xref: /openbmc/linux/fs/splice.c (revision 7afa6fd0)
15274f052SJens Axboe /*
25274f052SJens Axboe  * "splice": joining two ropes together by interweaving their strands.
35274f052SJens Axboe  *
45274f052SJens Axboe  * This is the "extended pipe" functionality, where a pipe is used as
55274f052SJens Axboe  * an arbitrary in-memory buffer. Think of a pipe as a small kernel
65274f052SJens Axboe  * buffer that you can use to transfer data from one end to the other.
75274f052SJens Axboe  *
85274f052SJens Axboe  * The traditional unix read/write is extended with a "splice()" operation
95274f052SJens Axboe  * that transfers data buffers to or from a pipe buffer.
105274f052SJens Axboe  *
115274f052SJens Axboe  * Named by Larry McVoy, original implementation from Linus, extended by
12c2058e06SJens Axboe  * Jens to support splicing to files, network, direct splicing, etc and
13c2058e06SJens Axboe  * fixing lots of bugs.
145274f052SJens Axboe  *
15c2058e06SJens Axboe  * Copyright (C) 2005-2006 Jens Axboe <axboe@suse.de>
16c2058e06SJens Axboe  * Copyright (C) 2005-2006 Linus Torvalds <torvalds@osdl.org>
17c2058e06SJens Axboe  * Copyright (C) 2006 Ingo Molnar <mingo@elte.hu>
185274f052SJens Axboe  *
195274f052SJens Axboe  */
205274f052SJens Axboe #include <linux/fs.h>
215274f052SJens Axboe #include <linux/file.h>
225274f052SJens Axboe #include <linux/pagemap.h>
235274f052SJens Axboe #include <linux/pipe_fs_i.h>
245274f052SJens Axboe #include <linux/mm_inline.h>
255abc97aaSJens Axboe #include <linux/swap.h>
264f6f0bd2SJens Axboe #include <linux/writeback.h>
274f6f0bd2SJens Axboe #include <linux/buffer_head.h>
28a0f06780SJeff Garzik #include <linux/module.h>
294f6f0bd2SJens Axboe #include <linux/syscalls.h>
30912d35f8SJens Axboe #include <linux/uio.h>
315274f052SJens Axboe 
32912d35f8SJens Axboe struct partial_page {
33912d35f8SJens Axboe 	unsigned int offset;
34912d35f8SJens Axboe 	unsigned int len;
35912d35f8SJens Axboe };
36912d35f8SJens Axboe 
37912d35f8SJens Axboe /*
3800522fb4SJens Axboe  * Passed to splice_to_pipe
39912d35f8SJens Axboe  */
40912d35f8SJens Axboe struct splice_pipe_desc {
41912d35f8SJens Axboe 	struct page **pages;		/* page map */
42912d35f8SJens Axboe 	struct partial_page *partial;	/* pages[] may not be contig */
43912d35f8SJens Axboe 	int nr_pages;			/* number of pages in map */
44912d35f8SJens Axboe 	unsigned int flags;		/* splice flags */
45912d35f8SJens Axboe 	struct pipe_buf_operations *ops;/* ops associated with output pipe */
46912d35f8SJens Axboe };
47912d35f8SJens Axboe 
4883f9135bSJens Axboe /*
4983f9135bSJens Axboe  * Attempt to steal a page from a pipe buffer. This should perhaps go into
5083f9135bSJens Axboe  * a vm helper function, it's already simplified quite a bit by the
5183f9135bSJens Axboe  * addition of remove_mapping(). If success is returned, the caller may
5283f9135bSJens Axboe  * attempt to reuse this page for another destination.
5383f9135bSJens Axboe  */
545abc97aaSJens Axboe static int page_cache_pipe_buf_steal(struct pipe_inode_info *info,
555abc97aaSJens Axboe 				     struct pipe_buffer *buf)
565abc97aaSJens Axboe {
575abc97aaSJens Axboe 	struct page *page = buf->page;
584f6f0bd2SJens Axboe 	struct address_space *mapping = page_mapping(page);
595abc97aaSJens Axboe 
609e0267c2SJens Axboe 	lock_page(page);
619e0267c2SJens Axboe 
625abc97aaSJens Axboe 	WARN_ON(!PageUptodate(page));
635abc97aaSJens Axboe 
64ad8d6f0aSJens Axboe 	/*
65ad8d6f0aSJens Axboe 	 * At least for ext2 with nobh option, we need to wait on writeback
66ad8d6f0aSJens Axboe 	 * completing on this page, since we'll remove it from the pagecache.
67ad8d6f0aSJens Axboe 	 * Otherwise truncate wont wait on the page, allowing the disk
68ad8d6f0aSJens Axboe 	 * blocks to be reused by someone else before we actually wrote our
69ad8d6f0aSJens Axboe 	 * data to them. fs corruption ensues.
70ad8d6f0aSJens Axboe 	 */
71ad8d6f0aSJens Axboe 	wait_on_page_writeback(page);
72ad8d6f0aSJens Axboe 
734f6f0bd2SJens Axboe 	if (PagePrivate(page))
744f6f0bd2SJens Axboe 		try_to_release_page(page, mapping_gfp_mask(mapping));
754f6f0bd2SJens Axboe 
769e0267c2SJens Axboe 	if (!remove_mapping(mapping, page)) {
779e0267c2SJens Axboe 		unlock_page(page);
785abc97aaSJens Axboe 		return 1;
799e0267c2SJens Axboe 	}
805abc97aaSJens Axboe 
810568b409SJens Axboe 	buf->flags |= PIPE_BUF_FLAG_LRU;
825abc97aaSJens Axboe 	return 0;
835abc97aaSJens Axboe }
845abc97aaSJens Axboe 
855274f052SJens Axboe static void page_cache_pipe_buf_release(struct pipe_inode_info *info,
865274f052SJens Axboe 					struct pipe_buffer *buf)
875274f052SJens Axboe {
885274f052SJens Axboe 	page_cache_release(buf->page);
895274f052SJens Axboe 	buf->page = NULL;
900568b409SJens Axboe 	buf->flags &= ~PIPE_BUF_FLAG_LRU;
915274f052SJens Axboe }
925274f052SJens Axboe 
93f84d7519SJens Axboe static int page_cache_pipe_buf_pin(struct pipe_inode_info *info,
945274f052SJens Axboe 				   struct pipe_buffer *buf)
955274f052SJens Axboe {
965274f052SJens Axboe 	struct page *page = buf->page;
9749d0b21bSJens Axboe 	int err;
985274f052SJens Axboe 
995274f052SJens Axboe 	if (!PageUptodate(page)) {
10049d0b21bSJens Axboe 		lock_page(page);
1015274f052SJens Axboe 
10249d0b21bSJens Axboe 		/*
10349d0b21bSJens Axboe 		 * Page got truncated/unhashed. This will cause a 0-byte
10473d62d83SIngo Molnar 		 * splice, if this is the first page.
10549d0b21bSJens Axboe 		 */
1065274f052SJens Axboe 		if (!page->mapping) {
10749d0b21bSJens Axboe 			err = -ENODATA;
10849d0b21bSJens Axboe 			goto error;
1095274f052SJens Axboe 		}
1105274f052SJens Axboe 
11149d0b21bSJens Axboe 		/*
11273d62d83SIngo Molnar 		 * Uh oh, read-error from disk.
11349d0b21bSJens Axboe 		 */
11449d0b21bSJens Axboe 		if (!PageUptodate(page)) {
11549d0b21bSJens Axboe 			err = -EIO;
11649d0b21bSJens Axboe 			goto error;
11749d0b21bSJens Axboe 		}
11849d0b21bSJens Axboe 
11949d0b21bSJens Axboe 		/*
120f84d7519SJens Axboe 		 * Page is ok afterall, we are done.
12149d0b21bSJens Axboe 		 */
12249d0b21bSJens Axboe 		unlock_page(page);
12349d0b21bSJens Axboe 	}
12449d0b21bSJens Axboe 
125f84d7519SJens Axboe 	return 0;
12649d0b21bSJens Axboe error:
12749d0b21bSJens Axboe 	unlock_page(page);
128f84d7519SJens Axboe 	return err;
12970524490SJens Axboe }
13070524490SJens Axboe 
1315274f052SJens Axboe static struct pipe_buf_operations page_cache_pipe_buf_ops = {
1325274f052SJens Axboe 	.can_merge = 0,
133f84d7519SJens Axboe 	.map = generic_pipe_buf_map,
134f84d7519SJens Axboe 	.unmap = generic_pipe_buf_unmap,
135f84d7519SJens Axboe 	.pin = page_cache_pipe_buf_pin,
1365274f052SJens Axboe 	.release = page_cache_pipe_buf_release,
1375abc97aaSJens Axboe 	.steal = page_cache_pipe_buf_steal,
138f84d7519SJens Axboe 	.get = generic_pipe_buf_get,
1395274f052SJens Axboe };
1405274f052SJens Axboe 
141912d35f8SJens Axboe static int user_page_pipe_buf_steal(struct pipe_inode_info *pipe,
142912d35f8SJens Axboe 				    struct pipe_buffer *buf)
143912d35f8SJens Axboe {
1447afa6fd0SJens Axboe 	if (!(buf->flags & PIPE_BUF_FLAG_GIFT))
145912d35f8SJens Axboe 		return 1;
1467afa6fd0SJens Axboe 
1477afa6fd0SJens Axboe 	return 0;
148912d35f8SJens Axboe }
149912d35f8SJens Axboe 
150912d35f8SJens Axboe static struct pipe_buf_operations user_page_pipe_buf_ops = {
151912d35f8SJens Axboe 	.can_merge = 0,
152f84d7519SJens Axboe 	.map = generic_pipe_buf_map,
153f84d7519SJens Axboe 	.unmap = generic_pipe_buf_unmap,
154f84d7519SJens Axboe 	.pin = generic_pipe_buf_pin,
155912d35f8SJens Axboe 	.release = page_cache_pipe_buf_release,
156912d35f8SJens Axboe 	.steal = user_page_pipe_buf_steal,
157f84d7519SJens Axboe 	.get = generic_pipe_buf_get,
158912d35f8SJens Axboe };
159912d35f8SJens Axboe 
16083f9135bSJens Axboe /*
16183f9135bSJens Axboe  * Pipe output worker. This sets up our pipe format with the page cache
16283f9135bSJens Axboe  * pipe buffer operations. Otherwise very similar to the regular pipe_writev().
16383f9135bSJens Axboe  */
16400522fb4SJens Axboe static ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
165912d35f8SJens Axboe 			      struct splice_pipe_desc *spd)
1665274f052SJens Axboe {
167912d35f8SJens Axboe 	int ret, do_wakeup, page_nr;
1685274f052SJens Axboe 
1695274f052SJens Axboe 	ret = 0;
1705274f052SJens Axboe 	do_wakeup = 0;
171912d35f8SJens Axboe 	page_nr = 0;
1725274f052SJens Axboe 
1733a326a2cSIngo Molnar 	if (pipe->inode)
1743a326a2cSIngo Molnar 		mutex_lock(&pipe->inode->i_mutex);
1755274f052SJens Axboe 
1765274f052SJens Axboe 	for (;;) {
1773a326a2cSIngo Molnar 		if (!pipe->readers) {
1785274f052SJens Axboe 			send_sig(SIGPIPE, current, 0);
1795274f052SJens Axboe 			if (!ret)
1805274f052SJens Axboe 				ret = -EPIPE;
1815274f052SJens Axboe 			break;
1825274f052SJens Axboe 		}
1835274f052SJens Axboe 
1846f767b04SJens Axboe 		if (pipe->nrbufs < PIPE_BUFFERS) {
1856f767b04SJens Axboe 			int newbuf = (pipe->curbuf + pipe->nrbufs) & (PIPE_BUFFERS - 1);
1863a326a2cSIngo Molnar 			struct pipe_buffer *buf = pipe->bufs + newbuf;
1875274f052SJens Axboe 
188912d35f8SJens Axboe 			buf->page = spd->pages[page_nr];
189912d35f8SJens Axboe 			buf->offset = spd->partial[page_nr].offset;
190912d35f8SJens Axboe 			buf->len = spd->partial[page_nr].len;
191912d35f8SJens Axboe 			buf->ops = spd->ops;
1927afa6fd0SJens Axboe 			if (spd->flags & SPLICE_F_GIFT)
1937afa6fd0SJens Axboe 				buf->flags |= PIPE_BUF_FLAG_GIFT;
1947afa6fd0SJens Axboe 
1956f767b04SJens Axboe 			pipe->nrbufs++;
196912d35f8SJens Axboe 			page_nr++;
197912d35f8SJens Axboe 			ret += buf->len;
198912d35f8SJens Axboe 
1996f767b04SJens Axboe 			if (pipe->inode)
2005274f052SJens Axboe 				do_wakeup = 1;
2015274f052SJens Axboe 
202912d35f8SJens Axboe 			if (!--spd->nr_pages)
2035274f052SJens Axboe 				break;
2046f767b04SJens Axboe 			if (pipe->nrbufs < PIPE_BUFFERS)
2055274f052SJens Axboe 				continue;
2065274f052SJens Axboe 
2075274f052SJens Axboe 			break;
2085274f052SJens Axboe 		}
2095274f052SJens Axboe 
210912d35f8SJens Axboe 		if (spd->flags & SPLICE_F_NONBLOCK) {
21129e35094SLinus Torvalds 			if (!ret)
21229e35094SLinus Torvalds 				ret = -EAGAIN;
21329e35094SLinus Torvalds 			break;
21429e35094SLinus Torvalds 		}
21529e35094SLinus Torvalds 
2165274f052SJens Axboe 		if (signal_pending(current)) {
2175274f052SJens Axboe 			if (!ret)
2185274f052SJens Axboe 				ret = -ERESTARTSYS;
2195274f052SJens Axboe 			break;
2205274f052SJens Axboe 		}
2215274f052SJens Axboe 
2225274f052SJens Axboe 		if (do_wakeup) {
223c0bd1f65SJens Axboe 			smp_mb();
2243a326a2cSIngo Molnar 			if (waitqueue_active(&pipe->wait))
2253a326a2cSIngo Molnar 				wake_up_interruptible_sync(&pipe->wait);
2263a326a2cSIngo Molnar 			kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
2275274f052SJens Axboe 			do_wakeup = 0;
2285274f052SJens Axboe 		}
2295274f052SJens Axboe 
2303a326a2cSIngo Molnar 		pipe->waiting_writers++;
2313a326a2cSIngo Molnar 		pipe_wait(pipe);
2323a326a2cSIngo Molnar 		pipe->waiting_writers--;
2335274f052SJens Axboe 	}
2345274f052SJens Axboe 
2353a326a2cSIngo Molnar 	if (pipe->inode)
2363a326a2cSIngo Molnar 		mutex_unlock(&pipe->inode->i_mutex);
2375274f052SJens Axboe 
2385274f052SJens Axboe 	if (do_wakeup) {
239c0bd1f65SJens Axboe 		smp_mb();
2403a326a2cSIngo Molnar 		if (waitqueue_active(&pipe->wait))
2413a326a2cSIngo Molnar 			wake_up_interruptible(&pipe->wait);
2423a326a2cSIngo Molnar 		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
2435274f052SJens Axboe 	}
2445274f052SJens Axboe 
245912d35f8SJens Axboe 	while (page_nr < spd->nr_pages)
246912d35f8SJens Axboe 		page_cache_release(spd->pages[page_nr++]);
2475274f052SJens Axboe 
2485274f052SJens Axboe 	return ret;
2495274f052SJens Axboe }
2505274f052SJens Axboe 
2513a326a2cSIngo Molnar static int
252cbb7e577SJens Axboe __generic_file_splice_read(struct file *in, loff_t *ppos,
253cbb7e577SJens Axboe 			   struct pipe_inode_info *pipe, size_t len,
254cbb7e577SJens Axboe 			   unsigned int flags)
2555274f052SJens Axboe {
2565274f052SJens Axboe 	struct address_space *mapping = in->f_mapping;
257912d35f8SJens Axboe 	unsigned int loff, nr_pages;
25816c523ddSJens Axboe 	struct page *pages[PIPE_BUFFERS];
259912d35f8SJens Axboe 	struct partial_page partial[PIPE_BUFFERS];
2605274f052SJens Axboe 	struct page *page;
26191ad66efSJens Axboe 	pgoff_t index, end_index;
26291ad66efSJens Axboe 	loff_t isize;
263912d35f8SJens Axboe 	size_t total_len;
264eb20796bSJens Axboe 	int error, page_nr;
265912d35f8SJens Axboe 	struct splice_pipe_desc spd = {
266912d35f8SJens Axboe 		.pages = pages,
267912d35f8SJens Axboe 		.partial = partial,
268912d35f8SJens Axboe 		.flags = flags,
269912d35f8SJens Axboe 		.ops = &page_cache_pipe_buf_ops,
270912d35f8SJens Axboe 	};
2715274f052SJens Axboe 
272cbb7e577SJens Axboe 	index = *ppos >> PAGE_CACHE_SHIFT;
273912d35f8SJens Axboe 	loff = *ppos & ~PAGE_CACHE_MASK;
274912d35f8SJens Axboe 	nr_pages = (len + loff + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
2755274f052SJens Axboe 
2765274f052SJens Axboe 	if (nr_pages > PIPE_BUFFERS)
2775274f052SJens Axboe 		nr_pages = PIPE_BUFFERS;
2785274f052SJens Axboe 
2795274f052SJens Axboe 	/*
28073d62d83SIngo Molnar 	 * Initiate read-ahead on this page range. however, don't call into
2810b749ce3SJens Axboe 	 * read-ahead if this is a non-zero offset (we are likely doing small
2820b749ce3SJens Axboe 	 * chunk splice and the page is already there) for a single page.
2835274f052SJens Axboe 	 */
284eb645a24SJens Axboe 	if (!loff || nr_pages > 1)
285eb645a24SJens Axboe 		page_cache_readahead(mapping, &in->f_ra, in, index, nr_pages);
2865274f052SJens Axboe 
2875274f052SJens Axboe 	/*
28873d62d83SIngo Molnar 	 * Now fill in the holes:
2895274f052SJens Axboe 	 */
2907480a904SJens Axboe 	error = 0;
291912d35f8SJens Axboe 	total_len = 0;
29282aa5d61SJens Axboe 
29382aa5d61SJens Axboe 	/*
294eb20796bSJens Axboe 	 * Lookup the (hopefully) full range of pages we need.
29582aa5d61SJens Axboe 	 */
296eb20796bSJens Axboe 	spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages);
297eb20796bSJens Axboe 
2985274f052SJens Axboe 	/*
299eb20796bSJens Axboe 	 * If find_get_pages_contig() returned fewer pages than we needed,
300eb20796bSJens Axboe 	 * allocate the rest.
301eb20796bSJens Axboe 	 */
302eb20796bSJens Axboe 	index += spd.nr_pages;
303eb20796bSJens Axboe 	while (spd.nr_pages < nr_pages) {
304eb20796bSJens Axboe 		/*
305eb20796bSJens Axboe 		 * Page could be there, find_get_pages_contig() breaks on
306eb20796bSJens Axboe 		 * the first hole.
3075274f052SJens Axboe 		 */
3087480a904SJens Axboe 		page = find_get_page(mapping, index);
3097480a904SJens Axboe 		if (!page) {
3107480a904SJens Axboe 			/*
311e27dedd8SJens Axboe 			 * Make sure the read-ahead engine is notified
312e27dedd8SJens Axboe 			 * about this failure.
313e27dedd8SJens Axboe 			 */
314e27dedd8SJens Axboe 			handle_ra_miss(mapping, &in->f_ra, index);
315e27dedd8SJens Axboe 
316e27dedd8SJens Axboe 			/*
317eb20796bSJens Axboe 			 * page didn't exist, allocate one.
3187480a904SJens Axboe 			 */
3197480a904SJens Axboe 			page = page_cache_alloc_cold(mapping);
3205274f052SJens Axboe 			if (!page)
3215274f052SJens Axboe 				break;
3225274f052SJens Axboe 
3237480a904SJens Axboe 			error = add_to_page_cache_lru(page, mapping, index,
3247480a904SJens Axboe 					      mapping_gfp_mask(mapping));
3255274f052SJens Axboe 			if (unlikely(error)) {
3265274f052SJens Axboe 				page_cache_release(page);
3275274f052SJens Axboe 				break;
3285274f052SJens Axboe 			}
329eb20796bSJens Axboe 			/*
330eb20796bSJens Axboe 			 * add_to_page_cache() locks the page, unlock it
331eb20796bSJens Axboe 			 * to avoid convoluting the logic below even more.
332eb20796bSJens Axboe 			 */
333eb20796bSJens Axboe 			unlock_page(page);
3345274f052SJens Axboe 		}
3357480a904SJens Axboe 
336eb20796bSJens Axboe 		pages[spd.nr_pages++] = page;
337eb20796bSJens Axboe 		index++;
338eb20796bSJens Axboe 	}
339eb20796bSJens Axboe 
340eb20796bSJens Axboe 	/*
341eb20796bSJens Axboe 	 * Now loop over the map and see if we need to start IO on any
342eb20796bSJens Axboe 	 * pages, fill in the partial map, etc.
343eb20796bSJens Axboe 	 */
344eb20796bSJens Axboe 	index = *ppos >> PAGE_CACHE_SHIFT;
345eb20796bSJens Axboe 	nr_pages = spd.nr_pages;
346eb20796bSJens Axboe 	spd.nr_pages = 0;
347eb20796bSJens Axboe 	for (page_nr = 0; page_nr < nr_pages; page_nr++) {
348eb20796bSJens Axboe 		unsigned int this_len;
349eb20796bSJens Axboe 
350eb20796bSJens Axboe 		if (!len)
351eb20796bSJens Axboe 			break;
352eb20796bSJens Axboe 
353eb20796bSJens Axboe 		/*
354eb20796bSJens Axboe 		 * this_len is the max we'll use from this page
355eb20796bSJens Axboe 		 */
356eb20796bSJens Axboe 		this_len = min_t(unsigned long, len, PAGE_CACHE_SIZE - loff);
357eb20796bSJens Axboe 		page = pages[page_nr];
358eb20796bSJens Axboe 
3597480a904SJens Axboe 		/*
3607480a904SJens Axboe 		 * If the page isn't uptodate, we may need to start io on it
3617480a904SJens Axboe 		 */
3627480a904SJens Axboe 		if (!PageUptodate(page)) {
363c4f895cbSJens Axboe 			/*
364c4f895cbSJens Axboe 			 * If in nonblock mode then dont block on waiting
365c4f895cbSJens Axboe 			 * for an in-flight io page
366c4f895cbSJens Axboe 			 */
367c4f895cbSJens Axboe 			if (flags & SPLICE_F_NONBLOCK)
368c4f895cbSJens Axboe 				break;
369c4f895cbSJens Axboe 
3707480a904SJens Axboe 			lock_page(page);
3717480a904SJens Axboe 
3727480a904SJens Axboe 			/*
3737480a904SJens Axboe 			 * page was truncated, stop here. if this isn't the
3747480a904SJens Axboe 			 * first page, we'll just complete what we already
3757480a904SJens Axboe 			 * added
3767480a904SJens Axboe 			 */
3777480a904SJens Axboe 			if (!page->mapping) {
3787480a904SJens Axboe 				unlock_page(page);
3797480a904SJens Axboe 				break;
3807480a904SJens Axboe 			}
3817480a904SJens Axboe 			/*
3827480a904SJens Axboe 			 * page was already under io and is now done, great
3837480a904SJens Axboe 			 */
3847480a904SJens Axboe 			if (PageUptodate(page)) {
3857480a904SJens Axboe 				unlock_page(page);
3867480a904SJens Axboe 				goto fill_it;
3877480a904SJens Axboe 			}
3887480a904SJens Axboe 
3897480a904SJens Axboe 			/*
3907480a904SJens Axboe 			 * need to read in the page
3917480a904SJens Axboe 			 */
3927480a904SJens Axboe 			error = mapping->a_ops->readpage(in, page);
3937480a904SJens Axboe 			if (unlikely(error)) {
394eb20796bSJens Axboe 				/*
395eb20796bSJens Axboe 				 * We really should re-lookup the page here,
396eb20796bSJens Axboe 				 * but it complicates things a lot. Instead
397eb20796bSJens Axboe 				 * lets just do what we already stored, and
398eb20796bSJens Axboe 				 * we'll get it the next time we are called.
399eb20796bSJens Axboe 				 */
4007480a904SJens Axboe 				if (error == AOP_TRUNCATED_PAGE)
401eb20796bSJens Axboe 					error = 0;
402eb20796bSJens Axboe 
4037480a904SJens Axboe 				break;
4047480a904SJens Axboe 			}
40591ad66efSJens Axboe 
40691ad66efSJens Axboe 			/*
40791ad66efSJens Axboe 			 * i_size must be checked after ->readpage().
40891ad66efSJens Axboe 			 */
40991ad66efSJens Axboe 			isize = i_size_read(mapping->host);
41091ad66efSJens Axboe 			end_index = (isize - 1) >> PAGE_CACHE_SHIFT;
411eb20796bSJens Axboe 			if (unlikely(!isize || index > end_index))
41291ad66efSJens Axboe 				break;
41391ad66efSJens Axboe 
41491ad66efSJens Axboe 			/*
41591ad66efSJens Axboe 			 * if this is the last page, see if we need to shrink
41691ad66efSJens Axboe 			 * the length and stop
41791ad66efSJens Axboe 			 */
41891ad66efSJens Axboe 			if (end_index == index) {
41991ad66efSJens Axboe 				loff = PAGE_CACHE_SIZE - (isize & ~PAGE_CACHE_MASK);
420eb20796bSJens Axboe 				if (total_len + loff > isize)
42191ad66efSJens Axboe 					break;
42291ad66efSJens Axboe 				/*
42391ad66efSJens Axboe 				 * force quit after adding this page
42491ad66efSJens Axboe 				 */
425eb20796bSJens Axboe 				len = this_len;
42682aa5d61SJens Axboe 				this_len = min(this_len, loff);
427912d35f8SJens Axboe 				loff = 0;
42891ad66efSJens Axboe 			}
4297480a904SJens Axboe 		}
4307480a904SJens Axboe fill_it:
431eb20796bSJens Axboe 		partial[page_nr].offset = loff;
432eb20796bSJens Axboe 		partial[page_nr].len = this_len;
43382aa5d61SJens Axboe 		len -= this_len;
434912d35f8SJens Axboe 		total_len += this_len;
43591ad66efSJens Axboe 		loff = 0;
436eb20796bSJens Axboe 		spd.nr_pages++;
437eb20796bSJens Axboe 		index++;
4385274f052SJens Axboe 	}
4395274f052SJens Axboe 
440eb20796bSJens Axboe 	/*
441eb20796bSJens Axboe 	 * Release any pages at the end, if we quit early. 'i' is how far
442eb20796bSJens Axboe 	 * we got, 'nr_pages' is how many pages are in the map.
443eb20796bSJens Axboe 	 */
444eb20796bSJens Axboe 	while (page_nr < nr_pages)
445eb20796bSJens Axboe 		page_cache_release(pages[page_nr++]);
446eb20796bSJens Axboe 
447912d35f8SJens Axboe 	if (spd.nr_pages)
44800522fb4SJens Axboe 		return splice_to_pipe(pipe, &spd);
44916c523ddSJens Axboe 
4507480a904SJens Axboe 	return error;
4515274f052SJens Axboe }
4525274f052SJens Axboe 
45383f9135bSJens Axboe /**
45483f9135bSJens Axboe  * generic_file_splice_read - splice data from file to a pipe
45583f9135bSJens Axboe  * @in:		file to splice from
45683f9135bSJens Axboe  * @pipe:	pipe to splice to
45783f9135bSJens Axboe  * @len:	number of bytes to splice
45883f9135bSJens Axboe  * @flags:	splice modifier flags
45983f9135bSJens Axboe  *
46083f9135bSJens Axboe  * Will read pages from given file and fill them into a pipe.
46183f9135bSJens Axboe  */
462cbb7e577SJens Axboe ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
463cbb7e577SJens Axboe 				 struct pipe_inode_info *pipe, size_t len,
464cbb7e577SJens Axboe 				 unsigned int flags)
4655274f052SJens Axboe {
4665274f052SJens Axboe 	ssize_t spliced;
4675274f052SJens Axboe 	int ret;
4685274f052SJens Axboe 
4695274f052SJens Axboe 	ret = 0;
4705274f052SJens Axboe 	spliced = 0;
4713a326a2cSIngo Molnar 
4725274f052SJens Axboe 	while (len) {
473cbb7e577SJens Axboe 		ret = __generic_file_splice_read(in, ppos, pipe, len, flags);
4745274f052SJens Axboe 
475c4f895cbSJens Axboe 		if (ret < 0)
4765274f052SJens Axboe 			break;
477c4f895cbSJens Axboe 		else if (!ret) {
478c4f895cbSJens Axboe 			if (spliced)
479c4f895cbSJens Axboe 				break;
480c4f895cbSJens Axboe 			if (flags & SPLICE_F_NONBLOCK) {
481c4f895cbSJens Axboe 				ret = -EAGAIN;
482c4f895cbSJens Axboe 				break;
483c4f895cbSJens Axboe 			}
484c4f895cbSJens Axboe 		}
4855274f052SJens Axboe 
486cbb7e577SJens Axboe 		*ppos += ret;
4875274f052SJens Axboe 		len -= ret;
4885274f052SJens Axboe 		spliced += ret;
4895274f052SJens Axboe 	}
4905274f052SJens Axboe 
4915274f052SJens Axboe 	if (spliced)
4925274f052SJens Axboe 		return spliced;
4935274f052SJens Axboe 
4945274f052SJens Axboe 	return ret;
4955274f052SJens Axboe }
4965274f052SJens Axboe 
497059a8f37SJens Axboe EXPORT_SYMBOL(generic_file_splice_read);
498059a8f37SJens Axboe 
4995274f052SJens Axboe /*
5004f6f0bd2SJens Axboe  * Send 'sd->len' bytes to socket from 'sd->file' at position 'sd->pos'
501016b661eSJens Axboe  * using sendpage(). Return the number of bytes sent.
5025274f052SJens Axboe  */
5035274f052SJens Axboe static int pipe_to_sendpage(struct pipe_inode_info *info,
5045274f052SJens Axboe 			    struct pipe_buffer *buf, struct splice_desc *sd)
5055274f052SJens Axboe {
5065274f052SJens Axboe 	struct file *file = sd->file;
5075274f052SJens Axboe 	loff_t pos = sd->pos;
508f84d7519SJens Axboe 	int ret, more;
5095274f052SJens Axboe 
510f84d7519SJens Axboe 	ret = buf->ops->pin(info, buf);
511f84d7519SJens Axboe 	if (!ret) {
512b2b39fa4SJens Axboe 		more = (sd->flags & SPLICE_F_MORE) || sd->len < sd->total_len;
5135274f052SJens Axboe 
514f84d7519SJens Axboe 		ret = file->f_op->sendpage(file, buf->page, buf->offset,
515f84d7519SJens Axboe 					   sd->len, &pos, more);
516f84d7519SJens Axboe 	}
5175274f052SJens Axboe 
518016b661eSJens Axboe 	return ret;
5195274f052SJens Axboe }
5205274f052SJens Axboe 
5215274f052SJens Axboe /*
5225274f052SJens Axboe  * This is a little more tricky than the file -> pipe splicing. There are
5235274f052SJens Axboe  * basically three cases:
5245274f052SJens Axboe  *
5255274f052SJens Axboe  *	- Destination page already exists in the address space and there
5265274f052SJens Axboe  *	  are users of it. For that case we have no other option that
5275274f052SJens Axboe  *	  copying the data. Tough luck.
5285274f052SJens Axboe  *	- Destination page already exists in the address space, but there
5295274f052SJens Axboe  *	  are no users of it. Make sure it's uptodate, then drop it. Fall
5305274f052SJens Axboe  *	  through to last case.
5315274f052SJens Axboe  *	- Destination page does not exist, we can add the pipe page to
5325274f052SJens Axboe  *	  the page cache and avoid the copy.
5335274f052SJens Axboe  *
53483f9135bSJens Axboe  * If asked to move pages to the output file (SPLICE_F_MOVE is set in
53583f9135bSJens Axboe  * sd->flags), we attempt to migrate pages from the pipe to the output
53683f9135bSJens Axboe  * file address space page cache. This is possible if no one else has
53783f9135bSJens Axboe  * the pipe page referenced outside of the pipe and page cache. If
53883f9135bSJens Axboe  * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create
53983f9135bSJens Axboe  * a new page in the output file page cache and fill/dirty that.
5405274f052SJens Axboe  */
5415274f052SJens Axboe static int pipe_to_file(struct pipe_inode_info *info, struct pipe_buffer *buf,
5425274f052SJens Axboe 			struct splice_desc *sd)
5435274f052SJens Axboe {
5445274f052SJens Axboe 	struct file *file = sd->file;
5455274f052SJens Axboe 	struct address_space *mapping = file->f_mapping;
5463e7ee3e7SJens Axboe 	gfp_t gfp_mask = mapping_gfp_mask(mapping);
547016b661eSJens Axboe 	unsigned int offset, this_len;
5485274f052SJens Axboe 	struct page *page;
5495274f052SJens Axboe 	pgoff_t index;
5503e7ee3e7SJens Axboe 	int ret;
5515274f052SJens Axboe 
5525274f052SJens Axboe 	/*
55349d0b21bSJens Axboe 	 * make sure the data in this buffer is uptodate
5545274f052SJens Axboe 	 */
555f84d7519SJens Axboe 	ret = buf->ops->pin(info, buf);
556f84d7519SJens Axboe 	if (unlikely(ret))
557f84d7519SJens Axboe 		return ret;
5585274f052SJens Axboe 
5595274f052SJens Axboe 	index = sd->pos >> PAGE_CACHE_SHIFT;
5605274f052SJens Axboe 	offset = sd->pos & ~PAGE_CACHE_MASK;
5615274f052SJens Axboe 
562016b661eSJens Axboe 	this_len = sd->len;
563016b661eSJens Axboe 	if (this_len + offset > PAGE_CACHE_SIZE)
564016b661eSJens Axboe 		this_len = PAGE_CACHE_SIZE - offset;
565016b661eSJens Axboe 
5665abc97aaSJens Axboe 	/*
5670568b409SJens Axboe 	 * Reuse buf page, if SPLICE_F_MOVE is set and we are doing a full
5680568b409SJens Axboe 	 * page.
5695abc97aaSJens Axboe 	 */
5700568b409SJens Axboe 	if ((sd->flags & SPLICE_F_MOVE) && this_len == PAGE_CACHE_SIZE) {
57183f9135bSJens Axboe 		/*
57283f9135bSJens Axboe 		 * If steal succeeds, buf->page is now pruned from the vm
5739e0267c2SJens Axboe 		 * side (LRU and page cache) and we can reuse it. The page
5749e0267c2SJens Axboe 		 * will also be looked on successful return.
57583f9135bSJens Axboe 		 */
5765abc97aaSJens Axboe 		if (buf->ops->steal(info, buf))
5775abc97aaSJens Axboe 			goto find_page;
5785abc97aaSJens Axboe 
5795abc97aaSJens Axboe 		page = buf->page;
58046e678c9SJens Axboe 		if (add_to_page_cache(page, mapping, index, gfp_mask)) {
58146e678c9SJens Axboe 			unlock_page(page);
5825abc97aaSJens Axboe 			goto find_page;
58346e678c9SJens Axboe 		}
5843e7ee3e7SJens Axboe 
5850568b409SJens Axboe 		page_cache_get(page);
5860568b409SJens Axboe 
5873e7ee3e7SJens Axboe 		if (!(buf->flags & PIPE_BUF_FLAG_LRU))
5883e7ee3e7SJens Axboe 			lru_cache_add(page);
5895abc97aaSJens Axboe 	} else {
5905274f052SJens Axboe find_page:
5919e0267c2SJens Axboe 		page = find_lock_page(mapping, index);
5929e0267c2SJens Axboe 		if (!page) {
5935274f052SJens Axboe 			ret = -ENOMEM;
5949e0267c2SJens Axboe 			page = page_cache_alloc_cold(mapping);
5959e0267c2SJens Axboe 			if (unlikely(!page))
5969aefe431SDave Jones 				goto out_nomem;
5975274f052SJens Axboe 
5985274f052SJens Axboe 			/*
5999e0267c2SJens Axboe 			 * This will also lock the page
6009e0267c2SJens Axboe 			 */
6019e0267c2SJens Axboe 			ret = add_to_page_cache_lru(page, mapping, index,
6029e0267c2SJens Axboe 						    gfp_mask);
6039e0267c2SJens Axboe 			if (unlikely(ret))
6049e0267c2SJens Axboe 				goto out;
6059e0267c2SJens Axboe 		}
6069e0267c2SJens Axboe 
6079e0267c2SJens Axboe 		/*
6089e0267c2SJens Axboe 		 * We get here with the page locked. If the page is also
6099e0267c2SJens Axboe 		 * uptodate, we don't need to do more. If it isn't, we
6109e0267c2SJens Axboe 		 * may need to bring it in if we are not going to overwrite
6119e0267c2SJens Axboe 		 * the full page.
6125274f052SJens Axboe 		 */
6135274f052SJens Axboe 		if (!PageUptodate(page)) {
614016b661eSJens Axboe 			if (this_len < PAGE_CACHE_SIZE) {
6155274f052SJens Axboe 				ret = mapping->a_ops->readpage(file, page);
6165274f052SJens Axboe 				if (unlikely(ret))
6175274f052SJens Axboe 					goto out;
6185274f052SJens Axboe 
6195274f052SJens Axboe 				lock_page(page);
6205274f052SJens Axboe 
6215274f052SJens Axboe 				if (!PageUptodate(page)) {
6225274f052SJens Axboe 					/*
62373d62d83SIngo Molnar 					 * Page got invalidated, repeat.
6245274f052SJens Axboe 					 */
6255274f052SJens Axboe 					if (!page->mapping) {
6265274f052SJens Axboe 						unlock_page(page);
6275274f052SJens Axboe 						page_cache_release(page);
6285274f052SJens Axboe 						goto find_page;
6295274f052SJens Axboe 					}
6305274f052SJens Axboe 					ret = -EIO;
6315274f052SJens Axboe 					goto out;
6325274f052SJens Axboe 				}
6339e0267c2SJens Axboe 			} else
6345274f052SJens Axboe 				SetPageUptodate(page);
6355274f052SJens Axboe 		}
6365274f052SJens Axboe 	}
6375274f052SJens Axboe 
638016b661eSJens Axboe 	ret = mapping->a_ops->prepare_write(file, page, offset, offset+this_len);
6394f6f0bd2SJens Axboe 	if (ret == AOP_TRUNCATED_PAGE) {
6404f6f0bd2SJens Axboe 		page_cache_release(page);
6414f6f0bd2SJens Axboe 		goto find_page;
6424f6f0bd2SJens Axboe 	} else if (ret)
6435274f052SJens Axboe 		goto out;
6445274f052SJens Axboe 
6450568b409SJens Axboe 	if (buf->page != page) {
646f84d7519SJens Axboe 		/*
647f84d7519SJens Axboe 		 * Careful, ->map() uses KM_USER0!
648f84d7519SJens Axboe 		 */
649f6762b7aSJens Axboe 		char *src = buf->ops->map(info, buf, 1);
650f84d7519SJens Axboe 		char *dst = kmap_atomic(page, KM_USER1);
6515abc97aaSJens Axboe 
652016b661eSJens Axboe 		memcpy(dst + offset, src + buf->offset, this_len);
6535274f052SJens Axboe 		flush_dcache_page(page);
654f84d7519SJens Axboe 		kunmap_atomic(dst, KM_USER1);
655f6762b7aSJens Axboe 		buf->ops->unmap(info, buf, src);
6565abc97aaSJens Axboe 	}
6575274f052SJens Axboe 
658016b661eSJens Axboe 	ret = mapping->a_ops->commit_write(file, page, offset, offset+this_len);
6590568b409SJens Axboe 	if (!ret) {
660016b661eSJens Axboe 		/*
6610568b409SJens Axboe 		 * Return the number of bytes written and mark page as
6620568b409SJens Axboe 		 * accessed, we are now done!
663016b661eSJens Axboe 		 */
664016b661eSJens Axboe 		ret = this_len;
665c7f21e4fSJens Axboe 		mark_page_accessed(page);
6664f6f0bd2SJens Axboe 		balance_dirty_pages_ratelimited(mapping);
6670568b409SJens Axboe 	} else if (ret == AOP_TRUNCATED_PAGE) {
6685274f052SJens Axboe 		page_cache_release(page);
6690568b409SJens Axboe 		goto find_page;
6700568b409SJens Axboe 	}
6710568b409SJens Axboe out:
6720568b409SJens Axboe 	page_cache_release(page);
6734f6f0bd2SJens Axboe 	unlock_page(page);
6749aefe431SDave Jones out_nomem:
6755274f052SJens Axboe 	return ret;
6765274f052SJens Axboe }
6775274f052SJens Axboe 
67883f9135bSJens Axboe /*
67983f9135bSJens Axboe  * Pipe input worker. Most of this logic works like a regular pipe, the
68083f9135bSJens Axboe  * key here is the 'actor' worker passed in that actually moves the data
68183f9135bSJens Axboe  * to the wanted destination. See pipe_to_file/pipe_to_sendpage above.
68283f9135bSJens Axboe  */
68300522fb4SJens Axboe ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
684cbb7e577SJens Axboe 			 loff_t *ppos, size_t len, unsigned int flags,
6855274f052SJens Axboe 			 splice_actor *actor)
6865274f052SJens Axboe {
6875274f052SJens Axboe 	int ret, do_wakeup, err;
6885274f052SJens Axboe 	struct splice_desc sd;
6895274f052SJens Axboe 
6905274f052SJens Axboe 	ret = 0;
6915274f052SJens Axboe 	do_wakeup = 0;
6925274f052SJens Axboe 
6935274f052SJens Axboe 	sd.total_len = len;
6945274f052SJens Axboe 	sd.flags = flags;
6955274f052SJens Axboe 	sd.file = out;
696cbb7e577SJens Axboe 	sd.pos = *ppos;
6975274f052SJens Axboe 
6983a326a2cSIngo Molnar 	if (pipe->inode)
6993a326a2cSIngo Molnar 		mutex_lock(&pipe->inode->i_mutex);
7005274f052SJens Axboe 
7015274f052SJens Axboe 	for (;;) {
7026f767b04SJens Axboe 		if (pipe->nrbufs) {
7036f767b04SJens Axboe 			struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
7045274f052SJens Axboe 			struct pipe_buf_operations *ops = buf->ops;
7055274f052SJens Axboe 
7065274f052SJens Axboe 			sd.len = buf->len;
7075274f052SJens Axboe 			if (sd.len > sd.total_len)
7085274f052SJens Axboe 				sd.len = sd.total_len;
7095274f052SJens Axboe 
7103a326a2cSIngo Molnar 			err = actor(pipe, buf, &sd);
711016b661eSJens Axboe 			if (err <= 0) {
7125274f052SJens Axboe 				if (!ret && err != -ENODATA)
7135274f052SJens Axboe 					ret = err;
7145274f052SJens Axboe 
7155274f052SJens Axboe 				break;
7165274f052SJens Axboe 			}
7175274f052SJens Axboe 
718016b661eSJens Axboe 			ret += err;
719016b661eSJens Axboe 			buf->offset += err;
720016b661eSJens Axboe 			buf->len -= err;
721016b661eSJens Axboe 
722016b661eSJens Axboe 			sd.len -= err;
723016b661eSJens Axboe 			sd.pos += err;
724016b661eSJens Axboe 			sd.total_len -= err;
725016b661eSJens Axboe 			if (sd.len)
726016b661eSJens Axboe 				continue;
72773d62d83SIngo Molnar 
7285274f052SJens Axboe 			if (!buf->len) {
7295274f052SJens Axboe 				buf->ops = NULL;
7303a326a2cSIngo Molnar 				ops->release(pipe, buf);
7316f767b04SJens Axboe 				pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);
7326f767b04SJens Axboe 				pipe->nrbufs--;
7336f767b04SJens Axboe 				if (pipe->inode)
7345274f052SJens Axboe 					do_wakeup = 1;
7355274f052SJens Axboe 			}
7365274f052SJens Axboe 
7375274f052SJens Axboe 			if (!sd.total_len)
7385274f052SJens Axboe 				break;
7395274f052SJens Axboe 		}
7405274f052SJens Axboe 
7416f767b04SJens Axboe 		if (pipe->nrbufs)
7425274f052SJens Axboe 			continue;
7433a326a2cSIngo Molnar 		if (!pipe->writers)
7445274f052SJens Axboe 			break;
7453a326a2cSIngo Molnar 		if (!pipe->waiting_writers) {
7465274f052SJens Axboe 			if (ret)
7475274f052SJens Axboe 				break;
7485274f052SJens Axboe 		}
7495274f052SJens Axboe 
75029e35094SLinus Torvalds 		if (flags & SPLICE_F_NONBLOCK) {
75129e35094SLinus Torvalds 			if (!ret)
75229e35094SLinus Torvalds 				ret = -EAGAIN;
75329e35094SLinus Torvalds 			break;
75429e35094SLinus Torvalds 		}
75529e35094SLinus Torvalds 
7565274f052SJens Axboe 		if (signal_pending(current)) {
7575274f052SJens Axboe 			if (!ret)
7585274f052SJens Axboe 				ret = -ERESTARTSYS;
7595274f052SJens Axboe 			break;
7605274f052SJens Axboe 		}
7615274f052SJens Axboe 
7625274f052SJens Axboe 		if (do_wakeup) {
763c0bd1f65SJens Axboe 			smp_mb();
7643a326a2cSIngo Molnar 			if (waitqueue_active(&pipe->wait))
7653a326a2cSIngo Molnar 				wake_up_interruptible_sync(&pipe->wait);
7663a326a2cSIngo Molnar 			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
7675274f052SJens Axboe 			do_wakeup = 0;
7685274f052SJens Axboe 		}
7695274f052SJens Axboe 
7703a326a2cSIngo Molnar 		pipe_wait(pipe);
7715274f052SJens Axboe 	}
7725274f052SJens Axboe 
7733a326a2cSIngo Molnar 	if (pipe->inode)
7743a326a2cSIngo Molnar 		mutex_unlock(&pipe->inode->i_mutex);
7755274f052SJens Axboe 
7765274f052SJens Axboe 	if (do_wakeup) {
777c0bd1f65SJens Axboe 		smp_mb();
7783a326a2cSIngo Molnar 		if (waitqueue_active(&pipe->wait))
7793a326a2cSIngo Molnar 			wake_up_interruptible(&pipe->wait);
7803a326a2cSIngo Molnar 		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
7815274f052SJens Axboe 	}
7825274f052SJens Axboe 
7835274f052SJens Axboe 	return ret;
7845274f052SJens Axboe }
7855274f052SJens Axboe 
78683f9135bSJens Axboe /**
78783f9135bSJens Axboe  * generic_file_splice_write - splice data from a pipe to a file
7883a326a2cSIngo Molnar  * @pipe:	pipe info
78983f9135bSJens Axboe  * @out:	file to write to
79083f9135bSJens Axboe  * @len:	number of bytes to splice
79183f9135bSJens Axboe  * @flags:	splice modifier flags
79283f9135bSJens Axboe  *
79383f9135bSJens Axboe  * Will either move or copy pages (determined by @flags options) from
79483f9135bSJens Axboe  * the given pipe inode to the given file.
79583f9135bSJens Axboe  *
79683f9135bSJens Axboe  */
7973a326a2cSIngo Molnar ssize_t
7983a326a2cSIngo Molnar generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
799cbb7e577SJens Axboe 			  loff_t *ppos, size_t len, unsigned int flags)
8005274f052SJens Axboe {
8014f6f0bd2SJens Axboe 	struct address_space *mapping = out->f_mapping;
8023a326a2cSIngo Molnar 	ssize_t ret;
8033a326a2cSIngo Molnar 
80400522fb4SJens Axboe 	ret = splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_file);
805a4514ebdSJens Axboe 	if (ret > 0) {
806a4514ebdSJens Axboe 		struct inode *inode = mapping->host;
807a4514ebdSJens Axboe 
808a4514ebdSJens Axboe 		*ppos += ret;
8094f6f0bd2SJens Axboe 
8104f6f0bd2SJens Axboe 		/*
811a4514ebdSJens Axboe 		 * If file or inode is SYNC and we actually wrote some data,
812a4514ebdSJens Axboe 		 * sync it.
8134f6f0bd2SJens Axboe 		 */
814a4514ebdSJens Axboe 		if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) {
8154f6f0bd2SJens Axboe 			int err;
8164f6f0bd2SJens Axboe 
8174f6f0bd2SJens Axboe 			mutex_lock(&inode->i_mutex);
818a4514ebdSJens Axboe 			err = generic_osync_inode(inode, mapping,
8194f6f0bd2SJens Axboe 						  OSYNC_METADATA|OSYNC_DATA);
8204f6f0bd2SJens Axboe 			mutex_unlock(&inode->i_mutex);
8214f6f0bd2SJens Axboe 
8224f6f0bd2SJens Axboe 			if (err)
8234f6f0bd2SJens Axboe 				ret = err;
8244f6f0bd2SJens Axboe 		}
825a4514ebdSJens Axboe 	}
8264f6f0bd2SJens Axboe 
8274f6f0bd2SJens Axboe 	return ret;
8285274f052SJens Axboe }
8295274f052SJens Axboe 
830059a8f37SJens Axboe EXPORT_SYMBOL(generic_file_splice_write);
831059a8f37SJens Axboe 
83283f9135bSJens Axboe /**
83383f9135bSJens Axboe  * generic_splice_sendpage - splice data from a pipe to a socket
83483f9135bSJens Axboe  * @inode:	pipe inode
83583f9135bSJens Axboe  * @out:	socket to write to
83683f9135bSJens Axboe  * @len:	number of bytes to splice
83783f9135bSJens Axboe  * @flags:	splice modifier flags
83883f9135bSJens Axboe  *
83983f9135bSJens Axboe  * Will send @len bytes from the pipe to a network socket. No data copying
84083f9135bSJens Axboe  * is involved.
84183f9135bSJens Axboe  *
84283f9135bSJens Axboe  */
8433a326a2cSIngo Molnar ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out,
844cbb7e577SJens Axboe 				loff_t *ppos, size_t len, unsigned int flags)
8455274f052SJens Axboe {
84600522fb4SJens Axboe 	return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_sendpage);
8475274f052SJens Axboe }
8485274f052SJens Axboe 
849059a8f37SJens Axboe EXPORT_SYMBOL(generic_splice_sendpage);
850a0f06780SJeff Garzik 
85183f9135bSJens Axboe /*
85283f9135bSJens Axboe  * Attempt to initiate a splice from pipe to file.
85383f9135bSJens Axboe  */
8543a326a2cSIngo Molnar static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
855cbb7e577SJens Axboe 			   loff_t *ppos, size_t len, unsigned int flags)
8565274f052SJens Axboe {
8575274f052SJens Axboe 	int ret;
8585274f052SJens Axboe 
85949570e9bSJens Axboe 	if (unlikely(!out->f_op || !out->f_op->splice_write))
8605274f052SJens Axboe 		return -EINVAL;
8615274f052SJens Axboe 
86249570e9bSJens Axboe 	if (unlikely(!(out->f_mode & FMODE_WRITE)))
8635274f052SJens Axboe 		return -EBADF;
8645274f052SJens Axboe 
865cbb7e577SJens Axboe 	ret = rw_verify_area(WRITE, out, ppos, len);
8665274f052SJens Axboe 	if (unlikely(ret < 0))
8675274f052SJens Axboe 		return ret;
8685274f052SJens Axboe 
869cbb7e577SJens Axboe 	return out->f_op->splice_write(pipe, out, ppos, len, flags);
8705274f052SJens Axboe }
8715274f052SJens Axboe 
87283f9135bSJens Axboe /*
87383f9135bSJens Axboe  * Attempt to initiate a splice from a file to a pipe.
87483f9135bSJens Axboe  */
875cbb7e577SJens Axboe static long do_splice_to(struct file *in, loff_t *ppos,
876cbb7e577SJens Axboe 			 struct pipe_inode_info *pipe, size_t len,
877cbb7e577SJens Axboe 			 unsigned int flags)
8785274f052SJens Axboe {
879cbb7e577SJens Axboe 	loff_t isize, left;
8805274f052SJens Axboe 	int ret;
8815274f052SJens Axboe 
88249570e9bSJens Axboe 	if (unlikely(!in->f_op || !in->f_op->splice_read))
8835274f052SJens Axboe 		return -EINVAL;
8845274f052SJens Axboe 
88549570e9bSJens Axboe 	if (unlikely(!(in->f_mode & FMODE_READ)))
8865274f052SJens Axboe 		return -EBADF;
8875274f052SJens Axboe 
888cbb7e577SJens Axboe 	ret = rw_verify_area(READ, in, ppos, len);
8895274f052SJens Axboe 	if (unlikely(ret < 0))
8905274f052SJens Axboe 		return ret;
8915274f052SJens Axboe 
8925274f052SJens Axboe 	isize = i_size_read(in->f_mapping->host);
893cbb7e577SJens Axboe 	if (unlikely(*ppos >= isize))
8945274f052SJens Axboe 		return 0;
8955274f052SJens Axboe 
896cbb7e577SJens Axboe 	left = isize - *ppos;
89749570e9bSJens Axboe 	if (unlikely(left < len))
8985274f052SJens Axboe 		len = left;
8995274f052SJens Axboe 
900cbb7e577SJens Axboe 	return in->f_op->splice_read(in, ppos, pipe, len, flags);
9015274f052SJens Axboe }
9025274f052SJens Axboe 
903cbb7e577SJens Axboe long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
904cbb7e577SJens Axboe 		      size_t len, unsigned int flags)
905b92ce558SJens Axboe {
906b92ce558SJens Axboe 	struct pipe_inode_info *pipe;
907b92ce558SJens Axboe 	long ret, bytes;
908cbb7e577SJens Axboe 	loff_t out_off;
909b92ce558SJens Axboe 	umode_t i_mode;
910b92ce558SJens Axboe 	int i;
911b92ce558SJens Axboe 
912b92ce558SJens Axboe 	/*
913b92ce558SJens Axboe 	 * We require the input being a regular file, as we don't want to
914b92ce558SJens Axboe 	 * randomly drop data for eg socket -> socket splicing. Use the
915b92ce558SJens Axboe 	 * piped splicing for that!
916b92ce558SJens Axboe 	 */
917b92ce558SJens Axboe 	i_mode = in->f_dentry->d_inode->i_mode;
918b92ce558SJens Axboe 	if (unlikely(!S_ISREG(i_mode) && !S_ISBLK(i_mode)))
919b92ce558SJens Axboe 		return -EINVAL;
920b92ce558SJens Axboe 
921b92ce558SJens Axboe 	/*
922b92ce558SJens Axboe 	 * neither in nor out is a pipe, setup an internal pipe attached to
923b92ce558SJens Axboe 	 * 'out' and transfer the wanted data from 'in' to 'out' through that
924b92ce558SJens Axboe 	 */
925b92ce558SJens Axboe 	pipe = current->splice_pipe;
92649570e9bSJens Axboe 	if (unlikely(!pipe)) {
927b92ce558SJens Axboe 		pipe = alloc_pipe_info(NULL);
928b92ce558SJens Axboe 		if (!pipe)
929b92ce558SJens Axboe 			return -ENOMEM;
930b92ce558SJens Axboe 
931b92ce558SJens Axboe 		/*
932b92ce558SJens Axboe 		 * We don't have an immediate reader, but we'll read the stuff
93300522fb4SJens Axboe 		 * out of the pipe right after the splice_to_pipe(). So set
934b92ce558SJens Axboe 		 * PIPE_READERS appropriately.
935b92ce558SJens Axboe 		 */
936b92ce558SJens Axboe 		pipe->readers = 1;
937b92ce558SJens Axboe 
938b92ce558SJens Axboe 		current->splice_pipe = pipe;
939b92ce558SJens Axboe 	}
940b92ce558SJens Axboe 
941b92ce558SJens Axboe 	/*
94273d62d83SIngo Molnar 	 * Do the splice.
943b92ce558SJens Axboe 	 */
944b92ce558SJens Axboe 	ret = 0;
945b92ce558SJens Axboe 	bytes = 0;
946cbb7e577SJens Axboe 	out_off = 0;
947b92ce558SJens Axboe 
948b92ce558SJens Axboe 	while (len) {
949b92ce558SJens Axboe 		size_t read_len, max_read_len;
950b92ce558SJens Axboe 
951b92ce558SJens Axboe 		/*
952b92ce558SJens Axboe 		 * Do at most PIPE_BUFFERS pages worth of transfer:
953b92ce558SJens Axboe 		 */
954b92ce558SJens Axboe 		max_read_len = min(len, (size_t)(PIPE_BUFFERS*PAGE_SIZE));
955b92ce558SJens Axboe 
956cbb7e577SJens Axboe 		ret = do_splice_to(in, ppos, pipe, max_read_len, flags);
957b92ce558SJens Axboe 		if (unlikely(ret < 0))
958b92ce558SJens Axboe 			goto out_release;
959b92ce558SJens Axboe 
960b92ce558SJens Axboe 		read_len = ret;
961b92ce558SJens Axboe 
962b92ce558SJens Axboe 		/*
963b92ce558SJens Axboe 		 * NOTE: nonblocking mode only applies to the input. We
964b92ce558SJens Axboe 		 * must not do the output in nonblocking mode as then we
965b92ce558SJens Axboe 		 * could get stuck data in the internal pipe:
966b92ce558SJens Axboe 		 */
967cbb7e577SJens Axboe 		ret = do_splice_from(pipe, out, &out_off, read_len,
968b92ce558SJens Axboe 				     flags & ~SPLICE_F_NONBLOCK);
969b92ce558SJens Axboe 		if (unlikely(ret < 0))
970b92ce558SJens Axboe 			goto out_release;
971b92ce558SJens Axboe 
972b92ce558SJens Axboe 		bytes += ret;
973b92ce558SJens Axboe 		len -= ret;
974b92ce558SJens Axboe 
975b92ce558SJens Axboe 		/*
976b92ce558SJens Axboe 		 * In nonblocking mode, if we got back a short read then
977b92ce558SJens Axboe 		 * that was due to either an IO error or due to the
978b92ce558SJens Axboe 		 * pagecache entry not being there. In the IO error case
979b92ce558SJens Axboe 		 * the _next_ splice attempt will produce a clean IO error
980b92ce558SJens Axboe 		 * return value (not a short read), so in both cases it's
981b92ce558SJens Axboe 		 * correct to break out of the loop here:
982b92ce558SJens Axboe 		 */
983b92ce558SJens Axboe 		if ((flags & SPLICE_F_NONBLOCK) && (read_len < max_read_len))
984b92ce558SJens Axboe 			break;
985b92ce558SJens Axboe 	}
986b92ce558SJens Axboe 
987b92ce558SJens Axboe 	pipe->nrbufs = pipe->curbuf = 0;
988b92ce558SJens Axboe 
989b92ce558SJens Axboe 	return bytes;
990b92ce558SJens Axboe 
991b92ce558SJens Axboe out_release:
992b92ce558SJens Axboe 	/*
993b92ce558SJens Axboe 	 * If we did an incomplete transfer we must release
994b92ce558SJens Axboe 	 * the pipe buffers in question:
995b92ce558SJens Axboe 	 */
996b92ce558SJens Axboe 	for (i = 0; i < PIPE_BUFFERS; i++) {
997b92ce558SJens Axboe 		struct pipe_buffer *buf = pipe->bufs + i;
998b92ce558SJens Axboe 
999b92ce558SJens Axboe 		if (buf->ops) {
1000b92ce558SJens Axboe 			buf->ops->release(pipe, buf);
1001b92ce558SJens Axboe 			buf->ops = NULL;
1002b92ce558SJens Axboe 		}
1003b92ce558SJens Axboe 	}
1004b92ce558SJens Axboe 	pipe->nrbufs = pipe->curbuf = 0;
1005b92ce558SJens Axboe 
1006b92ce558SJens Axboe 	/*
1007b92ce558SJens Axboe 	 * If we transferred some data, return the number of bytes:
1008b92ce558SJens Axboe 	 */
1009b92ce558SJens Axboe 	if (bytes > 0)
1010b92ce558SJens Axboe 		return bytes;
1011b92ce558SJens Axboe 
1012b92ce558SJens Axboe 	return ret;
1013b92ce558SJens Axboe }
1014b92ce558SJens Axboe 
1015b92ce558SJens Axboe EXPORT_SYMBOL(do_splice_direct);
1016b92ce558SJens Axboe 
101783f9135bSJens Axboe /*
101883f9135bSJens Axboe  * Determine where to splice to/from.
101983f9135bSJens Axboe  */
1020529565dcSIngo Molnar static long do_splice(struct file *in, loff_t __user *off_in,
1021529565dcSIngo Molnar 		      struct file *out, loff_t __user *off_out,
1022529565dcSIngo Molnar 		      size_t len, unsigned int flags)
10235274f052SJens Axboe {
10243a326a2cSIngo Molnar 	struct pipe_inode_info *pipe;
1025cbb7e577SJens Axboe 	loff_t offset, *off;
1026a4514ebdSJens Axboe 	long ret;
10275274f052SJens Axboe 
10283a326a2cSIngo Molnar 	pipe = in->f_dentry->d_inode->i_pipe;
1029529565dcSIngo Molnar 	if (pipe) {
1030529565dcSIngo Molnar 		if (off_in)
1031529565dcSIngo Molnar 			return -ESPIPE;
1032b92ce558SJens Axboe 		if (off_out) {
1033b92ce558SJens Axboe 			if (out->f_op->llseek == no_llseek)
1034b92ce558SJens Axboe 				return -EINVAL;
1035cbb7e577SJens Axboe 			if (copy_from_user(&offset, off_out, sizeof(loff_t)))
1036b92ce558SJens Axboe 				return -EFAULT;
1037cbb7e577SJens Axboe 			off = &offset;
1038cbb7e577SJens Axboe 		} else
1039cbb7e577SJens Axboe 			off = &out->f_pos;
1040529565dcSIngo Molnar 
1041a4514ebdSJens Axboe 		ret = do_splice_from(pipe, out, off, len, flags);
1042a4514ebdSJens Axboe 
1043a4514ebdSJens Axboe 		if (off_out && copy_to_user(off_out, off, sizeof(loff_t)))
1044a4514ebdSJens Axboe 			ret = -EFAULT;
1045a4514ebdSJens Axboe 
1046a4514ebdSJens Axboe 		return ret;
1047529565dcSIngo Molnar 	}
10485274f052SJens Axboe 
10493a326a2cSIngo Molnar 	pipe = out->f_dentry->d_inode->i_pipe;
1050529565dcSIngo Molnar 	if (pipe) {
1051529565dcSIngo Molnar 		if (off_out)
1052529565dcSIngo Molnar 			return -ESPIPE;
1053b92ce558SJens Axboe 		if (off_in) {
1054b92ce558SJens Axboe 			if (in->f_op->llseek == no_llseek)
1055b92ce558SJens Axboe 				return -EINVAL;
1056cbb7e577SJens Axboe 			if (copy_from_user(&offset, off_in, sizeof(loff_t)))
1057b92ce558SJens Axboe 				return -EFAULT;
1058cbb7e577SJens Axboe 			off = &offset;
1059cbb7e577SJens Axboe 		} else
1060cbb7e577SJens Axboe 			off = &in->f_pos;
1061529565dcSIngo Molnar 
1062a4514ebdSJens Axboe 		ret = do_splice_to(in, off, pipe, len, flags);
1063a4514ebdSJens Axboe 
1064a4514ebdSJens Axboe 		if (off_in && copy_to_user(off_in, off, sizeof(loff_t)))
1065a4514ebdSJens Axboe 			ret = -EFAULT;
1066a4514ebdSJens Axboe 
1067a4514ebdSJens Axboe 		return ret;
1068529565dcSIngo Molnar 	}
10695274f052SJens Axboe 
10705274f052SJens Axboe 	return -EINVAL;
10715274f052SJens Axboe }
10725274f052SJens Axboe 
1073912d35f8SJens Axboe /*
1074912d35f8SJens Axboe  * Map an iov into an array of pages and offset/length tupples. With the
1075912d35f8SJens Axboe  * partial_page structure, we can map several non-contiguous ranges into
1076912d35f8SJens Axboe  * our ones pages[] map instead of splitting that operation into pieces.
1077912d35f8SJens Axboe  * Could easily be exported as a generic helper for other users, in which
1078912d35f8SJens Axboe  * case one would probably want to add a 'max_nr_pages' parameter as well.
1079912d35f8SJens Axboe  */
1080912d35f8SJens Axboe static int get_iovec_page_array(const struct iovec __user *iov,
1081912d35f8SJens Axboe 				unsigned int nr_vecs, struct page **pages,
10827afa6fd0SJens Axboe 				struct partial_page *partial, int aligned)
1083912d35f8SJens Axboe {
1084912d35f8SJens Axboe 	int buffers = 0, error = 0;
1085912d35f8SJens Axboe 
1086912d35f8SJens Axboe 	/*
1087912d35f8SJens Axboe 	 * It's ok to take the mmap_sem for reading, even
1088912d35f8SJens Axboe 	 * across a "get_user()".
1089912d35f8SJens Axboe 	 */
1090912d35f8SJens Axboe 	down_read(&current->mm->mmap_sem);
1091912d35f8SJens Axboe 
1092912d35f8SJens Axboe 	while (nr_vecs) {
1093912d35f8SJens Axboe 		unsigned long off, npages;
1094912d35f8SJens Axboe 		void __user *base;
1095912d35f8SJens Axboe 		size_t len;
1096912d35f8SJens Axboe 		int i;
1097912d35f8SJens Axboe 
1098912d35f8SJens Axboe 		/*
1099912d35f8SJens Axboe 		 * Get user address base and length for this iovec.
1100912d35f8SJens Axboe 		 */
1101912d35f8SJens Axboe 		error = get_user(base, &iov->iov_base);
1102912d35f8SJens Axboe 		if (unlikely(error))
1103912d35f8SJens Axboe 			break;
1104912d35f8SJens Axboe 		error = get_user(len, &iov->iov_len);
1105912d35f8SJens Axboe 		if (unlikely(error))
1106912d35f8SJens Axboe 			break;
1107912d35f8SJens Axboe 
1108912d35f8SJens Axboe 		/*
1109912d35f8SJens Axboe 		 * Sanity check this iovec. 0 read succeeds.
1110912d35f8SJens Axboe 		 */
1111912d35f8SJens Axboe 		if (unlikely(!len))
1112912d35f8SJens Axboe 			break;
1113912d35f8SJens Axboe 		error = -EFAULT;
1114912d35f8SJens Axboe 		if (unlikely(!base))
1115912d35f8SJens Axboe 			break;
1116912d35f8SJens Axboe 
1117912d35f8SJens Axboe 		/*
1118912d35f8SJens Axboe 		 * Get this base offset and number of pages, then map
1119912d35f8SJens Axboe 		 * in the user pages.
1120912d35f8SJens Axboe 		 */
1121912d35f8SJens Axboe 		off = (unsigned long) base & ~PAGE_MASK;
11227afa6fd0SJens Axboe 
11237afa6fd0SJens Axboe 		/*
11247afa6fd0SJens Axboe 		 * If asked for alignment, the offset must be zero and the
11257afa6fd0SJens Axboe 		 * length a multiple of the PAGE_SIZE.
11267afa6fd0SJens Axboe 		 */
11277afa6fd0SJens Axboe 		error = -EINVAL;
11287afa6fd0SJens Axboe 		if (aligned && (off || len & ~PAGE_MASK))
11297afa6fd0SJens Axboe 			break;
11307afa6fd0SJens Axboe 
1131912d35f8SJens Axboe 		npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
1132912d35f8SJens Axboe 		if (npages > PIPE_BUFFERS - buffers)
1133912d35f8SJens Axboe 			npages = PIPE_BUFFERS - buffers;
1134912d35f8SJens Axboe 
1135912d35f8SJens Axboe 		error = get_user_pages(current, current->mm,
1136912d35f8SJens Axboe 				       (unsigned long) base, npages, 0, 0,
1137912d35f8SJens Axboe 				       &pages[buffers], NULL);
1138912d35f8SJens Axboe 
1139912d35f8SJens Axboe 		if (unlikely(error <= 0))
1140912d35f8SJens Axboe 			break;
1141912d35f8SJens Axboe 
1142912d35f8SJens Axboe 		/*
1143912d35f8SJens Axboe 		 * Fill this contiguous range into the partial page map.
1144912d35f8SJens Axboe 		 */
1145912d35f8SJens Axboe 		for (i = 0; i < error; i++) {
1146912d35f8SJens Axboe 			const int plen = min_t(size_t, len, PAGE_SIZE) - off;
1147912d35f8SJens Axboe 
1148912d35f8SJens Axboe 			partial[buffers].offset = off;
1149912d35f8SJens Axboe 			partial[buffers].len = plen;
1150912d35f8SJens Axboe 
1151912d35f8SJens Axboe 			off = 0;
1152912d35f8SJens Axboe 			len -= plen;
1153912d35f8SJens Axboe 			buffers++;
1154912d35f8SJens Axboe 		}
1155912d35f8SJens Axboe 
1156912d35f8SJens Axboe 		/*
1157912d35f8SJens Axboe 		 * We didn't complete this iov, stop here since it probably
1158912d35f8SJens Axboe 		 * means we have to move some of this into a pipe to
1159912d35f8SJens Axboe 		 * be able to continue.
1160912d35f8SJens Axboe 		 */
1161912d35f8SJens Axboe 		if (len)
1162912d35f8SJens Axboe 			break;
1163912d35f8SJens Axboe 
1164912d35f8SJens Axboe 		/*
1165912d35f8SJens Axboe 		 * Don't continue if we mapped fewer pages than we asked for,
1166912d35f8SJens Axboe 		 * or if we mapped the max number of pages that we have
1167912d35f8SJens Axboe 		 * room for.
1168912d35f8SJens Axboe 		 */
1169912d35f8SJens Axboe 		if (error < npages || buffers == PIPE_BUFFERS)
1170912d35f8SJens Axboe 			break;
1171912d35f8SJens Axboe 
1172912d35f8SJens Axboe 		nr_vecs--;
1173912d35f8SJens Axboe 		iov++;
1174912d35f8SJens Axboe 	}
1175912d35f8SJens Axboe 
1176912d35f8SJens Axboe 	up_read(&current->mm->mmap_sem);
1177912d35f8SJens Axboe 
1178912d35f8SJens Axboe 	if (buffers)
1179912d35f8SJens Axboe 		return buffers;
1180912d35f8SJens Axboe 
1181912d35f8SJens Axboe 	return error;
1182912d35f8SJens Axboe }
1183912d35f8SJens Axboe 
1184912d35f8SJens Axboe /*
1185912d35f8SJens Axboe  * vmsplice splices a user address range into a pipe. It can be thought of
1186912d35f8SJens Axboe  * as splice-from-memory, where the regular splice is splice-from-file (or
1187912d35f8SJens Axboe  * to file). In both cases the output is a pipe, naturally.
1188912d35f8SJens Axboe  *
1189912d35f8SJens Axboe  * Note that vmsplice only supports splicing _from_ user memory to a pipe,
1190912d35f8SJens Axboe  * not the other way around. Splicing from user memory is a simple operation
1191912d35f8SJens Axboe  * that can be supported without any funky alignment restrictions or nasty
1192912d35f8SJens Axboe  * vm tricks. We simply map in the user memory and fill them into a pipe.
1193912d35f8SJens Axboe  * The reverse isn't quite as easy, though. There are two possible solutions
1194912d35f8SJens Axboe  * for that:
1195912d35f8SJens Axboe  *
1196912d35f8SJens Axboe  *	- memcpy() the data internally, at which point we might as well just
1197912d35f8SJens Axboe  *	  do a regular read() on the buffer anyway.
1198912d35f8SJens Axboe  *	- Lots of nasty vm tricks, that are neither fast nor flexible (it
1199912d35f8SJens Axboe  *	  has restriction limitations on both ends of the pipe).
1200912d35f8SJens Axboe  *
1201912d35f8SJens Axboe  * Alas, it isn't here.
1202912d35f8SJens Axboe  *
1203912d35f8SJens Axboe  */
1204912d35f8SJens Axboe static long do_vmsplice(struct file *file, const struct iovec __user *iov,
1205912d35f8SJens Axboe 			unsigned long nr_segs, unsigned int flags)
1206912d35f8SJens Axboe {
1207912d35f8SJens Axboe 	struct pipe_inode_info *pipe = file->f_dentry->d_inode->i_pipe;
1208912d35f8SJens Axboe 	struct page *pages[PIPE_BUFFERS];
1209912d35f8SJens Axboe 	struct partial_page partial[PIPE_BUFFERS];
1210912d35f8SJens Axboe 	struct splice_pipe_desc spd = {
1211912d35f8SJens Axboe 		.pages = pages,
1212912d35f8SJens Axboe 		.partial = partial,
1213912d35f8SJens Axboe 		.flags = flags,
1214912d35f8SJens Axboe 		.ops = &user_page_pipe_buf_ops,
1215912d35f8SJens Axboe 	};
1216912d35f8SJens Axboe 
1217912d35f8SJens Axboe 	if (unlikely(!pipe))
1218912d35f8SJens Axboe 		return -EBADF;
1219912d35f8SJens Axboe 	if (unlikely(nr_segs > UIO_MAXIOV))
1220912d35f8SJens Axboe 		return -EINVAL;
1221912d35f8SJens Axboe 	else if (unlikely(!nr_segs))
1222912d35f8SJens Axboe 		return 0;
1223912d35f8SJens Axboe 
12247afa6fd0SJens Axboe 	spd.nr_pages = get_iovec_page_array(iov, nr_segs, pages, partial,
12257afa6fd0SJens Axboe 					    flags & SPLICE_F_GIFT);
1226912d35f8SJens Axboe 	if (spd.nr_pages <= 0)
1227912d35f8SJens Axboe 		return spd.nr_pages;
1228912d35f8SJens Axboe 
122900522fb4SJens Axboe 	return splice_to_pipe(pipe, &spd);
1230912d35f8SJens Axboe }
1231912d35f8SJens Axboe 
1232912d35f8SJens Axboe asmlinkage long sys_vmsplice(int fd, const struct iovec __user *iov,
1233912d35f8SJens Axboe 			     unsigned long nr_segs, unsigned int flags)
1234912d35f8SJens Axboe {
1235912d35f8SJens Axboe 	struct file *file;
1236912d35f8SJens Axboe 	long error;
1237912d35f8SJens Axboe 	int fput;
1238912d35f8SJens Axboe 
1239912d35f8SJens Axboe 	error = -EBADF;
1240912d35f8SJens Axboe 	file = fget_light(fd, &fput);
1241912d35f8SJens Axboe 	if (file) {
1242912d35f8SJens Axboe 		if (file->f_mode & FMODE_WRITE)
1243912d35f8SJens Axboe 			error = do_vmsplice(file, iov, nr_segs, flags);
1244912d35f8SJens Axboe 
1245912d35f8SJens Axboe 		fput_light(file, fput);
1246912d35f8SJens Axboe 	}
1247912d35f8SJens Axboe 
1248912d35f8SJens Axboe 	return error;
1249912d35f8SJens Axboe }
1250912d35f8SJens Axboe 
1251529565dcSIngo Molnar asmlinkage long sys_splice(int fd_in, loff_t __user *off_in,
1252529565dcSIngo Molnar 			   int fd_out, loff_t __user *off_out,
1253529565dcSIngo Molnar 			   size_t len, unsigned int flags)
12545274f052SJens Axboe {
12555274f052SJens Axboe 	long error;
12565274f052SJens Axboe 	struct file *in, *out;
12575274f052SJens Axboe 	int fput_in, fput_out;
12585274f052SJens Axboe 
12595274f052SJens Axboe 	if (unlikely(!len))
12605274f052SJens Axboe 		return 0;
12615274f052SJens Axboe 
12625274f052SJens Axboe 	error = -EBADF;
1263529565dcSIngo Molnar 	in = fget_light(fd_in, &fput_in);
12645274f052SJens Axboe 	if (in) {
12655274f052SJens Axboe 		if (in->f_mode & FMODE_READ) {
1266529565dcSIngo Molnar 			out = fget_light(fd_out, &fput_out);
12675274f052SJens Axboe 			if (out) {
12685274f052SJens Axboe 				if (out->f_mode & FMODE_WRITE)
1269529565dcSIngo Molnar 					error = do_splice(in, off_in,
1270529565dcSIngo Molnar 							  out, off_out,
1271529565dcSIngo Molnar 							  len, flags);
12725274f052SJens Axboe 				fput_light(out, fput_out);
12735274f052SJens Axboe 			}
12745274f052SJens Axboe 		}
12755274f052SJens Axboe 
12765274f052SJens Axboe 		fput_light(in, fput_in);
12775274f052SJens Axboe 	}
12785274f052SJens Axboe 
12795274f052SJens Axboe 	return error;
12805274f052SJens Axboe }
128170524490SJens Axboe 
128270524490SJens Axboe /*
128370524490SJens Axboe  * Link contents of ipipe to opipe.
128470524490SJens Axboe  */
128570524490SJens Axboe static int link_pipe(struct pipe_inode_info *ipipe,
128670524490SJens Axboe 		     struct pipe_inode_info *opipe,
128770524490SJens Axboe 		     size_t len, unsigned int flags)
128870524490SJens Axboe {
128970524490SJens Axboe 	struct pipe_buffer *ibuf, *obuf;
12902a27250eSJens Axboe 	int ret, do_wakeup, i, ipipe_first;
12912a27250eSJens Axboe 
12922a27250eSJens Axboe 	ret = do_wakeup = ipipe_first = 0;
129370524490SJens Axboe 
129470524490SJens Axboe 	/*
129570524490SJens Axboe 	 * Potential ABBA deadlock, work around it by ordering lock
129670524490SJens Axboe 	 * grabbing by inode address. Otherwise two different processes
129770524490SJens Axboe 	 * could deadlock (one doing tee from A -> B, the other from B -> A).
129870524490SJens Axboe 	 */
129970524490SJens Axboe 	if (ipipe->inode < opipe->inode) {
13002a27250eSJens Axboe 		ipipe_first = 1;
130170524490SJens Axboe 		mutex_lock(&ipipe->inode->i_mutex);
130270524490SJens Axboe 		mutex_lock(&opipe->inode->i_mutex);
130370524490SJens Axboe 	} else {
130470524490SJens Axboe 		mutex_lock(&opipe->inode->i_mutex);
130570524490SJens Axboe 		mutex_lock(&ipipe->inode->i_mutex);
130670524490SJens Axboe 	}
130770524490SJens Axboe 
130870524490SJens Axboe 	for (i = 0;; i++) {
130970524490SJens Axboe 		if (!opipe->readers) {
131070524490SJens Axboe 			send_sig(SIGPIPE, current, 0);
131170524490SJens Axboe 			if (!ret)
131270524490SJens Axboe 				ret = -EPIPE;
131370524490SJens Axboe 			break;
131470524490SJens Axboe 		}
131570524490SJens Axboe 		if (ipipe->nrbufs - i) {
131670524490SJens Axboe 			ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (PIPE_BUFFERS - 1));
131770524490SJens Axboe 
131870524490SJens Axboe 			/*
131970524490SJens Axboe 			 * If we have room, fill this buffer
132070524490SJens Axboe 			 */
132170524490SJens Axboe 			if (opipe->nrbufs < PIPE_BUFFERS) {
132270524490SJens Axboe 				int nbuf = (opipe->curbuf + opipe->nrbufs) & (PIPE_BUFFERS - 1);
132370524490SJens Axboe 
132470524490SJens Axboe 				/*
132570524490SJens Axboe 				 * Get a reference to this pipe buffer,
132670524490SJens Axboe 				 * so we can copy the contents over.
132770524490SJens Axboe 				 */
132870524490SJens Axboe 				ibuf->ops->get(ipipe, ibuf);
132970524490SJens Axboe 
133070524490SJens Axboe 				obuf = opipe->bufs + nbuf;
133170524490SJens Axboe 				*obuf = *ibuf;
133270524490SJens Axboe 
13337afa6fd0SJens Axboe 				/*
13347afa6fd0SJens Axboe 				 * Don't inherit the gift flag, we need to
13357afa6fd0SJens Axboe 				 * prevent multiple steals of this page.
13367afa6fd0SJens Axboe 				 */
13377afa6fd0SJens Axboe 				obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
13387afa6fd0SJens Axboe 
133970524490SJens Axboe 				if (obuf->len > len)
134070524490SJens Axboe 					obuf->len = len;
134170524490SJens Axboe 
134270524490SJens Axboe 				opipe->nrbufs++;
134370524490SJens Axboe 				do_wakeup = 1;
134470524490SJens Axboe 				ret += obuf->len;
134570524490SJens Axboe 				len -= obuf->len;
134670524490SJens Axboe 
134770524490SJens Axboe 				if (!len)
134870524490SJens Axboe 					break;
134970524490SJens Axboe 				if (opipe->nrbufs < PIPE_BUFFERS)
135070524490SJens Axboe 					continue;
135170524490SJens Axboe 			}
135270524490SJens Axboe 
135370524490SJens Axboe 			/*
135470524490SJens Axboe 			 * We have input available, but no output room.
13552a27250eSJens Axboe 			 * If we already copied data, return that. If we
13562a27250eSJens Axboe 			 * need to drop the opipe lock, it must be ordered
13572a27250eSJens Axboe 			 * last to avoid deadlocks.
135870524490SJens Axboe 			 */
13592a27250eSJens Axboe 			if ((flags & SPLICE_F_NONBLOCK) || !ipipe_first) {
136070524490SJens Axboe 				if (!ret)
136170524490SJens Axboe 					ret = -EAGAIN;
136270524490SJens Axboe 				break;
136370524490SJens Axboe 			}
136470524490SJens Axboe 			if (signal_pending(current)) {
136570524490SJens Axboe 				if (!ret)
136670524490SJens Axboe 					ret = -ERESTARTSYS;
136770524490SJens Axboe 				break;
136870524490SJens Axboe 			}
136970524490SJens Axboe 			if (do_wakeup) {
137070524490SJens Axboe 				smp_mb();
137170524490SJens Axboe 				if (waitqueue_active(&opipe->wait))
137270524490SJens Axboe 					wake_up_interruptible(&opipe->wait);
137370524490SJens Axboe 				kill_fasync(&opipe->fasync_readers, SIGIO, POLL_IN);
137470524490SJens Axboe 				do_wakeup = 0;
137570524490SJens Axboe 			}
137670524490SJens Axboe 
137770524490SJens Axboe 			opipe->waiting_writers++;
137870524490SJens Axboe 			pipe_wait(opipe);
137970524490SJens Axboe 			opipe->waiting_writers--;
138070524490SJens Axboe 			continue;
138170524490SJens Axboe 		}
138270524490SJens Axboe 
138370524490SJens Axboe 		/*
138470524490SJens Axboe 		 * No input buffers, do the usual checks for available
138570524490SJens Axboe 		 * writers and blocking and wait if necessary
138670524490SJens Axboe 		 */
138770524490SJens Axboe 		if (!ipipe->writers)
138870524490SJens Axboe 			break;
138970524490SJens Axboe 		if (!ipipe->waiting_writers) {
139070524490SJens Axboe 			if (ret)
139170524490SJens Axboe 				break;
139270524490SJens Axboe 		}
13932a27250eSJens Axboe 		/*
13942a27250eSJens Axboe 		 * pipe_wait() drops the ipipe mutex. To avoid deadlocks
13952a27250eSJens Axboe 		 * with another process, we can only safely do that if
13962a27250eSJens Axboe 		 * the ipipe lock is ordered last.
13972a27250eSJens Axboe 		 */
13982a27250eSJens Axboe 		if ((flags & SPLICE_F_NONBLOCK) || ipipe_first) {
139970524490SJens Axboe 			if (!ret)
140070524490SJens Axboe 				ret = -EAGAIN;
140170524490SJens Axboe 			break;
140270524490SJens Axboe 		}
140370524490SJens Axboe 		if (signal_pending(current)) {
140470524490SJens Axboe 			if (!ret)
140570524490SJens Axboe 				ret = -ERESTARTSYS;
140670524490SJens Axboe 			break;
140770524490SJens Axboe 		}
140870524490SJens Axboe 
140970524490SJens Axboe 		if (waitqueue_active(&ipipe->wait))
141070524490SJens Axboe 			wake_up_interruptible_sync(&ipipe->wait);
141170524490SJens Axboe 		kill_fasync(&ipipe->fasync_writers, SIGIO, POLL_OUT);
141270524490SJens Axboe 
141370524490SJens Axboe 		pipe_wait(ipipe);
141470524490SJens Axboe 	}
141570524490SJens Axboe 
141670524490SJens Axboe 	mutex_unlock(&ipipe->inode->i_mutex);
141770524490SJens Axboe 	mutex_unlock(&opipe->inode->i_mutex);
141870524490SJens Axboe 
141970524490SJens Axboe 	if (do_wakeup) {
142070524490SJens Axboe 		smp_mb();
142170524490SJens Axboe 		if (waitqueue_active(&opipe->wait))
142270524490SJens Axboe 			wake_up_interruptible(&opipe->wait);
142370524490SJens Axboe 		kill_fasync(&opipe->fasync_readers, SIGIO, POLL_IN);
142470524490SJens Axboe 	}
142570524490SJens Axboe 
142670524490SJens Axboe 	return ret;
142770524490SJens Axboe }
142870524490SJens Axboe 
142970524490SJens Axboe /*
143070524490SJens Axboe  * This is a tee(1) implementation that works on pipes. It doesn't copy
143170524490SJens Axboe  * any data, it simply references the 'in' pages on the 'out' pipe.
143270524490SJens Axboe  * The 'flags' used are the SPLICE_F_* variants, currently the only
143370524490SJens Axboe  * applicable one is SPLICE_F_NONBLOCK.
143470524490SJens Axboe  */
143570524490SJens Axboe static long do_tee(struct file *in, struct file *out, size_t len,
143670524490SJens Axboe 		   unsigned int flags)
143770524490SJens Axboe {
143870524490SJens Axboe 	struct pipe_inode_info *ipipe = in->f_dentry->d_inode->i_pipe;
143970524490SJens Axboe 	struct pipe_inode_info *opipe = out->f_dentry->d_inode->i_pipe;
144070524490SJens Axboe 
144170524490SJens Axboe 	/*
144270524490SJens Axboe 	 * Link ipipe to the two output pipes, consuming as we go along.
144370524490SJens Axboe 	 */
144470524490SJens Axboe 	if (ipipe && opipe)
144570524490SJens Axboe 		return link_pipe(ipipe, opipe, len, flags);
144670524490SJens Axboe 
144770524490SJens Axboe 	return -EINVAL;
144870524490SJens Axboe }
144970524490SJens Axboe 
145070524490SJens Axboe asmlinkage long sys_tee(int fdin, int fdout, size_t len, unsigned int flags)
145170524490SJens Axboe {
145270524490SJens Axboe 	struct file *in;
145370524490SJens Axboe 	int error, fput_in;
145470524490SJens Axboe 
145570524490SJens Axboe 	if (unlikely(!len))
145670524490SJens Axboe 		return 0;
145770524490SJens Axboe 
145870524490SJens Axboe 	error = -EBADF;
145970524490SJens Axboe 	in = fget_light(fdin, &fput_in);
146070524490SJens Axboe 	if (in) {
146170524490SJens Axboe 		if (in->f_mode & FMODE_READ) {
146270524490SJens Axboe 			int fput_out;
146370524490SJens Axboe 			struct file *out = fget_light(fdout, &fput_out);
146470524490SJens Axboe 
146570524490SJens Axboe 			if (out) {
146670524490SJens Axboe 				if (out->f_mode & FMODE_WRITE)
146770524490SJens Axboe 					error = do_tee(in, out, len, flags);
146870524490SJens Axboe 				fput_light(out, fput_out);
146970524490SJens Axboe 			}
147070524490SJens Axboe 		}
147170524490SJens Axboe  		fput_light(in, fput_in);
147270524490SJens Axboe  	}
147370524490SJens Axboe 
147470524490SJens Axboe 	return error;
147570524490SJens Axboe }
1476