xref: /openbmc/linux/fs/splice.c (revision eb20796b)
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;
282eb20796bSJens Axboe 	int error, page_nr;
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;
31082aa5d61SJens Axboe 
31182aa5d61SJens Axboe 	/*
312eb20796bSJens Axboe 	 * Lookup the (hopefully) full range of pages we need.
31382aa5d61SJens Axboe 	 */
314eb20796bSJens Axboe 	spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages);
315eb20796bSJens Axboe 
3165274f052SJens Axboe 	/*
317eb20796bSJens Axboe 	 * If find_get_pages_contig() returned fewer pages than we needed,
318eb20796bSJens Axboe 	 * allocate the rest.
319eb20796bSJens Axboe 	 */
320eb20796bSJens Axboe 	index += spd.nr_pages;
321eb20796bSJens Axboe 	while (spd.nr_pages < nr_pages) {
322eb20796bSJens Axboe 		/*
323eb20796bSJens Axboe 		 * Page could be there, find_get_pages_contig() breaks on
324eb20796bSJens Axboe 		 * the first hole.
3255274f052SJens Axboe 		 */
3267480a904SJens Axboe 		page = find_get_page(mapping, index);
3277480a904SJens Axboe 		if (!page) {
3287480a904SJens Axboe 			/*
329eb20796bSJens Axboe 			 * page didn't exist, allocate one.
3307480a904SJens Axboe 			 */
3317480a904SJens Axboe 			page = page_cache_alloc_cold(mapping);
3325274f052SJens Axboe 			if (!page)
3335274f052SJens Axboe 				break;
3345274f052SJens Axboe 
3357480a904SJens Axboe 			error = add_to_page_cache_lru(page, mapping, index,
3367480a904SJens Axboe 					      mapping_gfp_mask(mapping));
3375274f052SJens Axboe 			if (unlikely(error)) {
3385274f052SJens Axboe 				page_cache_release(page);
3395274f052SJens Axboe 				break;
3405274f052SJens Axboe 			}
341eb20796bSJens Axboe 			/*
342eb20796bSJens Axboe 			 * add_to_page_cache() locks the page, unlock it
343eb20796bSJens Axboe 			 * to avoid convoluting the logic below even more.
344eb20796bSJens Axboe 			 */
345eb20796bSJens Axboe 			unlock_page(page);
3465274f052SJens Axboe 		}
3477480a904SJens Axboe 
348eb20796bSJens Axboe 		pages[spd.nr_pages++] = page;
349eb20796bSJens Axboe 		index++;
350eb20796bSJens Axboe 	}
351eb20796bSJens Axboe 
352eb20796bSJens Axboe 	/*
353eb20796bSJens Axboe 	 * Now loop over the map and see if we need to start IO on any
354eb20796bSJens Axboe 	 * pages, fill in the partial map, etc.
355eb20796bSJens Axboe 	 */
356eb20796bSJens Axboe 	index = *ppos >> PAGE_CACHE_SHIFT;
357eb20796bSJens Axboe 	nr_pages = spd.nr_pages;
358eb20796bSJens Axboe 	spd.nr_pages = 0;
359eb20796bSJens Axboe 	for (page_nr = 0; page_nr < nr_pages; page_nr++) {
360eb20796bSJens Axboe 		unsigned int this_len;
361eb20796bSJens Axboe 
362eb20796bSJens Axboe 		if (!len)
363eb20796bSJens Axboe 			break;
364eb20796bSJens Axboe 
365eb20796bSJens Axboe 		/*
366eb20796bSJens Axboe 		 * this_len is the max we'll use from this page
367eb20796bSJens Axboe 		 */
368eb20796bSJens Axboe 		this_len = min_t(unsigned long, len, PAGE_CACHE_SIZE - loff);
369eb20796bSJens Axboe 		page = pages[page_nr];
370eb20796bSJens Axboe 
3717480a904SJens Axboe 		/*
3727480a904SJens Axboe 		 * If the page isn't uptodate, we may need to start io on it
3737480a904SJens Axboe 		 */
3747480a904SJens Axboe 		if (!PageUptodate(page)) {
375c4f895cbSJens Axboe 			/*
376c4f895cbSJens Axboe 			 * If in nonblock mode then dont block on waiting
377c4f895cbSJens Axboe 			 * for an in-flight io page
378c4f895cbSJens Axboe 			 */
379c4f895cbSJens Axboe 			if (flags & SPLICE_F_NONBLOCK)
380c4f895cbSJens Axboe 				break;
381c4f895cbSJens Axboe 
3827480a904SJens Axboe 			lock_page(page);
3837480a904SJens Axboe 
3847480a904SJens Axboe 			/*
3857480a904SJens Axboe 			 * page was truncated, stop here. if this isn't the
3867480a904SJens Axboe 			 * first page, we'll just complete what we already
3877480a904SJens Axboe 			 * added
3887480a904SJens Axboe 			 */
3897480a904SJens Axboe 			if (!page->mapping) {
3907480a904SJens Axboe 				unlock_page(page);
3917480a904SJens Axboe 				break;
3927480a904SJens Axboe 			}
3937480a904SJens Axboe 			/*
3947480a904SJens Axboe 			 * page was already under io and is now done, great
3957480a904SJens Axboe 			 */
3967480a904SJens Axboe 			if (PageUptodate(page)) {
3977480a904SJens Axboe 				unlock_page(page);
3987480a904SJens Axboe 				goto fill_it;
3997480a904SJens Axboe 			}
4007480a904SJens Axboe 
4017480a904SJens Axboe 			/*
4027480a904SJens Axboe 			 * need to read in the page
4037480a904SJens Axboe 			 */
4047480a904SJens Axboe 			error = mapping->a_ops->readpage(in, page);
4057480a904SJens Axboe 			if (unlikely(error)) {
406eb20796bSJens Axboe 				/*
407eb20796bSJens Axboe 				 * We really should re-lookup the page here,
408eb20796bSJens Axboe 				 * but it complicates things a lot. Instead
409eb20796bSJens Axboe 				 * lets just do what we already stored, and
410eb20796bSJens Axboe 				 * we'll get it the next time we are called.
411eb20796bSJens Axboe 				 */
4127480a904SJens Axboe 				if (error == AOP_TRUNCATED_PAGE)
413eb20796bSJens Axboe 					error = 0;
414eb20796bSJens Axboe 
4157480a904SJens Axboe 				break;
4167480a904SJens Axboe 			}
41791ad66efSJens Axboe 
41891ad66efSJens Axboe 			/*
41991ad66efSJens Axboe 			 * i_size must be checked after ->readpage().
42091ad66efSJens Axboe 			 */
42191ad66efSJens Axboe 			isize = i_size_read(mapping->host);
42291ad66efSJens Axboe 			end_index = (isize - 1) >> PAGE_CACHE_SHIFT;
423eb20796bSJens Axboe 			if (unlikely(!isize || index > end_index))
42491ad66efSJens Axboe 				break;
42591ad66efSJens Axboe 
42691ad66efSJens Axboe 			/*
42791ad66efSJens Axboe 			 * if this is the last page, see if we need to shrink
42891ad66efSJens Axboe 			 * the length and stop
42991ad66efSJens Axboe 			 */
43091ad66efSJens Axboe 			if (end_index == index) {
43191ad66efSJens Axboe 				loff = PAGE_CACHE_SIZE - (isize & ~PAGE_CACHE_MASK);
432eb20796bSJens Axboe 				if (total_len + loff > isize)
43391ad66efSJens Axboe 					break;
43491ad66efSJens Axboe 				/*
43591ad66efSJens Axboe 				 * force quit after adding this page
43691ad66efSJens Axboe 				 */
437eb20796bSJens Axboe 				len = this_len;
43882aa5d61SJens Axboe 				this_len = min(this_len, loff);
439912d35f8SJens Axboe 				loff = 0;
44091ad66efSJens Axboe 			}
4417480a904SJens Axboe 		}
4427480a904SJens Axboe fill_it:
443eb20796bSJens Axboe 		partial[page_nr].offset = loff;
444eb20796bSJens Axboe 		partial[page_nr].len = this_len;
44582aa5d61SJens Axboe 		len -= this_len;
446912d35f8SJens Axboe 		total_len += this_len;
44791ad66efSJens Axboe 		loff = 0;
448eb20796bSJens Axboe 		spd.nr_pages++;
449eb20796bSJens Axboe 		index++;
4505274f052SJens Axboe 	}
4515274f052SJens Axboe 
452eb20796bSJens Axboe 	/*
453eb20796bSJens Axboe 	 * Release any pages at the end, if we quit early. 'i' is how far
454eb20796bSJens Axboe 	 * we got, 'nr_pages' is how many pages are in the map.
455eb20796bSJens Axboe 	 */
456eb20796bSJens Axboe 	while (page_nr < nr_pages)
457eb20796bSJens Axboe 		page_cache_release(pages[page_nr++]);
458eb20796bSJens Axboe 
459912d35f8SJens Axboe 	if (spd.nr_pages)
46000522fb4SJens Axboe 		return splice_to_pipe(pipe, &spd);
46116c523ddSJens Axboe 
4627480a904SJens Axboe 	return error;
4635274f052SJens Axboe }
4645274f052SJens Axboe 
46583f9135bSJens Axboe /**
46683f9135bSJens Axboe  * generic_file_splice_read - splice data from file to a pipe
46783f9135bSJens Axboe  * @in:		file to splice from
46883f9135bSJens Axboe  * @pipe:	pipe to splice to
46983f9135bSJens Axboe  * @len:	number of bytes to splice
47083f9135bSJens Axboe  * @flags:	splice modifier flags
47183f9135bSJens Axboe  *
47283f9135bSJens Axboe  * Will read pages from given file and fill them into a pipe.
47383f9135bSJens Axboe  */
474cbb7e577SJens Axboe ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
475cbb7e577SJens Axboe 				 struct pipe_inode_info *pipe, size_t len,
476cbb7e577SJens Axboe 				 unsigned int flags)
4775274f052SJens Axboe {
4785274f052SJens Axboe 	ssize_t spliced;
4795274f052SJens Axboe 	int ret;
4805274f052SJens Axboe 
4815274f052SJens Axboe 	ret = 0;
4825274f052SJens Axboe 	spliced = 0;
4833a326a2cSIngo Molnar 
4845274f052SJens Axboe 	while (len) {
485cbb7e577SJens Axboe 		ret = __generic_file_splice_read(in, ppos, pipe, len, flags);
4865274f052SJens Axboe 
487c4f895cbSJens Axboe 		if (ret < 0)
4885274f052SJens Axboe 			break;
489c4f895cbSJens Axboe 		else if (!ret) {
490c4f895cbSJens Axboe 			if (spliced)
491c4f895cbSJens Axboe 				break;
492c4f895cbSJens Axboe 			if (flags & SPLICE_F_NONBLOCK) {
493c4f895cbSJens Axboe 				ret = -EAGAIN;
494c4f895cbSJens Axboe 				break;
495c4f895cbSJens Axboe 			}
496c4f895cbSJens Axboe 		}
4975274f052SJens Axboe 
498cbb7e577SJens Axboe 		*ppos += ret;
4995274f052SJens Axboe 		len -= ret;
5005274f052SJens Axboe 		spliced += ret;
5015274f052SJens Axboe 	}
5025274f052SJens Axboe 
5035274f052SJens Axboe 	if (spliced)
5045274f052SJens Axboe 		return spliced;
5055274f052SJens Axboe 
5065274f052SJens Axboe 	return ret;
5075274f052SJens Axboe }
5085274f052SJens Axboe 
509059a8f37SJens Axboe EXPORT_SYMBOL(generic_file_splice_read);
510059a8f37SJens Axboe 
5115274f052SJens Axboe /*
5124f6f0bd2SJens Axboe  * Send 'sd->len' bytes to socket from 'sd->file' at position 'sd->pos'
513016b661eSJens Axboe  * using sendpage(). Return the number of bytes sent.
5145274f052SJens Axboe  */
5155274f052SJens Axboe static int pipe_to_sendpage(struct pipe_inode_info *info,
5165274f052SJens Axboe 			    struct pipe_buffer *buf, struct splice_desc *sd)
5175274f052SJens Axboe {
5185274f052SJens Axboe 	struct file *file = sd->file;
5195274f052SJens Axboe 	loff_t pos = sd->pos;
5205274f052SJens Axboe 	ssize_t ret;
5215274f052SJens Axboe 	void *ptr;
522b2b39fa4SJens Axboe 	int more;
5235274f052SJens Axboe 
5245274f052SJens Axboe 	/*
52573d62d83SIngo Molnar 	 * Sub-optimal, but we are limited by the pipe ->map. We don't
5265274f052SJens Axboe 	 * need a kmap'ed buffer here, we just want to make sure we
5275274f052SJens Axboe 	 * have the page pinned if the pipe page originates from the
52873d62d83SIngo Molnar 	 * page cache.
5295274f052SJens Axboe 	 */
5305274f052SJens Axboe 	ptr = buf->ops->map(file, info, buf);
5315274f052SJens Axboe 	if (IS_ERR(ptr))
5325274f052SJens Axboe 		return PTR_ERR(ptr);
5335274f052SJens Axboe 
534b2b39fa4SJens Axboe 	more = (sd->flags & SPLICE_F_MORE) || sd->len < sd->total_len;
5355274f052SJens Axboe 
536016b661eSJens Axboe 	ret = file->f_op->sendpage(file, buf->page, buf->offset, sd->len,
537016b661eSJens Axboe 				   &pos, more);
5385274f052SJens Axboe 
5395274f052SJens Axboe 	buf->ops->unmap(info, buf);
540016b661eSJens Axboe 	return ret;
5415274f052SJens Axboe }
5425274f052SJens Axboe 
5435274f052SJens Axboe /*
5445274f052SJens Axboe  * This is a little more tricky than the file -> pipe splicing. There are
5455274f052SJens Axboe  * basically three cases:
5465274f052SJens Axboe  *
5475274f052SJens Axboe  *	- Destination page already exists in the address space and there
5485274f052SJens Axboe  *	  are users of it. For that case we have no other option that
5495274f052SJens Axboe  *	  copying the data. Tough luck.
5505274f052SJens Axboe  *	- Destination page already exists in the address space, but there
5515274f052SJens Axboe  *	  are no users of it. Make sure it's uptodate, then drop it. Fall
5525274f052SJens Axboe  *	  through to last case.
5535274f052SJens Axboe  *	- Destination page does not exist, we can add the pipe page to
5545274f052SJens Axboe  *	  the page cache and avoid the copy.
5555274f052SJens Axboe  *
55683f9135bSJens Axboe  * If asked to move pages to the output file (SPLICE_F_MOVE is set in
55783f9135bSJens Axboe  * sd->flags), we attempt to migrate pages from the pipe to the output
55883f9135bSJens Axboe  * file address space page cache. This is possible if no one else has
55983f9135bSJens Axboe  * the pipe page referenced outside of the pipe and page cache. If
56083f9135bSJens Axboe  * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create
56183f9135bSJens Axboe  * a new page in the output file page cache and fill/dirty that.
5625274f052SJens Axboe  */
5635274f052SJens Axboe static int pipe_to_file(struct pipe_inode_info *info, struct pipe_buffer *buf,
5645274f052SJens Axboe 			struct splice_desc *sd)
5655274f052SJens Axboe {
5665274f052SJens Axboe 	struct file *file = sd->file;
5675274f052SJens Axboe 	struct address_space *mapping = file->f_mapping;
5683e7ee3e7SJens Axboe 	gfp_t gfp_mask = mapping_gfp_mask(mapping);
569016b661eSJens Axboe 	unsigned int offset, this_len;
5705274f052SJens Axboe 	struct page *page;
5715274f052SJens Axboe 	pgoff_t index;
5725abc97aaSJens Axboe 	char *src;
5733e7ee3e7SJens Axboe 	int ret;
5745274f052SJens Axboe 
5755274f052SJens Axboe 	/*
57649d0b21bSJens Axboe 	 * make sure the data in this buffer is uptodate
5775274f052SJens Axboe 	 */
5785274f052SJens Axboe 	src = buf->ops->map(file, info, buf);
5795274f052SJens Axboe 	if (IS_ERR(src))
5805274f052SJens Axboe 		return PTR_ERR(src);
5815274f052SJens Axboe 
5825274f052SJens Axboe 	index = sd->pos >> PAGE_CACHE_SHIFT;
5835274f052SJens Axboe 	offset = sd->pos & ~PAGE_CACHE_MASK;
5845274f052SJens Axboe 
585016b661eSJens Axboe 	this_len = sd->len;
586016b661eSJens Axboe 	if (this_len + offset > PAGE_CACHE_SIZE)
587016b661eSJens Axboe 		this_len = PAGE_CACHE_SIZE - offset;
588016b661eSJens Axboe 
5895abc97aaSJens Axboe 	/*
59073d62d83SIngo Molnar 	 * Reuse buf page, if SPLICE_F_MOVE is set.
5915abc97aaSJens Axboe 	 */
5925abc97aaSJens Axboe 	if (sd->flags & SPLICE_F_MOVE) {
59383f9135bSJens Axboe 		/*
59483f9135bSJens Axboe 		 * If steal succeeds, buf->page is now pruned from the vm
5959e0267c2SJens Axboe 		 * side (LRU and page cache) and we can reuse it. The page
5969e0267c2SJens Axboe 		 * will also be looked on successful return.
59783f9135bSJens Axboe 		 */
5985abc97aaSJens Axboe 		if (buf->ops->steal(info, buf))
5995abc97aaSJens Axboe 			goto find_page;
6005abc97aaSJens Axboe 
6015abc97aaSJens Axboe 		page = buf->page;
6023e7ee3e7SJens Axboe 		if (add_to_page_cache(page, mapping, index, gfp_mask))
6035abc97aaSJens Axboe 			goto find_page;
6043e7ee3e7SJens Axboe 
6053e7ee3e7SJens Axboe 		if (!(buf->flags & PIPE_BUF_FLAG_LRU))
6063e7ee3e7SJens Axboe 			lru_cache_add(page);
6075abc97aaSJens Axboe 	} else {
6085274f052SJens Axboe find_page:
6099e0267c2SJens Axboe 		page = find_lock_page(mapping, index);
6109e0267c2SJens Axboe 		if (!page) {
6115274f052SJens Axboe 			ret = -ENOMEM;
6129e0267c2SJens Axboe 			page = page_cache_alloc_cold(mapping);
6139e0267c2SJens Axboe 			if (unlikely(!page))
6149aefe431SDave Jones 				goto out_nomem;
6155274f052SJens Axboe 
6165274f052SJens Axboe 			/*
6179e0267c2SJens Axboe 			 * This will also lock the page
6189e0267c2SJens Axboe 			 */
6199e0267c2SJens Axboe 			ret = add_to_page_cache_lru(page, mapping, index,
6209e0267c2SJens Axboe 						    gfp_mask);
6219e0267c2SJens Axboe 			if (unlikely(ret))
6229e0267c2SJens Axboe 				goto out;
6239e0267c2SJens Axboe 		}
6249e0267c2SJens Axboe 
6259e0267c2SJens Axboe 		/*
6269e0267c2SJens Axboe 		 * We get here with the page locked. If the page is also
6279e0267c2SJens Axboe 		 * uptodate, we don't need to do more. If it isn't, we
6289e0267c2SJens Axboe 		 * may need to bring it in if we are not going to overwrite
6299e0267c2SJens Axboe 		 * the full page.
6305274f052SJens Axboe 		 */
6315274f052SJens Axboe 		if (!PageUptodate(page)) {
632016b661eSJens Axboe 			if (this_len < PAGE_CACHE_SIZE) {
6335274f052SJens Axboe 				ret = mapping->a_ops->readpage(file, page);
6345274f052SJens Axboe 				if (unlikely(ret))
6355274f052SJens Axboe 					goto out;
6365274f052SJens Axboe 
6375274f052SJens Axboe 				lock_page(page);
6385274f052SJens Axboe 
6395274f052SJens Axboe 				if (!PageUptodate(page)) {
6405274f052SJens Axboe 					/*
64173d62d83SIngo Molnar 					 * Page got invalidated, repeat.
6425274f052SJens Axboe 					 */
6435274f052SJens Axboe 					if (!page->mapping) {
6445274f052SJens Axboe 						unlock_page(page);
6455274f052SJens Axboe 						page_cache_release(page);
6465274f052SJens Axboe 						goto find_page;
6475274f052SJens Axboe 					}
6485274f052SJens Axboe 					ret = -EIO;
6495274f052SJens Axboe 					goto out;
6505274f052SJens Axboe 				}
6519e0267c2SJens Axboe 			} else
6525274f052SJens Axboe 				SetPageUptodate(page);
6535274f052SJens Axboe 		}
6545274f052SJens Axboe 	}
6555274f052SJens Axboe 
656016b661eSJens Axboe 	ret = mapping->a_ops->prepare_write(file, page, offset, offset+this_len);
6574f6f0bd2SJens Axboe 	if (ret == AOP_TRUNCATED_PAGE) {
6584f6f0bd2SJens Axboe 		page_cache_release(page);
6594f6f0bd2SJens Axboe 		goto find_page;
6604f6f0bd2SJens Axboe 	} else if (ret)
6615274f052SJens Axboe 		goto out;
6625274f052SJens Axboe 
6633e7ee3e7SJens Axboe 	if (!(buf->flags & PIPE_BUF_FLAG_STOLEN)) {
6645abc97aaSJens Axboe 		char *dst = kmap_atomic(page, KM_USER0);
6655abc97aaSJens Axboe 
666016b661eSJens Axboe 		memcpy(dst + offset, src + buf->offset, this_len);
6675274f052SJens Axboe 		flush_dcache_page(page);
6685274f052SJens Axboe 		kunmap_atomic(dst, KM_USER0);
6695abc97aaSJens Axboe 	}
6705274f052SJens Axboe 
671016b661eSJens Axboe 	ret = mapping->a_ops->commit_write(file, page, offset, offset+this_len);
6724f6f0bd2SJens Axboe 	if (ret == AOP_TRUNCATED_PAGE) {
6734f6f0bd2SJens Axboe 		page_cache_release(page);
6744f6f0bd2SJens Axboe 		goto find_page;
6754f6f0bd2SJens Axboe 	} else if (ret)
6765274f052SJens Axboe 		goto out;
6775274f052SJens Axboe 
678016b661eSJens Axboe 	/*
679016b661eSJens Axboe 	 * Return the number of bytes written.
680016b661eSJens Axboe 	 */
681016b661eSJens Axboe 	ret = this_len;
682c7f21e4fSJens Axboe 	mark_page_accessed(page);
6834f6f0bd2SJens Axboe 	balance_dirty_pages_ratelimited(mapping);
6845274f052SJens Axboe out:
6859e0267c2SJens Axboe 	if (!(buf->flags & PIPE_BUF_FLAG_STOLEN))
6865274f052SJens Axboe 		page_cache_release(page);
6879e0267c2SJens Axboe 
6884f6f0bd2SJens Axboe 	unlock_page(page);
6899aefe431SDave Jones out_nomem:
6905274f052SJens Axboe 	buf->ops->unmap(info, buf);
6915274f052SJens Axboe 	return ret;
6925274f052SJens Axboe }
6935274f052SJens Axboe 
69483f9135bSJens Axboe /*
69583f9135bSJens Axboe  * Pipe input worker. Most of this logic works like a regular pipe, the
69683f9135bSJens Axboe  * key here is the 'actor' worker passed in that actually moves the data
69783f9135bSJens Axboe  * to the wanted destination. See pipe_to_file/pipe_to_sendpage above.
69883f9135bSJens Axboe  */
69900522fb4SJens Axboe ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
700cbb7e577SJens Axboe 			 loff_t *ppos, size_t len, unsigned int flags,
7015274f052SJens Axboe 			 splice_actor *actor)
7025274f052SJens Axboe {
7035274f052SJens Axboe 	int ret, do_wakeup, err;
7045274f052SJens Axboe 	struct splice_desc sd;
7055274f052SJens Axboe 
7065274f052SJens Axboe 	ret = 0;
7075274f052SJens Axboe 	do_wakeup = 0;
7085274f052SJens Axboe 
7095274f052SJens Axboe 	sd.total_len = len;
7105274f052SJens Axboe 	sd.flags = flags;
7115274f052SJens Axboe 	sd.file = out;
712cbb7e577SJens Axboe 	sd.pos = *ppos;
7135274f052SJens Axboe 
7143a326a2cSIngo Molnar 	if (pipe->inode)
7153a326a2cSIngo Molnar 		mutex_lock(&pipe->inode->i_mutex);
7165274f052SJens Axboe 
7175274f052SJens Axboe 	for (;;) {
7186f767b04SJens Axboe 		if (pipe->nrbufs) {
7196f767b04SJens Axboe 			struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
7205274f052SJens Axboe 			struct pipe_buf_operations *ops = buf->ops;
7215274f052SJens Axboe 
7225274f052SJens Axboe 			sd.len = buf->len;
7235274f052SJens Axboe 			if (sd.len > sd.total_len)
7245274f052SJens Axboe 				sd.len = sd.total_len;
7255274f052SJens Axboe 
7263a326a2cSIngo Molnar 			err = actor(pipe, buf, &sd);
727016b661eSJens Axboe 			if (err <= 0) {
7285274f052SJens Axboe 				if (!ret && err != -ENODATA)
7295274f052SJens Axboe 					ret = err;
7305274f052SJens Axboe 
7315274f052SJens Axboe 				break;
7325274f052SJens Axboe 			}
7335274f052SJens Axboe 
734016b661eSJens Axboe 			ret += err;
735016b661eSJens Axboe 			buf->offset += err;
736016b661eSJens Axboe 			buf->len -= err;
737016b661eSJens Axboe 
738016b661eSJens Axboe 			sd.len -= err;
739016b661eSJens Axboe 			sd.pos += err;
740016b661eSJens Axboe 			sd.total_len -= err;
741016b661eSJens Axboe 			if (sd.len)
742016b661eSJens Axboe 				continue;
74373d62d83SIngo Molnar 
7445274f052SJens Axboe 			if (!buf->len) {
7455274f052SJens Axboe 				buf->ops = NULL;
7463a326a2cSIngo Molnar 				ops->release(pipe, buf);
7476f767b04SJens Axboe 				pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);
7486f767b04SJens Axboe 				pipe->nrbufs--;
7496f767b04SJens Axboe 				if (pipe->inode)
7505274f052SJens Axboe 					do_wakeup = 1;
7515274f052SJens Axboe 			}
7525274f052SJens Axboe 
7535274f052SJens Axboe 			if (!sd.total_len)
7545274f052SJens Axboe 				break;
7555274f052SJens Axboe 		}
7565274f052SJens Axboe 
7576f767b04SJens Axboe 		if (pipe->nrbufs)
7585274f052SJens Axboe 			continue;
7593a326a2cSIngo Molnar 		if (!pipe->writers)
7605274f052SJens Axboe 			break;
7613a326a2cSIngo Molnar 		if (!pipe->waiting_writers) {
7625274f052SJens Axboe 			if (ret)
7635274f052SJens Axboe 				break;
7645274f052SJens Axboe 		}
7655274f052SJens Axboe 
76629e35094SLinus Torvalds 		if (flags & SPLICE_F_NONBLOCK) {
76729e35094SLinus Torvalds 			if (!ret)
76829e35094SLinus Torvalds 				ret = -EAGAIN;
76929e35094SLinus Torvalds 			break;
77029e35094SLinus Torvalds 		}
77129e35094SLinus Torvalds 
7725274f052SJens Axboe 		if (signal_pending(current)) {
7735274f052SJens Axboe 			if (!ret)
7745274f052SJens Axboe 				ret = -ERESTARTSYS;
7755274f052SJens Axboe 			break;
7765274f052SJens Axboe 		}
7775274f052SJens Axboe 
7785274f052SJens Axboe 		if (do_wakeup) {
779c0bd1f65SJens Axboe 			smp_mb();
7803a326a2cSIngo Molnar 			if (waitqueue_active(&pipe->wait))
7813a326a2cSIngo Molnar 				wake_up_interruptible_sync(&pipe->wait);
7823a326a2cSIngo Molnar 			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
7835274f052SJens Axboe 			do_wakeup = 0;
7845274f052SJens Axboe 		}
7855274f052SJens Axboe 
7863a326a2cSIngo Molnar 		pipe_wait(pipe);
7875274f052SJens Axboe 	}
7885274f052SJens Axboe 
7893a326a2cSIngo Molnar 	if (pipe->inode)
7903a326a2cSIngo Molnar 		mutex_unlock(&pipe->inode->i_mutex);
7915274f052SJens Axboe 
7925274f052SJens Axboe 	if (do_wakeup) {
793c0bd1f65SJens Axboe 		smp_mb();
7943a326a2cSIngo Molnar 		if (waitqueue_active(&pipe->wait))
7953a326a2cSIngo Molnar 			wake_up_interruptible(&pipe->wait);
7963a326a2cSIngo Molnar 		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
7975274f052SJens Axboe 	}
7985274f052SJens Axboe 
7995274f052SJens Axboe 	return ret;
8005274f052SJens Axboe }
8015274f052SJens Axboe 
80283f9135bSJens Axboe /**
80383f9135bSJens Axboe  * generic_file_splice_write - splice data from a pipe to a file
8043a326a2cSIngo Molnar  * @pipe:	pipe info
80583f9135bSJens Axboe  * @out:	file to write to
80683f9135bSJens Axboe  * @len:	number of bytes to splice
80783f9135bSJens Axboe  * @flags:	splice modifier flags
80883f9135bSJens Axboe  *
80983f9135bSJens Axboe  * Will either move or copy pages (determined by @flags options) from
81083f9135bSJens Axboe  * the given pipe inode to the given file.
81183f9135bSJens Axboe  *
81283f9135bSJens Axboe  */
8133a326a2cSIngo Molnar ssize_t
8143a326a2cSIngo Molnar generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
815cbb7e577SJens Axboe 			  loff_t *ppos, size_t len, unsigned int flags)
8165274f052SJens Axboe {
8174f6f0bd2SJens Axboe 	struct address_space *mapping = out->f_mapping;
8183a326a2cSIngo Molnar 	ssize_t ret;
8193a326a2cSIngo Molnar 
82000522fb4SJens Axboe 	ret = splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_file);
821a4514ebdSJens Axboe 	if (ret > 0) {
822a4514ebdSJens Axboe 		struct inode *inode = mapping->host;
823a4514ebdSJens Axboe 
824a4514ebdSJens Axboe 		*ppos += ret;
8254f6f0bd2SJens Axboe 
8264f6f0bd2SJens Axboe 		/*
827a4514ebdSJens Axboe 		 * If file or inode is SYNC and we actually wrote some data,
828a4514ebdSJens Axboe 		 * sync it.
8294f6f0bd2SJens Axboe 		 */
830a4514ebdSJens Axboe 		if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) {
8314f6f0bd2SJens Axboe 			int err;
8324f6f0bd2SJens Axboe 
8334f6f0bd2SJens Axboe 			mutex_lock(&inode->i_mutex);
834a4514ebdSJens Axboe 			err = generic_osync_inode(inode, mapping,
8354f6f0bd2SJens Axboe 						  OSYNC_METADATA|OSYNC_DATA);
8364f6f0bd2SJens Axboe 			mutex_unlock(&inode->i_mutex);
8374f6f0bd2SJens Axboe 
8384f6f0bd2SJens Axboe 			if (err)
8394f6f0bd2SJens Axboe 				ret = err;
8404f6f0bd2SJens Axboe 		}
841a4514ebdSJens Axboe 	}
8424f6f0bd2SJens Axboe 
8434f6f0bd2SJens Axboe 	return ret;
8445274f052SJens Axboe }
8455274f052SJens Axboe 
846059a8f37SJens Axboe EXPORT_SYMBOL(generic_file_splice_write);
847059a8f37SJens Axboe 
84883f9135bSJens Axboe /**
84983f9135bSJens Axboe  * generic_splice_sendpage - splice data from a pipe to a socket
85083f9135bSJens Axboe  * @inode:	pipe inode
85183f9135bSJens Axboe  * @out:	socket to write to
85283f9135bSJens Axboe  * @len:	number of bytes to splice
85383f9135bSJens Axboe  * @flags:	splice modifier flags
85483f9135bSJens Axboe  *
85583f9135bSJens Axboe  * Will send @len bytes from the pipe to a network socket. No data copying
85683f9135bSJens Axboe  * is involved.
85783f9135bSJens Axboe  *
85883f9135bSJens Axboe  */
8593a326a2cSIngo Molnar ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out,
860cbb7e577SJens Axboe 				loff_t *ppos, size_t len, unsigned int flags)
8615274f052SJens Axboe {
86200522fb4SJens Axboe 	return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_sendpage);
8635274f052SJens Axboe }
8645274f052SJens Axboe 
865059a8f37SJens Axboe EXPORT_SYMBOL(generic_splice_sendpage);
866a0f06780SJeff Garzik 
86783f9135bSJens Axboe /*
86883f9135bSJens Axboe  * Attempt to initiate a splice from pipe to file.
86983f9135bSJens Axboe  */
8703a326a2cSIngo Molnar static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
871cbb7e577SJens Axboe 			   loff_t *ppos, size_t len, unsigned int flags)
8725274f052SJens Axboe {
8735274f052SJens Axboe 	int ret;
8745274f052SJens Axboe 
87549570e9bSJens Axboe 	if (unlikely(!out->f_op || !out->f_op->splice_write))
8765274f052SJens Axboe 		return -EINVAL;
8775274f052SJens Axboe 
87849570e9bSJens Axboe 	if (unlikely(!(out->f_mode & FMODE_WRITE)))
8795274f052SJens Axboe 		return -EBADF;
8805274f052SJens Axboe 
881cbb7e577SJens Axboe 	ret = rw_verify_area(WRITE, out, ppos, len);
8825274f052SJens Axboe 	if (unlikely(ret < 0))
8835274f052SJens Axboe 		return ret;
8845274f052SJens Axboe 
885cbb7e577SJens Axboe 	return out->f_op->splice_write(pipe, out, ppos, len, flags);
8865274f052SJens Axboe }
8875274f052SJens Axboe 
88883f9135bSJens Axboe /*
88983f9135bSJens Axboe  * Attempt to initiate a splice from a file to a pipe.
89083f9135bSJens Axboe  */
891cbb7e577SJens Axboe static long do_splice_to(struct file *in, loff_t *ppos,
892cbb7e577SJens Axboe 			 struct pipe_inode_info *pipe, size_t len,
893cbb7e577SJens Axboe 			 unsigned int flags)
8945274f052SJens Axboe {
895cbb7e577SJens Axboe 	loff_t isize, left;
8965274f052SJens Axboe 	int ret;
8975274f052SJens Axboe 
89849570e9bSJens Axboe 	if (unlikely(!in->f_op || !in->f_op->splice_read))
8995274f052SJens Axboe 		return -EINVAL;
9005274f052SJens Axboe 
90149570e9bSJens Axboe 	if (unlikely(!(in->f_mode & FMODE_READ)))
9025274f052SJens Axboe 		return -EBADF;
9035274f052SJens Axboe 
904cbb7e577SJens Axboe 	ret = rw_verify_area(READ, in, ppos, len);
9055274f052SJens Axboe 	if (unlikely(ret < 0))
9065274f052SJens Axboe 		return ret;
9075274f052SJens Axboe 
9085274f052SJens Axboe 	isize = i_size_read(in->f_mapping->host);
909cbb7e577SJens Axboe 	if (unlikely(*ppos >= isize))
9105274f052SJens Axboe 		return 0;
9115274f052SJens Axboe 
912cbb7e577SJens Axboe 	left = isize - *ppos;
91349570e9bSJens Axboe 	if (unlikely(left < len))
9145274f052SJens Axboe 		len = left;
9155274f052SJens Axboe 
916cbb7e577SJens Axboe 	return in->f_op->splice_read(in, ppos, pipe, len, flags);
9175274f052SJens Axboe }
9185274f052SJens Axboe 
919cbb7e577SJens Axboe long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
920cbb7e577SJens Axboe 		      size_t len, unsigned int flags)
921b92ce558SJens Axboe {
922b92ce558SJens Axboe 	struct pipe_inode_info *pipe;
923b92ce558SJens Axboe 	long ret, bytes;
924cbb7e577SJens Axboe 	loff_t out_off;
925b92ce558SJens Axboe 	umode_t i_mode;
926b92ce558SJens Axboe 	int i;
927b92ce558SJens Axboe 
928b92ce558SJens Axboe 	/*
929b92ce558SJens Axboe 	 * We require the input being a regular file, as we don't want to
930b92ce558SJens Axboe 	 * randomly drop data for eg socket -> socket splicing. Use the
931b92ce558SJens Axboe 	 * piped splicing for that!
932b92ce558SJens Axboe 	 */
933b92ce558SJens Axboe 	i_mode = in->f_dentry->d_inode->i_mode;
934b92ce558SJens Axboe 	if (unlikely(!S_ISREG(i_mode) && !S_ISBLK(i_mode)))
935b92ce558SJens Axboe 		return -EINVAL;
936b92ce558SJens Axboe 
937b92ce558SJens Axboe 	/*
938b92ce558SJens Axboe 	 * neither in nor out is a pipe, setup an internal pipe attached to
939b92ce558SJens Axboe 	 * 'out' and transfer the wanted data from 'in' to 'out' through that
940b92ce558SJens Axboe 	 */
941b92ce558SJens Axboe 	pipe = current->splice_pipe;
94249570e9bSJens Axboe 	if (unlikely(!pipe)) {
943b92ce558SJens Axboe 		pipe = alloc_pipe_info(NULL);
944b92ce558SJens Axboe 		if (!pipe)
945b92ce558SJens Axboe 			return -ENOMEM;
946b92ce558SJens Axboe 
947b92ce558SJens Axboe 		/*
948b92ce558SJens Axboe 		 * We don't have an immediate reader, but we'll read the stuff
94900522fb4SJens Axboe 		 * out of the pipe right after the splice_to_pipe(). So set
950b92ce558SJens Axboe 		 * PIPE_READERS appropriately.
951b92ce558SJens Axboe 		 */
952b92ce558SJens Axboe 		pipe->readers = 1;
953b92ce558SJens Axboe 
954b92ce558SJens Axboe 		current->splice_pipe = pipe;
955b92ce558SJens Axboe 	}
956b92ce558SJens Axboe 
957b92ce558SJens Axboe 	/*
95873d62d83SIngo Molnar 	 * Do the splice.
959b92ce558SJens Axboe 	 */
960b92ce558SJens Axboe 	ret = 0;
961b92ce558SJens Axboe 	bytes = 0;
962cbb7e577SJens Axboe 	out_off = 0;
963b92ce558SJens Axboe 
964b92ce558SJens Axboe 	while (len) {
965b92ce558SJens Axboe 		size_t read_len, max_read_len;
966b92ce558SJens Axboe 
967b92ce558SJens Axboe 		/*
968b92ce558SJens Axboe 		 * Do at most PIPE_BUFFERS pages worth of transfer:
969b92ce558SJens Axboe 		 */
970b92ce558SJens Axboe 		max_read_len = min(len, (size_t)(PIPE_BUFFERS*PAGE_SIZE));
971b92ce558SJens Axboe 
972cbb7e577SJens Axboe 		ret = do_splice_to(in, ppos, pipe, max_read_len, flags);
973b92ce558SJens Axboe 		if (unlikely(ret < 0))
974b92ce558SJens Axboe 			goto out_release;
975b92ce558SJens Axboe 
976b92ce558SJens Axboe 		read_len = ret;
977b92ce558SJens Axboe 
978b92ce558SJens Axboe 		/*
979b92ce558SJens Axboe 		 * NOTE: nonblocking mode only applies to the input. We
980b92ce558SJens Axboe 		 * must not do the output in nonblocking mode as then we
981b92ce558SJens Axboe 		 * could get stuck data in the internal pipe:
982b92ce558SJens Axboe 		 */
983cbb7e577SJens Axboe 		ret = do_splice_from(pipe, out, &out_off, read_len,
984b92ce558SJens Axboe 				     flags & ~SPLICE_F_NONBLOCK);
985b92ce558SJens Axboe 		if (unlikely(ret < 0))
986b92ce558SJens Axboe 			goto out_release;
987b92ce558SJens Axboe 
988b92ce558SJens Axboe 		bytes += ret;
989b92ce558SJens Axboe 		len -= ret;
990b92ce558SJens Axboe 
991b92ce558SJens Axboe 		/*
992b92ce558SJens Axboe 		 * In nonblocking mode, if we got back a short read then
993b92ce558SJens Axboe 		 * that was due to either an IO error or due to the
994b92ce558SJens Axboe 		 * pagecache entry not being there. In the IO error case
995b92ce558SJens Axboe 		 * the _next_ splice attempt will produce a clean IO error
996b92ce558SJens Axboe 		 * return value (not a short read), so in both cases it's
997b92ce558SJens Axboe 		 * correct to break out of the loop here:
998b92ce558SJens Axboe 		 */
999b92ce558SJens Axboe 		if ((flags & SPLICE_F_NONBLOCK) && (read_len < max_read_len))
1000b92ce558SJens Axboe 			break;
1001b92ce558SJens Axboe 	}
1002b92ce558SJens Axboe 
1003b92ce558SJens Axboe 	pipe->nrbufs = pipe->curbuf = 0;
1004b92ce558SJens Axboe 
1005b92ce558SJens Axboe 	return bytes;
1006b92ce558SJens Axboe 
1007b92ce558SJens Axboe out_release:
1008b92ce558SJens Axboe 	/*
1009b92ce558SJens Axboe 	 * If we did an incomplete transfer we must release
1010b92ce558SJens Axboe 	 * the pipe buffers in question:
1011b92ce558SJens Axboe 	 */
1012b92ce558SJens Axboe 	for (i = 0; i < PIPE_BUFFERS; i++) {
1013b92ce558SJens Axboe 		struct pipe_buffer *buf = pipe->bufs + i;
1014b92ce558SJens Axboe 
1015b92ce558SJens Axboe 		if (buf->ops) {
1016b92ce558SJens Axboe 			buf->ops->release(pipe, buf);
1017b92ce558SJens Axboe 			buf->ops = NULL;
1018b92ce558SJens Axboe 		}
1019b92ce558SJens Axboe 	}
1020b92ce558SJens Axboe 	pipe->nrbufs = pipe->curbuf = 0;
1021b92ce558SJens Axboe 
1022b92ce558SJens Axboe 	/*
1023b92ce558SJens Axboe 	 * If we transferred some data, return the number of bytes:
1024b92ce558SJens Axboe 	 */
1025b92ce558SJens Axboe 	if (bytes > 0)
1026b92ce558SJens Axboe 		return bytes;
1027b92ce558SJens Axboe 
1028b92ce558SJens Axboe 	return ret;
1029b92ce558SJens Axboe }
1030b92ce558SJens Axboe 
1031b92ce558SJens Axboe EXPORT_SYMBOL(do_splice_direct);
1032b92ce558SJens Axboe 
103383f9135bSJens Axboe /*
103483f9135bSJens Axboe  * Determine where to splice to/from.
103583f9135bSJens Axboe  */
1036529565dcSIngo Molnar static long do_splice(struct file *in, loff_t __user *off_in,
1037529565dcSIngo Molnar 		      struct file *out, loff_t __user *off_out,
1038529565dcSIngo Molnar 		      size_t len, unsigned int flags)
10395274f052SJens Axboe {
10403a326a2cSIngo Molnar 	struct pipe_inode_info *pipe;
1041cbb7e577SJens Axboe 	loff_t offset, *off;
1042a4514ebdSJens Axboe 	long ret;
10435274f052SJens Axboe 
10443a326a2cSIngo Molnar 	pipe = in->f_dentry->d_inode->i_pipe;
1045529565dcSIngo Molnar 	if (pipe) {
1046529565dcSIngo Molnar 		if (off_in)
1047529565dcSIngo Molnar 			return -ESPIPE;
1048b92ce558SJens Axboe 		if (off_out) {
1049b92ce558SJens Axboe 			if (out->f_op->llseek == no_llseek)
1050b92ce558SJens Axboe 				return -EINVAL;
1051cbb7e577SJens Axboe 			if (copy_from_user(&offset, off_out, sizeof(loff_t)))
1052b92ce558SJens Axboe 				return -EFAULT;
1053cbb7e577SJens Axboe 			off = &offset;
1054cbb7e577SJens Axboe 		} else
1055cbb7e577SJens Axboe 			off = &out->f_pos;
1056529565dcSIngo Molnar 
1057a4514ebdSJens Axboe 		ret = do_splice_from(pipe, out, off, len, flags);
1058a4514ebdSJens Axboe 
1059a4514ebdSJens Axboe 		if (off_out && copy_to_user(off_out, off, sizeof(loff_t)))
1060a4514ebdSJens Axboe 			ret = -EFAULT;
1061a4514ebdSJens Axboe 
1062a4514ebdSJens Axboe 		return ret;
1063529565dcSIngo Molnar 	}
10645274f052SJens Axboe 
10653a326a2cSIngo Molnar 	pipe = out->f_dentry->d_inode->i_pipe;
1066529565dcSIngo Molnar 	if (pipe) {
1067529565dcSIngo Molnar 		if (off_out)
1068529565dcSIngo Molnar 			return -ESPIPE;
1069b92ce558SJens Axboe 		if (off_in) {
1070b92ce558SJens Axboe 			if (in->f_op->llseek == no_llseek)
1071b92ce558SJens Axboe 				return -EINVAL;
1072cbb7e577SJens Axboe 			if (copy_from_user(&offset, off_in, sizeof(loff_t)))
1073b92ce558SJens Axboe 				return -EFAULT;
1074cbb7e577SJens Axboe 			off = &offset;
1075cbb7e577SJens Axboe 		} else
1076cbb7e577SJens Axboe 			off = &in->f_pos;
1077529565dcSIngo Molnar 
1078a4514ebdSJens Axboe 		ret = do_splice_to(in, off, pipe, len, flags);
1079a4514ebdSJens Axboe 
1080a4514ebdSJens Axboe 		if (off_in && copy_to_user(off_in, off, sizeof(loff_t)))
1081a4514ebdSJens Axboe 			ret = -EFAULT;
1082a4514ebdSJens Axboe 
1083a4514ebdSJens Axboe 		return ret;
1084529565dcSIngo Molnar 	}
10855274f052SJens Axboe 
10865274f052SJens Axboe 	return -EINVAL;
10875274f052SJens Axboe }
10885274f052SJens Axboe 
1089912d35f8SJens Axboe /*
1090912d35f8SJens Axboe  * Map an iov into an array of pages and offset/length tupples. With the
1091912d35f8SJens Axboe  * partial_page structure, we can map several non-contiguous ranges into
1092912d35f8SJens Axboe  * our ones pages[] map instead of splitting that operation into pieces.
1093912d35f8SJens Axboe  * Could easily be exported as a generic helper for other users, in which
1094912d35f8SJens Axboe  * case one would probably want to add a 'max_nr_pages' parameter as well.
1095912d35f8SJens Axboe  */
1096912d35f8SJens Axboe static int get_iovec_page_array(const struct iovec __user *iov,
1097912d35f8SJens Axboe 				unsigned int nr_vecs, struct page **pages,
1098912d35f8SJens Axboe 				struct partial_page *partial)
1099912d35f8SJens Axboe {
1100912d35f8SJens Axboe 	int buffers = 0, error = 0;
1101912d35f8SJens Axboe 
1102912d35f8SJens Axboe 	/*
1103912d35f8SJens Axboe 	 * It's ok to take the mmap_sem for reading, even
1104912d35f8SJens Axboe 	 * across a "get_user()".
1105912d35f8SJens Axboe 	 */
1106912d35f8SJens Axboe 	down_read(&current->mm->mmap_sem);
1107912d35f8SJens Axboe 
1108912d35f8SJens Axboe 	while (nr_vecs) {
1109912d35f8SJens Axboe 		unsigned long off, npages;
1110912d35f8SJens Axboe 		void __user *base;
1111912d35f8SJens Axboe 		size_t len;
1112912d35f8SJens Axboe 		int i;
1113912d35f8SJens Axboe 
1114912d35f8SJens Axboe 		/*
1115912d35f8SJens Axboe 		 * Get user address base and length for this iovec.
1116912d35f8SJens Axboe 		 */
1117912d35f8SJens Axboe 		error = get_user(base, &iov->iov_base);
1118912d35f8SJens Axboe 		if (unlikely(error))
1119912d35f8SJens Axboe 			break;
1120912d35f8SJens Axboe 		error = get_user(len, &iov->iov_len);
1121912d35f8SJens Axboe 		if (unlikely(error))
1122912d35f8SJens Axboe 			break;
1123912d35f8SJens Axboe 
1124912d35f8SJens Axboe 		/*
1125912d35f8SJens Axboe 		 * Sanity check this iovec. 0 read succeeds.
1126912d35f8SJens Axboe 		 */
1127912d35f8SJens Axboe 		if (unlikely(!len))
1128912d35f8SJens Axboe 			break;
1129912d35f8SJens Axboe 		error = -EFAULT;
1130912d35f8SJens Axboe 		if (unlikely(!base))
1131912d35f8SJens Axboe 			break;
1132912d35f8SJens Axboe 
1133912d35f8SJens Axboe 		/*
1134912d35f8SJens Axboe 		 * Get this base offset and number of pages, then map
1135912d35f8SJens Axboe 		 * in the user pages.
1136912d35f8SJens Axboe 		 */
1137912d35f8SJens Axboe 		off = (unsigned long) base & ~PAGE_MASK;
1138912d35f8SJens Axboe 		npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
1139912d35f8SJens Axboe 		if (npages > PIPE_BUFFERS - buffers)
1140912d35f8SJens Axboe 			npages = PIPE_BUFFERS - buffers;
1141912d35f8SJens Axboe 
1142912d35f8SJens Axboe 		error = get_user_pages(current, current->mm,
1143912d35f8SJens Axboe 				       (unsigned long) base, npages, 0, 0,
1144912d35f8SJens Axboe 				       &pages[buffers], NULL);
1145912d35f8SJens Axboe 
1146912d35f8SJens Axboe 		if (unlikely(error <= 0))
1147912d35f8SJens Axboe 			break;
1148912d35f8SJens Axboe 
1149912d35f8SJens Axboe 		/*
1150912d35f8SJens Axboe 		 * Fill this contiguous range into the partial page map.
1151912d35f8SJens Axboe 		 */
1152912d35f8SJens Axboe 		for (i = 0; i < error; i++) {
1153912d35f8SJens Axboe 			const int plen = min_t(size_t, len, PAGE_SIZE) - off;
1154912d35f8SJens Axboe 
1155912d35f8SJens Axboe 			partial[buffers].offset = off;
1156912d35f8SJens Axboe 			partial[buffers].len = plen;
1157912d35f8SJens Axboe 
1158912d35f8SJens Axboe 			off = 0;
1159912d35f8SJens Axboe 			len -= plen;
1160912d35f8SJens Axboe 			buffers++;
1161912d35f8SJens Axboe 		}
1162912d35f8SJens Axboe 
1163912d35f8SJens Axboe 		/*
1164912d35f8SJens Axboe 		 * We didn't complete this iov, stop here since it probably
1165912d35f8SJens Axboe 		 * means we have to move some of this into a pipe to
1166912d35f8SJens Axboe 		 * be able to continue.
1167912d35f8SJens Axboe 		 */
1168912d35f8SJens Axboe 		if (len)
1169912d35f8SJens Axboe 			break;
1170912d35f8SJens Axboe 
1171912d35f8SJens Axboe 		/*
1172912d35f8SJens Axboe 		 * Don't continue if we mapped fewer pages than we asked for,
1173912d35f8SJens Axboe 		 * or if we mapped the max number of pages that we have
1174912d35f8SJens Axboe 		 * room for.
1175912d35f8SJens Axboe 		 */
1176912d35f8SJens Axboe 		if (error < npages || buffers == PIPE_BUFFERS)
1177912d35f8SJens Axboe 			break;
1178912d35f8SJens Axboe 
1179912d35f8SJens Axboe 		nr_vecs--;
1180912d35f8SJens Axboe 		iov++;
1181912d35f8SJens Axboe 	}
1182912d35f8SJens Axboe 
1183912d35f8SJens Axboe 	up_read(&current->mm->mmap_sem);
1184912d35f8SJens Axboe 
1185912d35f8SJens Axboe 	if (buffers)
1186912d35f8SJens Axboe 		return buffers;
1187912d35f8SJens Axboe 
1188912d35f8SJens Axboe 	return error;
1189912d35f8SJens Axboe }
1190912d35f8SJens Axboe 
1191912d35f8SJens Axboe /*
1192912d35f8SJens Axboe  * vmsplice splices a user address range into a pipe. It can be thought of
1193912d35f8SJens Axboe  * as splice-from-memory, where the regular splice is splice-from-file (or
1194912d35f8SJens Axboe  * to file). In both cases the output is a pipe, naturally.
1195912d35f8SJens Axboe  *
1196912d35f8SJens Axboe  * Note that vmsplice only supports splicing _from_ user memory to a pipe,
1197912d35f8SJens Axboe  * not the other way around. Splicing from user memory is a simple operation
1198912d35f8SJens Axboe  * that can be supported without any funky alignment restrictions or nasty
1199912d35f8SJens Axboe  * vm tricks. We simply map in the user memory and fill them into a pipe.
1200912d35f8SJens Axboe  * The reverse isn't quite as easy, though. There are two possible solutions
1201912d35f8SJens Axboe  * for that:
1202912d35f8SJens Axboe  *
1203912d35f8SJens Axboe  *	- memcpy() the data internally, at which point we might as well just
1204912d35f8SJens Axboe  *	  do a regular read() on the buffer anyway.
1205912d35f8SJens Axboe  *	- Lots of nasty vm tricks, that are neither fast nor flexible (it
1206912d35f8SJens Axboe  *	  has restriction limitations on both ends of the pipe).
1207912d35f8SJens Axboe  *
1208912d35f8SJens Axboe  * Alas, it isn't here.
1209912d35f8SJens Axboe  *
1210912d35f8SJens Axboe  */
1211912d35f8SJens Axboe static long do_vmsplice(struct file *file, const struct iovec __user *iov,
1212912d35f8SJens Axboe 			unsigned long nr_segs, unsigned int flags)
1213912d35f8SJens Axboe {
1214912d35f8SJens Axboe 	struct pipe_inode_info *pipe = file->f_dentry->d_inode->i_pipe;
1215912d35f8SJens Axboe 	struct page *pages[PIPE_BUFFERS];
1216912d35f8SJens Axboe 	struct partial_page partial[PIPE_BUFFERS];
1217912d35f8SJens Axboe 	struct splice_pipe_desc spd = {
1218912d35f8SJens Axboe 		.pages = pages,
1219912d35f8SJens Axboe 		.partial = partial,
1220912d35f8SJens Axboe 		.flags = flags,
1221912d35f8SJens Axboe 		.ops = &user_page_pipe_buf_ops,
1222912d35f8SJens Axboe 	};
1223912d35f8SJens Axboe 
1224912d35f8SJens Axboe 	if (unlikely(!pipe))
1225912d35f8SJens Axboe 		return -EBADF;
1226912d35f8SJens Axboe 	if (unlikely(nr_segs > UIO_MAXIOV))
1227912d35f8SJens Axboe 		return -EINVAL;
1228912d35f8SJens Axboe 	else if (unlikely(!nr_segs))
1229912d35f8SJens Axboe 		return 0;
1230912d35f8SJens Axboe 
1231912d35f8SJens Axboe 	spd.nr_pages = get_iovec_page_array(iov, nr_segs, pages, partial);
1232912d35f8SJens Axboe 	if (spd.nr_pages <= 0)
1233912d35f8SJens Axboe 		return spd.nr_pages;
1234912d35f8SJens Axboe 
123500522fb4SJens Axboe 	return splice_to_pipe(pipe, &spd);
1236912d35f8SJens Axboe }
1237912d35f8SJens Axboe 
1238912d35f8SJens Axboe asmlinkage long sys_vmsplice(int fd, const struct iovec __user *iov,
1239912d35f8SJens Axboe 			     unsigned long nr_segs, unsigned int flags)
1240912d35f8SJens Axboe {
1241912d35f8SJens Axboe 	struct file *file;
1242912d35f8SJens Axboe 	long error;
1243912d35f8SJens Axboe 	int fput;
1244912d35f8SJens Axboe 
1245912d35f8SJens Axboe 	error = -EBADF;
1246912d35f8SJens Axboe 	file = fget_light(fd, &fput);
1247912d35f8SJens Axboe 	if (file) {
1248912d35f8SJens Axboe 		if (file->f_mode & FMODE_WRITE)
1249912d35f8SJens Axboe 			error = do_vmsplice(file, iov, nr_segs, flags);
1250912d35f8SJens Axboe 
1251912d35f8SJens Axboe 		fput_light(file, fput);
1252912d35f8SJens Axboe 	}
1253912d35f8SJens Axboe 
1254912d35f8SJens Axboe 	return error;
1255912d35f8SJens Axboe }
1256912d35f8SJens Axboe 
1257529565dcSIngo Molnar asmlinkage long sys_splice(int fd_in, loff_t __user *off_in,
1258529565dcSIngo Molnar 			   int fd_out, loff_t __user *off_out,
1259529565dcSIngo Molnar 			   size_t len, unsigned int flags)
12605274f052SJens Axboe {
12615274f052SJens Axboe 	long error;
12625274f052SJens Axboe 	struct file *in, *out;
12635274f052SJens Axboe 	int fput_in, fput_out;
12645274f052SJens Axboe 
12655274f052SJens Axboe 	if (unlikely(!len))
12665274f052SJens Axboe 		return 0;
12675274f052SJens Axboe 
12685274f052SJens Axboe 	error = -EBADF;
1269529565dcSIngo Molnar 	in = fget_light(fd_in, &fput_in);
12705274f052SJens Axboe 	if (in) {
12715274f052SJens Axboe 		if (in->f_mode & FMODE_READ) {
1272529565dcSIngo Molnar 			out = fget_light(fd_out, &fput_out);
12735274f052SJens Axboe 			if (out) {
12745274f052SJens Axboe 				if (out->f_mode & FMODE_WRITE)
1275529565dcSIngo Molnar 					error = do_splice(in, off_in,
1276529565dcSIngo Molnar 							  out, off_out,
1277529565dcSIngo Molnar 							  len, flags);
12785274f052SJens Axboe 				fput_light(out, fput_out);
12795274f052SJens Axboe 			}
12805274f052SJens Axboe 		}
12815274f052SJens Axboe 
12825274f052SJens Axboe 		fput_light(in, fput_in);
12835274f052SJens Axboe 	}
12845274f052SJens Axboe 
12855274f052SJens Axboe 	return error;
12865274f052SJens Axboe }
128770524490SJens Axboe 
128870524490SJens Axboe /*
128970524490SJens Axboe  * Link contents of ipipe to opipe.
129070524490SJens Axboe  */
129170524490SJens Axboe static int link_pipe(struct pipe_inode_info *ipipe,
129270524490SJens Axboe 		     struct pipe_inode_info *opipe,
129370524490SJens Axboe 		     size_t len, unsigned int flags)
129470524490SJens Axboe {
129570524490SJens Axboe 	struct pipe_buffer *ibuf, *obuf;
12962a27250eSJens Axboe 	int ret, do_wakeup, i, ipipe_first;
12972a27250eSJens Axboe 
12982a27250eSJens Axboe 	ret = do_wakeup = ipipe_first = 0;
129970524490SJens Axboe 
130070524490SJens Axboe 	/*
130170524490SJens Axboe 	 * Potential ABBA deadlock, work around it by ordering lock
130270524490SJens Axboe 	 * grabbing by inode address. Otherwise two different processes
130370524490SJens Axboe 	 * could deadlock (one doing tee from A -> B, the other from B -> A).
130470524490SJens Axboe 	 */
130570524490SJens Axboe 	if (ipipe->inode < opipe->inode) {
13062a27250eSJens Axboe 		ipipe_first = 1;
130770524490SJens Axboe 		mutex_lock(&ipipe->inode->i_mutex);
130870524490SJens Axboe 		mutex_lock(&opipe->inode->i_mutex);
130970524490SJens Axboe 	} else {
131070524490SJens Axboe 		mutex_lock(&opipe->inode->i_mutex);
131170524490SJens Axboe 		mutex_lock(&ipipe->inode->i_mutex);
131270524490SJens Axboe 	}
131370524490SJens Axboe 
131470524490SJens Axboe 	for (i = 0;; i++) {
131570524490SJens Axboe 		if (!opipe->readers) {
131670524490SJens Axboe 			send_sig(SIGPIPE, current, 0);
131770524490SJens Axboe 			if (!ret)
131870524490SJens Axboe 				ret = -EPIPE;
131970524490SJens Axboe 			break;
132070524490SJens Axboe 		}
132170524490SJens Axboe 		if (ipipe->nrbufs - i) {
132270524490SJens Axboe 			ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (PIPE_BUFFERS - 1));
132370524490SJens Axboe 
132470524490SJens Axboe 			/*
132570524490SJens Axboe 			 * If we have room, fill this buffer
132670524490SJens Axboe 			 */
132770524490SJens Axboe 			if (opipe->nrbufs < PIPE_BUFFERS) {
132870524490SJens Axboe 				int nbuf = (opipe->curbuf + opipe->nrbufs) & (PIPE_BUFFERS - 1);
132970524490SJens Axboe 
133070524490SJens Axboe 				/*
133170524490SJens Axboe 				 * Get a reference to this pipe buffer,
133270524490SJens Axboe 				 * so we can copy the contents over.
133370524490SJens Axboe 				 */
133470524490SJens Axboe 				ibuf->ops->get(ipipe, ibuf);
133570524490SJens Axboe 
133670524490SJens Axboe 				obuf = opipe->bufs + nbuf;
133770524490SJens Axboe 				*obuf = *ibuf;
133870524490SJens 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