Blame view

fs/splice.c 46.3 KB
5274f052e   Jens Axboe   [PATCH] Introduce...
1
2
3
4
5
6
7
8
9
10
11
  /*
   * "splice": joining two ropes together by interweaving their strands.
   *
   * This is the "extended pipe" functionality, where a pipe is used as
   * an arbitrary in-memory buffer. Think of a pipe as a small kernel
   * buffer that you can use to transfer data from one end to the other.
   *
   * The traditional unix read/write is extended with a "splice()" operation
   * that transfers data buffers to or from a pipe buffer.
   *
   * Named by Larry McVoy, original implementation from Linus, extended by
c2058e061   Jens Axboe   [PATCH] splice: a...
12
13
   * Jens to support splicing to files, network, direct splicing, etc and
   * fixing lots of bugs.
5274f052e   Jens Axboe   [PATCH] Introduce...
14
   *
0fe234795   Jens Axboe   [PATCH] Update ax...
15
   * Copyright (C) 2005-2006 Jens Axboe <axboe@kernel.dk>
c2058e061   Jens Axboe   [PATCH] splice: a...
16
17
   * Copyright (C) 2005-2006 Linus Torvalds <torvalds@osdl.org>
   * Copyright (C) 2006 Ingo Molnar <mingo@elte.hu>
5274f052e   Jens Axboe   [PATCH] Introduce...
18
19
20
21
22
   *
   */
  #include <linux/fs.h>
  #include <linux/file.h>
  #include <linux/pagemap.h>
d6b29d7ce   Jens Axboe   splice: divorce t...
23
  #include <linux/splice.h>
08e552c69   KAMEZAWA Hiroyuki   memcg: synchroniz...
24
  #include <linux/memcontrol.h>
5274f052e   Jens Axboe   [PATCH] Introduce...
25
  #include <linux/mm_inline.h>
5abc97aa2   Jens Axboe   [PATCH] splice: a...
26
  #include <linux/swap.h>
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
27
  #include <linux/writeback.h>
630d9c472   Paul Gortmaker   fs: reduce the us...
28
  #include <linux/export.h>
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
29
  #include <linux/syscalls.h>
912d35f86   Jens Axboe   [PATCH] Add suppo...
30
  #include <linux/uio.h>
29ce20586   James Morris   security: revalid...
31
  #include <linux/security.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
32
  #include <linux/gfp.h>
35f9c09fe   Eric Dumazet   tcp: tcp_sendpage...
33
  #include <linux/socket.h>
5274f052e   Jens Axboe   [PATCH] Introduce...
34

83f9135bd   Jens Axboe   [PATCH] splice: a...
35
36
37
38
39
40
  /*
   * Attempt to steal a page from a pipe buffer. This should perhaps go into
   * a vm helper function, it's already simplified quite a bit by the
   * addition of remove_mapping(). If success is returned, the caller may
   * attempt to reuse this page for another destination.
   */
76ad4d111   Jens Axboe   [PATCH] splice: r...
41
  static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
5abc97aa2   Jens Axboe   [PATCH] splice: a...
42
43
44
  				     struct pipe_buffer *buf)
  {
  	struct page *page = buf->page;
9e94cd4fd   Jens Axboe   [PATCH] splice: r...
45
  	struct address_space *mapping;
5abc97aa2   Jens Axboe   [PATCH] splice: a...
46

9e0267c26   Jens Axboe   [PATCH] splice: f...
47
  	lock_page(page);
9e94cd4fd   Jens Axboe   [PATCH] splice: r...
48
49
50
  	mapping = page_mapping(page);
  	if (mapping) {
  		WARN_ON(!PageUptodate(page));
5abc97aa2   Jens Axboe   [PATCH] splice: a...
51

9e94cd4fd   Jens Axboe   [PATCH] splice: r...
52
53
54
55
56
57
58
59
60
  		/*
  		 * At least for ext2 with nobh option, we need to wait on
  		 * writeback completing on this page, since we'll remove it
  		 * from the pagecache.  Otherwise truncate wont wait on the
  		 * page, allowing the disk blocks to be reused by someone else
  		 * before we actually wrote our data to them. fs corruption
  		 * ensues.
  		 */
  		wait_on_page_writeback(page);
ad8d6f0a7   Jens Axboe   [PATCH] splice: p...
61

266cf658e   David Howells   FS-Cache: Recruit...
62
63
  		if (page_has_private(page) &&
  		    !try_to_release_page(page, GFP_KERNEL))
ca39d651d   Jens Axboe   splice: handle tr...
64
  			goto out_unlock;
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
65

9e94cd4fd   Jens Axboe   [PATCH] splice: r...
66
67
68
69
70
71
72
73
  		/*
  		 * If we succeeded in removing the mapping, set LRU flag
  		 * and return good.
  		 */
  		if (remove_mapping(mapping, page)) {
  			buf->flags |= PIPE_BUF_FLAG_LRU;
  			return 0;
  		}
9e0267c26   Jens Axboe   [PATCH] splice: f...
74
  	}
5abc97aa2   Jens Axboe   [PATCH] splice: a...
75

9e94cd4fd   Jens Axboe   [PATCH] splice: r...
76
77
78
79
  	/*
  	 * Raced with truncate or failed to remove page from current
  	 * address space, unlock and return failure.
  	 */
ca39d651d   Jens Axboe   splice: handle tr...
80
  out_unlock:
9e94cd4fd   Jens Axboe   [PATCH] splice: r...
81
82
  	unlock_page(page);
  	return 1;
5abc97aa2   Jens Axboe   [PATCH] splice: a...
83
  }
76ad4d111   Jens Axboe   [PATCH] splice: r...
84
  static void page_cache_pipe_buf_release(struct pipe_inode_info *pipe,
5274f052e   Jens Axboe   [PATCH] Introduce...
85
86
87
  					struct pipe_buffer *buf)
  {
  	page_cache_release(buf->page);
1432873af   Jens Axboe   [PATCH] splice: L...
88
  	buf->flags &= ~PIPE_BUF_FLAG_LRU;
5274f052e   Jens Axboe   [PATCH] Introduce...
89
  }
0845718da   Jens Axboe   pipe: add documen...
90
91
92
93
  /*
   * Check whether the contents of buf is OK to access. Since the content
   * is a page cache page, IO may be in flight.
   */
cac36bb06   Jens Axboe   pipe: change the ...
94
95
  static int page_cache_pipe_buf_confirm(struct pipe_inode_info *pipe,
  				       struct pipe_buffer *buf)
5274f052e   Jens Axboe   [PATCH] Introduce...
96
97
  {
  	struct page *page = buf->page;
49d0b21be   Jens Axboe   [PATCH] splice: o...
98
  	int err;
5274f052e   Jens Axboe   [PATCH] Introduce...
99
100
  
  	if (!PageUptodate(page)) {
49d0b21be   Jens Axboe   [PATCH] splice: o...
101
102
103
104
  		lock_page(page);
  
  		/*
  		 * Page got truncated/unhashed. This will cause a 0-byte
73d62d83e   Ingo Molnar   [PATCH] splice: c...
105
  		 * splice, if this is the first page.
49d0b21be   Jens Axboe   [PATCH] splice: o...
106
107
108
109
110
  		 */
  		if (!page->mapping) {
  			err = -ENODATA;
  			goto error;
  		}
5274f052e   Jens Axboe   [PATCH] Introduce...
111

49d0b21be   Jens Axboe   [PATCH] splice: o...
112
  		/*
73d62d83e   Ingo Molnar   [PATCH] splice: c...
113
  		 * Uh oh, read-error from disk.
49d0b21be   Jens Axboe   [PATCH] splice: o...
114
115
116
117
118
119
120
  		 */
  		if (!PageUptodate(page)) {
  			err = -EIO;
  			goto error;
  		}
  
  		/*
f84d75199   Jens Axboe   [PATCH] pipe: int...
121
  		 * Page is ok afterall, we are done.
49d0b21be   Jens Axboe   [PATCH] splice: o...
122
  		 */
5274f052e   Jens Axboe   [PATCH] Introduce...
123
  		unlock_page(page);
5274f052e   Jens Axboe   [PATCH] Introduce...
124
  	}
f84d75199   Jens Axboe   [PATCH] pipe: int...
125
  	return 0;
49d0b21be   Jens Axboe   [PATCH] splice: o...
126
127
  error:
  	unlock_page(page);
f84d75199   Jens Axboe   [PATCH] pipe: int...
128
  	return err;
70524490e   Jens Axboe   [PATCH] splice: a...
129
  }
708e3508c   Hugh Dickins   tmpfs: clone shme...
130
  const struct pipe_buf_operations page_cache_pipe_buf_ops = {
5274f052e   Jens Axboe   [PATCH] Introduce...
131
  	.can_merge = 0,
f84d75199   Jens Axboe   [PATCH] pipe: int...
132
133
  	.map = generic_pipe_buf_map,
  	.unmap = generic_pipe_buf_unmap,
cac36bb06   Jens Axboe   pipe: change the ...
134
  	.confirm = page_cache_pipe_buf_confirm,
5274f052e   Jens Axboe   [PATCH] Introduce...
135
  	.release = page_cache_pipe_buf_release,
5abc97aa2   Jens Axboe   [PATCH] splice: a...
136
  	.steal = page_cache_pipe_buf_steal,
f84d75199   Jens Axboe   [PATCH] pipe: int...
137
  	.get = generic_pipe_buf_get,
5274f052e   Jens Axboe   [PATCH] Introduce...
138
  };
912d35f86   Jens Axboe   [PATCH] Add suppo...
139
140
141
  static int user_page_pipe_buf_steal(struct pipe_inode_info *pipe,
  				    struct pipe_buffer *buf)
  {
7afa6fd03   Jens Axboe   [PATCH] vmsplice:...
142
143
  	if (!(buf->flags & PIPE_BUF_FLAG_GIFT))
  		return 1;
1432873af   Jens Axboe   [PATCH] splice: L...
144
  	buf->flags |= PIPE_BUF_FLAG_LRU;
330ab7161   Jens Axboe   [PATCH] vmsplice:...
145
  	return generic_pipe_buf_steal(pipe, buf);
912d35f86   Jens Axboe   [PATCH] Add suppo...
146
  }
d4c3cca94   Eric Dumazet   [PATCH] constify ...
147
  static const struct pipe_buf_operations user_page_pipe_buf_ops = {
912d35f86   Jens Axboe   [PATCH] Add suppo...
148
  	.can_merge = 0,
f84d75199   Jens Axboe   [PATCH] pipe: int...
149
150
  	.map = generic_pipe_buf_map,
  	.unmap = generic_pipe_buf_unmap,
cac36bb06   Jens Axboe   pipe: change the ...
151
  	.confirm = generic_pipe_buf_confirm,
912d35f86   Jens Axboe   [PATCH] Add suppo...
152
153
  	.release = page_cache_pipe_buf_release,
  	.steal = user_page_pipe_buf_steal,
f84d75199   Jens Axboe   [PATCH] pipe: int...
154
  	.get = generic_pipe_buf_get,
912d35f86   Jens Axboe   [PATCH] Add suppo...
155
  };
825cdcb1a   Namhyung Kim   splice: add wakeu...
156
157
158
159
160
161
162
  static void wakeup_pipe_readers(struct pipe_inode_info *pipe)
  {
  	smp_mb();
  	if (waitqueue_active(&pipe->wait))
  		wake_up_interruptible(&pipe->wait);
  	kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
  }
932cc6d4f   Jens Axboe   splice: completel...
163
164
165
166
167
168
  /**
   * splice_to_pipe - fill passed data into a pipe
   * @pipe:	pipe to fill
   * @spd:	data to fill
   *
   * Description:
79685b8de   Randy Dunlap   docbook: add pipe...
169
   *    @spd contains a map of pages and len/offset tuples, along with
932cc6d4f   Jens Axboe   splice: completel...
170
171
172
   *    the struct pipe_buf_operations associated with these pages. This
   *    function will link that data to the pipe.
   *
83f9135bd   Jens Axboe   [PATCH] splice: a...
173
   */
d6b29d7ce   Jens Axboe   splice: divorce t...
174
175
  ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
  		       struct splice_pipe_desc *spd)
5274f052e   Jens Axboe   [PATCH] Introduce...
176
  {
00de00bda   Jens Axboe   splice: fix leak ...
177
  	unsigned int spd_pages = spd->nr_pages;
912d35f86   Jens Axboe   [PATCH] Add suppo...
178
  	int ret, do_wakeup, page_nr;
5274f052e   Jens Axboe   [PATCH] Introduce...
179
180
181
  
  	ret = 0;
  	do_wakeup = 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
182
  	page_nr = 0;
5274f052e   Jens Axboe   [PATCH] Introduce...
183

61e0d47c3   Miklos Szeredi   splice: add helpe...
184
  	pipe_lock(pipe);
5274f052e   Jens Axboe   [PATCH] Introduce...
185

5274f052e   Jens Axboe   [PATCH] Introduce...
186
  	for (;;) {
3a326a2ce   Ingo Molnar   [PATCH] introduce...
187
  		if (!pipe->readers) {
5274f052e   Jens Axboe   [PATCH] Introduce...
188
189
190
191
192
  			send_sig(SIGPIPE, current, 0);
  			if (!ret)
  				ret = -EPIPE;
  			break;
  		}
35f3d14db   Jens Axboe   pipe: add support...
193
194
  		if (pipe->nrbufs < pipe->buffers) {
  			int newbuf = (pipe->curbuf + pipe->nrbufs) & (pipe->buffers - 1);
3a326a2ce   Ingo Molnar   [PATCH] introduce...
195
  			struct pipe_buffer *buf = pipe->bufs + newbuf;
5274f052e   Jens Axboe   [PATCH] Introduce...
196

912d35f86   Jens Axboe   [PATCH] Add suppo...
197
198
199
  			buf->page = spd->pages[page_nr];
  			buf->offset = spd->partial[page_nr].offset;
  			buf->len = spd->partial[page_nr].len;
497f9625c   Jens Axboe   pipe: allow passi...
200
  			buf->private = spd->partial[page_nr].private;
912d35f86   Jens Axboe   [PATCH] Add suppo...
201
  			buf->ops = spd->ops;
7afa6fd03   Jens Axboe   [PATCH] vmsplice:...
202
203
  			if (spd->flags & SPLICE_F_GIFT)
  				buf->flags |= PIPE_BUF_FLAG_GIFT;
6f767b042   Jens Axboe   [PATCH] splice: s...
204
  			pipe->nrbufs++;
912d35f86   Jens Axboe   [PATCH] Add suppo...
205
206
  			page_nr++;
  			ret += buf->len;
6f767b042   Jens Axboe   [PATCH] splice: s...
207
208
  			if (pipe->inode)
  				do_wakeup = 1;
5274f052e   Jens Axboe   [PATCH] Introduce...
209

912d35f86   Jens Axboe   [PATCH] Add suppo...
210
  			if (!--spd->nr_pages)
5274f052e   Jens Axboe   [PATCH] Introduce...
211
  				break;
35f3d14db   Jens Axboe   pipe: add support...
212
  			if (pipe->nrbufs < pipe->buffers)
5274f052e   Jens Axboe   [PATCH] Introduce...
213
214
215
216
  				continue;
  
  			break;
  		}
912d35f86   Jens Axboe   [PATCH] Add suppo...
217
  		if (spd->flags & SPLICE_F_NONBLOCK) {
29e350944   Linus Torvalds   splice: add SPLIC...
218
219
220
221
  			if (!ret)
  				ret = -EAGAIN;
  			break;
  		}
5274f052e   Jens Axboe   [PATCH] Introduce...
222
223
224
225
226
227
228
  		if (signal_pending(current)) {
  			if (!ret)
  				ret = -ERESTARTSYS;
  			break;
  		}
  
  		if (do_wakeup) {
c0bd1f650   Jens Axboe   [PATCH] splice: o...
229
  			smp_mb();
3a326a2ce   Ingo Molnar   [PATCH] introduce...
230
231
232
  			if (waitqueue_active(&pipe->wait))
  				wake_up_interruptible_sync(&pipe->wait);
  			kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
5274f052e   Jens Axboe   [PATCH] Introduce...
233
234
  			do_wakeup = 0;
  		}
3a326a2ce   Ingo Molnar   [PATCH] introduce...
235
236
237
  		pipe->waiting_writers++;
  		pipe_wait(pipe);
  		pipe->waiting_writers--;
5274f052e   Jens Axboe   [PATCH] Introduce...
238
  	}
61e0d47c3   Miklos Szeredi   splice: add helpe...
239
  	pipe_unlock(pipe);
5274f052e   Jens Axboe   [PATCH] Introduce...
240

825cdcb1a   Namhyung Kim   splice: add wakeu...
241
242
  	if (do_wakeup)
  		wakeup_pipe_readers(pipe);
5274f052e   Jens Axboe   [PATCH] Introduce...
243

00de00bda   Jens Axboe   splice: fix leak ...
244
  	while (page_nr < spd_pages)
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
245
  		spd->spd_release(spd, page_nr++);
5274f052e   Jens Axboe   [PATCH] Introduce...
246
247
248
  
  	return ret;
  }
708e3508c   Hugh Dickins   tmpfs: clone shme...
249
  void spd_release_page(struct splice_pipe_desc *spd, unsigned int i)
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
250
251
252
  {
  	page_cache_release(spd->pages[i]);
  }
35f3d14db   Jens Axboe   pipe: add support...
253
254
255
256
  /*
   * Check if we need to grow the arrays holding pages and partial page
   * descriptions.
   */
047fe3605   Eric Dumazet   splice: fix racy ...
257
  int splice_grow_spd(const struct pipe_inode_info *pipe, struct splice_pipe_desc *spd)
35f3d14db   Jens Axboe   pipe: add support...
258
  {
047fe3605   Eric Dumazet   splice: fix racy ...
259
260
261
262
  	unsigned int buffers = ACCESS_ONCE(pipe->buffers);
  
  	spd->nr_pages_max = buffers;
  	if (buffers <= PIPE_DEF_BUFFERS)
35f3d14db   Jens Axboe   pipe: add support...
263
  		return 0;
047fe3605   Eric Dumazet   splice: fix racy ...
264
265
  	spd->pages = kmalloc(buffers * sizeof(struct page *), GFP_KERNEL);
  	spd->partial = kmalloc(buffers * sizeof(struct partial_page), GFP_KERNEL);
35f3d14db   Jens Axboe   pipe: add support...
266
267
268
269
270
271
272
273
  
  	if (spd->pages && spd->partial)
  		return 0;
  
  	kfree(spd->pages);
  	kfree(spd->partial);
  	return -ENOMEM;
  }
047fe3605   Eric Dumazet   splice: fix racy ...
274
  void splice_shrink_spd(struct splice_pipe_desc *spd)
35f3d14db   Jens Axboe   pipe: add support...
275
  {
047fe3605   Eric Dumazet   splice: fix racy ...
276
  	if (spd->nr_pages_max <= PIPE_DEF_BUFFERS)
35f3d14db   Jens Axboe   pipe: add support...
277
278
279
280
281
  		return;
  
  	kfree(spd->pages);
  	kfree(spd->partial);
  }
3a326a2ce   Ingo Molnar   [PATCH] introduce...
282
  static int
cbb7e577e   Jens Axboe   [PATCH] splice: p...
283
284
285
  __generic_file_splice_read(struct file *in, loff_t *ppos,
  			   struct pipe_inode_info *pipe, size_t len,
  			   unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
286
287
  {
  	struct address_space *mapping = in->f_mapping;
d8983910a   Fengguang Wu   readahead: pass r...
288
  	unsigned int loff, nr_pages, req_pages;
35f3d14db   Jens Axboe   pipe: add support...
289
290
  	struct page *pages[PIPE_DEF_BUFFERS];
  	struct partial_page partial[PIPE_DEF_BUFFERS];
5274f052e   Jens Axboe   [PATCH] Introduce...
291
  	struct page *page;
91ad66ef4   Jens Axboe   [PATCH] splice: c...
292
293
  	pgoff_t index, end_index;
  	loff_t isize;
eb20796bf   Jens Axboe   [PATCH] splice: m...
294
  	int error, page_nr;
912d35f86   Jens Axboe   [PATCH] Add suppo...
295
296
297
  	struct splice_pipe_desc spd = {
  		.pages = pages,
  		.partial = partial,
047fe3605   Eric Dumazet   splice: fix racy ...
298
  		.nr_pages_max = PIPE_DEF_BUFFERS,
912d35f86   Jens Axboe   [PATCH] Add suppo...
299
300
  		.flags = flags,
  		.ops = &page_cache_pipe_buf_ops,
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
301
  		.spd_release = spd_release_page,
912d35f86   Jens Axboe   [PATCH] Add suppo...
302
  	};
5274f052e   Jens Axboe   [PATCH] Introduce...
303

35f3d14db   Jens Axboe   pipe: add support...
304
305
  	if (splice_grow_spd(pipe, &spd))
  		return -ENOMEM;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
306
  	index = *ppos >> PAGE_CACHE_SHIFT;
912d35f86   Jens Axboe   [PATCH] Add suppo...
307
  	loff = *ppos & ~PAGE_CACHE_MASK;
d8983910a   Fengguang Wu   readahead: pass r...
308
  	req_pages = (len + loff + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
047fe3605   Eric Dumazet   splice: fix racy ...
309
  	nr_pages = min(req_pages, spd.nr_pages_max);
5274f052e   Jens Axboe   [PATCH] Introduce...
310
311
  
  	/*
eb20796bf   Jens Axboe   [PATCH] splice: m...
312
313
  	 * Lookup the (hopefully) full range of pages we need.
  	 */
35f3d14db   Jens Axboe   pipe: add support...
314
  	spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, spd.pages);
431a4820b   Fengguang Wu   readahead: move s...
315
  	index += spd.nr_pages;
82aa5d618   Jens Axboe   [PATCH] splice: f...
316

eb20796bf   Jens Axboe   [PATCH] splice: m...
317
318
  	/*
  	 * If find_get_pages_contig() returned fewer pages than we needed,
431a4820b   Fengguang Wu   readahead: move s...
319
  	 * readahead/allocate the rest and fill in the holes.
eb20796bf   Jens Axboe   [PATCH] splice: m...
320
  	 */
431a4820b   Fengguang Wu   readahead: move s...
321
  	if (spd.nr_pages < nr_pages)
cf914a7d6   Rusty Russell   readahead: split ...
322
323
  		page_cache_sync_readahead(mapping, &in->f_ra, in,
  				index, req_pages - spd.nr_pages);
431a4820b   Fengguang Wu   readahead: move s...
324

932cc6d4f   Jens Axboe   splice: completel...
325
  	error = 0;
eb20796bf   Jens Axboe   [PATCH] splice: m...
326
  	while (spd.nr_pages < nr_pages) {
82aa5d618   Jens Axboe   [PATCH] splice: f...
327
  		/*
eb20796bf   Jens Axboe   [PATCH] splice: m...
328
329
  		 * Page could be there, find_get_pages_contig() breaks on
  		 * the first hole.
5274f052e   Jens Axboe   [PATCH] Introduce...
330
  		 */
7480a9043   Jens Axboe   [PATCH] splice: s...
331
332
  		page = find_get_page(mapping, index);
  		if (!page) {
e27dedd84   Jens Axboe   [PATCH] splice: c...
333
  			/*
eb20796bf   Jens Axboe   [PATCH] splice: m...
334
  			 * page didn't exist, allocate one.
7480a9043   Jens Axboe   [PATCH] splice: s...
335
336
337
338
339
340
  			 */
  			page = page_cache_alloc_cold(mapping);
  			if (!page)
  				break;
  
  			error = add_to_page_cache_lru(page, mapping, index,
0ae0b5d05   Nick Piggin   fs/splice.c: fix ...
341
  						GFP_KERNEL);
7480a9043   Jens Axboe   [PATCH] splice: s...
342
343
  			if (unlikely(error)) {
  				page_cache_release(page);
a0548871e   Jens Axboe   [PATCH] splice: r...
344
345
  				if (error == -EEXIST)
  					continue;
7480a9043   Jens Axboe   [PATCH] splice: s...
346
347
  				break;
  			}
eb20796bf   Jens Axboe   [PATCH] splice: m...
348
349
350
351
352
  			/*
  			 * add_to_page_cache() locks the page, unlock it
  			 * to avoid convoluting the logic below even more.
  			 */
  			unlock_page(page);
7480a9043   Jens Axboe   [PATCH] splice: s...
353
  		}
35f3d14db   Jens Axboe   pipe: add support...
354
  		spd.pages[spd.nr_pages++] = page;
eb20796bf   Jens Axboe   [PATCH] splice: m...
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
  		index++;
  	}
  
  	/*
  	 * Now loop over the map and see if we need to start IO on any
  	 * pages, fill in the partial map, etc.
  	 */
  	index = *ppos >> PAGE_CACHE_SHIFT;
  	nr_pages = spd.nr_pages;
  	spd.nr_pages = 0;
  	for (page_nr = 0; page_nr < nr_pages; page_nr++) {
  		unsigned int this_len;
  
  		if (!len)
  			break;
  
  		/*
  		 * this_len is the max we'll use from this page
  		 */
  		this_len = min_t(unsigned long, len, PAGE_CACHE_SIZE - loff);
35f3d14db   Jens Axboe   pipe: add support...
375
  		page = spd.pages[page_nr];
eb20796bf   Jens Axboe   [PATCH] splice: m...
376

a08a166fe   Fengguang Wu   readahead: conver...
377
  		if (PageReadahead(page))
cf914a7d6   Rusty Russell   readahead: split ...
378
  			page_cache_async_readahead(mapping, &in->f_ra, in,
d8983910a   Fengguang Wu   readahead: pass r...
379
  					page, index, req_pages - page_nr);
a08a166fe   Fengguang Wu   readahead: conver...
380

7480a9043   Jens Axboe   [PATCH] splice: s...
381
382
383
384
  		/*
  		 * If the page isn't uptodate, we may need to start io on it
  		 */
  		if (!PageUptodate(page)) {
6965031d3   Miklos Szeredi   splice: fix misus...
385
  			lock_page(page);
7480a9043   Jens Axboe   [PATCH] splice: s...
386
387
  
  			/*
32502b841   Miklos Szeredi   splice: fix gener...
388
389
390
391
  			 * Page was truncated, or invalidated by the
  			 * filesystem.  Redo the find/create, but this time the
  			 * page is kept locked, so there's no chance of another
  			 * race with truncate/invalidate.
7480a9043   Jens Axboe   [PATCH] splice: s...
392
393
394
  			 */
  			if (!page->mapping) {
  				unlock_page(page);
32502b841   Miklos Szeredi   splice: fix gener...
395
396
397
398
399
400
401
  				page = find_or_create_page(mapping, index,
  						mapping_gfp_mask(mapping));
  
  				if (!page) {
  					error = -ENOMEM;
  					break;
  				}
35f3d14db   Jens Axboe   pipe: add support...
402
403
  				page_cache_release(spd.pages[page_nr]);
  				spd.pages[page_nr] = page;
7480a9043   Jens Axboe   [PATCH] splice: s...
404
405
406
407
408
409
410
411
  			}
  			/*
  			 * page was already under io and is now done, great
  			 */
  			if (PageUptodate(page)) {
  				unlock_page(page);
  				goto fill_it;
  			}
5274f052e   Jens Axboe   [PATCH] Introduce...
412

7480a9043   Jens Axboe   [PATCH] splice: s...
413
414
415
416
  			/*
  			 * need to read in the page
  			 */
  			error = mapping->a_ops->readpage(in, page);
5274f052e   Jens Axboe   [PATCH] Introduce...
417
  			if (unlikely(error)) {
eb20796bf   Jens Axboe   [PATCH] splice: m...
418
419
420
421
422
423
  				/*
  				 * We really should re-lookup the page here,
  				 * but it complicates things a lot. Instead
  				 * lets just do what we already stored, and
  				 * we'll get it the next time we are called.
  				 */
7480a9043   Jens Axboe   [PATCH] splice: s...
424
  				if (error == AOP_TRUNCATED_PAGE)
eb20796bf   Jens Axboe   [PATCH] splice: m...
425
  					error = 0;
5274f052e   Jens Axboe   [PATCH] Introduce...
426
427
  				break;
  			}
620a324b7   Jens Axboe   splice: __generic...
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
  		}
  fill_it:
  		/*
  		 * i_size must be checked after PageUptodate.
  		 */
  		isize = i_size_read(mapping->host);
  		end_index = (isize - 1) >> PAGE_CACHE_SHIFT;
  		if (unlikely(!isize || index > end_index))
  			break;
  
  		/*
  		 * if this is the last page, see if we need to shrink
  		 * the length and stop
  		 */
  		if (end_index == index) {
  			unsigned int plen;
91ad66ef4   Jens Axboe   [PATCH] splice: c...
444
445
  
  			/*
620a324b7   Jens Axboe   splice: __generic...
446
  			 * max good bytes in this page
91ad66ef4   Jens Axboe   [PATCH] splice: c...
447
  			 */
620a324b7   Jens Axboe   splice: __generic...
448
449
  			plen = ((isize - 1) & ~PAGE_CACHE_MASK) + 1;
  			if (plen <= loff)
91ad66ef4   Jens Axboe   [PATCH] splice: c...
450
  				break;
91ad66ef4   Jens Axboe   [PATCH] splice: c...
451
452
  
  			/*
620a324b7   Jens Axboe   splice: __generic...
453
  			 * force quit after adding this page
91ad66ef4   Jens Axboe   [PATCH] splice: c...
454
  			 */
620a324b7   Jens Axboe   splice: __generic...
455
456
  			this_len = min(this_len, plen - loff);
  			len = this_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
457
  		}
620a324b7   Jens Axboe   splice: __generic...
458

35f3d14db   Jens Axboe   pipe: add support...
459
460
  		spd.partial[page_nr].offset = loff;
  		spd.partial[page_nr].len = this_len;
82aa5d618   Jens Axboe   [PATCH] splice: f...
461
  		len -= this_len;
91ad66ef4   Jens Axboe   [PATCH] splice: c...
462
  		loff = 0;
eb20796bf   Jens Axboe   [PATCH] splice: m...
463
464
  		spd.nr_pages++;
  		index++;
5274f052e   Jens Axboe   [PATCH] Introduce...
465
  	}
eb20796bf   Jens Axboe   [PATCH] splice: m...
466
  	/*
475ecade6   Hugh Dickins   splice: __generic...
467
  	 * Release any pages at the end, if we quit early. 'page_nr' is how far
eb20796bf   Jens Axboe   [PATCH] splice: m...
468
469
470
  	 * we got, 'nr_pages' is how many pages are in the map.
  	 */
  	while (page_nr < nr_pages)
35f3d14db   Jens Axboe   pipe: add support...
471
  		page_cache_release(spd.pages[page_nr++]);
f4e6b498d   Fengguang Wu   readahead: combin...
472
  	in->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT;
eb20796bf   Jens Axboe   [PATCH] splice: m...
473

912d35f86   Jens Axboe   [PATCH] Add suppo...
474
  	if (spd.nr_pages)
35f3d14db   Jens Axboe   pipe: add support...
475
  		error = splice_to_pipe(pipe, &spd);
5274f052e   Jens Axboe   [PATCH] Introduce...
476

047fe3605   Eric Dumazet   splice: fix racy ...
477
  	splice_shrink_spd(&spd);
7480a9043   Jens Axboe   [PATCH] splice: s...
478
  	return error;
5274f052e   Jens Axboe   [PATCH] Introduce...
479
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
480
481
482
  /**
   * generic_file_splice_read - splice data from file to a pipe
   * @in:		file to splice from
932cc6d4f   Jens Axboe   splice: completel...
483
   * @ppos:	position in @in
83f9135bd   Jens Axboe   [PATCH] splice: a...
484
485
486
487
   * @pipe:	pipe to splice to
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
488
489
490
491
492
   * Description:
   *    Will read pages from given file and fill them into a pipe. Can be
   *    used as long as the address_space operations for the source implements
   *    a readpage() hook.
   *
83f9135bd   Jens Axboe   [PATCH] splice: a...
493
   */
cbb7e577e   Jens Axboe   [PATCH] splice: p...
494
495
496
  ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
  				 struct pipe_inode_info *pipe, size_t len,
  				 unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
497
  {
d366d3988   Jens Axboe   splice: move inod...
498
  	loff_t isize, left;
8191ecd1d   Jens Axboe   splice: fix infin...
499
  	int ret;
d366d3988   Jens Axboe   splice: move inod...
500
501
502
503
504
505
506
507
  
  	isize = i_size_read(in->f_mapping->host);
  	if (unlikely(*ppos >= isize))
  		return 0;
  
  	left = isize - *ppos;
  	if (unlikely(left < len))
  		len = left;
5274f052e   Jens Axboe   [PATCH] Introduce...
508

8191ecd1d   Jens Axboe   splice: fix infin...
509
  	ret = __generic_file_splice_read(in, ppos, pipe, len, flags);
723590ed5   Miklos Szeredi   splice: update mt...
510
  	if (ret > 0) {
cbb7e577e   Jens Axboe   [PATCH] splice: p...
511
  		*ppos += ret;
723590ed5   Miklos Szeredi   splice: update mt...
512
513
  		file_accessed(in);
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
514
515
516
  
  	return ret;
  }
059a8f373   Jens Axboe   [PATCH] splice: e...
517
  EXPORT_SYMBOL(generic_file_splice_read);
6818173bd   Miklos Szeredi   splice: implement...
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
  static const struct pipe_buf_operations default_pipe_buf_ops = {
  	.can_merge = 0,
  	.map = generic_pipe_buf_map,
  	.unmap = generic_pipe_buf_unmap,
  	.confirm = generic_pipe_buf_confirm,
  	.release = generic_pipe_buf_release,
  	.steal = generic_pipe_buf_steal,
  	.get = generic_pipe_buf_get,
  };
  
  static ssize_t kernel_readv(struct file *file, const struct iovec *vec,
  			    unsigned long vlen, loff_t offset)
  {
  	mm_segment_t old_fs;
  	loff_t pos = offset;
  	ssize_t res;
  
  	old_fs = get_fs();
  	set_fs(get_ds());
  	/* The cast to a user pointer is valid due to the set_fs() */
  	res = vfs_readv(file, (const struct iovec __user *)vec, vlen, &pos);
  	set_fs(old_fs);
  
  	return res;
  }
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
543
544
  static ssize_t kernel_write(struct file *file, const char *buf, size_t count,
  			    loff_t pos)
0b0a47f5c   Miklos Szeredi   splice: implement...
545
546
547
548
549
550
551
  {
  	mm_segment_t old_fs;
  	ssize_t res;
  
  	old_fs = get_fs();
  	set_fs(get_ds());
  	/* The cast to a user pointer is valid due to the set_fs() */
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
552
  	res = vfs_write(file, (const char __user *)buf, count, &pos);
0b0a47f5c   Miklos Szeredi   splice: implement...
553
554
555
556
  	set_fs(old_fs);
  
  	return res;
  }
6818173bd   Miklos Szeredi   splice: implement...
557
558
559
560
561
562
563
  ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
  				 struct pipe_inode_info *pipe, size_t len,
  				 unsigned int flags)
  {
  	unsigned int nr_pages;
  	unsigned int nr_freed;
  	size_t offset;
35f3d14db   Jens Axboe   pipe: add support...
564
565
566
  	struct page *pages[PIPE_DEF_BUFFERS];
  	struct partial_page partial[PIPE_DEF_BUFFERS];
  	struct iovec *vec, __vec[PIPE_DEF_BUFFERS];
6818173bd   Miklos Szeredi   splice: implement...
567
568
569
570
571
572
573
  	ssize_t res;
  	size_t this_len;
  	int error;
  	int i;
  	struct splice_pipe_desc spd = {
  		.pages = pages,
  		.partial = partial,
047fe3605   Eric Dumazet   splice: fix racy ...
574
  		.nr_pages_max = PIPE_DEF_BUFFERS,
6818173bd   Miklos Szeredi   splice: implement...
575
576
577
578
  		.flags = flags,
  		.ops = &default_pipe_buf_ops,
  		.spd_release = spd_release_page,
  	};
35f3d14db   Jens Axboe   pipe: add support...
579
580
581
582
583
  	if (splice_grow_spd(pipe, &spd))
  		return -ENOMEM;
  
  	res = -ENOMEM;
  	vec = __vec;
047fe3605   Eric Dumazet   splice: fix racy ...
584
585
  	if (spd.nr_pages_max > PIPE_DEF_BUFFERS) {
  		vec = kmalloc(spd.nr_pages_max * sizeof(struct iovec), GFP_KERNEL);
35f3d14db   Jens Axboe   pipe: add support...
586
587
588
  		if (!vec)
  			goto shrink_ret;
  	}
6818173bd   Miklos Szeredi   splice: implement...
589
590
  	offset = *ppos & ~PAGE_CACHE_MASK;
  	nr_pages = (len + offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
047fe3605   Eric Dumazet   splice: fix racy ...
591
  	for (i = 0; i < nr_pages && i < spd.nr_pages_max && len; i++) {
6818173bd   Miklos Szeredi   splice: implement...
592
  		struct page *page;
4f2312285   Jens Axboe   splice: fix repea...
593
  		page = alloc_page(GFP_USER);
6818173bd   Miklos Szeredi   splice: implement...
594
595
596
597
598
  		error = -ENOMEM;
  		if (!page)
  			goto err;
  
  		this_len = min_t(size_t, len, PAGE_CACHE_SIZE - offset);
4f2312285   Jens Axboe   splice: fix repea...
599
  		vec[i].iov_base = (void __user *) page_address(page);
6818173bd   Miklos Szeredi   splice: implement...
600
  		vec[i].iov_len = this_len;
35f3d14db   Jens Axboe   pipe: add support...
601
  		spd.pages[i] = page;
6818173bd   Miklos Szeredi   splice: implement...
602
603
604
605
606
607
  		spd.nr_pages++;
  		len -= this_len;
  		offset = 0;
  	}
  
  	res = kernel_readv(in, vec, spd.nr_pages, *ppos);
77f6bf57b   Andrew Morton   splice: fix error...
608
609
  	if (res < 0) {
  		error = res;
6818173bd   Miklos Szeredi   splice: implement...
610
  		goto err;
77f6bf57b   Andrew Morton   splice: fix error...
611
  	}
6818173bd   Miklos Szeredi   splice: implement...
612
613
614
615
616
617
618
  
  	error = 0;
  	if (!res)
  		goto err;
  
  	nr_freed = 0;
  	for (i = 0; i < spd.nr_pages; i++) {
6818173bd   Miklos Szeredi   splice: implement...
619
  		this_len = min_t(size_t, vec[i].iov_len, res);
35f3d14db   Jens Axboe   pipe: add support...
620
621
  		spd.partial[i].offset = 0;
  		spd.partial[i].len = this_len;
6818173bd   Miklos Szeredi   splice: implement...
622
  		if (!this_len) {
35f3d14db   Jens Axboe   pipe: add support...
623
624
  			__free_page(spd.pages[i]);
  			spd.pages[i] = NULL;
6818173bd   Miklos Szeredi   splice: implement...
625
626
627
628
629
630
631
632
633
  			nr_freed++;
  		}
  		res -= this_len;
  	}
  	spd.nr_pages -= nr_freed;
  
  	res = splice_to_pipe(pipe, &spd);
  	if (res > 0)
  		*ppos += res;
35f3d14db   Jens Axboe   pipe: add support...
634
635
636
  shrink_ret:
  	if (vec != __vec)
  		kfree(vec);
047fe3605   Eric Dumazet   splice: fix racy ...
637
  	splice_shrink_spd(&spd);
6818173bd   Miklos Szeredi   splice: implement...
638
639
640
  	return res;
  
  err:
4f2312285   Jens Axboe   splice: fix repea...
641
  	for (i = 0; i < spd.nr_pages; i++)
35f3d14db   Jens Axboe   pipe: add support...
642
  		__free_page(spd.pages[i]);
4f2312285   Jens Axboe   splice: fix repea...
643

35f3d14db   Jens Axboe   pipe: add support...
644
645
  	res = error;
  	goto shrink_ret;
6818173bd   Miklos Szeredi   splice: implement...
646
647
  }
  EXPORT_SYMBOL(default_file_splice_read);
5274f052e   Jens Axboe   [PATCH] Introduce...
648
  /*
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
649
   * Send 'sd->len' bytes to socket from 'sd->file' at position 'sd->pos'
016b661e2   Jens Axboe   [PATCH] splice: f...
650
   * using sendpage(). Return the number of bytes sent.
5274f052e   Jens Axboe   [PATCH] Introduce...
651
   */
76ad4d111   Jens Axboe   [PATCH] splice: r...
652
  static int pipe_to_sendpage(struct pipe_inode_info *pipe,
5274f052e   Jens Axboe   [PATCH] Introduce...
653
654
  			    struct pipe_buffer *buf, struct splice_desc *sd)
  {
6a14b90bb   Jens Axboe   vmsplice: add vms...
655
  	struct file *file = sd->u.file;
5274f052e   Jens Axboe   [PATCH] Introduce...
656
  	loff_t pos = sd->pos;
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
657
  	int more;
5274f052e   Jens Axboe   [PATCH] Introduce...
658

a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
659
660
  	if (!likely(file->f_op && file->f_op->sendpage))
  		return -EINVAL;
35f9c09fe   Eric Dumazet   tcp: tcp_sendpage...
661
662
663
  	more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0;
  	if (sd->len < sd->total_len)
  		more |= MSG_SENDPAGE_NOTLAST;
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
664
665
  	return file->f_op->sendpage(file, buf->page, buf->offset,
  				    sd->len, &pos, more);
5274f052e   Jens Axboe   [PATCH] Introduce...
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
  }
  
  /*
   * This is a little more tricky than the file -> pipe splicing. There are
   * basically three cases:
   *
   *	- Destination page already exists in the address space and there
   *	  are users of it. For that case we have no other option that
   *	  copying the data. Tough luck.
   *	- Destination page already exists in the address space, but there
   *	  are no users of it. Make sure it's uptodate, then drop it. Fall
   *	  through to last case.
   *	- Destination page does not exist, we can add the pipe page to
   *	  the page cache and avoid the copy.
   *
83f9135bd   Jens Axboe   [PATCH] splice: a...
681
682
683
684
685
686
   * If asked to move pages to the output file (SPLICE_F_MOVE is set in
   * sd->flags), we attempt to migrate pages from the pipe to the output
   * file address space page cache. This is possible if no one else has
   * the pipe page referenced outside of the pipe and page cache. If
   * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create
   * a new page in the output file page cache and fill/dirty that.
5274f052e   Jens Axboe   [PATCH] Introduce...
687
   */
328eaaba4   Miklos Szeredi   ocfs2: fix i_mute...
688
689
  int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  		 struct splice_desc *sd)
5274f052e   Jens Axboe   [PATCH] Introduce...
690
  {
6a14b90bb   Jens Axboe   vmsplice: add vms...
691
  	struct file *file = sd->u.file;
5274f052e   Jens Axboe   [PATCH] Introduce...
692
  	struct address_space *mapping = file->f_mapping;
016b661e2   Jens Axboe   [PATCH] splice: f...
693
  	unsigned int offset, this_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
694
  	struct page *page;
afddba49d   Nick Piggin   fs: introduce wri...
695
  	void *fsdata;
3e7ee3e7b   Jens Axboe   [PATCH] splice: f...
696
  	int ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
697

5274f052e   Jens Axboe   [PATCH] Introduce...
698
  	offset = sd->pos & ~PAGE_CACHE_MASK;
016b661e2   Jens Axboe   [PATCH] splice: f...
699
700
701
  	this_len = sd->len;
  	if (this_len + offset > PAGE_CACHE_SIZE)
  		this_len = PAGE_CACHE_SIZE - offset;
afddba49d   Nick Piggin   fs: introduce wri...
702
703
704
705
  	ret = pagecache_write_begin(file, mapping, sd->pos, this_len,
  				AOP_FLAG_UNINTERRUPTIBLE, &page, &fsdata);
  	if (unlikely(ret))
  		goto out;
5274f052e   Jens Axboe   [PATCH] Introduce...
706

0568b409c   Jens Axboe   [PATCH] splice: f...
707
  	if (buf->page != page) {
76ad4d111   Jens Axboe   [PATCH] splice: r...
708
  		char *src = buf->ops->map(pipe, buf, 1);
e8e3c3d66   Cong Wang   fs: remove the se...
709
  		char *dst = kmap_atomic(page);
5abc97aa2   Jens Axboe   [PATCH] splice: a...
710

016b661e2   Jens Axboe   [PATCH] splice: f...
711
  		memcpy(dst + offset, src + buf->offset, this_len);
5abc97aa2   Jens Axboe   [PATCH] splice: a...
712
  		flush_dcache_page(page);
e8e3c3d66   Cong Wang   fs: remove the se...
713
  		kunmap_atomic(dst);
76ad4d111   Jens Axboe   [PATCH] splice: r...
714
  		buf->ops->unmap(pipe, buf, src);
5abc97aa2   Jens Axboe   [PATCH] splice: a...
715
  	}
afddba49d   Nick Piggin   fs: introduce wri...
716
717
  	ret = pagecache_write_end(file, mapping, sd->pos, this_len, this_len,
  				page, fsdata);
5274f052e   Jens Axboe   [PATCH] Introduce...
718
  out:
5274f052e   Jens Axboe   [PATCH] Introduce...
719
720
  	return ret;
  }
328eaaba4   Miklos Szeredi   ocfs2: fix i_mute...
721
  EXPORT_SYMBOL(pipe_to_file);
5274f052e   Jens Axboe   [PATCH] Introduce...
722

b3c2d2ddd   Miklos Szeredi   splice: split up ...
723
724
725
726
727
728
729
  static void wakeup_pipe_writers(struct pipe_inode_info *pipe)
  {
  	smp_mb();
  	if (waitqueue_active(&pipe->wait))
  		wake_up_interruptible(&pipe->wait);
  	kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
  }
932cc6d4f   Jens Axboe   splice: completel...
730
  /**
b3c2d2ddd   Miklos Szeredi   splice: split up ...
731
   * splice_from_pipe_feed - feed available data from a pipe to a file
932cc6d4f   Jens Axboe   splice: completel...
732
733
734
735
736
   * @pipe:	pipe to splice from
   * @sd:		information to @actor
   * @actor:	handler that splices the data
   *
   * Description:
b3c2d2ddd   Miklos Szeredi   splice: split up ...
737
738
739
740
741
742
743
   *    This function loops over the pipe and calls @actor to do the
   *    actual moving of a single struct pipe_buffer to the desired
   *    destination.  It returns when there's no more buffers left in
   *    the pipe or if the requested number of bytes (@sd->total_len)
   *    have been copied.  It returns a positive number (one) if the
   *    pipe needs to be filled with more data, zero if the required
   *    number of bytes have been copied and -errno on error.
932cc6d4f   Jens Axboe   splice: completel...
744
   *
b3c2d2ddd   Miklos Szeredi   splice: split up ...
745
746
747
748
   *    This, together with splice_from_pipe_{begin,end,next}, may be
   *    used to implement the functionality of __splice_from_pipe() when
   *    locking is required around copying the pipe buffers to the
   *    destination.
83f9135bd   Jens Axboe   [PATCH] splice: a...
749
   */
b3c2d2ddd   Miklos Szeredi   splice: split up ...
750
751
  int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_desc *sd,
  			  splice_actor *actor)
5274f052e   Jens Axboe   [PATCH] Introduce...
752
  {
b3c2d2ddd   Miklos Szeredi   splice: split up ...
753
  	int ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
754

b3c2d2ddd   Miklos Szeredi   splice: split up ...
755
756
757
  	while (pipe->nrbufs) {
  		struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
  		const struct pipe_buf_operations *ops = buf->ops;
5274f052e   Jens Axboe   [PATCH] Introduce...
758

b3c2d2ddd   Miklos Szeredi   splice: split up ...
759
760
761
  		sd->len = buf->len;
  		if (sd->len > sd->total_len)
  			sd->len = sd->total_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
762

a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
763
764
  		ret = buf->ops->confirm(pipe, buf);
  		if (unlikely(ret)) {
b3c2d2ddd   Miklos Szeredi   splice: split up ...
765
766
767
768
  			if (ret == -ENODATA)
  				ret = 0;
  			return ret;
  		}
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
769
770
771
772
  
  		ret = actor(pipe, buf, sd);
  		if (ret <= 0)
  			return ret;
b3c2d2ddd   Miklos Szeredi   splice: split up ...
773
774
775
776
777
778
779
780
781
782
783
  		buf->offset += ret;
  		buf->len -= ret;
  
  		sd->num_spliced += ret;
  		sd->len -= ret;
  		sd->pos += ret;
  		sd->total_len -= ret;
  
  		if (!buf->len) {
  			buf->ops = NULL;
  			ops->release(pipe, buf);
35f3d14db   Jens Axboe   pipe: add support...
784
  			pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1);
b3c2d2ddd   Miklos Szeredi   splice: split up ...
785
786
787
788
  			pipe->nrbufs--;
  			if (pipe->inode)
  				sd->need_wakeup = true;
  		}
5274f052e   Jens Axboe   [PATCH] Introduce...
789

b3c2d2ddd   Miklos Szeredi   splice: split up ...
790
791
792
  		if (!sd->total_len)
  			return 0;
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
793

b3c2d2ddd   Miklos Szeredi   splice: split up ...
794
795
796
  	return 1;
  }
  EXPORT_SYMBOL(splice_from_pipe_feed);
5274f052e   Jens Axboe   [PATCH] Introduce...
797

b3c2d2ddd   Miklos Szeredi   splice: split up ...
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
  /**
   * splice_from_pipe_next - wait for some data to splice from
   * @pipe:	pipe to splice from
   * @sd:		information about the splice operation
   *
   * Description:
   *    This function will wait for some data and return a positive
   *    value (one) if pipe buffers are available.  It will return zero
   *    or -errno if no more data needs to be spliced.
   */
  int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd)
  {
  	while (!pipe->nrbufs) {
  		if (!pipe->writers)
  			return 0;
016b661e2   Jens Axboe   [PATCH] splice: f...
813

b3c2d2ddd   Miklos Szeredi   splice: split up ...
814
815
  		if (!pipe->waiting_writers && sd->num_spliced)
  			return 0;
73d62d83e   Ingo Molnar   [PATCH] splice: c...
816

b3c2d2ddd   Miklos Szeredi   splice: split up ...
817
818
  		if (sd->flags & SPLICE_F_NONBLOCK)
  			return -EAGAIN;
5274f052e   Jens Axboe   [PATCH] Introduce...
819

b3c2d2ddd   Miklos Szeredi   splice: split up ...
820
821
  		if (signal_pending(current))
  			return -ERESTARTSYS;
5274f052e   Jens Axboe   [PATCH] Introduce...
822

b3c2d2ddd   Miklos Szeredi   splice: split up ...
823
824
825
  		if (sd->need_wakeup) {
  			wakeup_pipe_writers(pipe);
  			sd->need_wakeup = false;
5274f052e   Jens Axboe   [PATCH] Introduce...
826
  		}
b3c2d2ddd   Miklos Szeredi   splice: split up ...
827
828
  		pipe_wait(pipe);
  	}
29e350944   Linus Torvalds   splice: add SPLIC...
829

b3c2d2ddd   Miklos Szeredi   splice: split up ...
830
831
832
  	return 1;
  }
  EXPORT_SYMBOL(splice_from_pipe_next);
5274f052e   Jens Axboe   [PATCH] Introduce...
833

b3c2d2ddd   Miklos Szeredi   splice: split up ...
834
835
  /**
   * splice_from_pipe_begin - start splicing from pipe
b80901bbf   Randy Dunlap   splice: fix new k...
836
   * @sd:		information about the splice operation
b3c2d2ddd   Miklos Szeredi   splice: split up ...
837
838
839
840
841
842
843
844
845
846
847
848
   *
   * Description:
   *    This function should be called before a loop containing
   *    splice_from_pipe_next() and splice_from_pipe_feed() to
   *    initialize the necessary fields of @sd.
   */
  void splice_from_pipe_begin(struct splice_desc *sd)
  {
  	sd->num_spliced = 0;
  	sd->need_wakeup = false;
  }
  EXPORT_SYMBOL(splice_from_pipe_begin);
5274f052e   Jens Axboe   [PATCH] Introduce...
849

b3c2d2ddd   Miklos Szeredi   splice: split up ...
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
  /**
   * splice_from_pipe_end - finish splicing from pipe
   * @pipe:	pipe to splice from
   * @sd:		information about the splice operation
   *
   * Description:
   *    This function will wake up pipe writers if necessary.  It should
   *    be called after a loop containing splice_from_pipe_next() and
   *    splice_from_pipe_feed().
   */
  void splice_from_pipe_end(struct pipe_inode_info *pipe, struct splice_desc *sd)
  {
  	if (sd->need_wakeup)
  		wakeup_pipe_writers(pipe);
  }
  EXPORT_SYMBOL(splice_from_pipe_end);
5274f052e   Jens Axboe   [PATCH] Introduce...
866

b3c2d2ddd   Miklos Szeredi   splice: split up ...
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
  /**
   * __splice_from_pipe - splice data from a pipe to given actor
   * @pipe:	pipe to splice from
   * @sd:		information to @actor
   * @actor:	handler that splices the data
   *
   * Description:
   *    This function does little more than loop over the pipe and call
   *    @actor to do the actual moving of a single struct pipe_buffer to
   *    the desired destination. See pipe_to_file, pipe_to_sendpage, or
   *    pipe_to_user.
   *
   */
  ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd,
  			   splice_actor *actor)
  {
  	int ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
884

b3c2d2ddd   Miklos Szeredi   splice: split up ...
885
886
887
888
889
890
891
892
893
  	splice_from_pipe_begin(sd);
  	do {
  		ret = splice_from_pipe_next(pipe, sd);
  		if (ret > 0)
  			ret = splice_from_pipe_feed(pipe, sd, actor);
  	} while (ret > 0);
  	splice_from_pipe_end(pipe, sd);
  
  	return sd->num_spliced ? sd->num_spliced : ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
894
  }
40bee44ea   Mark Fasheh   Export __splice_f...
895
  EXPORT_SYMBOL(__splice_from_pipe);
5274f052e   Jens Axboe   [PATCH] Introduce...
896

932cc6d4f   Jens Axboe   splice: completel...
897
898
899
900
901
902
903
904
905
906
  /**
   * splice_from_pipe - splice data from a pipe to a file
   * @pipe:	pipe to splice from
   * @out:	file to splice to
   * @ppos:	position in @out
   * @len:	how many bytes to splice
   * @flags:	splice modifier flags
   * @actor:	handler that splices the data
   *
   * Description:
2933970b9   Miklos Szeredi   splice: remove i_...
907
   *    See __splice_from_pipe. This function locks the pipe inode,
932cc6d4f   Jens Axboe   splice: completel...
908
909
910
   *    otherwise it's identical to __splice_from_pipe().
   *
   */
6da618098   Mark Fasheh   [PATCH] Introduce...
911
912
913
914
915
  ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
  			 loff_t *ppos, size_t len, unsigned int flags,
  			 splice_actor *actor)
  {
  	ssize_t ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
916
917
918
919
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
920
  		.u.file = out,
c66ab6fa7   Jens Axboe   splice: abstract ...
921
  	};
6da618098   Mark Fasheh   [PATCH] Introduce...
922

61e0d47c3   Miklos Szeredi   splice: add helpe...
923
  	pipe_lock(pipe);
c66ab6fa7   Jens Axboe   splice: abstract ...
924
  	ret = __splice_from_pipe(pipe, &sd, actor);
61e0d47c3   Miklos Szeredi   splice: add helpe...
925
  	pipe_unlock(pipe);
6da618098   Mark Fasheh   [PATCH] Introduce...
926
927
928
929
930
  
  	return ret;
  }
  
  /**
83f9135bd   Jens Axboe   [PATCH] splice: a...
931
   * generic_file_splice_write - splice data from a pipe to a file
3a326a2ce   Ingo Molnar   [PATCH] introduce...
932
   * @pipe:	pipe info
83f9135bd   Jens Axboe   [PATCH] splice: a...
933
   * @out:	file to write to
932cc6d4f   Jens Axboe   splice: completel...
934
   * @ppos:	position in @out
83f9135bd   Jens Axboe   [PATCH] splice: a...
935
936
937
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
938
939
940
   * Description:
   *    Will either move or copy pages (determined by @flags options) from
   *    the given pipe inode to the given file.
83f9135bd   Jens Axboe   [PATCH] splice: a...
941
942
   *
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
943
944
  ssize_t
  generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
945
  			  loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
946
  {
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
947
  	struct address_space *mapping = out->f_mapping;
8c34e2d63   Jens Axboe   [PATCH] Remove SU...
948
  	struct inode *inode = mapping->host;
7f3d4ee10   Miklos Szeredi   vfs: splice remov...
949
950
951
952
953
954
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
  		.u.file = out,
  	};
3a326a2ce   Ingo Molnar   [PATCH] introduce...
955
  	ssize_t ret;
14da92001   Jan Kara   fs: Protect write...
956
  	sb_start_write(inode->i_sb);
61e0d47c3   Miklos Szeredi   splice: add helpe...
957
  	pipe_lock(pipe);
eb443e5a2   Miklos Szeredi   splice: fix i_mut...
958
959
960
961
962
963
964
965
966
  
  	splice_from_pipe_begin(&sd);
  	do {
  		ret = splice_from_pipe_next(pipe, &sd);
  		if (ret <= 0)
  			break;
  
  		mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD);
  		ret = file_remove_suid(out);
723590ed5   Miklos Szeredi   splice: update mt...
967
  		if (!ret) {
c3b2da314   Josef Bacik   fs: introduce ino...
968
969
970
971
  			ret = file_update_time(out);
  			if (!ret)
  				ret = splice_from_pipe_feed(pipe, &sd,
  							    pipe_to_file);
723590ed5   Miklos Szeredi   splice: update mt...
972
  		}
eb443e5a2   Miklos Szeredi   splice: fix i_mut...
973
974
975
  		mutex_unlock(&inode->i_mutex);
  	} while (ret > 0);
  	splice_from_pipe_end(pipe, &sd);
61e0d47c3   Miklos Szeredi   splice: add helpe...
976
  	pipe_unlock(pipe);
eb443e5a2   Miklos Szeredi   splice: fix i_mut...
977
978
979
  
  	if (sd.num_spliced)
  		ret = sd.num_spliced;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
980
  	if (ret > 0) {
148f948ba   Jan Kara   vfs: Introduce ne...
981
  		int err;
17ee4f49a   Jens Axboe   splice: adjust ba...
982

148f948ba   Jan Kara   vfs: Introduce ne...
983
984
985
986
987
  		err = generic_write_sync(out, *ppos, ret);
  		if (err)
  			ret = err;
  		else
  			*ppos += ret;
d0e1d66b5   Namjae Jeon   writeback: remove...
988
  		balance_dirty_pages_ratelimited(mapping);
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
989
  	}
14da92001   Jan Kara   fs: Protect write...
990
  	sb_end_write(inode->i_sb);
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
991
992
  
  	return ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
993
  }
059a8f373   Jens Axboe   [PATCH] splice: e...
994
  EXPORT_SYMBOL(generic_file_splice_write);
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
995
996
  static int write_pipe_buf(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  			  struct splice_desc *sd)
0b0a47f5c   Miklos Szeredi   splice: implement...
997
  {
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
998
999
  	int ret;
  	void *data;
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
1000
1001
1002
1003
1004
  	data = buf->ops->map(pipe, buf, 0);
  	ret = kernel_write(sd->u.file, data + buf->offset, sd->len, sd->pos);
  	buf->ops->unmap(pipe, buf, data);
  
  	return ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
1005
1006
1007
1008
1009
1010
  }
  
  static ssize_t default_file_splice_write(struct pipe_inode_info *pipe,
  					 struct file *out, loff_t *ppos,
  					 size_t len, unsigned int flags)
  {
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
1011
  	ssize_t ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
1012

b2858d7d1   Miklos Szeredi   splice: fix kmaps...
1013
1014
1015
  	ret = splice_from_pipe(pipe, out, ppos, len, flags, write_pipe_buf);
  	if (ret > 0)
  		*ppos += ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
1016

b2858d7d1   Miklos Szeredi   splice: fix kmaps...
1017
  	return ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
1018
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
1019
1020
  /**
   * generic_splice_sendpage - splice data from a pipe to a socket
932cc6d4f   Jens Axboe   splice: completel...
1021
   * @pipe:	pipe to splice from
83f9135bd   Jens Axboe   [PATCH] splice: a...
1022
   * @out:	socket to write to
932cc6d4f   Jens Axboe   splice: completel...
1023
   * @ppos:	position in @out
83f9135bd   Jens Axboe   [PATCH] splice: a...
1024
1025
1026
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
1027
1028
1029
   * Description:
   *    Will send @len bytes from the pipe to a network socket. No data copying
   *    is involved.
83f9135bd   Jens Axboe   [PATCH] splice: a...
1030
1031
   *
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
1032
  ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1033
  				loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
1034
  {
00522fb41   Jens Axboe   [PATCH] splice: r...
1035
  	return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_sendpage);
5274f052e   Jens Axboe   [PATCH] Introduce...
1036
  }
059a8f373   Jens Axboe   [PATCH] splice: e...
1037
  EXPORT_SYMBOL(generic_splice_sendpage);
a0f067802   Jeff Garzik   [PATCH] splice ex...
1038

83f9135bd   Jens Axboe   [PATCH] splice: a...
1039
1040
1041
  /*
   * Attempt to initiate a splice from pipe to file.
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
1042
  static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1043
  			   loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
1044
  {
0b0a47f5c   Miklos Szeredi   splice: implement...
1045
1046
  	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
  				loff_t *, size_t, unsigned int);
5274f052e   Jens Axboe   [PATCH] Introduce...
1047
  	int ret;
49570e9b2   Jens Axboe   [PATCH] splice: u...
1048
  	if (unlikely(!(out->f_mode & FMODE_WRITE)))
5274f052e   Jens Axboe   [PATCH] Introduce...
1049
  		return -EBADF;
efc968d45   Linus Torvalds   Don't allow splic...
1050
1051
  	if (unlikely(out->f_flags & O_APPEND))
  		return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1052
  	ret = rw_verify_area(WRITE, out, ppos, len);
5274f052e   Jens Axboe   [PATCH] Introduce...
1053
1054
  	if (unlikely(ret < 0))
  		return ret;
cc56f7de7   Changli Gao   sendfile(): check...
1055
1056
1057
  	if (out->f_op && out->f_op->splice_write)
  		splice_write = out->f_op->splice_write;
  	else
0b0a47f5c   Miklos Szeredi   splice: implement...
1058
1059
1060
  		splice_write = default_file_splice_write;
  
  	return splice_write(pipe, out, ppos, len, flags);
5274f052e   Jens Axboe   [PATCH] Introduce...
1061
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
1062
1063
1064
  /*
   * Attempt to initiate a splice from a file to a pipe.
   */
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1065
1066
1067
  static long do_splice_to(struct file *in, loff_t *ppos,
  			 struct pipe_inode_info *pipe, size_t len,
  			 unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
1068
  {
6818173bd   Miklos Szeredi   splice: implement...
1069
1070
  	ssize_t (*splice_read)(struct file *, loff_t *,
  			       struct pipe_inode_info *, size_t, unsigned int);
5274f052e   Jens Axboe   [PATCH] Introduce...
1071
  	int ret;
49570e9b2   Jens Axboe   [PATCH] splice: u...
1072
  	if (unlikely(!(in->f_mode & FMODE_READ)))
5274f052e   Jens Axboe   [PATCH] Introduce...
1073
  		return -EBADF;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1074
  	ret = rw_verify_area(READ, in, ppos, len);
5274f052e   Jens Axboe   [PATCH] Introduce...
1075
1076
  	if (unlikely(ret < 0))
  		return ret;
cc56f7de7   Changli Gao   sendfile(): check...
1077
1078
1079
  	if (in->f_op && in->f_op->splice_read)
  		splice_read = in->f_op->splice_read;
  	else
6818173bd   Miklos Szeredi   splice: implement...
1080
1081
1082
  		splice_read = default_file_splice_read;
  
  	return splice_read(in, ppos, pipe, len, flags);
5274f052e   Jens Axboe   [PATCH] Introduce...
1083
  }
932cc6d4f   Jens Axboe   splice: completel...
1084
1085
1086
1087
1088
1089
1090
1091
1092
  /**
   * splice_direct_to_actor - splices data directly between two non-pipes
   * @in:		file to splice from
   * @sd:		actor information on where to splice to
   * @actor:	handles the data splicing
   *
   * Description:
   *    This is a special case helper to splice directly between two
   *    points, without requiring an explicit pipe. Internally an allocated
79685b8de   Randy Dunlap   docbook: add pipe...
1093
   *    pipe is cached in the process, and reused during the lifetime of
932cc6d4f   Jens Axboe   splice: completel...
1094
1095
   *    that process.
   *
c66ab6fa7   Jens Axboe   splice: abstract ...
1096
1097
1098
   */
  ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
  			       splice_direct_actor *actor)
b92ce5589   Jens Axboe   [PATCH] splice: a...
1099
1100
1101
1102
  {
  	struct pipe_inode_info *pipe;
  	long ret, bytes;
  	umode_t i_mode;
c66ab6fa7   Jens Axboe   splice: abstract ...
1103
1104
  	size_t len;
  	int i, flags;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1105
1106
1107
1108
1109
1110
  
  	/*
  	 * We require the input being a regular file, as we don't want to
  	 * randomly drop data for eg socket -> socket splicing. Use the
  	 * piped splicing for that!
  	 */
0f7fc9e4d   Josef "Jeff" Sipek   [PATCH] VFS: chan...
1111
  	i_mode = in->f_path.dentry->d_inode->i_mode;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1112
1113
1114
1115
1116
1117
1118
1119
  	if (unlikely(!S_ISREG(i_mode) && !S_ISBLK(i_mode)))
  		return -EINVAL;
  
  	/*
  	 * neither in nor out is a pipe, setup an internal pipe attached to
  	 * 'out' and transfer the wanted data from 'in' to 'out' through that
  	 */
  	pipe = current->splice_pipe;
49570e9b2   Jens Axboe   [PATCH] splice: u...
1120
  	if (unlikely(!pipe)) {
b92ce5589   Jens Axboe   [PATCH] splice: a...
1121
1122
1123
1124
1125
1126
  		pipe = alloc_pipe_info(NULL);
  		if (!pipe)
  			return -ENOMEM;
  
  		/*
  		 * We don't have an immediate reader, but we'll read the stuff
00522fb41   Jens Axboe   [PATCH] splice: r...
1127
  		 * out of the pipe right after the splice_to_pipe(). So set
b92ce5589   Jens Axboe   [PATCH] splice: a...
1128
1129
1130
1131
1132
1133
1134
1135
  		 * PIPE_READERS appropriately.
  		 */
  		pipe->readers = 1;
  
  		current->splice_pipe = pipe;
  	}
  
  	/*
73d62d83e   Ingo Molnar   [PATCH] splice: c...
1136
  	 * Do the splice.
b92ce5589   Jens Axboe   [PATCH] splice: a...
1137
1138
1139
  	 */
  	ret = 0;
  	bytes = 0;
c66ab6fa7   Jens Axboe   splice: abstract ...
1140
1141
1142
1143
1144
1145
1146
  	len = sd->total_len;
  	flags = sd->flags;
  
  	/*
  	 * Don't block on output, we have to drain the direct pipe.
  	 */
  	sd->flags &= ~SPLICE_F_NONBLOCK;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1147
1148
  
  	while (len) {
51a92c0f6   Jens Axboe   splice: fix offse...
1149
  		size_t read_len;
a82c53a0e   Tom Zanussi   splice: fix sendf...
1150
  		loff_t pos = sd->pos, prev_pos = pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1151

bcd4f3acb   Jens Axboe   splice: direct sp...
1152
  		ret = do_splice_to(in, &pos, pipe, len, flags);
51a92c0f6   Jens Axboe   splice: fix offse...
1153
  		if (unlikely(ret <= 0))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1154
1155
1156
  			goto out_release;
  
  		read_len = ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
1157
  		sd->total_len = read_len;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1158
1159
1160
1161
1162
1163
  
  		/*
  		 * NOTE: nonblocking mode only applies to the input. We
  		 * must not do the output in nonblocking mode as then we
  		 * could get stuck data in the internal pipe:
  		 */
c66ab6fa7   Jens Axboe   splice: abstract ...
1164
  		ret = actor(pipe, sd);
a82c53a0e   Tom Zanussi   splice: fix sendf...
1165
1166
  		if (unlikely(ret <= 0)) {
  			sd->pos = prev_pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1167
  			goto out_release;
a82c53a0e   Tom Zanussi   splice: fix sendf...
1168
  		}
b92ce5589   Jens Axboe   [PATCH] splice: a...
1169
1170
1171
  
  		bytes += ret;
  		len -= ret;
bcd4f3acb   Jens Axboe   splice: direct sp...
1172
  		sd->pos = pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1173

a82c53a0e   Tom Zanussi   splice: fix sendf...
1174
1175
  		if (ret < read_len) {
  			sd->pos = prev_pos + ret;
51a92c0f6   Jens Axboe   splice: fix offse...
1176
  			goto out_release;
a82c53a0e   Tom Zanussi   splice: fix sendf...
1177
  		}
b92ce5589   Jens Axboe   [PATCH] splice: a...
1178
  	}
9e97198db   Jens Axboe   splice: fix probl...
1179
  done:
b92ce5589   Jens Axboe   [PATCH] splice: a...
1180
  	pipe->nrbufs = pipe->curbuf = 0;
808487085   Jens Axboe   splice: always up...
1181
  	file_accessed(in);
b92ce5589   Jens Axboe   [PATCH] splice: a...
1182
1183
1184
1185
1186
1187
1188
  	return bytes;
  
  out_release:
  	/*
  	 * If we did an incomplete transfer we must release
  	 * the pipe buffers in question:
  	 */
35f3d14db   Jens Axboe   pipe: add support...
1189
  	for (i = 0; i < pipe->buffers; i++) {
b92ce5589   Jens Axboe   [PATCH] splice: a...
1190
1191
1192
1193
1194
1195
1196
  		struct pipe_buffer *buf = pipe->bufs + i;
  
  		if (buf->ops) {
  			buf->ops->release(pipe, buf);
  			buf->ops = NULL;
  		}
  	}
b92ce5589   Jens Axboe   [PATCH] splice: a...
1197

9e97198db   Jens Axboe   splice: fix probl...
1198
1199
  	if (!bytes)
  		bytes = ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
1200

9e97198db   Jens Axboe   splice: fix probl...
1201
  	goto done;
c66ab6fa7   Jens Axboe   splice: abstract ...
1202
1203
1204
1205
1206
1207
  }
  EXPORT_SYMBOL(splice_direct_to_actor);
  
  static int direct_splice_actor(struct pipe_inode_info *pipe,
  			       struct splice_desc *sd)
  {
6a14b90bb   Jens Axboe   vmsplice: add vms...
1208
  	struct file *file = sd->u.file;
c66ab6fa7   Jens Axboe   splice: abstract ...
1209

2cb4b05e7   Changli Gao   splice: direct_sp...
1210
1211
  	return do_splice_from(pipe, file, &file->f_pos, sd->total_len,
  			      sd->flags);
c66ab6fa7   Jens Axboe   splice: abstract ...
1212
  }
932cc6d4f   Jens Axboe   splice: completel...
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
  /**
   * do_splice_direct - splices data directly between two files
   * @in:		file to splice from
   * @ppos:	input file offset
   * @out:	file to splice to
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
   * Description:
   *    For use by do_sendfile(). splice can easily emulate sendfile, but
   *    doing it in the application would incur an extra system call
   *    (splice in + splice out, as compared to just sendfile()). So this helper
   *    can splice directly through a process-private pipe.
   *
   */
c66ab6fa7   Jens Axboe   splice: abstract ...
1228
1229
1230
1231
1232
1233
1234
1235
  long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
  		      size_t len, unsigned int flags)
  {
  	struct splice_desc sd = {
  		.len		= len,
  		.total_len	= len,
  		.flags		= flags,
  		.pos		= *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
1236
  		.u.file		= out,
c66ab6fa7   Jens Axboe   splice: abstract ...
1237
  	};
51a92c0f6   Jens Axboe   splice: fix offse...
1238
  	long ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
1239
1240
  
  	ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
51a92c0f6   Jens Axboe   splice: fix offse...
1241
  	if (ret > 0)
a82c53a0e   Tom Zanussi   splice: fix sendf...
1242
  		*ppos = sd.pos;
51a92c0f6   Jens Axboe   splice: fix offse...
1243

c66ab6fa7   Jens Axboe   splice: abstract ...
1244
  	return ret;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1245
  }
7c77f0b3f   Miklos Szeredi   splice: implement...
1246
1247
1248
  static int splice_pipe_to_pipe(struct pipe_inode_info *ipipe,
  			       struct pipe_inode_info *opipe,
  			       size_t len, unsigned int flags);
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1249
1250
  
  /*
83f9135bd   Jens Axboe   [PATCH] splice: a...
1251
1252
   * Determine where to splice to/from.
   */
529565dcb   Ingo Molnar   [PATCH] splice: a...
1253
1254
1255
  static long do_splice(struct file *in, loff_t __user *off_in,
  		      struct file *out, loff_t __user *off_out,
  		      size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
1256
  {
7c77f0b3f   Miklos Szeredi   splice: implement...
1257
1258
  	struct pipe_inode_info *ipipe;
  	struct pipe_inode_info *opipe;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1259
  	loff_t offset, *off;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1260
  	long ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
1261

71993e62a   Linus Torvalds   Rename 'pipe_info...
1262
1263
  	ipipe = get_pipe_info(in);
  	opipe = get_pipe_info(out);
7c77f0b3f   Miklos Szeredi   splice: implement...
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
  
  	if (ipipe && opipe) {
  		if (off_in || off_out)
  			return -ESPIPE;
  
  		if (!(in->f_mode & FMODE_READ))
  			return -EBADF;
  
  		if (!(out->f_mode & FMODE_WRITE))
  			return -EBADF;
  
  		/* Splicing to self would be fun, but... */
  		if (ipipe == opipe)
  			return -EINVAL;
  
  		return splice_pipe_to_pipe(ipipe, opipe, len, flags);
  	}
  
  	if (ipipe) {
529565dcb   Ingo Molnar   [PATCH] splice: a...
1283
1284
  		if (off_in)
  			return -ESPIPE;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1285
  		if (off_out) {
19c9a49b4   Changli Gao   splice: check f_m...
1286
  			if (!(out->f_mode & FMODE_PWRITE))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1287
  				return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1288
  			if (copy_from_user(&offset, off_out, sizeof(loff_t)))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1289
  				return -EFAULT;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1290
1291
1292
  			off = &offset;
  		} else
  			off = &out->f_pos;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1293

7c77f0b3f   Miklos Szeredi   splice: implement...
1294
  		ret = do_splice_from(ipipe, out, off, len, flags);
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1295
1296
1297
1298
1299
  
  		if (off_out && copy_to_user(off_out, off, sizeof(loff_t)))
  			ret = -EFAULT;
  
  		return ret;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1300
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1301

7c77f0b3f   Miklos Szeredi   splice: implement...
1302
  	if (opipe) {
529565dcb   Ingo Molnar   [PATCH] splice: a...
1303
1304
  		if (off_out)
  			return -ESPIPE;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1305
  		if (off_in) {
19c9a49b4   Changli Gao   splice: check f_m...
1306
  			if (!(in->f_mode & FMODE_PREAD))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1307
  				return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1308
  			if (copy_from_user(&offset, off_in, sizeof(loff_t)))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1309
  				return -EFAULT;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1310
1311
1312
  			off = &offset;
  		} else
  			off = &in->f_pos;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1313

7c77f0b3f   Miklos Szeredi   splice: implement...
1314
  		ret = do_splice_to(in, off, opipe, len, flags);
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1315
1316
1317
1318
1319
  
  		if (off_in && copy_to_user(off_in, off, sizeof(loff_t)))
  			ret = -EFAULT;
  
  		return ret;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1320
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1321
1322
1323
  
  	return -EINVAL;
  }
912d35f86   Jens Axboe   [PATCH] Add suppo...
1324
1325
1326
1327
1328
1329
1330
1331
1332
  /*
   * Map an iov into an array of pages and offset/length tupples. With the
   * partial_page structure, we can map several non-contiguous ranges into
   * our ones pages[] map instead of splitting that operation into pieces.
   * Could easily be exported as a generic helper for other users, in which
   * case one would probably want to add a 'max_nr_pages' parameter as well.
   */
  static int get_iovec_page_array(const struct iovec __user *iov,
  				unsigned int nr_vecs, struct page **pages,
bd1a68b59   Eric Dumazet   vmsplice: relax a...
1333
  				struct partial_page *partial, bool aligned,
35f3d14db   Jens Axboe   pipe: add support...
1334
  				unsigned int pipe_buffers)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1335
1336
  {
  	int buffers = 0, error = 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1337
1338
  	while (nr_vecs) {
  		unsigned long off, npages;
757239576   Linus Torvalds   Fix possible spli...
1339
  		struct iovec entry;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1340
1341
1342
  		void __user *base;
  		size_t len;
  		int i;
757239576   Linus Torvalds   Fix possible spli...
1343
  		error = -EFAULT;
bc40d73c9   Nick Piggin   splice: use get_u...
1344
  		if (copy_from_user(&entry, iov, sizeof(entry)))
912d35f86   Jens Axboe   [PATCH] Add suppo...
1345
  			break;
757239576   Linus Torvalds   Fix possible spli...
1346
1347
  		base = entry.iov_base;
  		len = entry.iov_len;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1348
1349
1350
  		/*
  		 * Sanity check this iovec. 0 read succeeds.
  		 */
757239576   Linus Torvalds   Fix possible spli...
1351
  		error = 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1352
1353
1354
  		if (unlikely(!len))
  			break;
  		error = -EFAULT;
712a30e63   Bastian Blank   splice: fix user ...
1355
  		if (!access_ok(VERIFY_READ, base, len))
912d35f86   Jens Axboe   [PATCH] Add suppo...
1356
1357
1358
1359
1360
1361
1362
  			break;
  
  		/*
  		 * Get this base offset and number of pages, then map
  		 * in the user pages.
  		 */
  		off = (unsigned long) base & ~PAGE_MASK;
7afa6fd03   Jens Axboe   [PATCH] vmsplice:...
1363
1364
1365
1366
1367
1368
1369
1370
  
  		/*
  		 * If asked for alignment, the offset must be zero and the
  		 * length a multiple of the PAGE_SIZE.
  		 */
  		error = -EINVAL;
  		if (aligned && (off || len & ~PAGE_MASK))
  			break;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1371
  		npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
35f3d14db   Jens Axboe   pipe: add support...
1372
1373
  		if (npages > pipe_buffers - buffers)
  			npages = pipe_buffers - buffers;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1374

bc40d73c9   Nick Piggin   splice: use get_u...
1375
1376
  		error = get_user_pages_fast((unsigned long)base, npages,
  					0, &pages[buffers]);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1377
1378
1379
1380
1381
1382
1383
1384
  
  		if (unlikely(error <= 0))
  			break;
  
  		/*
  		 * Fill this contiguous range into the partial page map.
  		 */
  		for (i = 0; i < error; i++) {
7591489a8   Jens Axboe   [PATCH] vmsplice:...
1385
  			const int plen = min_t(size_t, len, PAGE_SIZE - off);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
  
  			partial[buffers].offset = off;
  			partial[buffers].len = plen;
  
  			off = 0;
  			len -= plen;
  			buffers++;
  		}
  
  		/*
  		 * We didn't complete this iov, stop here since it probably
  		 * means we have to move some of this into a pipe to
  		 * be able to continue.
  		 */
  		if (len)
  			break;
  
  		/*
  		 * Don't continue if we mapped fewer pages than we asked for,
  		 * or if we mapped the max number of pages that we have
  		 * room for.
  		 */
35f3d14db   Jens Axboe   pipe: add support...
1408
  		if (error < npages || buffers == pipe_buffers)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1409
1410
1411
1412
1413
  			break;
  
  		nr_vecs--;
  		iov++;
  	}
912d35f86   Jens Axboe   [PATCH] Add suppo...
1414
1415
1416
1417
1418
  	if (buffers)
  		return buffers;
  
  	return error;
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1419
1420
1421
1422
1423
  static int pipe_to_user(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  			struct splice_desc *sd)
  {
  	char *src;
  	int ret;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
  	/*
  	 * See if we can use the atomic maps, by prefaulting in the
  	 * pages and doing an atomic copy
  	 */
  	if (!fault_in_pages_writeable(sd->u.userptr, sd->len)) {
  		src = buf->ops->map(pipe, buf, 1);
  		ret = __copy_to_user_inatomic(sd->u.userptr, src + buf->offset,
  							sd->len);
  		buf->ops->unmap(pipe, buf, src);
  		if (!ret) {
  			ret = sd->len;
  			goto out;
  		}
  	}
  
  	/*
  	 * No dice, use slow non-atomic map and copy
   	 */
  	src = buf->ops->map(pipe, buf, 0);
  
  	ret = sd->len;
  	if (copy_to_user(sd->u.userptr, src + buf->offset, sd->len))
  		ret = -EFAULT;
6866bef40   Jens Axboe   splice: fix doubl...
1447
  	buf->ops->unmap(pipe, buf, src);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1448
1449
1450
  out:
  	if (ret > 0)
  		sd->u.userptr += ret;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
  	return ret;
  }
  
  /*
   * For lack of a better implementation, implement vmsplice() to userspace
   * as a simple copy of the pipes pages to the user iov.
   */
  static long vmsplice_to_user(struct file *file, const struct iovec __user *iov,
  			     unsigned long nr_segs, unsigned int flags)
  {
  	struct pipe_inode_info *pipe;
  	struct splice_desc sd;
  	ssize_t size;
  	int error;
  	long ret;
71993e62a   Linus Torvalds   Rename 'pipe_info...
1466
  	pipe = get_pipe_info(file);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1467
1468
  	if (!pipe)
  		return -EBADF;
61e0d47c3   Miklos Szeredi   splice: add helpe...
1469
  	pipe_lock(pipe);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
  
  	error = ret = 0;
  	while (nr_segs) {
  		void __user *base;
  		size_t len;
  
  		/*
  		 * Get user address base and length for this iovec.
  		 */
  		error = get_user(base, &iov->iov_base);
  		if (unlikely(error))
  			break;
  		error = get_user(len, &iov->iov_len);
  		if (unlikely(error))
  			break;
  
  		/*
  		 * Sanity check this iovec. 0 read succeeds.
  		 */
  		if (unlikely(!len))
  			break;
  		if (unlikely(!base)) {
  			error = -EFAULT;
  			break;
  		}
8811930dc   Jens Axboe   splice: missing u...
1495
1496
1497
1498
  		if (unlikely(!access_ok(VERIFY_WRITE, base, len))) {
  			error = -EFAULT;
  			break;
  		}
6a14b90bb   Jens Axboe   vmsplice: add vms...
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
  		sd.len = 0;
  		sd.total_len = len;
  		sd.flags = flags;
  		sd.u.userptr = base;
  		sd.pos = 0;
  
  		size = __splice_from_pipe(pipe, &sd, pipe_to_user);
  		if (size < 0) {
  			if (!ret)
  				ret = size;
  
  			break;
  		}
  
  		ret += size;
  
  		if (size < len)
  			break;
  
  		nr_segs--;
  		iov++;
  	}
61e0d47c3   Miklos Szeredi   splice: add helpe...
1521
  	pipe_unlock(pipe);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1522
1523
1524
1525
1526
1527
  
  	if (!ret)
  		ret = error;
  
  	return ret;
  }
912d35f86   Jens Axboe   [PATCH] Add suppo...
1528
1529
1530
1531
  /*
   * vmsplice splices a user address range into a pipe. It can be thought of
   * as splice-from-memory, where the regular splice is splice-from-file (or
   * to file). In both cases the output is a pipe, naturally.
912d35f86   Jens Axboe   [PATCH] Add suppo...
1532
   */
6a14b90bb   Jens Axboe   vmsplice: add vms...
1533
1534
  static long vmsplice_to_pipe(struct file *file, const struct iovec __user *iov,
  			     unsigned long nr_segs, unsigned int flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1535
  {
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1536
  	struct pipe_inode_info *pipe;
35f3d14db   Jens Axboe   pipe: add support...
1537
1538
  	struct page *pages[PIPE_DEF_BUFFERS];
  	struct partial_page partial[PIPE_DEF_BUFFERS];
912d35f86   Jens Axboe   [PATCH] Add suppo...
1539
1540
1541
  	struct splice_pipe_desc spd = {
  		.pages = pages,
  		.partial = partial,
047fe3605   Eric Dumazet   splice: fix racy ...
1542
  		.nr_pages_max = PIPE_DEF_BUFFERS,
912d35f86   Jens Axboe   [PATCH] Add suppo...
1543
1544
  		.flags = flags,
  		.ops = &user_page_pipe_buf_ops,
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
1545
  		.spd_release = spd_release_page,
912d35f86   Jens Axboe   [PATCH] Add suppo...
1546
  	};
35f3d14db   Jens Axboe   pipe: add support...
1547
  	long ret;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1548

71993e62a   Linus Torvalds   Rename 'pipe_info...
1549
  	pipe = get_pipe_info(file);
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1550
  	if (!pipe)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1551
  		return -EBADF;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1552

35f3d14db   Jens Axboe   pipe: add support...
1553
1554
1555
1556
  	if (splice_grow_spd(pipe, &spd))
  		return -ENOMEM;
  
  	spd.nr_pages = get_iovec_page_array(iov, nr_segs, spd.pages,
bd1a68b59   Eric Dumazet   vmsplice: relax a...
1557
  					    spd.partial, false,
047fe3605   Eric Dumazet   splice: fix racy ...
1558
  					    spd.nr_pages_max);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1559
  	if (spd.nr_pages <= 0)
35f3d14db   Jens Axboe   pipe: add support...
1560
1561
1562
  		ret = spd.nr_pages;
  	else
  		ret = splice_to_pipe(pipe, &spd);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1563

047fe3605   Eric Dumazet   splice: fix racy ...
1564
  	splice_shrink_spd(&spd);
35f3d14db   Jens Axboe   pipe: add support...
1565
  	return ret;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1566
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
  /*
   * Note that vmsplice only really supports true splicing _from_ user memory
   * to a pipe, not the other way around. Splicing from user memory is a simple
   * operation that can be supported without any funky alignment restrictions
   * or nasty vm tricks. We simply map in the user memory and fill them into
   * a pipe. The reverse isn't quite as easy, though. There are two possible
   * solutions for that:
   *
   *	- memcpy() the data internally, at which point we might as well just
   *	  do a regular read() on the buffer anyway.
   *	- Lots of nasty vm tricks, that are neither fast nor flexible (it
   *	  has restriction limitations on both ends of the pipe).
   *
   * Currently we punt and implement it as a normal copy, see pipe_to_user().
   *
   */
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1583
1584
  SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,
  		unsigned long, nr_segs, unsigned int, flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1585
  {
2903ff019   Al Viro   switch simple cas...
1586
  	struct fd f;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1587
  	long error;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1588

6a14b90bb   Jens Axboe   vmsplice: add vms...
1589
1590
1591
1592
  	if (unlikely(nr_segs > UIO_MAXIOV))
  		return -EINVAL;
  	else if (unlikely(!nr_segs))
  		return 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1593
  	error = -EBADF;
2903ff019   Al Viro   switch simple cas...
1594
1595
1596
1597
1598
1599
1600
1601
  	f = fdget(fd);
  	if (f.file) {
  		if (f.file->f_mode & FMODE_WRITE)
  			error = vmsplice_to_pipe(f.file, iov, nr_segs, flags);
  		else if (f.file->f_mode & FMODE_READ)
  			error = vmsplice_to_user(f.file, iov, nr_segs, flags);
  
  		fdput(f);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1602
1603
1604
1605
  	}
  
  	return error;
  }
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1606
1607
1608
  SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in,
  		int, fd_out, loff_t __user *, off_out,
  		size_t, len, unsigned int, flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
1609
  {
2903ff019   Al Viro   switch simple cas...
1610
  	struct fd in, out;
5274f052e   Jens Axboe   [PATCH] Introduce...
1611
  	long error;
5274f052e   Jens Axboe   [PATCH] Introduce...
1612
1613
1614
1615
1616
  
  	if (unlikely(!len))
  		return 0;
  
  	error = -EBADF;
2903ff019   Al Viro   switch simple cas...
1617
1618
1619
1620
1621
1622
1623
1624
  	in = fdget(fd_in);
  	if (in.file) {
  		if (in.file->f_mode & FMODE_READ) {
  			out = fdget(fd_out);
  			if (out.file) {
  				if (out.file->f_mode & FMODE_WRITE)
  					error = do_splice(in.file, off_in,
  							  out.file, off_out,
529565dcb   Ingo Molnar   [PATCH] splice: a...
1625
  							  len, flags);
2903ff019   Al Viro   switch simple cas...
1626
  				fdput(out);
5274f052e   Jens Axboe   [PATCH] Introduce...
1627
1628
  			}
  		}
2903ff019   Al Viro   switch simple cas...
1629
  		fdput(in);
5274f052e   Jens Axboe   [PATCH] Introduce...
1630
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1631
1632
  	return error;
  }
70524490e   Jens Axboe   [PATCH] splice: a...
1633
1634
  
  /*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1635
1636
1637
   * Make sure there's data to read. Wait for input if we can, otherwise
   * return an appropriate error.
   */
7c77f0b3f   Miklos Szeredi   splice: implement...
1638
  static int ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
  {
  	int ret;
  
  	/*
  	 * Check ->nrbufs without the inode lock first. This function
  	 * is speculative anyways, so missing one is ok.
  	 */
  	if (pipe->nrbufs)
  		return 0;
  
  	ret = 0;
61e0d47c3   Miklos Szeredi   splice: add helpe...
1650
  	pipe_lock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
  
  	while (!pipe->nrbufs) {
  		if (signal_pending(current)) {
  			ret = -ERESTARTSYS;
  			break;
  		}
  		if (!pipe->writers)
  			break;
  		if (!pipe->waiting_writers) {
  			if (flags & SPLICE_F_NONBLOCK) {
  				ret = -EAGAIN;
  				break;
  			}
  		}
  		pipe_wait(pipe);
  	}
61e0d47c3   Miklos Szeredi   splice: add helpe...
1667
  	pipe_unlock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1668
1669
1670
1671
1672
1673
1674
  	return ret;
  }
  
  /*
   * Make sure there's writeable room. Wait for room if we can, otherwise
   * return an appropriate error.
   */
7c77f0b3f   Miklos Szeredi   splice: implement...
1675
  static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1676
1677
1678
1679
1680
1681
1682
  {
  	int ret;
  
  	/*
  	 * Check ->nrbufs without the inode lock first. This function
  	 * is speculative anyways, so missing one is ok.
  	 */
35f3d14db   Jens Axboe   pipe: add support...
1683
  	if (pipe->nrbufs < pipe->buffers)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1684
1685
1686
  		return 0;
  
  	ret = 0;
61e0d47c3   Miklos Szeredi   splice: add helpe...
1687
  	pipe_lock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1688

35f3d14db   Jens Axboe   pipe: add support...
1689
  	while (pipe->nrbufs >= pipe->buffers) {
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
  		if (!pipe->readers) {
  			send_sig(SIGPIPE, current, 0);
  			ret = -EPIPE;
  			break;
  		}
  		if (flags & SPLICE_F_NONBLOCK) {
  			ret = -EAGAIN;
  			break;
  		}
  		if (signal_pending(current)) {
  			ret = -ERESTARTSYS;
  			break;
  		}
  		pipe->waiting_writers++;
  		pipe_wait(pipe);
  		pipe->waiting_writers--;
  	}
61e0d47c3   Miklos Szeredi   splice: add helpe...
1707
  	pipe_unlock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1708
1709
1710
1711
  	return ret;
  }
  
  /*
7c77f0b3f   Miklos Szeredi   splice: implement...
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
   * Splice contents of ipipe to opipe.
   */
  static int splice_pipe_to_pipe(struct pipe_inode_info *ipipe,
  			       struct pipe_inode_info *opipe,
  			       size_t len, unsigned int flags)
  {
  	struct pipe_buffer *ibuf, *obuf;
  	int ret = 0, nbuf;
  	bool input_wakeup = false;
  
  
  retry:
  	ret = ipipe_prep(ipipe, flags);
  	if (ret)
  		return ret;
  
  	ret = opipe_prep(opipe, flags);
  	if (ret)
  		return ret;
  
  	/*
  	 * Potential ABBA deadlock, work around it by ordering lock
  	 * grabbing by pipe info address. Otherwise two different processes
  	 * could deadlock (one doing tee from A -> B, the other from B -> A).
  	 */
  	pipe_double_lock(ipipe, opipe);
  
  	do {
  		if (!opipe->readers) {
  			send_sig(SIGPIPE, current, 0);
  			if (!ret)
  				ret = -EPIPE;
  			break;
  		}
  
  		if (!ipipe->nrbufs && !ipipe->writers)
  			break;
  
  		/*
  		 * Cannot make any progress, because either the input
  		 * pipe is empty or the output pipe is full.
  		 */
35f3d14db   Jens Axboe   pipe: add support...
1754
  		if (!ipipe->nrbufs || opipe->nrbufs >= opipe->buffers) {
7c77f0b3f   Miklos Szeredi   splice: implement...
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
  			/* Already processed some buffers, break */
  			if (ret)
  				break;
  
  			if (flags & SPLICE_F_NONBLOCK) {
  				ret = -EAGAIN;
  				break;
  			}
  
  			/*
  			 * We raced with another reader/writer and haven't
  			 * managed to process any buffers.  A zero return
  			 * value means EOF, so retry instead.
  			 */
  			pipe_unlock(ipipe);
  			pipe_unlock(opipe);
  			goto retry;
  		}
  
  		ibuf = ipipe->bufs + ipipe->curbuf;
35f3d14db   Jens Axboe   pipe: add support...
1775
  		nbuf = (opipe->curbuf + opipe->nrbufs) & (opipe->buffers - 1);
7c77f0b3f   Miklos Szeredi   splice: implement...
1776
1777
1778
1779
1780
1781
1782
1783
1784
  		obuf = opipe->bufs + nbuf;
  
  		if (len >= ibuf->len) {
  			/*
  			 * Simply move the whole buffer from ipipe to opipe
  			 */
  			*obuf = *ibuf;
  			ibuf->ops = NULL;
  			opipe->nrbufs++;
35f3d14db   Jens Axboe   pipe: add support...
1785
  			ipipe->curbuf = (ipipe->curbuf + 1) & (ipipe->buffers - 1);
7c77f0b3f   Miklos Szeredi   splice: implement...
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
  			ipipe->nrbufs--;
  			input_wakeup = true;
  		} else {
  			/*
  			 * Get a reference to this pipe buffer,
  			 * so we can copy the contents over.
  			 */
  			ibuf->ops->get(ipipe, ibuf);
  			*obuf = *ibuf;
  
  			/*
  			 * Don't inherit the gift flag, we need to
  			 * prevent multiple steals of this page.
  			 */
  			obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
  
  			obuf->len = len;
  			opipe->nrbufs++;
  			ibuf->offset += obuf->len;
  			ibuf->len -= obuf->len;
  		}
  		ret += obuf->len;
  		len -= obuf->len;
  	} while (len);
  
  	pipe_unlock(ipipe);
  	pipe_unlock(opipe);
  
  	/*
  	 * If we put data in the output pipe, wakeup any potential readers.
  	 */
825cdcb1a   Namhyung Kim   splice: add wakeu...
1817
1818
  	if (ret > 0)
  		wakeup_pipe_readers(opipe);
7c77f0b3f   Miklos Szeredi   splice: implement...
1819
1820
1821
1822
1823
1824
1825
  	if (input_wakeup)
  		wakeup_pipe_writers(ipipe);
  
  	return ret;
  }
  
  /*
70524490e   Jens Axboe   [PATCH] splice: a...
1826
1827
1828
1829
1830
1831
1832
   * Link contents of ipipe to opipe.
   */
  static int link_pipe(struct pipe_inode_info *ipipe,
  		     struct pipe_inode_info *opipe,
  		     size_t len, unsigned int flags)
  {
  	struct pipe_buffer *ibuf, *obuf;
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1833
  	int ret = 0, i = 0, nbuf;
70524490e   Jens Axboe   [PATCH] splice: a...
1834
1835
1836
  
  	/*
  	 * Potential ABBA deadlock, work around it by ordering lock
61e0d47c3   Miklos Szeredi   splice: add helpe...
1837
  	 * grabbing by pipe info address. Otherwise two different processes
70524490e   Jens Axboe   [PATCH] splice: a...
1838
1839
  	 * could deadlock (one doing tee from A -> B, the other from B -> A).
  	 */
61e0d47c3   Miklos Szeredi   splice: add helpe...
1840
  	pipe_double_lock(ipipe, opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1841

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1842
  	do {
70524490e   Jens Axboe   [PATCH] splice: a...
1843
1844
1845
1846
1847
1848
  		if (!opipe->readers) {
  			send_sig(SIGPIPE, current, 0);
  			if (!ret)
  				ret = -EPIPE;
  			break;
  		}
70524490e   Jens Axboe   [PATCH] splice: a...
1849

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1850
1851
1852
1853
  		/*
  		 * If we have iterated all input buffers or ran out of
  		 * output room, break.
  		 */
35f3d14db   Jens Axboe   pipe: add support...
1854
  		if (i >= ipipe->nrbufs || opipe->nrbufs >= opipe->buffers)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1855
  			break;
70524490e   Jens Axboe   [PATCH] splice: a...
1856

35f3d14db   Jens Axboe   pipe: add support...
1857
1858
  		ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (ipipe->buffers-1));
  		nbuf = (opipe->curbuf + opipe->nrbufs) & (opipe->buffers - 1);
70524490e   Jens Axboe   [PATCH] splice: a...
1859
1860
  
  		/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1861
1862
  		 * Get a reference to this pipe buffer,
  		 * so we can copy the contents over.
70524490e   Jens Axboe   [PATCH] splice: a...
1863
  		 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1864
1865
1866
1867
  		ibuf->ops->get(ipipe, ibuf);
  
  		obuf = opipe->bufs + nbuf;
  		*obuf = *ibuf;
2a27250e6   Jens Axboe   [PATCH] tee: link...
1868
  		/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1869
1870
  		 * Don't inherit the gift flag, we need to
  		 * prevent multiple steals of this page.
2a27250e6   Jens Axboe   [PATCH] tee: link...
1871
  		 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1872
  		obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
70524490e   Jens Axboe   [PATCH] splice: a...
1873

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1874
1875
  		if (obuf->len > len)
  			obuf->len = len;
70524490e   Jens Axboe   [PATCH] splice: a...
1876

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1877
1878
1879
1880
1881
  		opipe->nrbufs++;
  		ret += obuf->len;
  		len -= obuf->len;
  		i++;
  	} while (len);
70524490e   Jens Axboe   [PATCH] splice: a...
1882

02cf01aea   Jens Axboe   splice: only retu...
1883
1884
1885
1886
1887
1888
  	/*
  	 * return EAGAIN if we have the potential of some data in the
  	 * future, otherwise just return 0
  	 */
  	if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK))
  		ret = -EAGAIN;
61e0d47c3   Miklos Szeredi   splice: add helpe...
1889
1890
  	pipe_unlock(ipipe);
  	pipe_unlock(opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1891

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1892
1893
1894
  	/*
  	 * If we put data in the output pipe, wakeup any potential readers.
  	 */
825cdcb1a   Namhyung Kim   splice: add wakeu...
1895
1896
  	if (ret > 0)
  		wakeup_pipe_readers(opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
  
  	return ret;
  }
  
  /*
   * This is a tee(1) implementation that works on pipes. It doesn't copy
   * any data, it simply references the 'in' pages on the 'out' pipe.
   * The 'flags' used are the SPLICE_F_* variants, currently the only
   * applicable one is SPLICE_F_NONBLOCK.
   */
  static long do_tee(struct file *in, struct file *out, size_t len,
  		   unsigned int flags)
  {
71993e62a   Linus Torvalds   Rename 'pipe_info...
1910
1911
  	struct pipe_inode_info *ipipe = get_pipe_info(in);
  	struct pipe_inode_info *opipe = get_pipe_info(out);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1912
  	int ret = -EINVAL;
70524490e   Jens Axboe   [PATCH] splice: a...
1913
1914
  
  	/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1915
1916
  	 * Duplicate the contents of ipipe to opipe without actually
  	 * copying the data.
70524490e   Jens Axboe   [PATCH] splice: a...
1917
  	 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1918
1919
1920
1921
1922
  	if (ipipe && opipe && ipipe != opipe) {
  		/*
  		 * Keep going, unless we encounter an error. The ipipe/opipe
  		 * ordering doesn't really matter.
  		 */
7c77f0b3f   Miklos Szeredi   splice: implement...
1923
  		ret = ipipe_prep(ipipe, flags);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1924
  		if (!ret) {
7c77f0b3f   Miklos Szeredi   splice: implement...
1925
  			ret = opipe_prep(opipe, flags);
02cf01aea   Jens Axboe   splice: only retu...
1926
  			if (!ret)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1927
  				ret = link_pipe(ipipe, opipe, len, flags);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1928
1929
  		}
  	}
70524490e   Jens Axboe   [PATCH] splice: a...
1930

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1931
  	return ret;
70524490e   Jens Axboe   [PATCH] splice: a...
1932
  }
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1933
  SYSCALL_DEFINE4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags)
70524490e   Jens Axboe   [PATCH] splice: a...
1934
  {
2903ff019   Al Viro   switch simple cas...
1935
1936
  	struct fd in;
  	int error;
70524490e   Jens Axboe   [PATCH] splice: a...
1937
1938
1939
1940
1941
  
  	if (unlikely(!len))
  		return 0;
  
  	error = -EBADF;
2903ff019   Al Viro   switch simple cas...
1942
1943
1944
1945
1946
1947
1948
1949
1950
  	in = fdget(fdin);
  	if (in.file) {
  		if (in.file->f_mode & FMODE_READ) {
  			struct fd out = fdget(fdout);
  			if (out.file) {
  				if (out.file->f_mode & FMODE_WRITE)
  					error = do_tee(in.file, out.file,
  							len, flags);
  				fdput(out);
70524490e   Jens Axboe   [PATCH] splice: a...
1951
1952
  			}
  		}
2903ff019   Al Viro   switch simple cas...
1953
   		fdput(in);
70524490e   Jens Axboe   [PATCH] splice: a...
1954
1955
1956
1957
   	}
  
  	return error;
  }