xref: /openbmc/linux/fs/splice.c (revision eb645a24)
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 
813e7ee3e7SJens Axboe 	buf->flags |= PIPE_BUF_FLAG_STOLEN | 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;
903e7ee3e7SJens Axboe 	buf->flags &= ~(PIPE_BUF_FLAG_STOLEN | PIPE_BUF_FLAG_LRU);
915274f052SJens Axboe }
925274f052SJens Axboe 
935274f052SJens Axboe static void *page_cache_pipe_buf_map(struct file *file,
945274f052SJens Axboe 				     struct pipe_inode_info *info,
955274f052SJens Axboe 				     struct pipe_buffer *buf)
965274f052SJens Axboe {
975274f052SJens Axboe 	struct page *page = buf->page;
9849d0b21bSJens Axboe 	int err;
995274f052SJens Axboe 
1005274f052SJens Axboe 	if (!PageUptodate(page)) {
10149d0b21bSJens Axboe 		lock_page(page);
1025274f052SJens Axboe 
10349d0b21bSJens Axboe 		/*
10449d0b21bSJens Axboe 		 * Page got truncated/unhashed. This will cause a 0-byte
10573d62d83SIngo Molnar 		 * splice, if this is the first page.
10649d0b21bSJens Axboe 		 */
1075274f052SJens Axboe 		if (!page->mapping) {
10849d0b21bSJens Axboe 			err = -ENODATA;
10949d0b21bSJens Axboe 			goto error;
1105274f052SJens Axboe 		}
1115274f052SJens Axboe 
11249d0b21bSJens Axboe 		/*
11373d62d83SIngo Molnar 		 * Uh oh, read-error from disk.
11449d0b21bSJens Axboe 		 */
11549d0b21bSJens Axboe 		if (!PageUptodate(page)) {
11649d0b21bSJens Axboe 			err = -EIO;
11749d0b21bSJens Axboe 			goto error;
11849d0b21bSJens Axboe 		}
11949d0b21bSJens Axboe 
12049d0b21bSJens Axboe 		/*
12173d62d83SIngo Molnar 		 * Page is ok afterall, fall through to mapping.
12249d0b21bSJens Axboe 		 */
12349d0b21bSJens Axboe 		unlock_page(page);
12449d0b21bSJens Axboe 	}
12549d0b21bSJens Axboe 
12649d0b21bSJens Axboe 	return kmap(page);
12749d0b21bSJens Axboe error:
12849d0b21bSJens Axboe 	unlock_page(page);
12949d0b21bSJens Axboe 	return ERR_PTR(err);
1305274f052SJens Axboe }
1315274f052SJens Axboe 
1325274f052SJens Axboe static void page_cache_pipe_buf_unmap(struct pipe_inode_info *info,
1335274f052SJens Axboe 				      struct pipe_buffer *buf)
1345274f052SJens Axboe {
1355274f052SJens Axboe 	kunmap(buf->page);
1365274f052SJens Axboe }
1375274f052SJens Axboe 
138912d35f8SJens Axboe static void *user_page_pipe_buf_map(struct file *file,
139912d35f8SJens Axboe 				    struct pipe_inode_info *pipe,
140912d35f8SJens Axboe 				    struct pipe_buffer *buf)
141912d35f8SJens Axboe {
142912d35f8SJens Axboe 	return kmap(buf->page);
143912d35f8SJens Axboe }
144912d35f8SJens Axboe 
145912d35f8SJens Axboe static void user_page_pipe_buf_unmap(struct pipe_inode_info *pipe,
146912d35f8SJens Axboe 				     struct pipe_buffer *buf)
147912d35f8SJens Axboe {
148912d35f8SJens Axboe 	kunmap(buf->page);
149912d35f8SJens Axboe }
150912d35f8SJens Axboe 
15170524490SJens Axboe static void page_cache_pipe_buf_get(struct pipe_inode_info *info,
15270524490SJens Axboe 				    struct pipe_buffer *buf)
15370524490SJens Axboe {
15470524490SJens Axboe 	page_cache_get(buf->page);
15570524490SJens Axboe }
15670524490SJens Axboe 
1575274f052SJens Axboe static struct pipe_buf_operations page_cache_pipe_buf_ops = {
1585274f052SJens Axboe 	.can_merge = 0,
1595274f052SJens Axboe 	.map = page_cache_pipe_buf_map,
1605274f052SJens Axboe 	.unmap = page_cache_pipe_buf_unmap,
1615274f052SJens Axboe 	.release = page_cache_pipe_buf_release,
1625abc97aaSJens Axboe 	.steal = page_cache_pipe_buf_steal,
16370524490SJens Axboe 	.get = page_cache_pipe_buf_get,
1645274f052SJens Axboe };
1655274f052SJens Axboe 
166912d35f8SJens Axboe static int user_page_pipe_buf_steal(struct pipe_inode_info *pipe,
167912d35f8SJens Axboe 				    struct pipe_buffer *buf)
168912d35f8SJens Axboe {
169912d35f8SJens Axboe 	return 1;
170912d35f8SJens Axboe }
171912d35f8SJens Axboe 
172912d35f8SJens Axboe static struct pipe_buf_operations user_page_pipe_buf_ops = {
173912d35f8SJens Axboe 	.can_merge = 0,
174912d35f8SJens Axboe 	.map = user_page_pipe_buf_map,
175912d35f8SJens Axboe 	.unmap = user_page_pipe_buf_unmap,
176912d35f8SJens Axboe 	.release = page_cache_pipe_buf_release,
177912d35f8SJens Axboe 	.steal = user_page_pipe_buf_steal,
178912d35f8SJens Axboe 	.get = page_cache_pipe_buf_get,
179912d35f8SJens Axboe };
180912d35f8SJens Axboe 
18183f9135bSJens Axboe /*
18283f9135bSJens Axboe  * Pipe output worker. This sets up our pipe format with the page cache
18383f9135bSJens Axboe  * pipe buffer operations. Otherwise very similar to the regular pipe_writev().
18483f9135bSJens Axboe  */
18500522fb4SJens Axboe static ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
186912d35f8SJens Axboe 			      struct splice_pipe_desc *spd)
1875274f052SJens Axboe {
188912d35f8SJens Axboe 	int ret, do_wakeup, page_nr;
1895274f052SJens Axboe 
1905274f052SJens Axboe 	ret = 0;
1915274f052SJens Axboe 	do_wakeup = 0;
192912d35f8SJens Axboe 	page_nr = 0;
1935274f052SJens Axboe 
1943a326a2cSIngo Molnar 	if (pipe->inode)
1953a326a2cSIngo Molnar 		mutex_lock(&pipe->inode->i_mutex);
1965274f052SJens Axboe 
1975274f052SJens Axboe 	for (;;) {
1983a326a2cSIngo Molnar 		if (!pipe->readers) {
1995274f052SJens Axboe 			send_sig(SIGPIPE, current, 0);
2005274f052SJens Axboe 			if (!ret)
2015274f052SJens Axboe 				ret = -EPIPE;
2025274f052SJens Axboe 			break;
2035274f052SJens Axboe 		}
2045274f052SJens Axboe 
2056f767b04SJens Axboe 		if (pipe->nrbufs < PIPE_BUFFERS) {
2066f767b04SJens Axboe 			int newbuf = (pipe->curbuf + pipe->nrbufs) & (PIPE_BUFFERS - 1);
2073a326a2cSIngo Molnar 			struct pipe_buffer *buf = pipe->bufs + newbuf;
2085274f052SJens Axboe 
209912d35f8SJens Axboe 			buf->page = spd->pages[page_nr];
210912d35f8SJens Axboe 			buf->offset = spd->partial[page_nr].offset;
211912d35f8SJens Axboe 			buf->len = spd->partial[page_nr].len;
212912d35f8SJens Axboe 			buf->ops = spd->ops;
2136f767b04SJens Axboe 			pipe->nrbufs++;
214912d35f8SJens Axboe 			page_nr++;
215912d35f8SJens Axboe 			ret += buf->len;
216912d35f8SJens Axboe 
2176f767b04SJens Axboe 			if (pipe->inode)
2185274f052SJens Axboe 				do_wakeup = 1;
2195274f052SJens Axboe 
220912d35f8SJens Axboe 			if (!--spd->nr_pages)
2215274f052SJens Axboe 				break;
2226f767b04SJens Axboe 			if (pipe->nrbufs < PIPE_BUFFERS)
2235274f052SJens Axboe 				continue;
2245274f052SJens Axboe 
2255274f052SJens Axboe 			break;
2265274f052SJens Axboe 		}
2275274f052SJens Axboe 
228912d35f8SJens Axboe 		if (spd->flags & SPLICE_F_NONBLOCK) {
22929e35094SLinus Torvalds 			if (!ret)
23029e35094SLinus Torvalds 				ret = -EAGAIN;
23129e35094SLinus Torvalds 			break;
23229e35094SLinus Torvalds 		}
23329e35094SLinus Torvalds 
2345274f052SJens Axboe 		if (signal_pending(current)) {
2355274f052SJens Axboe 			if (!ret)
2365274f052SJens Axboe 				ret = -ERESTARTSYS;
2375274f052SJens Axboe 			break;
2385274f052SJens Axboe 		}
2395274f052SJens Axboe 
2405274f052SJens Axboe 		if (do_wakeup) {
241c0bd1f65SJens Axboe 			smp_mb();
2423a326a2cSIngo Molnar 			if (waitqueue_active(&pipe->wait))
2433a326a2cSIngo Molnar 				wake_up_interruptible_sync(&pipe->wait);
2443a326a2cSIngo Molnar 			kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
2455274f052SJens Axboe 			do_wakeup = 0;
2465274f052SJens Axboe 		}
2475274f052SJens Axboe 
2483a326a2cSIngo Molnar 		pipe->waiting_writers++;
2493a326a2cSIngo Molnar 		pipe_wait(pipe);
2503a326a2cSIngo Molnar 		pipe->waiting_writers--;
2515274f052SJens Axboe 	}
2525274f052SJens Axboe 
2533a326a2cSIngo Molnar 	if (pipe->inode)
2543a326a2cSIngo Molnar 		mutex_unlock(&pipe->inode->i_mutex);
2555274f052SJens Axboe 
2565274f052SJens Axboe 	if (do_wakeup) {
257c0bd1f65SJens Axboe 		smp_mb();
2583a326a2cSIngo Molnar 		if (waitqueue_active(&pipe->wait))
2593a326a2cSIngo Molnar 			wake_up_interruptible(&pipe->wait);
2603a326a2cSIngo Molnar 		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
2615274f052SJens Axboe 	}
2625274f052SJens Axboe 
263912d35f8SJens Axboe 	while (page_nr < spd->nr_pages)
264912d35f8SJens Axboe 		page_cache_release(spd->pages[page_nr++]);
2655274f052SJens Axboe 
2665274f052SJens Axboe 	return ret;
2675274f052SJens Axboe }
2685274f052SJens Axboe 
2693a326a2cSIngo Molnar static int
270cbb7e577SJens Axboe __generic_file_splice_read(struct file *in, loff_t *ppos,
271cbb7e577SJens Axboe 			   struct pipe_inode_info *pipe, size_t len,
272cbb7e577SJens Axboe 			   unsigned int flags)
2735274f052SJens Axboe {
2745274f052SJens Axboe 	struct address_space *mapping = in->f_mapping;
275912d35f8SJens Axboe 	unsigned int loff, nr_pages;
27616c523ddSJens Axboe 	struct page *pages[PIPE_BUFFERS];
277912d35f8SJens Axboe 	struct partial_page partial[PIPE_BUFFERS];
2785274f052SJens Axboe 	struct page *page;
27991ad66efSJens Axboe 	pgoff_t index, end_index;
28091ad66efSJens Axboe 	loff_t isize;
281912d35f8SJens Axboe 	size_t total_len;
282912d35f8SJens Axboe 	int error;
283912d35f8SJens Axboe 	struct splice_pipe_desc spd = {
284912d35f8SJens Axboe 		.pages = pages,
285912d35f8SJens Axboe 		.partial = partial,
286912d35f8SJens Axboe 		.flags = flags,
287912d35f8SJens Axboe 		.ops = &page_cache_pipe_buf_ops,
288912d35f8SJens Axboe 	};
2895274f052SJens Axboe 
290cbb7e577SJens Axboe 	index = *ppos >> PAGE_CACHE_SHIFT;
291912d35f8SJens Axboe 	loff = *ppos & ~PAGE_CACHE_MASK;
292912d35f8SJens Axboe 	nr_pages = (len + loff + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
2935274f052SJens Axboe 
2945274f052SJens Axboe 	if (nr_pages > PIPE_BUFFERS)
2955274f052SJens Axboe 		nr_pages = PIPE_BUFFERS;
2965274f052SJens Axboe 
2975274f052SJens Axboe 	/*
29873d62d83SIngo Molnar 	 * Initiate read-ahead on this page range. however, don't call into
2990b749ce3SJens Axboe 	 * read-ahead if this is a non-zero offset (we are likely doing small
3000b749ce3SJens Axboe 	 * chunk splice and the page is already there) for a single page.
3015274f052SJens Axboe 	 */
302eb645a24SJens Axboe 	if (!loff || nr_pages > 1)
303eb645a24SJens Axboe 		page_cache_readahead(mapping, &in->f_ra, in, index, nr_pages);
3045274f052SJens Axboe 
3055274f052SJens Axboe 	/*
30673d62d83SIngo Molnar 	 * Now fill in the holes:
3075274f052SJens Axboe 	 */
3087480a904SJens Axboe 	error = 0;
309912d35f8SJens Axboe 	total_len = 0;
310912d35f8SJens Axboe 	for (spd.nr_pages = 0; spd.nr_pages < nr_pages; spd.nr_pages++, index++) {
31182aa5d61SJens Axboe 		unsigned int this_len;
31282aa5d61SJens Axboe 
31382aa5d61SJens Axboe 		if (!len)
31482aa5d61SJens Axboe 			break;
31582aa5d61SJens Axboe 
31682aa5d61SJens Axboe 		/*
31782aa5d61SJens Axboe 		 * this_len is the max we'll use from this page
31882aa5d61SJens Axboe 		 */
319ba5f5d90SAndrew Morton 		this_len = min_t(unsigned long, len, PAGE_CACHE_SIZE - loff);
3207480a904SJens Axboe find_page:
3215274f052SJens Axboe 		/*
3227480a904SJens Axboe 		 * lookup the page for this index
3235274f052SJens Axboe 		 */
3247480a904SJens Axboe 		page = find_get_page(mapping, index);
3257480a904SJens Axboe 		if (!page) {
3267480a904SJens Axboe 			/*
3277480a904SJens Axboe 			 * page didn't exist, allocate one
3287480a904SJens Axboe 			 */
3297480a904SJens Axboe 			page = page_cache_alloc_cold(mapping);
3305274f052SJens Axboe 			if (!page)
3315274f052SJens Axboe 				break;
3325274f052SJens Axboe 
3337480a904SJens Axboe 			error = add_to_page_cache_lru(page, mapping, index,
3347480a904SJens Axboe 						mapping_gfp_mask(mapping));
3355274f052SJens Axboe 			if (unlikely(error)) {
3365274f052SJens Axboe 				page_cache_release(page);
3375274f052SJens Axboe 				break;
3385274f052SJens Axboe 			}
3397480a904SJens Axboe 
3407480a904SJens Axboe 			goto readpage;
3415274f052SJens Axboe 		}
3427480a904SJens Axboe 
3437480a904SJens Axboe 		/*
3447480a904SJens Axboe 		 * If the page isn't uptodate, we may need to start io on it
3457480a904SJens Axboe 		 */
3467480a904SJens Axboe 		if (!PageUptodate(page)) {
347c4f895cbSJens Axboe 			/*
348c4f895cbSJens Axboe 			 * If in nonblock mode then dont block on waiting
349c4f895cbSJens Axboe 			 * for an in-flight io page
350c4f895cbSJens Axboe 			 */
351c4f895cbSJens Axboe 			if (flags & SPLICE_F_NONBLOCK)
352c4f895cbSJens Axboe 				break;
353c4f895cbSJens Axboe 
3547480a904SJens Axboe 			lock_page(page);
3557480a904SJens Axboe 
3567480a904SJens Axboe 			/*
3577480a904SJens Axboe 			 * page was truncated, stop here. if this isn't the
3587480a904SJens Axboe 			 * first page, we'll just complete what we already
3597480a904SJens Axboe 			 * added
3607480a904SJens Axboe 			 */
3617480a904SJens Axboe 			if (!page->mapping) {
3627480a904SJens Axboe 				unlock_page(page);
3637480a904SJens Axboe 				page_cache_release(page);
3647480a904SJens Axboe 				break;
3657480a904SJens Axboe 			}
3667480a904SJens Axboe 			/*
3677480a904SJens Axboe 			 * page was already under io and is now done, great
3687480a904SJens Axboe 			 */
3697480a904SJens Axboe 			if (PageUptodate(page)) {
3707480a904SJens Axboe 				unlock_page(page);
3717480a904SJens Axboe 				goto fill_it;
3727480a904SJens Axboe 			}
3737480a904SJens Axboe 
3747480a904SJens Axboe readpage:
3757480a904SJens Axboe 			/*
3767480a904SJens Axboe 			 * need to read in the page
3777480a904SJens Axboe 			 */
3787480a904SJens Axboe 			error = mapping->a_ops->readpage(in, page);
3797480a904SJens Axboe 
3807480a904SJens Axboe 			if (unlikely(error)) {
3817480a904SJens Axboe 				page_cache_release(page);
3827480a904SJens Axboe 				if (error == AOP_TRUNCATED_PAGE)
3837480a904SJens Axboe 					goto find_page;
3847480a904SJens Axboe 				break;
3857480a904SJens Axboe 			}
38691ad66efSJens Axboe 
38791ad66efSJens Axboe 			/*
38891ad66efSJens Axboe 			 * i_size must be checked after ->readpage().
38991ad66efSJens Axboe 			 */
39091ad66efSJens Axboe 			isize = i_size_read(mapping->host);
39191ad66efSJens Axboe 			end_index = (isize - 1) >> PAGE_CACHE_SHIFT;
39291ad66efSJens Axboe 			if (unlikely(!isize || index > end_index)) {
39391ad66efSJens Axboe 				page_cache_release(page);
39491ad66efSJens Axboe 				break;
39591ad66efSJens Axboe 			}
39691ad66efSJens Axboe 
39791ad66efSJens Axboe 			/*
39891ad66efSJens Axboe 			 * if this is the last page, see if we need to shrink
39991ad66efSJens Axboe 			 * the length and stop
40091ad66efSJens Axboe 			 */
40191ad66efSJens Axboe 			if (end_index == index) {
40291ad66efSJens Axboe 				loff = PAGE_CACHE_SIZE - (isize & ~PAGE_CACHE_MASK);
403912d35f8SJens Axboe 				if (total_len + loff > isize) {
40491ad66efSJens Axboe 					page_cache_release(page);
40591ad66efSJens Axboe 					break;
40691ad66efSJens Axboe 				}
40791ad66efSJens Axboe 				/*
40891ad66efSJens Axboe 				 * force quit after adding this page
40991ad66efSJens Axboe 				 */
410912d35f8SJens Axboe 				nr_pages = spd.nr_pages;
41182aa5d61SJens Axboe 				this_len = min(this_len, loff);
412912d35f8SJens Axboe 				loff = 0;
41391ad66efSJens Axboe 			}
4147480a904SJens Axboe 		}
4157480a904SJens Axboe fill_it:
416912d35f8SJens Axboe 		pages[spd.nr_pages] = page;
417912d35f8SJens Axboe 		partial[spd.nr_pages].offset = loff;
418912d35f8SJens Axboe 		partial[spd.nr_pages].len = this_len;
41982aa5d61SJens Axboe 		len -= this_len;
420912d35f8SJens Axboe 		total_len += this_len;
42191ad66efSJens Axboe 		loff = 0;
4225274f052SJens Axboe 	}
4235274f052SJens Axboe 
424912d35f8SJens Axboe 	if (spd.nr_pages)
42500522fb4SJens Axboe 		return splice_to_pipe(pipe, &spd);
42616c523ddSJens Axboe 
4277480a904SJens Axboe 	return error;
4285274f052SJens Axboe }
4295274f052SJens Axboe 
43083f9135bSJens Axboe /**
43183f9135bSJens Axboe  * generic_file_splice_read - splice data from file to a pipe
43283f9135bSJens Axboe  * @in:		file to splice from
43383f9135bSJens Axboe  * @pipe:	pipe to splice to
43483f9135bSJens Axboe  * @len:	number of bytes to splice
43583f9135bSJens Axboe  * @flags:	splice modifier flags
43683f9135bSJens Axboe  *
43783f9135bSJens Axboe  * Will read pages from given file and fill them into a pipe.
43883f9135bSJens Axboe  */
439cbb7e577SJens Axboe ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
440cbb7e577SJens Axboe 				 struct pipe_inode_info *pipe, size_t len,
441cbb7e577SJens Axboe 				 unsigned int flags)
4425274f052SJens Axboe {
4435274f052SJens Axboe 	ssize_t spliced;
4445274f052SJens Axboe 	int ret;
4455274f052SJens Axboe 
4465274f052SJens Axboe 	ret = 0;
4475274f052SJens Axboe 	spliced = 0;
4483a326a2cSIngo Molnar 
4495274f052SJens Axboe 	while (len) {
450cbb7e577SJens Axboe 		ret = __generic_file_splice_read(in, ppos, pipe, len, flags);
4515274f052SJens Axboe 
452c4f895cbSJens Axboe 		if (ret < 0)
4535274f052SJens Axboe 			break;
454c4f895cbSJens Axboe 		else if (!ret) {
455c4f895cbSJens Axboe 			if (spliced)
456c4f895cbSJens Axboe 				break;
457c4f895cbSJens Axboe 			if (flags & SPLICE_F_NONBLOCK) {
458c4f895cbSJens Axboe 				ret = -EAGAIN;
459c4f895cbSJens Axboe 				break;
460c4f895cbSJens Axboe 			}
461c4f895cbSJens Axboe 		}
4625274f052SJens Axboe 
463cbb7e577SJens Axboe 		*ppos += ret;
4645274f052SJens Axboe 		len -= ret;
4655274f052SJens Axboe 		spliced += ret;
4665274f052SJens Axboe 	}
4675274f052SJens Axboe 
4685274f052SJens Axboe 	if (spliced)
4695274f052SJens Axboe 		return spliced;
4705274f052SJens Axboe 
4715274f052SJens Axboe 	return ret;
4725274f052SJens Axboe }
4735274f052SJens Axboe 
474059a8f37SJens Axboe EXPORT_SYMBOL(generic_file_splice_read);
475059a8f37SJens Axboe 
4765274f052SJens Axboe /*
4774f6f0bd2SJens Axboe  * Send 'sd->len' bytes to socket from 'sd->file' at position 'sd->pos'
478016b661eSJens Axboe  * using sendpage(). Return the number of bytes sent.
4795274f052SJens Axboe  */
4805274f052SJens Axboe static int pipe_to_sendpage(struct pipe_inode_info *info,
4815274f052SJens Axboe 			    struct pipe_buffer *buf, struct splice_desc *sd)
4825274f052SJens Axboe {
4835274f052SJens Axboe 	struct file *file = sd->file;
4845274f052SJens Axboe 	loff_t pos = sd->pos;
4855274f052SJens Axboe 	ssize_t ret;
4865274f052SJens Axboe 	void *ptr;
487b2b39fa4SJens Axboe 	int more;
4885274f052SJens Axboe 
4895274f052SJens Axboe 	/*
49073d62d83SIngo Molnar 	 * Sub-optimal, but we are limited by the pipe ->map. We don't
4915274f052SJens Axboe 	 * need a kmap'ed buffer here, we just want to make sure we
4925274f052SJens Axboe 	 * have the page pinned if the pipe page originates from the
49373d62d83SIngo Molnar 	 * page cache.
4945274f052SJens Axboe 	 */
4955274f052SJens Axboe 	ptr = buf->ops->map(file, info, buf);
4965274f052SJens Axboe 	if (IS_ERR(ptr))
4975274f052SJens Axboe 		return PTR_ERR(ptr);
4985274f052SJens Axboe 
499b2b39fa4SJens Axboe 	more = (sd->flags & SPLICE_F_MORE) || sd->len < sd->total_len;
5005274f052SJens Axboe 
501016b661eSJens Axboe 	ret = file->f_op->sendpage(file, buf->page, buf->offset, sd->len,
502016b661eSJens Axboe 				   &pos, more);
5035274f052SJens Axboe 
5045274f052SJens Axboe 	buf->ops->unmap(info, buf);
505016b661eSJens Axboe 	return ret;
5065274f052SJens Axboe }
5075274f052SJens Axboe 
5085274f052SJens Axboe /*
5095274f052SJens Axboe  * This is a little more tricky than the file -> pipe splicing. There are
5105274f052SJens Axboe  * basically three cases:
5115274f052SJens Axboe  *
5125274f052SJens Axboe  *	- Destination page already exists in the address space and there
5135274f052SJens Axboe  *	  are users of it. For that case we have no other option that
5145274f052SJens Axboe  *	  copying the data. Tough luck.
5155274f052SJens Axboe  *	- Destination page already exists in the address space, but there
5165274f052SJens Axboe  *	  are no users of it. Make sure it's uptodate, then drop it. Fall
5175274f052SJens Axboe  *	  through to last case.
5185274f052SJens Axboe  *	- Destination page does not exist, we can add the pipe page to
5195274f052SJens Axboe  *	  the page cache and avoid the copy.
5205274f052SJens Axboe  *
52183f9135bSJens Axboe  * If asked to move pages to the output file (SPLICE_F_MOVE is set in
52283f9135bSJens Axboe  * sd->flags), we attempt to migrate pages from the pipe to the output
52383f9135bSJens Axboe  * file address space page cache. This is possible if no one else has
52483f9135bSJens Axboe  * the pipe page referenced outside of the pipe and page cache. If
52583f9135bSJens Axboe  * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create
52683f9135bSJens Axboe  * a new page in the output file page cache and fill/dirty that.
5275274f052SJens Axboe  */
5285274f052SJens Axboe static int pipe_to_file(struct pipe_inode_info *info, struct pipe_buffer *buf,
5295274f052SJens Axboe 			struct splice_desc *sd)
5305274f052SJens Axboe {
5315274f052SJens Axboe 	struct file *file = sd->file;
5325274f052SJens Axboe 	struct address_space *mapping = file->f_mapping;
5333e7ee3e7SJens Axboe 	gfp_t gfp_mask = mapping_gfp_mask(mapping);
534016b661eSJens Axboe 	unsigned int offset, this_len;
5355274f052SJens Axboe 	struct page *page;
5365274f052SJens Axboe 	pgoff_t index;
5375abc97aaSJens Axboe 	char *src;
5383e7ee3e7SJens Axboe 	int ret;
5395274f052SJens Axboe 
5405274f052SJens Axboe 	/*
54149d0b21bSJens Axboe 	 * make sure the data in this buffer is uptodate
5425274f052SJens Axboe 	 */
5435274f052SJens Axboe 	src = buf->ops->map(file, info, buf);
5445274f052SJens Axboe 	if (IS_ERR(src))
5455274f052SJens Axboe 		return PTR_ERR(src);
5465274f052SJens Axboe 
5475274f052SJens Axboe 	index = sd->pos >> PAGE_CACHE_SHIFT;
5485274f052SJens Axboe 	offset = sd->pos & ~PAGE_CACHE_MASK;
5495274f052SJens Axboe 
550016b661eSJens Axboe 	this_len = sd->len;
551016b661eSJens Axboe 	if (this_len + offset > PAGE_CACHE_SIZE)
552016b661eSJens Axboe 		this_len = PAGE_CACHE_SIZE - offset;
553016b661eSJens Axboe 
5545abc97aaSJens Axboe 	/*
55573d62d83SIngo Molnar 	 * Reuse buf page, if SPLICE_F_MOVE is set.
5565abc97aaSJens Axboe 	 */
5575abc97aaSJens Axboe 	if (sd->flags & SPLICE_F_MOVE) {
55883f9135bSJens Axboe 		/*
55983f9135bSJens Axboe 		 * If steal succeeds, buf->page is now pruned from the vm
5609e0267c2SJens Axboe 		 * side (LRU and page cache) and we can reuse it. The page
5619e0267c2SJens Axboe 		 * will also be looked on successful return.
56283f9135bSJens Axboe 		 */
5635abc97aaSJens Axboe 		if (buf->ops->steal(info, buf))
5645abc97aaSJens Axboe 			goto find_page;
5655abc97aaSJens Axboe 
5665abc97aaSJens Axboe 		page = buf->page;
5673e7ee3e7SJens Axboe 		if (add_to_page_cache(page, mapping, index, gfp_mask))
5685abc97aaSJens Axboe 			goto find_page;
5693e7ee3e7SJens Axboe 
5703e7ee3e7SJens Axboe 		if (!(buf->flags & PIPE_BUF_FLAG_LRU))
5713e7ee3e7SJens Axboe 			lru_cache_add(page);
5725abc97aaSJens Axboe 	} else {
5735274f052SJens Axboe find_page:
5749e0267c2SJens Axboe 		page = find_lock_page(mapping, index);
5759e0267c2SJens Axboe 		if (!page) {
5765274f052SJens Axboe 			ret = -ENOMEM;
5779e0267c2SJens Axboe 			page = page_cache_alloc_cold(mapping);
5789e0267c2SJens Axboe 			if (unlikely(!page))
5799aefe431SDave Jones 				goto out_nomem;
5805274f052SJens Axboe 
5815274f052SJens Axboe 			/*
5829e0267c2SJens Axboe 			 * This will also lock the page
5839e0267c2SJens Axboe 			 */
5849e0267c2SJens Axboe 			ret = add_to_page_cache_lru(page, mapping, index,
5859e0267c2SJens Axboe 						    gfp_mask);
5869e0267c2SJens Axboe 			if (unlikely(ret))
5879e0267c2SJens Axboe 				goto out;
5889e0267c2SJens Axboe 		}
5899e0267c2SJens Axboe 
5909e0267c2SJens Axboe 		/*
5919e0267c2SJens Axboe 		 * We get here with the page locked. If the page is also
5929e0267c2SJens Axboe 		 * uptodate, we don't need to do more. If it isn't, we
5939e0267c2SJens Axboe 		 * may need to bring it in if we are not going to overwrite
5949e0267c2SJens Axboe 		 * the full page.
5955274f052SJens Axboe 		 */
5965274f052SJens Axboe 		if (!PageUptodate(page)) {
597016b661eSJens Axboe 			if (this_len < PAGE_CACHE_SIZE) {
5985274f052SJens Axboe 				ret = mapping->a_ops->readpage(file, page);
5995274f052SJens Axboe 				if (unlikely(ret))
6005274f052SJens Axboe 					goto out;
6015274f052SJens Axboe 
6025274f052SJens Axboe 				lock_page(page);
6035274f052SJens Axboe 
6045274f052SJens Axboe 				if (!PageUptodate(page)) {
6055274f052SJens Axboe 					/*
60673d62d83SIngo Molnar 					 * Page got invalidated, repeat.
6075274f052SJens Axboe 					 */
6085274f052SJens Axboe 					if (!page->mapping) {
6095274f052SJens Axboe 						unlock_page(page);
6105274f052SJens Axboe 						page_cache_release(page);
6115274f052SJens Axboe 						goto find_page;
6125274f052SJens Axboe 					}
6135274f052SJens Axboe 					ret = -EIO;
6145274f052SJens Axboe 					goto out;
6155274f052SJens Axboe 				}
6169e0267c2SJens Axboe 			} else
6175274f052SJens Axboe 				SetPageUptodate(page);
6185274f052SJens Axboe 		}
6195274f052SJens Axboe 	}
6205274f052SJens Axboe 
621016b661eSJens Axboe 	ret = mapping->a_ops->prepare_write(file, page, offset, offset+this_len);
6224f6f0bd2SJens Axboe 	if (ret == AOP_TRUNCATED_PAGE) {
6234f6f0bd2SJens Axboe 		page_cache_release(page);
6244f6f0bd2SJens Axboe 		goto find_page;
6254f6f0bd2SJens Axboe 	} else if (ret)
6265274f052SJens Axboe 		goto out;
6275274f052SJens Axboe 
6283e7ee3e7SJens Axboe 	if (!(buf->flags & PIPE_BUF_FLAG_STOLEN)) {
6295abc97aaSJens Axboe 		char *dst = kmap_atomic(page, KM_USER0);
6305abc97aaSJens Axboe 
631016b661eSJens Axboe 		memcpy(dst + offset, src + buf->offset, this_len);
6325274f052SJens Axboe 		flush_dcache_page(page);
6335274f052SJens Axboe 		kunmap_atomic(dst, KM_USER0);
6345abc97aaSJens Axboe 	}
6355274f052SJens Axboe 
636016b661eSJens Axboe 	ret = mapping->a_ops->commit_write(file, page, offset, offset+this_len);
6374f6f0bd2SJens Axboe 	if (ret == AOP_TRUNCATED_PAGE) {
6384f6f0bd2SJens Axboe 		page_cache_release(page);
6394f6f0bd2SJens Axboe 		goto find_page;
6404f6f0bd2SJens Axboe 	} else if (ret)
6415274f052SJens Axboe 		goto out;
6425274f052SJens Axboe 
643016b661eSJens Axboe 	/*
644016b661eSJens Axboe 	 * Return the number of bytes written.
645016b661eSJens Axboe 	 */
646016b661eSJens Axboe 	ret = this_len;
647c7f21e4fSJens Axboe 	mark_page_accessed(page);
6484f6f0bd2SJens Axboe 	balance_dirty_pages_ratelimited(mapping);
6495274f052SJens Axboe out:
6509e0267c2SJens Axboe 	if (!(buf->flags & PIPE_BUF_FLAG_STOLEN))
6515274f052SJens Axboe 		page_cache_release(page);
6529e0267c2SJens Axboe 
6534f6f0bd2SJens Axboe 	unlock_page(page);
6549aefe431SDave Jones out_nomem:
6555274f052SJens Axboe 	buf->ops->unmap(info, buf);
6565274f052SJens Axboe 	return ret;
6575274f052SJens Axboe }
6585274f052SJens Axboe 
65983f9135bSJens Axboe /*
66083f9135bSJens Axboe  * Pipe input worker. Most of this logic works like a regular pipe, the
66183f9135bSJens Axboe  * key here is the 'actor' worker passed in that actually moves the data
66283f9135bSJens Axboe  * to the wanted destination. See pipe_to_file/pipe_to_sendpage above.
66383f9135bSJens Axboe  */
66400522fb4SJens Axboe ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
665cbb7e577SJens Axboe 			 loff_t *ppos, size_t len, unsigned int flags,
6665274f052SJens Axboe 			 splice_actor *actor)
6675274f052SJens Axboe {
6685274f052SJens Axboe 	int ret, do_wakeup, err;
6695274f052SJens Axboe 	struct splice_desc sd;
6705274f052SJens Axboe 
6715274f052SJens Axboe 	ret = 0;
6725274f052SJens Axboe 	do_wakeup = 0;
6735274f052SJens Axboe 
6745274f052SJens Axboe 	sd.total_len = len;
6755274f052SJens Axboe 	sd.flags = flags;
6765274f052SJens Axboe 	sd.file = out;
677cbb7e577SJens Axboe 	sd.pos = *ppos;
6785274f052SJens Axboe 
6793a326a2cSIngo Molnar 	if (pipe->inode)
6803a326a2cSIngo Molnar 		mutex_lock(&pipe->inode->i_mutex);
6815274f052SJens Axboe 
6825274f052SJens Axboe 	for (;;) {
6836f767b04SJens Axboe 		if (pipe->nrbufs) {
6846f767b04SJens Axboe 			struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
6855274f052SJens Axboe 			struct pipe_buf_operations *ops = buf->ops;
6865274f052SJens Axboe 
6875274f052SJens Axboe 			sd.len = buf->len;
6885274f052SJens Axboe 			if (sd.len > sd.total_len)
6895274f052SJens Axboe 				sd.len = sd.total_len;
6905274f052SJens Axboe 
6913a326a2cSIngo Molnar 			err = actor(pipe, buf, &sd);
692016b661eSJens Axboe 			if (err <= 0) {
6935274f052SJens Axboe 				if (!ret && err != -ENODATA)
6945274f052SJens Axboe 					ret = err;
6955274f052SJens Axboe 
6965274f052SJens Axboe 				break;
6975274f052SJens Axboe 			}
6985274f052SJens Axboe 
699016b661eSJens Axboe 			ret += err;
700016b661eSJens Axboe 			buf->offset += err;
701016b661eSJens Axboe 			buf->len -= err;
702016b661eSJens Axboe 
703016b661eSJens Axboe 			sd.len -= err;
704016b661eSJens Axboe 			sd.pos += err;
705016b661eSJens Axboe 			sd.total_len -= err;
706016b661eSJens Axboe 			if (sd.len)
707016b661eSJens Axboe 				continue;
70873d62d83SIngo Molnar 
7095274f052SJens Axboe 			if (!buf->len) {
7105274f052SJens Axboe 				buf->ops = NULL;
7113a326a2cSIngo Molnar 				ops->release(pipe, buf);
7126f767b04SJens Axboe 				pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);
7136f767b04SJens Axboe 				pipe->nrbufs--;
7146f767b04SJens Axboe 				if (pipe->inode)
7155274f052SJens Axboe 					do_wakeup = 1;
7165274f052SJens Axboe 			}
7175274f052SJens Axboe 
7185274f052SJens Axboe 			if (!sd.total_len)
7195274f052SJens Axboe 				break;
7205274f052SJens Axboe 		}
7215274f052SJens Axboe 
7226f767b04SJens Axboe 		if (pipe->nrbufs)
7235274f052SJens Axboe 			continue;
7243a326a2cSIngo Molnar 		if (!pipe->writers)
7255274f052SJens Axboe 			break;
7263a326a2cSIngo Molnar 		if (!pipe->waiting_writers) {
7275274f052SJens Axboe 			if (ret)
7285274f052SJens Axboe 				break;
7295274f052SJens Axboe 		}
7305274f052SJens Axboe 
73129e35094SLinus Torvalds 		if (flags & SPLICE_F_NONBLOCK) {
73229e35094SLinus Torvalds 			if (!ret)
73329e35094SLinus Torvalds 				ret = -EAGAIN;
73429e35094SLinus Torvalds 			break;
73529e35094SLinus Torvalds 		}
73629e35094SLinus Torvalds 
7375274f052SJens Axboe 		if (signal_pending(current)) {
7385274f052SJens Axboe 			if (!ret)
7395274f052SJens Axboe 				ret = -ERESTARTSYS;
7405274f052SJens Axboe 			break;
7415274f052SJens Axboe 		}
7425274f052SJens Axboe 
7435274f052SJens Axboe 		if (do_wakeup) {
744c0bd1f65SJens Axboe 			smp_mb();
7453a326a2cSIngo Molnar 			if (waitqueue_active(&pipe->wait))
7463a326a2cSIngo Molnar 				wake_up_interruptible_sync(&pipe->wait);
7473a326a2cSIngo Molnar 			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
7485274f052SJens Axboe 			do_wakeup = 0;
7495274f052SJens Axboe 		}
7505274f052SJens Axboe 
7513a326a2cSIngo Molnar 		pipe_wait(pipe);
7525274f052SJens Axboe 	}
7535274f052SJens Axboe 
7543a326a2cSIngo Molnar 	if (pipe->inode)
7553a326a2cSIngo Molnar 		mutex_unlock(&pipe->inode->i_mutex);
7565274f052SJens Axboe 
7575274f052SJens Axboe 	if (do_wakeup) {
758c0bd1f65SJens Axboe 		smp_mb();
7593a326a2cSIngo Molnar 		if (waitqueue_active(&pipe->wait))
7603a326a2cSIngo Molnar 			wake_up_interruptible(&pipe->wait);
7613a326a2cSIngo Molnar 		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
7625274f052SJens Axboe 	}
7635274f052SJens Axboe 
7645274f052SJens Axboe 	return ret;
7655274f052SJens Axboe }
7665274f052SJens Axboe 
76783f9135bSJens Axboe /**
76883f9135bSJens Axboe  * generic_file_splice_write - splice data from a pipe to a file
7693a326a2cSIngo Molnar  * @pipe:	pipe info
77083f9135bSJens Axboe  * @out:	file to write to
77183f9135bSJens Axboe  * @len:	number of bytes to splice
77283f9135bSJens Axboe  * @flags:	splice modifier flags
77383f9135bSJens Axboe  *
77483f9135bSJens Axboe  * Will either move or copy pages (determined by @flags options) from
77583f9135bSJens Axboe  * the given pipe inode to the given file.
77683f9135bSJens Axboe  *
77783f9135bSJens Axboe  */
7783a326a2cSIngo Molnar ssize_t
7793a326a2cSIngo Molnar generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
780cbb7e577SJens Axboe 			  loff_t *ppos, size_t len, unsigned int flags)
7815274f052SJens Axboe {
7824f6f0bd2SJens Axboe 	struct address_space *mapping = out->f_mapping;
7833a326a2cSIngo Molnar 	ssize_t ret;
7843a326a2cSIngo Molnar 
78500522fb4SJens Axboe 	ret = splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_file);
786a4514ebdSJens Axboe 	if (ret > 0) {
787a4514ebdSJens Axboe 		struct inode *inode = mapping->host;
788a4514ebdSJens Axboe 
789a4514ebdSJens Axboe 		*ppos += ret;
7904f6f0bd2SJens Axboe 
7914f6f0bd2SJens Axboe 		/*
792a4514ebdSJens Axboe 		 * If file or inode is SYNC and we actually wrote some data,
793a4514ebdSJens Axboe 		 * sync it.
7944f6f0bd2SJens Axboe 		 */
795a4514ebdSJens Axboe 		if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) {
7964f6f0bd2SJens Axboe 			int err;
7974f6f0bd2SJens Axboe 
7984f6f0bd2SJens Axboe 			mutex_lock(&inode->i_mutex);
799a4514ebdSJens Axboe 			err = generic_osync_inode(inode, mapping,
8004f6f0bd2SJens Axboe 						  OSYNC_METADATA|OSYNC_DATA);
8014f6f0bd2SJens Axboe 			mutex_unlock(&inode->i_mutex);
8024f6f0bd2SJens Axboe 
8034f6f0bd2SJens Axboe 			if (err)
8044f6f0bd2SJens Axboe 				ret = err;
8054f6f0bd2SJens Axboe 		}
806a4514ebdSJens Axboe 	}
8074f6f0bd2SJens Axboe 
8084f6f0bd2SJens Axboe 	return ret;
8095274f052SJens Axboe }
8105274f052SJens Axboe 
811059a8f37SJens Axboe EXPORT_SYMBOL(generic_file_splice_write);
812059a8f37SJens Axboe 
81383f9135bSJens Axboe /**
81483f9135bSJens Axboe  * generic_splice_sendpage - splice data from a pipe to a socket
81583f9135bSJens Axboe  * @inode:	pipe inode
81683f9135bSJens Axboe  * @out:	socket to write to
81783f9135bSJens Axboe  * @len:	number of bytes to splice
81883f9135bSJens Axboe  * @flags:	splice modifier flags
81983f9135bSJens Axboe  *
82083f9135bSJens Axboe  * Will send @len bytes from the pipe to a network socket. No data copying
82183f9135bSJens Axboe  * is involved.
82283f9135bSJens Axboe  *
82383f9135bSJens Axboe  */
8243a326a2cSIngo Molnar ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out,
825cbb7e577SJens Axboe 				loff_t *ppos, size_t len, unsigned int flags)
8265274f052SJens Axboe {
82700522fb4SJens Axboe 	return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_sendpage);
8285274f052SJens Axboe }
8295274f052SJens Axboe 
830059a8f37SJens Axboe EXPORT_SYMBOL(generic_splice_sendpage);
831a0f06780SJeff Garzik 
83283f9135bSJens Axboe /*
83383f9135bSJens Axboe  * Attempt to initiate a splice from pipe to file.
83483f9135bSJens Axboe  */
8353a326a2cSIngo Molnar static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
836cbb7e577SJens Axboe 			   loff_t *ppos, size_t len, unsigned int flags)
8375274f052SJens Axboe {
8385274f052SJens Axboe 	int ret;
8395274f052SJens Axboe 
84049570e9bSJens Axboe 	if (unlikely(!out->f_op || !out->f_op->splice_write))
8415274f052SJens Axboe 		return -EINVAL;
8425274f052SJens Axboe 
84349570e9bSJens Axboe 	if (unlikely(!(out->f_mode & FMODE_WRITE)))
8445274f052SJens Axboe 		return -EBADF;
8455274f052SJens Axboe 
846cbb7e577SJens Axboe 	ret = rw_verify_area(WRITE, out, ppos, len);
8475274f052SJens Axboe 	if (unlikely(ret < 0))
8485274f052SJens Axboe 		return ret;
8495274f052SJens Axboe 
850cbb7e577SJens Axboe 	return out->f_op->splice_write(pipe, out, ppos, len, flags);
8515274f052SJens Axboe }
8525274f052SJens Axboe 
85383f9135bSJens Axboe /*
85483f9135bSJens Axboe  * Attempt to initiate a splice from a file to a pipe.
85583f9135bSJens Axboe  */
856cbb7e577SJens Axboe static long do_splice_to(struct file *in, loff_t *ppos,
857cbb7e577SJens Axboe 			 struct pipe_inode_info *pipe, size_t len,
858cbb7e577SJens Axboe 			 unsigned int flags)
8595274f052SJens Axboe {
860cbb7e577SJens Axboe 	loff_t isize, left;
8615274f052SJens Axboe 	int ret;
8625274f052SJens Axboe 
86349570e9bSJens Axboe 	if (unlikely(!in->f_op || !in->f_op->splice_read))
8645274f052SJens Axboe 		return -EINVAL;
8655274f052SJens Axboe 
86649570e9bSJens Axboe 	if (unlikely(!(in->f_mode & FMODE_READ)))
8675274f052SJens Axboe 		return -EBADF;
8685274f052SJens Axboe 
869cbb7e577SJens Axboe 	ret = rw_verify_area(READ, in, ppos, len);
8705274f052SJens Axboe 	if (unlikely(ret < 0))
8715274f052SJens Axboe 		return ret;
8725274f052SJens Axboe 
8735274f052SJens Axboe 	isize = i_size_read(in->f_mapping->host);
874cbb7e577SJens Axboe 	if (unlikely(*ppos >= isize))
8755274f052SJens Axboe 		return 0;
8765274f052SJens Axboe 
877cbb7e577SJens Axboe 	left = isize - *ppos;
87849570e9bSJens Axboe 	if (unlikely(left < len))
8795274f052SJens Axboe 		len = left;
8805274f052SJens Axboe 
881cbb7e577SJens Axboe 	return in->f_op->splice_read(in, ppos, pipe, len, flags);
8825274f052SJens Axboe }
8835274f052SJens Axboe 
884cbb7e577SJens Axboe long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
885cbb7e577SJens Axboe 		      size_t len, unsigned int flags)
886b92ce558SJens Axboe {
887b92ce558SJens Axboe 	struct pipe_inode_info *pipe;
888b92ce558SJens Axboe 	long ret, bytes;
889cbb7e577SJens Axboe 	loff_t out_off;
890b92ce558SJens Axboe 	umode_t i_mode;
891b92ce558SJens Axboe 	int i;
892b92ce558SJens Axboe 
893b92ce558SJens Axboe 	/*
894b92ce558SJens Axboe 	 * We require the input being a regular file, as we don't want to
895b92ce558SJens Axboe 	 * randomly drop data for eg socket -> socket splicing. Use the
896b92ce558SJens Axboe 	 * piped splicing for that!
897b92ce558SJens Axboe 	 */
898b92ce558SJens Axboe 	i_mode = in->f_dentry->d_inode->i_mode;
899b92ce558SJens Axboe 	if (unlikely(!S_ISREG(i_mode) && !S_ISBLK(i_mode)))
900b92ce558SJens Axboe 		return -EINVAL;
901b92ce558SJens Axboe 
902b92ce558SJens Axboe 	/*
903b92ce558SJens Axboe 	 * neither in nor out is a pipe, setup an internal pipe attached to
904b92ce558SJens Axboe 	 * 'out' and transfer the wanted data from 'in' to 'out' through that
905b92ce558SJens Axboe 	 */
906b92ce558SJens Axboe 	pipe = current->splice_pipe;
90749570e9bSJens Axboe 	if (unlikely(!pipe)) {
908b92ce558SJens Axboe 		pipe = alloc_pipe_info(NULL);
909b92ce558SJens Axboe 		if (!pipe)
910b92ce558SJens Axboe 			return -ENOMEM;
911b92ce558SJens Axboe 
912b92ce558SJens Axboe 		/*
913b92ce558SJens Axboe 		 * We don't have an immediate reader, but we'll read the stuff
91400522fb4SJens Axboe 		 * out of the pipe right after the splice_to_pipe(). So set
915b92ce558SJens Axboe 		 * PIPE_READERS appropriately.
916b92ce558SJens Axboe 		 */
917b92ce558SJens Axboe 		pipe->readers = 1;
918b92ce558SJens Axboe 
919b92ce558SJens Axboe 		current->splice_pipe = pipe;
920b92ce558SJens Axboe 	}
921b92ce558SJens Axboe 
922b92ce558SJens Axboe 	/*
92373d62d83SIngo Molnar 	 * Do the splice.
924b92ce558SJens Axboe 	 */
925b92ce558SJens Axboe 	ret = 0;
926b92ce558SJens Axboe 	bytes = 0;
927cbb7e577SJens Axboe 	out_off = 0;
928b92ce558SJens Axboe 
929b92ce558SJens Axboe 	while (len) {
930b92ce558SJens Axboe 		size_t read_len, max_read_len;
931b92ce558SJens Axboe 
932b92ce558SJens Axboe 		/*
933b92ce558SJens Axboe 		 * Do at most PIPE_BUFFERS pages worth of transfer:
934b92ce558SJens Axboe 		 */
935b92ce558SJens Axboe 		max_read_len = min(len, (size_t)(PIPE_BUFFERS*PAGE_SIZE));
936b92ce558SJens Axboe 
937cbb7e577SJens Axboe 		ret = do_splice_to(in, ppos, pipe, max_read_len, flags);
938b92ce558SJens Axboe 		if (unlikely(ret < 0))
939b92ce558SJens Axboe 			goto out_release;
940b92ce558SJens Axboe 
941b92ce558SJens Axboe 		read_len = ret;
942b92ce558SJens Axboe 
943b92ce558SJens Axboe 		/*
944b92ce558SJens Axboe 		 * NOTE: nonblocking mode only applies to the input. We
945b92ce558SJens Axboe 		 * must not do the output in nonblocking mode as then we
946b92ce558SJens Axboe 		 * could get stuck data in the internal pipe:
947b92ce558SJens Axboe 		 */
948cbb7e577SJens Axboe 		ret = do_splice_from(pipe, out, &out_off, read_len,
949b92ce558SJens Axboe 				     flags & ~SPLICE_F_NONBLOCK);
950b92ce558SJens Axboe 		if (unlikely(ret < 0))
951b92ce558SJens Axboe 			goto out_release;
952b92ce558SJens Axboe 
953b92ce558SJens Axboe 		bytes += ret;
954b92ce558SJens Axboe 		len -= ret;
955b92ce558SJens Axboe 
956b92ce558SJens Axboe 		/*
957b92ce558SJens Axboe 		 * In nonblocking mode, if we got back a short read then
958b92ce558SJens Axboe 		 * that was due to either an IO error or due to the
959b92ce558SJens Axboe 		 * pagecache entry not being there. In the IO error case
960b92ce558SJens Axboe 		 * the _next_ splice attempt will produce a clean IO error
961b92ce558SJens Axboe 		 * return value (not a short read), so in both cases it's
962b92ce558SJens Axboe 		 * correct to break out of the loop here:
963b92ce558SJens Axboe 		 */
964b92ce558SJens Axboe 		if ((flags & SPLICE_F_NONBLOCK) && (read_len < max_read_len))
965b92ce558SJens Axboe 			break;
966b92ce558SJens Axboe 	}
967b92ce558SJens Axboe 
968b92ce558SJens Axboe 	pipe->nrbufs = pipe->curbuf = 0;
969b92ce558SJens Axboe 
970b92ce558SJens Axboe 	return bytes;
971b92ce558SJens Axboe 
972b92ce558SJens Axboe out_release:
973b92ce558SJens Axboe 	/*
974b92ce558SJens Axboe 	 * If we did an incomplete transfer we must release
975b92ce558SJens Axboe 	 * the pipe buffers in question:
976b92ce558SJens Axboe 	 */
977b92ce558SJens Axboe 	for (i = 0; i < PIPE_BUFFERS; i++) {
978b92ce558SJens Axboe 		struct pipe_buffer *buf = pipe->bufs + i;
979b92ce558SJens Axboe 
980b92ce558SJens Axboe 		if (buf->ops) {
981b92ce558SJens Axboe 			buf->ops->release(pipe, buf);
982b92ce558SJens Axboe 			buf->ops = NULL;
983b92ce558SJens Axboe 		}
984b92ce558SJens Axboe 	}
985b92ce558SJens Axboe 	pipe->nrbufs = pipe->curbuf = 0;
986b92ce558SJens Axboe 
987b92ce558SJens Axboe 	/*
988b92ce558SJens Axboe 	 * If we transferred some data, return the number of bytes:
989b92ce558SJens Axboe 	 */
990b92ce558SJens Axboe 	if (bytes > 0)
991b92ce558SJens Axboe 		return bytes;
992b92ce558SJens Axboe 
993b92ce558SJens Axboe 	return ret;
994b92ce558SJens Axboe }
995b92ce558SJens Axboe 
996b92ce558SJens Axboe EXPORT_SYMBOL(do_splice_direct);
997b92ce558SJens Axboe 
99883f9135bSJens Axboe /*
99983f9135bSJens Axboe  * Determine where to splice to/from.
100083f9135bSJens Axboe  */
1001529565dcSIngo Molnar static long do_splice(struct file *in, loff_t __user *off_in,
1002529565dcSIngo Molnar 		      struct file *out, loff_t __user *off_out,
1003529565dcSIngo Molnar 		      size_t len, unsigned int flags)
10045274f052SJens Axboe {
10053a326a2cSIngo Molnar 	struct pipe_inode_info *pipe;
1006cbb7e577SJens Axboe 	loff_t offset, *off;
1007a4514ebdSJens Axboe 	long ret;
10085274f052SJens Axboe 
10093a326a2cSIngo Molnar 	pipe = in->f_dentry->d_inode->i_pipe;
1010529565dcSIngo Molnar 	if (pipe) {
1011529565dcSIngo Molnar 		if (off_in)
1012529565dcSIngo Molnar 			return -ESPIPE;
1013b92ce558SJens Axboe 		if (off_out) {
1014b92ce558SJens Axboe 			if (out->f_op->llseek == no_llseek)
1015b92ce558SJens Axboe 				return -EINVAL;
1016cbb7e577SJens Axboe 			if (copy_from_user(&offset, off_out, sizeof(loff_t)))
1017b92ce558SJens Axboe 				return -EFAULT;
1018cbb7e577SJens Axboe 			off = &offset;
1019cbb7e577SJens Axboe 		} else
1020cbb7e577SJens Axboe 			off = &out->f_pos;
1021529565dcSIngo Molnar 
1022a4514ebdSJens Axboe 		ret = do_splice_from(pipe, out, off, len, flags);
1023a4514ebdSJens Axboe 
1024a4514ebdSJens Axboe 		if (off_out && copy_to_user(off_out, off, sizeof(loff_t)))
1025a4514ebdSJens Axboe 			ret = -EFAULT;
1026a4514ebdSJens Axboe 
1027a4514ebdSJens Axboe 		return ret;
1028529565dcSIngo Molnar 	}
10295274f052SJens Axboe 
10303a326a2cSIngo Molnar 	pipe = out->f_dentry->d_inode->i_pipe;
1031529565dcSIngo Molnar 	if (pipe) {
1032529565dcSIngo Molnar 		if (off_out)
1033529565dcSIngo Molnar 			return -ESPIPE;
1034b92ce558SJens Axboe 		if (off_in) {
1035b92ce558SJens Axboe 			if (in->f_op->llseek == no_llseek)
1036b92ce558SJens Axboe 				return -EINVAL;
1037cbb7e577SJens Axboe 			if (copy_from_user(&offset, off_in, sizeof(loff_t)))
1038b92ce558SJens Axboe 				return -EFAULT;
1039cbb7e577SJens Axboe 			off = &offset;
1040cbb7e577SJens Axboe 		} else
1041cbb7e577SJens Axboe 			off = &in->f_pos;
1042529565dcSIngo Molnar 
1043a4514ebdSJens Axboe 		ret = do_splice_to(in, off, pipe, len, flags);
1044a4514ebdSJens Axboe 
1045a4514ebdSJens Axboe 		if (off_in && copy_to_user(off_in, off, sizeof(loff_t)))
1046a4514ebdSJens Axboe 			ret = -EFAULT;
1047a4514ebdSJens Axboe 
1048a4514ebdSJens Axboe 		return ret;
1049529565dcSIngo Molnar 	}
10505274f052SJens Axboe 
10515274f052SJens Axboe 	return -EINVAL;
10525274f052SJens Axboe }
10535274f052SJens Axboe 
1054912d35f8SJens Axboe /*
1055912d35f8SJens Axboe  * Map an iov into an array of pages and offset/length tupples. With the
1056912d35f8SJens Axboe  * partial_page structure, we can map several non-contiguous ranges into
1057912d35f8SJens Axboe  * our ones pages[] map instead of splitting that operation into pieces.
1058912d35f8SJens Axboe  * Could easily be exported as a generic helper for other users, in which
1059912d35f8SJens Axboe  * case one would probably want to add a 'max_nr_pages' parameter as well.
1060912d35f8SJens Axboe  */
1061912d35f8SJens Axboe static int get_iovec_page_array(const struct iovec __user *iov,
1062912d35f8SJens Axboe 				unsigned int nr_vecs, struct page **pages,
1063912d35f8SJens Axboe 				struct partial_page *partial)
1064912d35f8SJens Axboe {
1065912d35f8SJens Axboe 	int buffers = 0, error = 0;
1066912d35f8SJens Axboe 
1067912d35f8SJens Axboe 	/*
1068912d35f8SJens Axboe 	 * It's ok to take the mmap_sem for reading, even
1069912d35f8SJens Axboe 	 * across a "get_user()".
1070912d35f8SJens Axboe 	 */
1071912d35f8SJens Axboe 	down_read(&current->mm->mmap_sem);
1072912d35f8SJens Axboe 
1073912d35f8SJens Axboe 	while (nr_vecs) {
1074912d35f8SJens Axboe 		unsigned long off, npages;
1075912d35f8SJens Axboe 		void __user *base;
1076912d35f8SJens Axboe 		size_t len;
1077912d35f8SJens Axboe 		int i;
1078912d35f8SJens Axboe 
1079912d35f8SJens Axboe 		/*
1080912d35f8SJens Axboe 		 * Get user address base and length for this iovec.
1081912d35f8SJens Axboe 		 */
1082912d35f8SJens Axboe 		error = get_user(base, &iov->iov_base);
1083912d35f8SJens Axboe 		if (unlikely(error))
1084912d35f8SJens Axboe 			break;
1085912d35f8SJens Axboe 		error = get_user(len, &iov->iov_len);
1086912d35f8SJens Axboe 		if (unlikely(error))
1087912d35f8SJens Axboe 			break;
1088912d35f8SJens Axboe 
1089912d35f8SJens Axboe 		/*
1090912d35f8SJens Axboe 		 * Sanity check this iovec. 0 read succeeds.
1091912d35f8SJens Axboe 		 */
1092912d35f8SJens Axboe 		if (unlikely(!len))
1093912d35f8SJens Axboe 			break;
1094912d35f8SJens Axboe 		error = -EFAULT;
1095912d35f8SJens Axboe 		if (unlikely(!base))
1096912d35f8SJens Axboe 			break;
1097912d35f8SJens Axboe 
1098912d35f8SJens Axboe 		/*
1099912d35f8SJens Axboe 		 * Get this base offset and number of pages, then map
1100912d35f8SJens Axboe 		 * in the user pages.
1101912d35f8SJens Axboe 		 */
1102912d35f8SJens Axboe 		off = (unsigned long) base & ~PAGE_MASK;
1103912d35f8SJens Axboe 		npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
1104912d35f8SJens Axboe 		if (npages > PIPE_BUFFERS - buffers)
1105912d35f8SJens Axboe 			npages = PIPE_BUFFERS - buffers;
1106912d35f8SJens Axboe 
1107912d35f8SJens Axboe 		error = get_user_pages(current, current->mm,
1108912d35f8SJens Axboe 				       (unsigned long) base, npages, 0, 0,
1109912d35f8SJens Axboe 				       &pages[buffers], NULL);
1110912d35f8SJens Axboe 
1111912d35f8SJens Axboe 		if (unlikely(error <= 0))
1112912d35f8SJens Axboe 			break;
1113912d35f8SJens Axboe 
1114912d35f8SJens Axboe 		/*
1115912d35f8SJens Axboe 		 * Fill this contiguous range into the partial page map.
1116912d35f8SJens Axboe 		 */
1117912d35f8SJens Axboe 		for (i = 0; i < error; i++) {
1118912d35f8SJens Axboe 			const int plen = min_t(size_t, len, PAGE_SIZE) - off;
1119912d35f8SJens Axboe 
1120912d35f8SJens Axboe 			partial[buffers].offset = off;
1121912d35f8SJens Axboe 			partial[buffers].len = plen;
1122912d35f8SJens Axboe 
1123912d35f8SJens Axboe 			off = 0;
1124912d35f8SJens Axboe 			len -= plen;
1125912d35f8SJens Axboe 			buffers++;
1126912d35f8SJens Axboe 		}
1127912d35f8SJens Axboe 
1128912d35f8SJens Axboe 		/*
1129912d35f8SJens Axboe 		 * We didn't complete this iov, stop here since it probably
1130912d35f8SJens Axboe 		 * means we have to move some of this into a pipe to
1131912d35f8SJens Axboe 		 * be able to continue.
1132912d35f8SJens Axboe 		 */
1133912d35f8SJens Axboe 		if (len)
1134912d35f8SJens Axboe 			break;
1135912d35f8SJens Axboe 
1136912d35f8SJens Axboe 		/*
1137912d35f8SJens Axboe 		 * Don't continue if we mapped fewer pages than we asked for,
1138912d35f8SJens Axboe 		 * or if we mapped the max number of pages that we have
1139912d35f8SJens Axboe 		 * room for.
1140912d35f8SJens Axboe 		 */
1141912d35f8SJens Axboe 		if (error < npages || buffers == PIPE_BUFFERS)
1142912d35f8SJens Axboe 			break;
1143912d35f8SJens Axboe 
1144912d35f8SJens Axboe 		nr_vecs--;
1145912d35f8SJens Axboe 		iov++;
1146912d35f8SJens Axboe 	}
1147912d35f8SJens Axboe 
1148912d35f8SJens Axboe 	up_read(&current->mm->mmap_sem);
1149912d35f8SJens Axboe 
1150912d35f8SJens Axboe 	if (buffers)
1151912d35f8SJens Axboe 		return buffers;
1152912d35f8SJens Axboe 
1153912d35f8SJens Axboe 	return error;
1154912d35f8SJens Axboe }
1155912d35f8SJens Axboe 
1156912d35f8SJens Axboe /*
1157912d35f8SJens Axboe  * vmsplice splices a user address range into a pipe. It can be thought of
1158912d35f8SJens Axboe  * as splice-from-memory, where the regular splice is splice-from-file (or
1159912d35f8SJens Axboe  * to file). In both cases the output is a pipe, naturally.
1160912d35f8SJens Axboe  *
1161912d35f8SJens Axboe  * Note that vmsplice only supports splicing _from_ user memory to a pipe,
1162912d35f8SJens Axboe  * not the other way around. Splicing from user memory is a simple operation
1163912d35f8SJens Axboe  * that can be supported without any funky alignment restrictions or nasty
1164912d35f8SJens Axboe  * vm tricks. We simply map in the user memory and fill them into a pipe.
1165912d35f8SJens Axboe  * The reverse isn't quite as easy, though. There are two possible solutions
1166912d35f8SJens Axboe  * for that:
1167912d35f8SJens Axboe  *
1168912d35f8SJens Axboe  *	- memcpy() the data internally, at which point we might as well just
1169912d35f8SJens Axboe  *	  do a regular read() on the buffer anyway.
1170912d35f8SJens Axboe  *	- Lots of nasty vm tricks, that are neither fast nor flexible (it
1171912d35f8SJens Axboe  *	  has restriction limitations on both ends of the pipe).
1172912d35f8SJens Axboe  *
1173912d35f8SJens Axboe  * Alas, it isn't here.
1174912d35f8SJens Axboe  *
1175912d35f8SJens Axboe  */
1176912d35f8SJens Axboe static long do_vmsplice(struct file *file, const struct iovec __user *iov,
1177912d35f8SJens Axboe 			unsigned long nr_segs, unsigned int flags)
1178912d35f8SJens Axboe {
1179912d35f8SJens Axboe 	struct pipe_inode_info *pipe = file->f_dentry->d_inode->i_pipe;
1180912d35f8SJens Axboe 	struct page *pages[PIPE_BUFFERS];
1181912d35f8SJens Axboe 	struct partial_page partial[PIPE_BUFFERS];
1182912d35f8SJens Axboe 	struct splice_pipe_desc spd = {
1183912d35f8SJens Axboe 		.pages = pages,
1184912d35f8SJens Axboe 		.partial = partial,
1185912d35f8SJens Axboe 		.flags = flags,
1186912d35f8SJens Axboe 		.ops = &user_page_pipe_buf_ops,
1187912d35f8SJens Axboe 	};
1188912d35f8SJens Axboe 
1189912d35f8SJens Axboe 	if (unlikely(!pipe))
1190912d35f8SJens Axboe 		return -EBADF;
1191912d35f8SJens Axboe 	if (unlikely(nr_segs > UIO_MAXIOV))
1192912d35f8SJens Axboe 		return -EINVAL;
1193912d35f8SJens Axboe 	else if (unlikely(!nr_segs))
1194912d35f8SJens Axboe 		return 0;
1195912d35f8SJens Axboe 
1196912d35f8SJens Axboe 	spd.nr_pages = get_iovec_page_array(iov, nr_segs, pages, partial);
1197912d35f8SJens Axboe 	if (spd.nr_pages <= 0)
1198912d35f8SJens Axboe 		return spd.nr_pages;
1199912d35f8SJens Axboe 
120000522fb4SJens Axboe 	return splice_to_pipe(pipe, &spd);
1201912d35f8SJens Axboe }
1202912d35f8SJens Axboe 
1203912d35f8SJens Axboe asmlinkage long sys_vmsplice(int fd, const struct iovec __user *iov,
1204912d35f8SJens Axboe 			     unsigned long nr_segs, unsigned int flags)
1205912d35f8SJens Axboe {
1206912d35f8SJens Axboe 	struct file *file;
1207912d35f8SJens Axboe 	long error;
1208912d35f8SJens Axboe 	int fput;
1209912d35f8SJens Axboe 
1210912d35f8SJens Axboe 	error = -EBADF;
1211912d35f8SJens Axboe 	file = fget_light(fd, &fput);
1212912d35f8SJens Axboe 	if (file) {
1213912d35f8SJens Axboe 		if (file->f_mode & FMODE_WRITE)
1214912d35f8SJens Axboe 			error = do_vmsplice(file, iov, nr_segs, flags);
1215912d35f8SJens Axboe 
1216912d35f8SJens Axboe 		fput_light(file, fput);
1217912d35f8SJens Axboe 	}
1218912d35f8SJens Axboe 
1219912d35f8SJens Axboe 	return error;
1220912d35f8SJens Axboe }
1221912d35f8SJens Axboe 
1222529565dcSIngo Molnar asmlinkage long sys_splice(int fd_in, loff_t __user *off_in,
1223529565dcSIngo Molnar 			   int fd_out, loff_t __user *off_out,
1224529565dcSIngo Molnar 			   size_t len, unsigned int flags)
12255274f052SJens Axboe {
12265274f052SJens Axboe 	long error;
12275274f052SJens Axboe 	struct file *in, *out;
12285274f052SJens Axboe 	int fput_in, fput_out;
12295274f052SJens Axboe 
12305274f052SJens Axboe 	if (unlikely(!len))
12315274f052SJens Axboe 		return 0;
12325274f052SJens Axboe 
12335274f052SJens Axboe 	error = -EBADF;
1234529565dcSIngo Molnar 	in = fget_light(fd_in, &fput_in);
12355274f052SJens Axboe 	if (in) {
12365274f052SJens Axboe 		if (in->f_mode & FMODE_READ) {
1237529565dcSIngo Molnar 			out = fget_light(fd_out, &fput_out);
12385274f052SJens Axboe 			if (out) {
12395274f052SJens Axboe 				if (out->f_mode & FMODE_WRITE)
1240529565dcSIngo Molnar 					error = do_splice(in, off_in,
1241529565dcSIngo Molnar 							  out, off_out,
1242529565dcSIngo Molnar 							  len, flags);
12435274f052SJens Axboe 				fput_light(out, fput_out);
12445274f052SJens Axboe 			}
12455274f052SJens Axboe 		}
12465274f052SJens Axboe 
12475274f052SJens Axboe 		fput_light(in, fput_in);
12485274f052SJens Axboe 	}
12495274f052SJens Axboe 
12505274f052SJens Axboe 	return error;
12515274f052SJens Axboe }
125270524490SJens Axboe 
125370524490SJens Axboe /*
125470524490SJens Axboe  * Link contents of ipipe to opipe.
125570524490SJens Axboe  */
125670524490SJens Axboe static int link_pipe(struct pipe_inode_info *ipipe,
125770524490SJens Axboe 		     struct pipe_inode_info *opipe,
125870524490SJens Axboe 		     size_t len, unsigned int flags)
125970524490SJens Axboe {
126070524490SJens Axboe 	struct pipe_buffer *ibuf, *obuf;
12612a27250eSJens Axboe 	int ret, do_wakeup, i, ipipe_first;
12622a27250eSJens Axboe 
12632a27250eSJens Axboe 	ret = do_wakeup = ipipe_first = 0;
126470524490SJens Axboe 
126570524490SJens Axboe 	/*
126670524490SJens Axboe 	 * Potential ABBA deadlock, work around it by ordering lock
126770524490SJens Axboe 	 * grabbing by inode address. Otherwise two different processes
126870524490SJens Axboe 	 * could deadlock (one doing tee from A -> B, the other from B -> A).
126970524490SJens Axboe 	 */
127070524490SJens Axboe 	if (ipipe->inode < opipe->inode) {
12712a27250eSJens Axboe 		ipipe_first = 1;
127270524490SJens Axboe 		mutex_lock(&ipipe->inode->i_mutex);
127370524490SJens Axboe 		mutex_lock(&opipe->inode->i_mutex);
127470524490SJens Axboe 	} else {
127570524490SJens Axboe 		mutex_lock(&opipe->inode->i_mutex);
127670524490SJens Axboe 		mutex_lock(&ipipe->inode->i_mutex);
127770524490SJens Axboe 	}
127870524490SJens Axboe 
127970524490SJens Axboe 	for (i = 0;; i++) {
128070524490SJens Axboe 		if (!opipe->readers) {
128170524490SJens Axboe 			send_sig(SIGPIPE, current, 0);
128270524490SJens Axboe 			if (!ret)
128370524490SJens Axboe 				ret = -EPIPE;
128470524490SJens Axboe 			break;
128570524490SJens Axboe 		}
128670524490SJens Axboe 		if (ipipe->nrbufs - i) {
128770524490SJens Axboe 			ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (PIPE_BUFFERS - 1));
128870524490SJens Axboe 
128970524490SJens Axboe 			/*
129070524490SJens Axboe 			 * If we have room, fill this buffer
129170524490SJens Axboe 			 */
129270524490SJens Axboe 			if (opipe->nrbufs < PIPE_BUFFERS) {
129370524490SJens Axboe 				int nbuf = (opipe->curbuf + opipe->nrbufs) & (PIPE_BUFFERS - 1);
129470524490SJens Axboe 
129570524490SJens Axboe 				/*
129670524490SJens Axboe 				 * Get a reference to this pipe buffer,
129770524490SJens Axboe 				 * so we can copy the contents over.
129870524490SJens Axboe 				 */
129970524490SJens Axboe 				ibuf->ops->get(ipipe, ibuf);
130070524490SJens Axboe 
130170524490SJens Axboe 				obuf = opipe->bufs + nbuf;
130270524490SJens Axboe 				*obuf = *ibuf;
130370524490SJens Axboe 
130470524490SJens Axboe 				if (obuf->len > len)
130570524490SJens Axboe 					obuf->len = len;
130670524490SJens Axboe 
130770524490SJens Axboe 				opipe->nrbufs++;
130870524490SJens Axboe 				do_wakeup = 1;
130970524490SJens Axboe 				ret += obuf->len;
131070524490SJens Axboe 				len -= obuf->len;
131170524490SJens Axboe 
131270524490SJens Axboe 				if (!len)
131370524490SJens Axboe 					break;
131470524490SJens Axboe 				if (opipe->nrbufs < PIPE_BUFFERS)
131570524490SJens Axboe 					continue;
131670524490SJens Axboe 			}
131770524490SJens Axboe 
131870524490SJens Axboe 			/*
131970524490SJens Axboe 			 * We have input available, but no output room.
13202a27250eSJens Axboe 			 * If we already copied data, return that. If we
13212a27250eSJens Axboe 			 * need to drop the opipe lock, it must be ordered
13222a27250eSJens Axboe 			 * last to avoid deadlocks.
132370524490SJens Axboe 			 */
13242a27250eSJens Axboe 			if ((flags & SPLICE_F_NONBLOCK) || !ipipe_first) {
132570524490SJens Axboe 				if (!ret)
132670524490SJens Axboe 					ret = -EAGAIN;
132770524490SJens Axboe 				break;
132870524490SJens Axboe 			}
132970524490SJens Axboe 			if (signal_pending(current)) {
133070524490SJens Axboe 				if (!ret)
133170524490SJens Axboe 					ret = -ERESTARTSYS;
133270524490SJens Axboe 				break;
133370524490SJens Axboe 			}
133470524490SJens Axboe 			if (do_wakeup) {
133570524490SJens Axboe 				smp_mb();
133670524490SJens Axboe 				if (waitqueue_active(&opipe->wait))
133770524490SJens Axboe 					wake_up_interruptible(&opipe->wait);
133870524490SJens Axboe 				kill_fasync(&opipe->fasync_readers, SIGIO, POLL_IN);
133970524490SJens Axboe 				do_wakeup = 0;
134070524490SJens Axboe 			}
134170524490SJens Axboe 
134270524490SJens Axboe 			opipe->waiting_writers++;
134370524490SJens Axboe 			pipe_wait(opipe);
134470524490SJens Axboe 			opipe->waiting_writers--;
134570524490SJens Axboe 			continue;
134670524490SJens Axboe 		}
134770524490SJens Axboe 
134870524490SJens Axboe 		/*
134970524490SJens Axboe 		 * No input buffers, do the usual checks for available
135070524490SJens Axboe 		 * writers and blocking and wait if necessary
135170524490SJens Axboe 		 */
135270524490SJens Axboe 		if (!ipipe->writers)
135370524490SJens Axboe 			break;
135470524490SJens Axboe 		if (!ipipe->waiting_writers) {
135570524490SJens Axboe 			if (ret)
135670524490SJens Axboe 				break;
135770524490SJens Axboe 		}
13582a27250eSJens Axboe 		/*
13592a27250eSJens Axboe 		 * pipe_wait() drops the ipipe mutex. To avoid deadlocks
13602a27250eSJens Axboe 		 * with another process, we can only safely do that if
13612a27250eSJens Axboe 		 * the ipipe lock is ordered last.
13622a27250eSJens Axboe 		 */
13632a27250eSJens Axboe 		if ((flags & SPLICE_F_NONBLOCK) || ipipe_first) {
136470524490SJens Axboe 			if (!ret)
136570524490SJens Axboe 				ret = -EAGAIN;
136670524490SJens Axboe 			break;
136770524490SJens Axboe 		}
136870524490SJens Axboe 		if (signal_pending(current)) {
136970524490SJens Axboe 			if (!ret)
137070524490SJens Axboe 				ret = -ERESTARTSYS;
137170524490SJens Axboe 			break;
137270524490SJens Axboe 		}
137370524490SJens Axboe 
137470524490SJens Axboe 		if (waitqueue_active(&ipipe->wait))
137570524490SJens Axboe 			wake_up_interruptible_sync(&ipipe->wait);
137670524490SJens Axboe 		kill_fasync(&ipipe->fasync_writers, SIGIO, POLL_OUT);
137770524490SJens Axboe 
137870524490SJens Axboe 		pipe_wait(ipipe);
137970524490SJens Axboe 	}
138070524490SJens Axboe 
138170524490SJens Axboe 	mutex_unlock(&ipipe->inode->i_mutex);
138270524490SJens Axboe 	mutex_unlock(&opipe->inode->i_mutex);
138370524490SJens Axboe 
138470524490SJens Axboe 	if (do_wakeup) {
138570524490SJens Axboe 		smp_mb();
138670524490SJens Axboe 		if (waitqueue_active(&opipe->wait))
138770524490SJens Axboe 			wake_up_interruptible(&opipe->wait);
138870524490SJens Axboe 		kill_fasync(&opipe->fasync_readers, SIGIO, POLL_IN);
138970524490SJens Axboe 	}
139070524490SJens Axboe 
139170524490SJens Axboe 	return ret;
139270524490SJens Axboe }
139370524490SJens Axboe 
139470524490SJens Axboe /*
139570524490SJens Axboe  * This is a tee(1) implementation that works on pipes. It doesn't copy
139670524490SJens Axboe  * any data, it simply references the 'in' pages on the 'out' pipe.
139770524490SJens Axboe  * The 'flags' used are the SPLICE_F_* variants, currently the only
139870524490SJens Axboe  * applicable one is SPLICE_F_NONBLOCK.
139970524490SJens Axboe  */
140070524490SJens Axboe static long do_tee(struct file *in, struct file *out, size_t len,
140170524490SJens Axboe 		   unsigned int flags)
140270524490SJens Axboe {
140370524490SJens Axboe 	struct pipe_inode_info *ipipe = in->f_dentry->d_inode->i_pipe;
140470524490SJens Axboe 	struct pipe_inode_info *opipe = out->f_dentry->d_inode->i_pipe;
140570524490SJens Axboe 
140670524490SJens Axboe 	/*
140770524490SJens Axboe 	 * Link ipipe to the two output pipes, consuming as we go along.
140870524490SJens Axboe 	 */
140970524490SJens Axboe 	if (ipipe && opipe)
141070524490SJens Axboe 		return link_pipe(ipipe, opipe, len, flags);
141170524490SJens Axboe 
141270524490SJens Axboe 	return -EINVAL;
141370524490SJens Axboe }
141470524490SJens Axboe 
141570524490SJens Axboe asmlinkage long sys_tee(int fdin, int fdout, size_t len, unsigned int flags)
141670524490SJens Axboe {
141770524490SJens Axboe 	struct file *in;
141870524490SJens Axboe 	int error, fput_in;
141970524490SJens Axboe 
142070524490SJens Axboe 	if (unlikely(!len))
142170524490SJens Axboe 		return 0;
142270524490SJens Axboe 
142370524490SJens Axboe 	error = -EBADF;
142470524490SJens Axboe 	in = fget_light(fdin, &fput_in);
142570524490SJens Axboe 	if (in) {
142670524490SJens Axboe 		if (in->f_mode & FMODE_READ) {
142770524490SJens Axboe 			int fput_out;
142870524490SJens Axboe 			struct file *out = fget_light(fdout, &fput_out);
142970524490SJens Axboe 
143070524490SJens Axboe 			if (out) {
143170524490SJens Axboe 				if (out->f_mode & FMODE_WRITE)
143270524490SJens Axboe 					error = do_tee(in, out, len, flags);
143370524490SJens Axboe 				fput_light(out, fput_out);
143470524490SJens Axboe 			}
143570524490SJens Axboe 		}
143670524490SJens Axboe  		fput_light(in, fput_in);
143770524490SJens Axboe  	}
143870524490SJens Axboe 
143970524490SJens Axboe 	return error;
144070524490SJens Axboe }
1441