Blame view

fs/splice.c 39.6 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
   *
   */
be297968d   Christoph Hellwig   mm: only include ...
20
  #include <linux/bvec.h>
5274f052e   Jens Axboe   [PATCH] Introduce...
21
22
23
  #include <linux/fs.h>
  #include <linux/file.h>
  #include <linux/pagemap.h>
d6b29d7ce   Jens Axboe   splice: divorce t...
24
  #include <linux/splice.h>
08e552c69   KAMEZAWA Hiroyuki   memcg: synchroniz...
25
  #include <linux/memcontrol.h>
5274f052e   Jens Axboe   [PATCH] Introduce...
26
  #include <linux/mm_inline.h>
5abc97aa2   Jens Axboe   [PATCH] splice: a...
27
  #include <linux/swap.h>
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
28
  #include <linux/writeback.h>
630d9c472   Paul Gortmaker   fs: reduce the us...
29
  #include <linux/export.h>
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
30
  #include <linux/syscalls.h>
912d35f86   Jens Axboe   [PATCH] Add suppo...
31
  #include <linux/uio.h>
29ce20586   James Morris   security: revalid...
32
  #include <linux/security.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
33
  #include <linux/gfp.h>
35f9c09fe   Eric Dumazet   tcp: tcp_sendpage...
34
  #include <linux/socket.h>
76b021d05   Al Viro   convert vmsplice ...
35
  #include <linux/compat.h>
174cd4b1e   Ingo Molnar   sched/headers: Pr...
36
  #include <linux/sched/signal.h>
06ae43f34   Al Viro   Don't bother with...
37
  #include "internal.h"
5274f052e   Jens Axboe   [PATCH] Introduce...
38

83f9135bd   Jens Axboe   [PATCH] splice: a...
39
40
41
42
43
44
  /*
   * 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...
45
  static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
5abc97aa2   Jens Axboe   [PATCH] splice: a...
46
47
48
  				     struct pipe_buffer *buf)
  {
  	struct page *page = buf->page;
9e94cd4fd   Jens Axboe   [PATCH] splice: r...
49
  	struct address_space *mapping;
5abc97aa2   Jens Axboe   [PATCH] splice: a...
50

9e0267c26   Jens Axboe   [PATCH] splice: f...
51
  	lock_page(page);
9e94cd4fd   Jens Axboe   [PATCH] splice: r...
52
53
54
  	mapping = page_mapping(page);
  	if (mapping) {
  		WARN_ON(!PageUptodate(page));
5abc97aa2   Jens Axboe   [PATCH] splice: a...
55

9e94cd4fd   Jens Axboe   [PATCH] splice: r...
56
57
58
59
60
61
62
63
64
  		/*
  		 * 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...
65

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

9e94cd4fd   Jens Axboe   [PATCH] splice: r...
70
71
72
73
74
75
76
77
  		/*
  		 * 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...
78
  	}
5abc97aa2   Jens Axboe   [PATCH] splice: a...
79

9e94cd4fd   Jens Axboe   [PATCH] splice: r...
80
81
82
83
  	/*
  	 * Raced with truncate or failed to remove page from current
  	 * address space, unlock and return failure.
  	 */
ca39d651d   Jens Axboe   splice: handle tr...
84
  out_unlock:
9e94cd4fd   Jens Axboe   [PATCH] splice: r...
85
86
  	unlock_page(page);
  	return 1;
5abc97aa2   Jens Axboe   [PATCH] splice: a...
87
  }
76ad4d111   Jens Axboe   [PATCH] splice: r...
88
  static void page_cache_pipe_buf_release(struct pipe_inode_info *pipe,
5274f052e   Jens Axboe   [PATCH] Introduce...
89
90
  					struct pipe_buffer *buf)
  {
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
91
  	put_page(buf->page);
1432873af   Jens Axboe   [PATCH] splice: L...
92
  	buf->flags &= ~PIPE_BUF_FLAG_LRU;
5274f052e   Jens Axboe   [PATCH] Introduce...
93
  }
0845718da   Jens Axboe   pipe: add documen...
94
95
96
97
  /*
   * 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 ...
98
99
  static int page_cache_pipe_buf_confirm(struct pipe_inode_info *pipe,
  				       struct pipe_buffer *buf)
5274f052e   Jens Axboe   [PATCH] Introduce...
100
101
  {
  	struct page *page = buf->page;
49d0b21be   Jens Axboe   [PATCH] splice: o...
102
  	int err;
5274f052e   Jens Axboe   [PATCH] Introduce...
103
104
  
  	if (!PageUptodate(page)) {
49d0b21be   Jens Axboe   [PATCH] splice: o...
105
106
107
108
  		lock_page(page);
  
  		/*
  		 * Page got truncated/unhashed. This will cause a 0-byte
73d62d83e   Ingo Molnar   [PATCH] splice: c...
109
  		 * splice, if this is the first page.
49d0b21be   Jens Axboe   [PATCH] splice: o...
110
111
112
113
114
  		 */
  		if (!page->mapping) {
  			err = -ENODATA;
  			goto error;
  		}
5274f052e   Jens Axboe   [PATCH] Introduce...
115

49d0b21be   Jens Axboe   [PATCH] splice: o...
116
  		/*
73d62d83e   Ingo Molnar   [PATCH] splice: c...
117
  		 * Uh oh, read-error from disk.
49d0b21be   Jens Axboe   [PATCH] splice: o...
118
119
120
121
122
123
124
  		 */
  		if (!PageUptodate(page)) {
  			err = -EIO;
  			goto error;
  		}
  
  		/*
f84d75199   Jens Axboe   [PATCH] pipe: int...
125
  		 * Page is ok afterall, we are done.
49d0b21be   Jens Axboe   [PATCH] splice: o...
126
  		 */
5274f052e   Jens Axboe   [PATCH] Introduce...
127
  		unlock_page(page);
5274f052e   Jens Axboe   [PATCH] Introduce...
128
  	}
f84d75199   Jens Axboe   [PATCH] pipe: int...
129
  	return 0;
49d0b21be   Jens Axboe   [PATCH] splice: o...
130
131
  error:
  	unlock_page(page);
f84d75199   Jens Axboe   [PATCH] pipe: int...
132
  	return err;
70524490e   Jens Axboe   [PATCH] splice: a...
133
  }
708e3508c   Hugh Dickins   tmpfs: clone shme...
134
  const struct pipe_buf_operations page_cache_pipe_buf_ops = {
5274f052e   Jens Axboe   [PATCH] Introduce...
135
  	.can_merge = 0,
cac36bb06   Jens Axboe   pipe: change the ...
136
  	.confirm = page_cache_pipe_buf_confirm,
5274f052e   Jens Axboe   [PATCH] Introduce...
137
  	.release = page_cache_pipe_buf_release,
5abc97aa2   Jens Axboe   [PATCH] splice: a...
138
  	.steal = page_cache_pipe_buf_steal,
f84d75199   Jens Axboe   [PATCH] pipe: int...
139
  	.get = generic_pipe_buf_get,
5274f052e   Jens Axboe   [PATCH] Introduce...
140
  };
912d35f86   Jens Axboe   [PATCH] Add suppo...
141
142
143
  static int user_page_pipe_buf_steal(struct pipe_inode_info *pipe,
  				    struct pipe_buffer *buf)
  {
7afa6fd03   Jens Axboe   [PATCH] vmsplice:...
144
145
  	if (!(buf->flags & PIPE_BUF_FLAG_GIFT))
  		return 1;
1432873af   Jens Axboe   [PATCH] splice: L...
146
  	buf->flags |= PIPE_BUF_FLAG_LRU;
330ab7161   Jens Axboe   [PATCH] vmsplice:...
147
  	return generic_pipe_buf_steal(pipe, buf);
912d35f86   Jens Axboe   [PATCH] Add suppo...
148
  }
d4c3cca94   Eric Dumazet   [PATCH] constify ...
149
  static const struct pipe_buf_operations user_page_pipe_buf_ops = {
912d35f86   Jens Axboe   [PATCH] Add suppo...
150
  	.can_merge = 0,
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;
8924feff6   Al Viro   splice: lift pipe...
178
  	int ret = 0, page_nr = 0;
5274f052e   Jens Axboe   [PATCH] Introduce...
179

d6785d915   Rabin Vincent   splice: handle ze...
180
181
  	if (!spd_pages)
  		return 0;
8924feff6   Al Viro   splice: lift pipe...
182
183
184
185
186
  	if (unlikely(!pipe->readers)) {
  		send_sig(SIGPIPE, current, 0);
  		ret = -EPIPE;
  		goto out;
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
187

8924feff6   Al Viro   splice: lift pipe...
188
189
190
  	while (pipe->nrbufs < pipe->buffers) {
  		int newbuf = (pipe->curbuf + pipe->nrbufs) & (pipe->buffers - 1);
  		struct pipe_buffer *buf = pipe->bufs + newbuf;
5274f052e   Jens Axboe   [PATCH] Introduce...
191

8924feff6   Al Viro   splice: lift pipe...
192
193
194
195
196
  		buf->page = spd->pages[page_nr];
  		buf->offset = spd->partial[page_nr].offset;
  		buf->len = spd->partial[page_nr].len;
  		buf->private = spd->partial[page_nr].private;
  		buf->ops = spd->ops;
5a81e6a17   Miklos Szeredi   vfs: fix uninitia...
197
  		buf->flags = 0;
5274f052e   Jens Axboe   [PATCH] Introduce...
198

8924feff6   Al Viro   splice: lift pipe...
199
200
201
  		pipe->nrbufs++;
  		page_nr++;
  		ret += buf->len;
29e350944   Linus Torvalds   splice: add SPLIC...
202

8924feff6   Al Viro   splice: lift pipe...
203
  		if (!--spd->nr_pages)
5274f052e   Jens Axboe   [PATCH] Introduce...
204
  			break;
5274f052e   Jens Axboe   [PATCH] Introduce...
205
  	}
8924feff6   Al Viro   splice: lift pipe...
206
207
  	if (!ret)
  		ret = -EAGAIN;
5274f052e   Jens Axboe   [PATCH] Introduce...
208

8924feff6   Al Viro   splice: lift pipe...
209
  out:
00de00bda   Jens Axboe   splice: fix leak ...
210
  	while (page_nr < spd_pages)
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
211
  		spd->spd_release(spd, page_nr++);
5274f052e   Jens Axboe   [PATCH] Introduce...
212
213
214
  
  	return ret;
  }
2b514574f   Hannes Frederic Sowa   net: af_unix: imp...
215
  EXPORT_SYMBOL_GPL(splice_to_pipe);
5274f052e   Jens Axboe   [PATCH] Introduce...
216

79fddc4ef   Al Viro   new helper: add_t...
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
  ssize_t add_to_pipe(struct pipe_inode_info *pipe, struct pipe_buffer *buf)
  {
  	int ret;
  
  	if (unlikely(!pipe->readers)) {
  		send_sig(SIGPIPE, current, 0);
  		ret = -EPIPE;
  	} else if (pipe->nrbufs == pipe->buffers) {
  		ret = -EAGAIN;
  	} else {
  		int newbuf = (pipe->curbuf + pipe->nrbufs) & (pipe->buffers - 1);
  		pipe->bufs[newbuf] = *buf;
  		pipe->nrbufs++;
  		return buf->len;
  	}
a779638cf   Miklos Szeredi   pipe: add pipe_bu...
232
  	pipe_buf_release(pipe, buf);
79fddc4ef   Al Viro   new helper: add_t...
233
234
235
  	return ret;
  }
  EXPORT_SYMBOL(add_to_pipe);
35f3d14db   Jens Axboe   pipe: add support...
236
237
238
239
  /*
   * Check if we need to grow the arrays holding pages and partial page
   * descriptions.
   */
047fe3605   Eric Dumazet   splice: fix racy ...
240
  int splice_grow_spd(const struct pipe_inode_info *pipe, struct splice_pipe_desc *spd)
35f3d14db   Jens Axboe   pipe: add support...
241
  {
6aa7de059   Mark Rutland   locking/atomics: ...
242
  	unsigned int buffers = READ_ONCE(pipe->buffers);
047fe3605   Eric Dumazet   splice: fix racy ...
243
244
245
  
  	spd->nr_pages_max = buffers;
  	if (buffers <= PIPE_DEF_BUFFERS)
35f3d14db   Jens Axboe   pipe: add support...
246
  		return 0;
6da2ec560   Kees Cook   treewide: kmalloc...
247
248
249
  	spd->pages = kmalloc_array(buffers, sizeof(struct page *), GFP_KERNEL);
  	spd->partial = kmalloc_array(buffers, sizeof(struct partial_page),
  				     GFP_KERNEL);
35f3d14db   Jens Axboe   pipe: add support...
250
251
252
253
254
255
256
257
  
  	if (spd->pages && spd->partial)
  		return 0;
  
  	kfree(spd->pages);
  	kfree(spd->partial);
  	return -ENOMEM;
  }
047fe3605   Eric Dumazet   splice: fix racy ...
258
  void splice_shrink_spd(struct splice_pipe_desc *spd)
35f3d14db   Jens Axboe   pipe: add support...
259
  {
047fe3605   Eric Dumazet   splice: fix racy ...
260
  	if (spd->nr_pages_max <= PIPE_DEF_BUFFERS)
35f3d14db   Jens Axboe   pipe: add support...
261
262
263
264
265
  		return;
  
  	kfree(spd->pages);
  	kfree(spd->partial);
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
266
267
268
  /**
   * generic_file_splice_read - splice data from file to a pipe
   * @in:		file to splice from
932cc6d4f   Jens Axboe   splice: completel...
269
   * @ppos:	position in @in
83f9135bd   Jens Axboe   [PATCH] splice: a...
270
271
272
273
   * @pipe:	pipe to splice to
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
274
275
   * Description:
   *    Will read pages from given file and fill them into a pipe. Can be
82c156f85   Al Viro   switch generic_fi...
276
   *    used as long as it has more or less sane ->read_iter().
932cc6d4f   Jens Axboe   splice: completel...
277
   *
83f9135bd   Jens Axboe   [PATCH] splice: a...
278
   */
cbb7e577e   Jens Axboe   [PATCH] splice: p...
279
280
281
  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...
282
  {
82c156f85   Al Viro   switch generic_fi...
283
284
  	struct iov_iter to;
  	struct kiocb kiocb;
82c156f85   Al Viro   switch generic_fi...
285
  	int idx, ret;
be64f884b   Boaz Harrosh   dax: unify ext2/4...
286

82c156f85   Al Viro   switch generic_fi...
287
288
289
290
  	iov_iter_pipe(&to, ITER_PIPE | READ, pipe, len);
  	idx = to.idx;
  	init_sync_kiocb(&kiocb, in);
  	kiocb.ki_pos = *ppos;
bb7462b6f   Miklos Szeredi   vfs: use helpers ...
291
  	ret = call_read_iter(in, &kiocb, &to);
723590ed5   Miklos Szeredi   splice: update mt...
292
  	if (ret > 0) {
82c156f85   Al Viro   switch generic_fi...
293
  		*ppos = kiocb.ki_pos;
723590ed5   Miklos Szeredi   splice: update mt...
294
  		file_accessed(in);
82c156f85   Al Viro   switch generic_fi...
295
  	} else if (ret < 0) {
c3a690240   Al Viro   fix ITER_PIPE int...
296
297
298
  		to.idx = idx;
  		to.iov_offset = 0;
  		iov_iter_advance(&to, 0); /* to free what was emitted */
82c156f85   Al Viro   switch generic_fi...
299
300
301
302
303
304
  		/*
  		 * callers of ->splice_read() expect -EAGAIN on
  		 * "can't put anything in there", rather than -EFAULT.
  		 */
  		if (ret == -EFAULT)
  			ret = -EAGAIN;
723590ed5   Miklos Szeredi   splice: update mt...
305
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
306
307
308
  
  	return ret;
  }
059a8f373   Jens Axboe   [PATCH] splice: e...
309
  EXPORT_SYMBOL(generic_file_splice_read);
241699cd7   Al Viro   new iov_iter flav...
310
  const struct pipe_buf_operations default_pipe_buf_ops = {
6818173bd   Miklos Szeredi   splice: implement...
311
  	.can_merge = 0,
6818173bd   Miklos Szeredi   splice: implement...
312
313
314
315
316
  	.confirm = generic_pipe_buf_confirm,
  	.release = generic_pipe_buf_release,
  	.steal = generic_pipe_buf_steal,
  	.get = generic_pipe_buf_get,
  };
28a625cbc   Miklos Szeredi   fuse: fix pipe_bu...
317
318
319
320
321
322
323
324
325
  static int generic_pipe_buf_nosteal(struct pipe_inode_info *pipe,
  				    struct pipe_buffer *buf)
  {
  	return 1;
  }
  
  /* Pipe buffer operations for a socket and similar. */
  const struct pipe_buf_operations nosteal_pipe_buf_ops = {
  	.can_merge = 0,
28a625cbc   Miklos Szeredi   fuse: fix pipe_bu...
326
327
328
329
330
331
  	.confirm = generic_pipe_buf_confirm,
  	.release = generic_pipe_buf_release,
  	.steal = generic_pipe_buf_nosteal,
  	.get = generic_pipe_buf_get,
  };
  EXPORT_SYMBOL(nosteal_pipe_buf_ops);
523ac9afc   Al Viro   switch default_fi...
332
  static ssize_t kernel_readv(struct file *file, const struct kvec *vec,
6818173bd   Miklos Szeredi   splice: implement...
333
334
335
336
337
338
339
340
341
  			    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() */
793b80ef1   Christoph Hellwig   vfs: pass a flags...
342
  	res = vfs_readv(file, (const struct iovec __user *)vec, vlen, &pos, 0);
6818173bd   Miklos Szeredi   splice: implement...
343
344
345
346
  	set_fs(old_fs);
  
  	return res;
  }
82c156f85   Al Viro   switch generic_fi...
347
  static ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
6818173bd   Miklos Szeredi   splice: implement...
348
349
350
  				 struct pipe_inode_info *pipe, size_t len,
  				 unsigned int flags)
  {
523ac9afc   Al Viro   switch default_fi...
351
352
353
  	struct kvec *vec, __vec[PIPE_DEF_BUFFERS];
  	struct iov_iter to;
  	struct page **pages;
6818173bd   Miklos Szeredi   splice: implement...
354
  	unsigned int nr_pages;
13c0f52be   Al Viro   make nr_pages cal...
355
  	size_t offset, base, copied = 0;
6818173bd   Miklos Szeredi   splice: implement...
356
  	ssize_t res;
6818173bd   Miklos Szeredi   splice: implement...
357
  	int i;
35f3d14db   Jens Axboe   pipe: add support...
358

523ac9afc   Al Viro   switch default_fi...
359
360
  	if (pipe->nrbufs == pipe->buffers)
  		return -EAGAIN;
35f3d14db   Jens Axboe   pipe: add support...
361

523ac9afc   Al Viro   switch default_fi...
362
363
364
365
  	/*
  	 * Try to keep page boundaries matching to source pagecache ones -
  	 * it probably won't be much help, but...
  	 */
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
366
  	offset = *ppos & ~PAGE_MASK;
6818173bd   Miklos Szeredi   splice: implement...
367

523ac9afc   Al Viro   switch default_fi...
368
  	iov_iter_pipe(&to, ITER_PIPE | READ, pipe, len + offset);
6818173bd   Miklos Szeredi   splice: implement...
369

13c0f52be   Al Viro   make nr_pages cal...
370
  	res = iov_iter_get_pages_alloc(&to, &pages, len + offset, &base);
523ac9afc   Al Viro   switch default_fi...
371
372
  	if (res <= 0)
  		return -ENOMEM;
6818173bd   Miklos Szeredi   splice: implement...
373

13c0f52be   Al Viro   make nr_pages cal...
374
  	nr_pages = DIV_ROUND_UP(res + base, PAGE_SIZE);
6818173bd   Miklos Szeredi   splice: implement...
375

523ac9afc   Al Viro   switch default_fi...
376
377
  	vec = __vec;
  	if (nr_pages > PIPE_DEF_BUFFERS) {
6da2ec560   Kees Cook   treewide: kmalloc...
378
  		vec = kmalloc_array(nr_pages, sizeof(struct kvec), GFP_KERNEL);
523ac9afc   Al Viro   switch default_fi...
379
380
381
382
  		if (unlikely(!vec)) {
  			res = -ENOMEM;
  			goto out;
  		}
77f6bf57b   Andrew Morton   splice: fix error...
383
  	}
6818173bd   Miklos Szeredi   splice: implement...
384

523ac9afc   Al Viro   switch default_fi...
385
386
387
388
389
390
391
392
393
  	pipe->bufs[to.idx].offset = offset;
  	pipe->bufs[to.idx].len -= offset;
  
  	for (i = 0; i < nr_pages; i++) {
  		size_t this_len = min_t(size_t, len, PAGE_SIZE - offset);
  		vec[i].iov_base = page_address(pages[i]) + offset;
  		vec[i].iov_len = this_len;
  		len -= this_len;
  		offset = 0;
6818173bd   Miklos Szeredi   splice: implement...
394
  	}
6818173bd   Miklos Szeredi   splice: implement...
395

523ac9afc   Al Viro   switch default_fi...
396
397
398
  	res = kernel_readv(in, vec, nr_pages, *ppos);
  	if (res > 0) {
  		copied = res;
6818173bd   Miklos Szeredi   splice: implement...
399
  		*ppos += res;
523ac9afc   Al Viro   switch default_fi...
400
  	}
6818173bd   Miklos Szeredi   splice: implement...
401

35f3d14db   Jens Axboe   pipe: add support...
402
403
  	if (vec != __vec)
  		kfree(vec);
523ac9afc   Al Viro   switch default_fi...
404
405
406
407
408
  out:
  	for (i = 0; i < nr_pages; i++)
  		put_page(pages[i]);
  	kvfree(pages);
  	iov_iter_advance(&to, copied);	/* truncates and discards */
6818173bd   Miklos Szeredi   splice: implement...
409
  	return res;
6818173bd   Miklos Szeredi   splice: implement...
410
  }
6818173bd   Miklos Szeredi   splice: implement...
411

5274f052e   Jens Axboe   [PATCH] Introduce...
412
  /*
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
413
   * Send 'sd->len' bytes to socket from 'sd->file' at position 'sd->pos'
016b661e2   Jens Axboe   [PATCH] splice: f...
414
   * using sendpage(). Return the number of bytes sent.
5274f052e   Jens Axboe   [PATCH] Introduce...
415
   */
76ad4d111   Jens Axboe   [PATCH] splice: r...
416
  static int pipe_to_sendpage(struct pipe_inode_info *pipe,
5274f052e   Jens Axboe   [PATCH] Introduce...
417
418
  			    struct pipe_buffer *buf, struct splice_desc *sd)
  {
6a14b90bb   Jens Axboe   vmsplice: add vms...
419
  	struct file *file = sd->u.file;
5274f052e   Jens Axboe   [PATCH] Introduce...
420
  	loff_t pos = sd->pos;
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
421
  	int more;
5274f052e   Jens Axboe   [PATCH] Introduce...
422

72c2d5319   Al Viro   file->f_op is nev...
423
  	if (!likely(file->f_op->sendpage))
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
424
  		return -EINVAL;
35f9c09fe   Eric Dumazet   tcp: tcp_sendpage...
425
  	more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0;
ae62ca7b0   Eric Dumazet   tcp: fix MSG_SEND...
426
427
  
  	if (sd->len < sd->total_len && pipe->nrbufs > 1)
35f9c09fe   Eric Dumazet   tcp: tcp_sendpage...
428
  		more |= MSG_SENDPAGE_NOTLAST;
ae62ca7b0   Eric Dumazet   tcp: fix MSG_SEND...
429

a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
430
431
  	return file->f_op->sendpage(file, buf->page, buf->offset,
  				    sd->len, &pos, more);
5274f052e   Jens Axboe   [PATCH] Introduce...
432
  }
b3c2d2ddd   Miklos Szeredi   splice: split up ...
433
434
435
436
437
438
439
  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...
440
  /**
b3c2d2ddd   Miklos Szeredi   splice: split up ...
441
   * splice_from_pipe_feed - feed available data from a pipe to a file
932cc6d4f   Jens Axboe   splice: completel...
442
443
444
445
446
   * @pipe:	pipe to splice from
   * @sd:		information to @actor
   * @actor:	handler that splices the data
   *
   * Description:
b3c2d2ddd   Miklos Szeredi   splice: split up ...
447
448
449
450
451
452
453
   *    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...
454
   *
b3c2d2ddd   Miklos Szeredi   splice: split up ...
455
456
457
458
   *    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...
459
   */
96f9bc8fb   Al Viro   fs/splice.c: remo...
460
  static int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_desc *sd,
b3c2d2ddd   Miklos Szeredi   splice: split up ...
461
  			  splice_actor *actor)
5274f052e   Jens Axboe   [PATCH] Introduce...
462
  {
b3c2d2ddd   Miklos Szeredi   splice: split up ...
463
  	int ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
464

b3c2d2ddd   Miklos Szeredi   splice: split up ...
465
466
  	while (pipe->nrbufs) {
  		struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
5274f052e   Jens Axboe   [PATCH] Introduce...
467

b3c2d2ddd   Miklos Szeredi   splice: split up ...
468
469
470
  		sd->len = buf->len;
  		if (sd->len > sd->total_len)
  			sd->len = sd->total_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
471

fba597db4   Miklos Szeredi   pipe: add pipe_bu...
472
  		ret = pipe_buf_confirm(pipe, buf);
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
473
  		if (unlikely(ret)) {
b3c2d2ddd   Miklos Szeredi   splice: split up ...
474
475
476
477
  			if (ret == -ENODATA)
  				ret = 0;
  			return ret;
  		}
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
478
479
480
481
  
  		ret = actor(pipe, buf, sd);
  		if (ret <= 0)
  			return ret;
b3c2d2ddd   Miklos Szeredi   splice: split up ...
482
483
484
485
486
487
488
489
490
  		buf->offset += ret;
  		buf->len -= ret;
  
  		sd->num_spliced += ret;
  		sd->len -= ret;
  		sd->pos += ret;
  		sd->total_len -= ret;
  
  		if (!buf->len) {
a779638cf   Miklos Szeredi   pipe: add pipe_bu...
491
  			pipe_buf_release(pipe, buf);
35f3d14db   Jens Axboe   pipe: add support...
492
  			pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1);
b3c2d2ddd   Miklos Szeredi   splice: split up ...
493
  			pipe->nrbufs--;
6447a3cf1   Al Viro   get rid of pipe->...
494
  			if (pipe->files)
b3c2d2ddd   Miklos Szeredi   splice: split up ...
495
496
  				sd->need_wakeup = true;
  		}
5274f052e   Jens Axboe   [PATCH] Introduce...
497

b3c2d2ddd   Miklos Szeredi   splice: split up ...
498
499
500
  		if (!sd->total_len)
  			return 0;
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
501

b3c2d2ddd   Miklos Szeredi   splice: split up ...
502
503
  	return 1;
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
504

b3c2d2ddd   Miklos Szeredi   splice: split up ...
505
506
507
508
509
510
511
512
513
514
  /**
   * 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.
   */
96f9bc8fb   Al Viro   fs/splice.c: remo...
515
  static int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd)
b3c2d2ddd   Miklos Szeredi   splice: split up ...
516
  {
c725bfce7   Jan Kara   vfs: Make sendfil...
517
518
519
520
521
522
  	/*
  	 * Check for signal early to make process killable when there are
  	 * always buffers available
  	 */
  	if (signal_pending(current))
  		return -ERESTARTSYS;
b3c2d2ddd   Miklos Szeredi   splice: split up ...
523
524
525
  	while (!pipe->nrbufs) {
  		if (!pipe->writers)
  			return 0;
016b661e2   Jens Axboe   [PATCH] splice: f...
526

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

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

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

b3c2d2ddd   Miklos Szeredi   splice: split up ...
536
537
538
  		if (sd->need_wakeup) {
  			wakeup_pipe_writers(pipe);
  			sd->need_wakeup = false;
5274f052e   Jens Axboe   [PATCH] Introduce...
539
  		}
b3c2d2ddd   Miklos Szeredi   splice: split up ...
540
541
  		pipe_wait(pipe);
  	}
29e350944   Linus Torvalds   splice: add SPLIC...
542

b3c2d2ddd   Miklos Szeredi   splice: split up ...
543
544
  	return 1;
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
545

b3c2d2ddd   Miklos Szeredi   splice: split up ...
546
547
  /**
   * splice_from_pipe_begin - start splicing from pipe
b80901bbf   Randy Dunlap   splice: fix new k...
548
   * @sd:		information about the splice operation
b3c2d2ddd   Miklos Szeredi   splice: split up ...
549
550
551
552
553
554
   *
   * 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.
   */
96f9bc8fb   Al Viro   fs/splice.c: remo...
555
  static void splice_from_pipe_begin(struct splice_desc *sd)
b3c2d2ddd   Miklos Szeredi   splice: split up ...
556
557
558
559
  {
  	sd->num_spliced = 0;
  	sd->need_wakeup = false;
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
560

b3c2d2ddd   Miklos Szeredi   splice: split up ...
561
562
563
564
565
566
567
568
569
570
  /**
   * 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().
   */
96f9bc8fb   Al Viro   fs/splice.c: remo...
571
  static void splice_from_pipe_end(struct pipe_inode_info *pipe, struct splice_desc *sd)
b3c2d2ddd   Miklos Szeredi   splice: split up ...
572
573
574
575
  {
  	if (sd->need_wakeup)
  		wakeup_pipe_writers(pipe);
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
576

b3c2d2ddd   Miklos Szeredi   splice: split up ...
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
  /**
   * __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...
594

b3c2d2ddd   Miklos Szeredi   splice: split up ...
595
596
  	splice_from_pipe_begin(sd);
  	do {
c2489e07c   Jan Kara   vfs: Avoid softlo...
597
  		cond_resched();
b3c2d2ddd   Miklos Szeredi   splice: split up ...
598
599
600
601
602
603
604
  		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...
605
  }
40bee44ea   Mark Fasheh   Export __splice_f...
606
  EXPORT_SYMBOL(__splice_from_pipe);
5274f052e   Jens Axboe   [PATCH] Introduce...
607

932cc6d4f   Jens Axboe   splice: completel...
608
609
610
611
612
613
614
615
616
617
  /**
   * 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_...
618
   *    See __splice_from_pipe. This function locks the pipe inode,
932cc6d4f   Jens Axboe   splice: completel...
619
620
621
   *    otherwise it's identical to __splice_from_pipe().
   *
   */
6da618098   Mark Fasheh   [PATCH] Introduce...
622
623
624
625
626
  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 ...
627
628
629
630
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
631
  		.u.file = out,
c66ab6fa7   Jens Axboe   splice: abstract ...
632
  	};
6da618098   Mark Fasheh   [PATCH] Introduce...
633

61e0d47c3   Miklos Szeredi   splice: add helpe...
634
  	pipe_lock(pipe);
c66ab6fa7   Jens Axboe   splice: abstract ...
635
  	ret = __splice_from_pipe(pipe, &sd, actor);
61e0d47c3   Miklos Szeredi   splice: add helpe...
636
  	pipe_unlock(pipe);
6da618098   Mark Fasheh   [PATCH] Introduce...
637
638
639
640
641
  
  	return ret;
  }
  
  /**
8d0207652   Al Viro   ->splice_write() ...
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
   * iter_file_splice_write - splice data from a pipe to a file
   * @pipe:	pipe info
   * @out:	file to write to
   * @ppos:	position in @out
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
   * Description:
   *    Will either move or copy pages (determined by @flags options) from
   *    the given pipe inode to the given file.
   *    This one is ->write_iter-based.
   *
   */
  ssize_t
  iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
  			  loff_t *ppos, size_t len, unsigned int flags)
  {
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
  		.u.file = out,
  	};
  	int nbufs = pipe->buffers;
  	struct bio_vec *array = kcalloc(nbufs, sizeof(struct bio_vec),
  					GFP_KERNEL);
  	ssize_t ret;
  
  	if (unlikely(!array))
  		return -ENOMEM;
  
  	pipe_lock(pipe);
  
  	splice_from_pipe_begin(&sd);
  	while (sd.total_len) {
  		struct iov_iter from;
8d0207652   Al Viro   ->splice_write() ...
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
  		size_t left;
  		int n, idx;
  
  		ret = splice_from_pipe_next(pipe, &sd);
  		if (ret <= 0)
  			break;
  
  		if (unlikely(nbufs < pipe->buffers)) {
  			kfree(array);
  			nbufs = pipe->buffers;
  			array = kcalloc(nbufs, sizeof(struct bio_vec),
  					GFP_KERNEL);
  			if (!array) {
  				ret = -ENOMEM;
  				break;
  			}
  		}
  
  		/* build the vector */
  		left = sd.total_len;
  		for (n = 0, idx = pipe->curbuf; left && n < pipe->nrbufs; n++, idx++) {
  			struct pipe_buffer *buf = pipe->bufs + idx;
  			size_t this_len = buf->len;
  
  			if (this_len > left)
  				this_len = left;
  
  			if (idx == pipe->buffers - 1)
  				idx = -1;
fba597db4   Miklos Szeredi   pipe: add pipe_bu...
707
  			ret = pipe_buf_confirm(pipe, buf);
8d0207652   Al Viro   ->splice_write() ...
708
709
710
711
712
713
714
715
716
717
718
  			if (unlikely(ret)) {
  				if (ret == -ENODATA)
  					ret = 0;
  				goto done;
  			}
  
  			array[n].bv_page = buf->page;
  			array[n].bv_len = this_len;
  			array[n].bv_offset = buf->offset;
  			left -= this_len;
  		}
05afcb77e   Al Viro   new helper: iov_i...
719
720
  		iov_iter_bvec(&from, ITER_BVEC | WRITE, array, n,
  			      sd.total_len - left);
abbb65899   Christoph Hellwig   fs: implement vfs...
721
  		ret = vfs_iter_write(out, &from, &sd.pos, 0);
8d0207652   Al Viro   ->splice_write() ...
722
723
724
725
726
  		if (ret <= 0)
  			break;
  
  		sd.num_spliced += ret;
  		sd.total_len -= ret;
dbe4e192a   Christoph Hellwig   fs: add vfs_iter_...
727
  		*ppos = sd.pos;
8d0207652   Al Viro   ->splice_write() ...
728
729
730
731
732
  
  		/* dismiss the fully eaten buffers, adjust the partial one */
  		while (ret) {
  			struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
  			if (ret >= buf->len) {
8d0207652   Al Viro   ->splice_write() ...
733
734
  				ret -= buf->len;
  				buf->len = 0;
a779638cf   Miklos Szeredi   pipe: add pipe_bu...
735
  				pipe_buf_release(pipe, buf);
8d0207652   Al Viro   ->splice_write() ...
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
  				pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1);
  				pipe->nrbufs--;
  				if (pipe->files)
  					sd.need_wakeup = true;
  			} else {
  				buf->offset += ret;
  				buf->len -= ret;
  				ret = 0;
  			}
  		}
  	}
  done:
  	kfree(array);
  	splice_from_pipe_end(pipe, &sd);
  
  	pipe_unlock(pipe);
  
  	if (sd.num_spliced)
  		ret = sd.num_spliced;
  
  	return ret;
  }
  
  EXPORT_SYMBOL(iter_file_splice_write);
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
760
761
  static int write_pipe_buf(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  			  struct splice_desc *sd)
0b0a47f5c   Miklos Szeredi   splice: implement...
762
  {
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
763
764
  	int ret;
  	void *data;
06ae43f34   Al Viro   Don't bother with...
765
  	loff_t tmp = sd->pos;
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
766

fbb32750a   Al Viro   pipe: kill ->map(...
767
  	data = kmap(buf->page);
06ae43f34   Al Viro   Don't bother with...
768
  	ret = __kernel_write(sd->u.file, data + buf->offset, sd->len, &tmp);
fbb32750a   Al Viro   pipe: kill ->map(...
769
  	kunmap(buf->page);
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
770
771
  
  	return ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
772
773
774
775
776
777
  }
  
  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...
778
  	ssize_t ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
779

b2858d7d1   Miklos Szeredi   splice: fix kmaps...
780
781
782
  	ret = splice_from_pipe(pipe, out, ppos, len, flags, write_pipe_buf);
  	if (ret > 0)
  		*ppos += ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
783

b2858d7d1   Miklos Szeredi   splice: fix kmaps...
784
  	return ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
785
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
786
787
  /**
   * generic_splice_sendpage - splice data from a pipe to a socket
932cc6d4f   Jens Axboe   splice: completel...
788
   * @pipe:	pipe to splice from
83f9135bd   Jens Axboe   [PATCH] splice: a...
789
   * @out:	socket to write to
932cc6d4f   Jens Axboe   splice: completel...
790
   * @ppos:	position in @out
83f9135bd   Jens Axboe   [PATCH] splice: a...
791
792
793
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
794
795
796
   * Description:
   *    Will send @len bytes from the pipe to a network socket. No data copying
   *    is involved.
83f9135bd   Jens Axboe   [PATCH] splice: a...
797
798
   *
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
799
  ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
800
  				loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
801
  {
00522fb41   Jens Axboe   [PATCH] splice: r...
802
  	return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_sendpage);
5274f052e   Jens Axboe   [PATCH] Introduce...
803
  }
059a8f373   Jens Axboe   [PATCH] splice: e...
804
  EXPORT_SYMBOL(generic_splice_sendpage);
a0f067802   Jeff Garzik   [PATCH] splice ex...
805

83f9135bd   Jens Axboe   [PATCH] splice: a...
806
807
808
  /*
   * Attempt to initiate a splice from pipe to file.
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
809
  static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
810
  			   loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
811
  {
0b0a47f5c   Miklos Szeredi   splice: implement...
812
813
  	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
  				loff_t *, size_t, unsigned int);
5274f052e   Jens Axboe   [PATCH] Introduce...
814

72c2d5319   Al Viro   file->f_op is nev...
815
  	if (out->f_op->splice_write)
cc56f7de7   Changli Gao   sendfile(): check...
816
817
  		splice_write = out->f_op->splice_write;
  	else
0b0a47f5c   Miklos Szeredi   splice: implement...
818
  		splice_write = default_file_splice_write;
500368f7f   Al Viro   lift file_*_write...
819
  	return splice_write(pipe, out, ppos, len, flags);
5274f052e   Jens Axboe   [PATCH] Introduce...
820
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
821
822
823
  /*
   * Attempt to initiate a splice from a file to a pipe.
   */
cbb7e577e   Jens Axboe   [PATCH] splice: p...
824
825
826
  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...
827
  {
6818173bd   Miklos Szeredi   splice: implement...
828
829
  	ssize_t (*splice_read)(struct file *, loff_t *,
  			       struct pipe_inode_info *, size_t, unsigned int);
5274f052e   Jens Axboe   [PATCH] Introduce...
830
  	int ret;
49570e9b2   Jens Axboe   [PATCH] splice: u...
831
  	if (unlikely(!(in->f_mode & FMODE_READ)))
5274f052e   Jens Axboe   [PATCH] Introduce...
832
  		return -EBADF;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
833
  	ret = rw_verify_area(READ, in, ppos, len);
5274f052e   Jens Axboe   [PATCH] Introduce...
834
835
  	if (unlikely(ret < 0))
  		return ret;
03cc0789a   Al Viro   do_splice_to(): c...
836
837
  	if (unlikely(len > MAX_RW_COUNT))
  		len = MAX_RW_COUNT;
72c2d5319   Al Viro   file->f_op is nev...
838
  	if (in->f_op->splice_read)
cc56f7de7   Changli Gao   sendfile(): check...
839
840
  		splice_read = in->f_op->splice_read;
  	else
6818173bd   Miklos Szeredi   splice: implement...
841
842
843
  		splice_read = default_file_splice_read;
  
  	return splice_read(in, ppos, pipe, len, flags);
5274f052e   Jens Axboe   [PATCH] Introduce...
844
  }
932cc6d4f   Jens Axboe   splice: completel...
845
846
847
848
849
850
851
852
853
  /**
   * 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...
854
   *    pipe is cached in the process, and reused during the lifetime of
932cc6d4f   Jens Axboe   splice: completel...
855
856
   *    that process.
   *
c66ab6fa7   Jens Axboe   splice: abstract ...
857
858
859
   */
  ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
  			       splice_direct_actor *actor)
b92ce5589   Jens Axboe   [PATCH] splice: a...
860
861
862
863
  {
  	struct pipe_inode_info *pipe;
  	long ret, bytes;
  	umode_t i_mode;
c66ab6fa7   Jens Axboe   splice: abstract ...
864
  	size_t len;
0ff28d9f4   Christophe Leroy   splice: sendfile(...
865
  	int i, flags, more;
b92ce5589   Jens Axboe   [PATCH] splice: a...
866
867
868
869
870
871
  
  	/*
  	 * 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!
  	 */
496ad9aa8   Al Viro   new helper: file_...
872
  	i_mode = file_inode(in)->i_mode;
b92ce5589   Jens Axboe   [PATCH] splice: a...
873
874
875
876
877
878
879
880
  	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...
881
  	if (unlikely(!pipe)) {
7bee130e2   Al Viro   get rid of alloc_...
882
  		pipe = alloc_pipe_info();
b92ce5589   Jens Axboe   [PATCH] splice: a...
883
884
885
886
887
  		if (!pipe)
  			return -ENOMEM;
  
  		/*
  		 * We don't have an immediate reader, but we'll read the stuff
00522fb41   Jens Axboe   [PATCH] splice: r...
888
  		 * out of the pipe right after the splice_to_pipe(). So set
b92ce5589   Jens Axboe   [PATCH] splice: a...
889
890
891
892
893
894
895
896
  		 * PIPE_READERS appropriately.
  		 */
  		pipe->readers = 1;
  
  		current->splice_pipe = pipe;
  	}
  
  	/*
73d62d83e   Ingo Molnar   [PATCH] splice: c...
897
  	 * Do the splice.
b92ce5589   Jens Axboe   [PATCH] splice: a...
898
899
900
  	 */
  	ret = 0;
  	bytes = 0;
c66ab6fa7   Jens Axboe   splice: abstract ...
901
902
903
904
905
906
907
  	len = sd->total_len;
  	flags = sd->flags;
  
  	/*
  	 * Don't block on output, we have to drain the direct pipe.
  	 */
  	sd->flags &= ~SPLICE_F_NONBLOCK;
0ff28d9f4   Christophe Leroy   splice: sendfile(...
908
  	more = sd->flags & SPLICE_F_MORE;
b92ce5589   Jens Axboe   [PATCH] splice: a...
909
910
  
  	while (len) {
51a92c0f6   Jens Axboe   splice: fix offse...
911
  		size_t read_len;
a82c53a0e   Tom Zanussi   splice: fix sendf...
912
  		loff_t pos = sd->pos, prev_pos = pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
913

bcd4f3acb   Jens Axboe   splice: direct sp...
914
  		ret = do_splice_to(in, &pos, pipe, len, flags);
51a92c0f6   Jens Axboe   splice: fix offse...
915
  		if (unlikely(ret <= 0))
b92ce5589   Jens Axboe   [PATCH] splice: a...
916
917
918
  			goto out_release;
  
  		read_len = ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
919
  		sd->total_len = read_len;
b92ce5589   Jens Axboe   [PATCH] splice: a...
920
921
  
  		/*
0ff28d9f4   Christophe Leroy   splice: sendfile(...
922
923
924
925
926
927
928
929
930
  		 * If more data is pending, set SPLICE_F_MORE
  		 * If this is the last data and SPLICE_F_MORE was not set
  		 * initially, clears it.
  		 */
  		if (read_len < len)
  			sd->flags |= SPLICE_F_MORE;
  		else if (!more)
  			sd->flags &= ~SPLICE_F_MORE;
  		/*
b92ce5589   Jens Axboe   [PATCH] splice: a...
931
932
933
934
  		 * 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 ...
935
  		ret = actor(pipe, sd);
a82c53a0e   Tom Zanussi   splice: fix sendf...
936
937
  		if (unlikely(ret <= 0)) {
  			sd->pos = prev_pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
938
  			goto out_release;
a82c53a0e   Tom Zanussi   splice: fix sendf...
939
  		}
b92ce5589   Jens Axboe   [PATCH] splice: a...
940
941
942
  
  		bytes += ret;
  		len -= ret;
bcd4f3acb   Jens Axboe   splice: direct sp...
943
  		sd->pos = pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
944

a82c53a0e   Tom Zanussi   splice: fix sendf...
945
946
  		if (ret < read_len) {
  			sd->pos = prev_pos + ret;
51a92c0f6   Jens Axboe   splice: fix offse...
947
  			goto out_release;
a82c53a0e   Tom Zanussi   splice: fix sendf...
948
  		}
b92ce5589   Jens Axboe   [PATCH] splice: a...
949
  	}
9e97198db   Jens Axboe   splice: fix probl...
950
  done:
b92ce5589   Jens Axboe   [PATCH] splice: a...
951
  	pipe->nrbufs = pipe->curbuf = 0;
808487085   Jens Axboe   splice: always up...
952
  	file_accessed(in);
b92ce5589   Jens Axboe   [PATCH] splice: a...
953
954
955
956
957
958
959
  	return bytes;
  
  out_release:
  	/*
  	 * If we did an incomplete transfer we must release
  	 * the pipe buffers in question:
  	 */
35f3d14db   Jens Axboe   pipe: add support...
960
  	for (i = 0; i < pipe->buffers; i++) {
b92ce5589   Jens Axboe   [PATCH] splice: a...
961
  		struct pipe_buffer *buf = pipe->bufs + i;
a779638cf   Miklos Szeredi   pipe: add pipe_bu...
962
963
  		if (buf->ops)
  			pipe_buf_release(pipe, buf);
b92ce5589   Jens Axboe   [PATCH] splice: a...
964
  	}
b92ce5589   Jens Axboe   [PATCH] splice: a...
965

9e97198db   Jens Axboe   splice: fix probl...
966
967
  	if (!bytes)
  		bytes = ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
968

9e97198db   Jens Axboe   splice: fix probl...
969
  	goto done;
c66ab6fa7   Jens Axboe   splice: abstract ...
970
971
972
973
974
975
  }
  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...
976
  	struct file *file = sd->u.file;
c66ab6fa7   Jens Axboe   splice: abstract ...
977

7995bd287   Al Viro   splice: don't pas...
978
  	return do_splice_from(pipe, file, sd->opos, sd->total_len,
2cb4b05e7   Changli Gao   splice: direct_sp...
979
  			      sd->flags);
c66ab6fa7   Jens Axboe   splice: abstract ...
980
  }
932cc6d4f   Jens Axboe   splice: completel...
981
982
983
984
985
  /**
   * do_splice_direct - splices data directly between two files
   * @in:		file to splice from
   * @ppos:	input file offset
   * @out:	file to splice to
acdb37c36   Randy Dunlap   fs: fix new splic...
986
   * @opos:	output file offset
932cc6d4f   Jens Axboe   splice: completel...
987
988
989
990
991
992
993
994
995
996
   * @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 ...
997
  long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
7995bd287   Al Viro   splice: don't pas...
998
  		      loff_t *opos, size_t len, unsigned int flags)
c66ab6fa7   Jens Axboe   splice: abstract ...
999
1000
1001
1002
1003
1004
  {
  	struct splice_desc sd = {
  		.len		= len,
  		.total_len	= len,
  		.flags		= flags,
  		.pos		= *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
1005
  		.u.file		= out,
7995bd287   Al Viro   splice: don't pas...
1006
  		.opos		= opos,
c66ab6fa7   Jens Axboe   splice: abstract ...
1007
  	};
51a92c0f6   Jens Axboe   splice: fix offse...
1008
  	long ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
1009

18c67cb9f   Al Viro   splice: lift chec...
1010
1011
1012
1013
1014
1015
1016
1017
1018
  	if (unlikely(!(out->f_mode & FMODE_WRITE)))
  		return -EBADF;
  
  	if (unlikely(out->f_flags & O_APPEND))
  		return -EINVAL;
  
  	ret = rw_verify_area(WRITE, out, opos, len);
  	if (unlikely(ret < 0))
  		return ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
1019
  	ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
51a92c0f6   Jens Axboe   splice: fix offse...
1020
  	if (ret > 0)
a82c53a0e   Tom Zanussi   splice: fix sendf...
1021
  		*ppos = sd.pos;
51a92c0f6   Jens Axboe   splice: fix offse...
1022

c66ab6fa7   Jens Axboe   splice: abstract ...
1023
  	return ret;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1024
  }
1c118596a   Miklos Szeredi   vfs: export do_sp...
1025
  EXPORT_SYMBOL(do_splice_direct);
b92ce5589   Jens Axboe   [PATCH] splice: a...
1026

8924feff6   Al Viro   splice: lift pipe...
1027
1028
  static int wait_for_space(struct pipe_inode_info *pipe, unsigned flags)
  {
52bce9116   Linus Torvalds   splice: reinstate...
1029
1030
1031
1032
1033
1034
1035
  	for (;;) {
  		if (unlikely(!pipe->readers)) {
  			send_sig(SIGPIPE, current, 0);
  			return -EPIPE;
  		}
  		if (pipe->nrbufs != pipe->buffers)
  			return 0;
8924feff6   Al Viro   splice: lift pipe...
1036
1037
1038
1039
1040
1041
1042
1043
  		if (flags & SPLICE_F_NONBLOCK)
  			return -EAGAIN;
  		if (signal_pending(current))
  			return -ERESTARTSYS;
  		pipe->waiting_writers++;
  		pipe_wait(pipe);
  		pipe->waiting_writers--;
  	}
8924feff6   Al Viro   splice: lift pipe...
1044
  }
7c77f0b3f   Miklos Szeredi   splice: implement...
1045
1046
1047
  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...
1048
1049
  
  /*
83f9135bd   Jens Axboe   [PATCH] splice: a...
1050
1051
   * Determine where to splice to/from.
   */
529565dcb   Ingo Molnar   [PATCH] splice: a...
1052
1053
1054
  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...
1055
  {
7c77f0b3f   Miklos Szeredi   splice: implement...
1056
1057
  	struct pipe_inode_info *ipipe;
  	struct pipe_inode_info *opipe;
7995bd287   Al Viro   splice: don't pas...
1058
  	loff_t offset;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1059
  	long ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
1060

71993e62a   Linus Torvalds   Rename 'pipe_info...
1061
1062
  	ipipe = get_pipe_info(in);
  	opipe = get_pipe_info(out);
7c77f0b3f   Miklos Szeredi   splice: implement...
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
  
  	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...
1082
1083
  		if (off_in)
  			return -ESPIPE;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1084
  		if (off_out) {
19c9a49b4   Changli Gao   splice: check f_m...
1085
  			if (!(out->f_mode & FMODE_PWRITE))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1086
  				return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1087
  			if (copy_from_user(&offset, off_out, sizeof(loff_t)))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1088
  				return -EFAULT;
7995bd287   Al Viro   splice: don't pas...
1089
1090
1091
  		} else {
  			offset = out->f_pos;
  		}
529565dcb   Ingo Molnar   [PATCH] splice: a...
1092

18c67cb9f   Al Viro   splice: lift chec...
1093
1094
1095
1096
1097
1098
1099
1100
1101
  		if (unlikely(!(out->f_mode & FMODE_WRITE)))
  			return -EBADF;
  
  		if (unlikely(out->f_flags & O_APPEND))
  			return -EINVAL;
  
  		ret = rw_verify_area(WRITE, out, &offset, len);
  		if (unlikely(ret < 0))
  			return ret;
500368f7f   Al Viro   lift file_*_write...
1102
  		file_start_write(out);
7995bd287   Al Viro   splice: don't pas...
1103
  		ret = do_splice_from(ipipe, out, &offset, len, flags);
500368f7f   Al Viro   lift file_*_write...
1104
  		file_end_write(out);
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1105

7995bd287   Al Viro   splice: don't pas...
1106
1107
1108
  		if (!off_out)
  			out->f_pos = offset;
  		else if (copy_to_user(off_out, &offset, sizeof(loff_t)))
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1109
1110
1111
  			ret = -EFAULT;
  
  		return ret;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1112
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1113

7c77f0b3f   Miklos Szeredi   splice: implement...
1114
  	if (opipe) {
529565dcb   Ingo Molnar   [PATCH] splice: a...
1115
1116
  		if (off_out)
  			return -ESPIPE;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1117
  		if (off_in) {
19c9a49b4   Changli Gao   splice: check f_m...
1118
  			if (!(in->f_mode & FMODE_PREAD))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1119
  				return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1120
  			if (copy_from_user(&offset, off_in, sizeof(loff_t)))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1121
  				return -EFAULT;
7995bd287   Al Viro   splice: don't pas...
1122
1123
1124
  		} else {
  			offset = in->f_pos;
  		}
529565dcb   Ingo Molnar   [PATCH] splice: a...
1125

8924feff6   Al Viro   splice: lift pipe...
1126
1127
1128
1129
1130
1131
1132
  		pipe_lock(opipe);
  		ret = wait_for_space(opipe, flags);
  		if (!ret)
  			ret = do_splice_to(in, &offset, opipe, len, flags);
  		pipe_unlock(opipe);
  		if (ret > 0)
  			wakeup_pipe_readers(opipe);
7995bd287   Al Viro   splice: don't pas...
1133
1134
1135
  		if (!off_in)
  			in->f_pos = offset;
  		else if (copy_to_user(off_in, &offset, sizeof(loff_t)))
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1136
1137
1138
  			ret = -EFAULT;
  
  		return ret;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1139
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1140
1141
1142
  
  	return -EINVAL;
  }
79fddc4ef   Al Viro   new helper: add_t...
1143
1144
1145
  static int iter_to_pipe(struct iov_iter *from,
  			struct pipe_inode_info *pipe,
  			unsigned flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1146
  {
79fddc4ef   Al Viro   new helper: add_t...
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
  	struct pipe_buffer buf = {
  		.ops = &user_page_pipe_buf_ops,
  		.flags = flags
  	};
  	size_t total = 0;
  	int ret = 0;
  	bool failed = false;
  
  	while (iov_iter_count(from) && !failed) {
  		struct page *pages[16];
db85a9eb2   Al Viro   splice: switch ge...
1157
1158
  		ssize_t copied;
  		size_t start;
79fddc4ef   Al Viro   new helper: add_t...
1159
  		int n;
db85a9eb2   Al Viro   splice: switch ge...
1160

79fddc4ef   Al Viro   new helper: add_t...
1161
1162
1163
1164
1165
  		copied = iov_iter_get_pages(from, pages, ~0UL, 16, &start);
  		if (copied <= 0) {
  			ret = copied;
  			break;
  		}
db85a9eb2   Al Viro   splice: switch ge...
1166

79fddc4ef   Al Viro   new helper: add_t...
1167
  		for (n = 0; copied; n++, start = 0) {
db85a9eb2   Al Viro   splice: switch ge...
1168
  			int size = min_t(int, copied, PAGE_SIZE - start);
79fddc4ef   Al Viro   new helper: add_t...
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
  			if (!failed) {
  				buf.page = pages[n];
  				buf.offset = start;
  				buf.len = size;
  				ret = add_to_pipe(pipe, &buf);
  				if (unlikely(ret < 0)) {
  					failed = true;
  				} else {
  					iov_iter_advance(from, ret);
  					total += ret;
  				}
  			} else {
  				put_page(pages[n]);
  			}
db85a9eb2   Al Viro   splice: switch ge...
1183
  			copied -= size;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1184
  		}
912d35f86   Jens Axboe   [PATCH] Add suppo...
1185
  	}
79fddc4ef   Al Viro   new helper: add_t...
1186
  	return total ? total : ret;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1187
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1188
1189
1190
  static int pipe_to_user(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  			struct splice_desc *sd)
  {
6130f5315   Al Viro   switch vmsplice_t...
1191
1192
  	int n = copy_page_to_iter(buf->page, buf->offset, sd->len, sd->u.data);
  	return n == sd->len ? n : -EFAULT;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1193
1194
1195
1196
1197
1198
  }
  
  /*
   * For lack of a better implementation, implement vmsplice() to userspace
   * as a simple copy of the pipes pages to the user iov.
   */
87a3002af   Al Viro   vmsplice(): lift ...
1199
1200
  static long vmsplice_to_user(struct file *file, struct iov_iter *iter,
  			     unsigned int flags)
6a14b90bb   Jens Axboe   vmsplice: add vms...
1201
  {
87a3002af   Al Viro   vmsplice(): lift ...
1202
1203
1204
1205
1206
1207
1208
  	struct pipe_inode_info *pipe = get_pipe_info(file);
  	struct splice_desc sd = {
  		.total_len = iov_iter_count(iter),
  		.flags = flags,
  		.u.data = iter
  	};
  	long ret = 0;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1209

6a14b90bb   Jens Axboe   vmsplice: add vms...
1210
1211
  	if (!pipe)
  		return -EBADF;
345995fa4   Al Viro   vmsplice_to_user(...
1212
1213
1214
1215
1216
  	if (sd.total_len) {
  		pipe_lock(pipe);
  		ret = __splice_from_pipe(pipe, &sd, pipe_to_user);
  		pipe_unlock(pipe);
  	}
6a14b90bb   Jens Axboe   vmsplice: add vms...
1217
1218
1219
  
  	return ret;
  }
912d35f86   Jens Axboe   [PATCH] Add suppo...
1220
1221
1222
1223
  /*
   * 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...
1224
   */
87a3002af   Al Viro   vmsplice(): lift ...
1225
1226
  static long vmsplice_to_pipe(struct file *file, struct iov_iter *iter,
  			     unsigned int flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1227
  {
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1228
  	struct pipe_inode_info *pipe;
87a3002af   Al Viro   vmsplice(): lift ...
1229
  	long ret = 0;
79fddc4ef   Al Viro   new helper: add_t...
1230
1231
1232
1233
  	unsigned buf_flag = 0;
  
  	if (flags & SPLICE_F_GIFT)
  		buf_flag = PIPE_BUF_FLAG_GIFT;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1234

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

8924feff6   Al Viro   splice: lift pipe...
1239
1240
  	pipe_lock(pipe);
  	ret = wait_for_space(pipe, flags);
79fddc4ef   Al Viro   new helper: add_t...
1241
  	if (!ret)
87a3002af   Al Viro   vmsplice(): lift ...
1242
  		ret = iter_to_pipe(iter, pipe, buf_flag);
8924feff6   Al Viro   splice: lift pipe...
1243
1244
1245
  	pipe_unlock(pipe);
  	if (ret > 0)
  		wakeup_pipe_readers(pipe);
35f3d14db   Jens Axboe   pipe: add support...
1246
  	return ret;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1247
  }
87a3002af   Al Viro   vmsplice(): lift ...
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
  static int vmsplice_type(struct fd f, int *type)
  {
  	if (!f.file)
  		return -EBADF;
  	if (f.file->f_mode & FMODE_WRITE) {
  		*type = WRITE;
  	} else if (f.file->f_mode & FMODE_READ) {
  		*type = READ;
  	} else {
  		fdput(f);
  		return -EBADF;
  	}
  	return 0;
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
  /*
   * 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().
   *
   */
87a3002af   Al Viro   vmsplice(): lift ...
1278
  static long do_vmsplice(struct file *f, struct iov_iter *iter, unsigned int flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1279
  {
3d6ea290f   Al Viro   splice/tee/vmspli...
1280
1281
  	if (unlikely(flags & ~SPLICE_F_ALL))
  		return -EINVAL;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1282

87a3002af   Al Viro   vmsplice(): lift ...
1283
1284
  	if (!iov_iter_count(iter))
  		return 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1285

87a3002af   Al Viro   vmsplice(): lift ...
1286
1287
1288
1289
  	if (iov_iter_rw(iter) == WRITE)
  		return vmsplice_to_pipe(f, iter, flags);
  	else
  		return vmsplice_to_user(f, iter, flags);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1290
  }
87a3002af   Al Viro   vmsplice(): lift ...
1291
  SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, uiov,
30cfe4ef8   Dominik Brodowski   fs: add do_vmspli...
1292
1293
  		unsigned long, nr_segs, unsigned int, flags)
  {
87a3002af   Al Viro   vmsplice(): lift ...
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
  	struct iovec iovstack[UIO_FASTIOV];
  	struct iovec *iov = iovstack;
  	struct iov_iter iter;
  	long error;
  	struct fd f;
  	int type;
  
  	f = fdget(fd);
  	error = vmsplice_type(f, &type);
  	if (error)
  		return error;
  
  	error = import_iovec(type, uiov, nr_segs,
  			     ARRAY_SIZE(iovstack), &iov, &iter);
  	if (!error) {
  		error = do_vmsplice(f.file, &iter, flags);
  		kfree(iov);
  	}
  	fdput(f);
  	return error;
30cfe4ef8   Dominik Brodowski   fs: add do_vmspli...
1314
  }
76b021d05   Al Viro   convert vmsplice ...
1315
1316
1317
1318
  #ifdef CONFIG_COMPAT
  COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, iov32,
  		    unsigned int, nr_segs, unsigned int, flags)
  {
87a3002af   Al Viro   vmsplice(): lift ...
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
  	struct iovec iovstack[UIO_FASTIOV];
  	struct iovec *iov = iovstack;
  	struct iov_iter iter;
  	long error;
  	struct fd f;
  	int type;
  
  	f = fdget(fd);
  	error = vmsplice_type(f, &type);
  	if (error)
  		return error;
  
  	error = compat_import_iovec(type, iov32, nr_segs,
  			     ARRAY_SIZE(iovstack), &iov, &iter);
  	if (!error) {
  		error = do_vmsplice(f.file, &iter, flags);
  		kfree(iov);
76b021d05   Al Viro   convert vmsplice ...
1336
  	}
87a3002af   Al Viro   vmsplice(): lift ...
1337
1338
  	fdput(f);
  	return error;
76b021d05   Al Viro   convert vmsplice ...
1339
1340
  }
  #endif
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1341
1342
1343
  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...
1344
  {
2903ff019   Al Viro   switch simple cas...
1345
  	struct fd in, out;
5274f052e   Jens Axboe   [PATCH] Introduce...
1346
  	long error;
5274f052e   Jens Axboe   [PATCH] Introduce...
1347
1348
1349
  
  	if (unlikely(!len))
  		return 0;
3d6ea290f   Al Viro   splice/tee/vmspli...
1350
1351
  	if (unlikely(flags & ~SPLICE_F_ALL))
  		return -EINVAL;
5274f052e   Jens Axboe   [PATCH] Introduce...
1352
  	error = -EBADF;
2903ff019   Al Viro   switch simple cas...
1353
1354
1355
1356
1357
1358
1359
1360
  	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...
1361
  							  len, flags);
2903ff019   Al Viro   switch simple cas...
1362
  				fdput(out);
5274f052e   Jens Axboe   [PATCH] Introduce...
1363
1364
  			}
  		}
2903ff019   Al Viro   switch simple cas...
1365
  		fdput(in);
5274f052e   Jens Axboe   [PATCH] Introduce...
1366
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1367
1368
  	return error;
  }
70524490e   Jens Axboe   [PATCH] splice: a...
1369
1370
  
  /*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1371
1372
1373
   * Make sure there's data to read. Wait for input if we can, otherwise
   * return an appropriate error.
   */
7c77f0b3f   Miklos Szeredi   splice: implement...
1374
  static int ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
  {
  	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...
1386
  	pipe_lock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
  
  	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...
1403
  	pipe_unlock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1404
1405
1406
1407
1408
1409
1410
  	return ret;
  }
  
  /*
   * Make sure there's writeable room. Wait for room if we can, otherwise
   * return an appropriate error.
   */
7c77f0b3f   Miklos Szeredi   splice: implement...
1411
  static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1412
1413
1414
1415
1416
1417
1418
  {
  	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...
1419
  	if (pipe->nrbufs < pipe->buffers)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1420
1421
1422
  		return 0;
  
  	ret = 0;
61e0d47c3   Miklos Szeredi   splice: add helpe...
1423
  	pipe_lock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1424

35f3d14db   Jens Axboe   pipe: add support...
1425
  	while (pipe->nrbufs >= pipe->buffers) {
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
  		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...
1443
  	pipe_unlock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1444
1445
1446
1447
  	return ret;
  }
  
  /*
7c77f0b3f   Miklos Szeredi   splice: implement...
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
   * 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...
1490
  		if (!ipipe->nrbufs || opipe->nrbufs >= opipe->buffers) {
7c77f0b3f   Miklos Szeredi   splice: implement...
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
  			/* 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...
1511
  		nbuf = (opipe->curbuf + opipe->nrbufs) & (opipe->buffers - 1);
7c77f0b3f   Miklos Szeredi   splice: implement...
1512
1513
1514
1515
1516
1517
1518
1519
1520
  		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...
1521
  			ipipe->curbuf = (ipipe->curbuf + 1) & (ipipe->buffers - 1);
7c77f0b3f   Miklos Szeredi   splice: implement...
1522
1523
1524
1525
1526
1527
1528
  			ipipe->nrbufs--;
  			input_wakeup = true;
  		} else {
  			/*
  			 * Get a reference to this pipe buffer,
  			 * so we can copy the contents over.
  			 */
7bf2d1df8   Miklos Szeredi   pipe: add pipe_bu...
1529
  			pipe_buf_get(ipipe, ibuf);
7c77f0b3f   Miklos Szeredi   splice: implement...
1530
1531
1532
1533
1534
1535
1536
  			*obuf = *ibuf;
  
  			/*
  			 * Don't inherit the gift flag, we need to
  			 * prevent multiple steals of this page.
  			 */
  			obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
2af926fd5   Jann Horn   splice: don't mer...
1537
  			pipe_buf_mark_unmergeable(obuf);
7c77f0b3f   Miklos Szeredi   splice: implement...
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
  			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...
1553
1554
  	if (ret > 0)
  		wakeup_pipe_readers(opipe);
7c77f0b3f   Miklos Szeredi   splice: implement...
1555
1556
1557
1558
1559
1560
1561
  	if (input_wakeup)
  		wakeup_pipe_writers(ipipe);
  
  	return ret;
  }
  
  /*
70524490e   Jens Axboe   [PATCH] splice: a...
1562
1563
1564
1565
1566
1567
1568
   * 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...
1569
  	int ret = 0, i = 0, nbuf;
70524490e   Jens Axboe   [PATCH] splice: a...
1570
1571
1572
  
  	/*
  	 * Potential ABBA deadlock, work around it by ordering lock
61e0d47c3   Miklos Szeredi   splice: add helpe...
1573
  	 * grabbing by pipe info address. Otherwise two different processes
70524490e   Jens Axboe   [PATCH] splice: a...
1574
1575
  	 * could deadlock (one doing tee from A -> B, the other from B -> A).
  	 */
61e0d47c3   Miklos Szeredi   splice: add helpe...
1576
  	pipe_double_lock(ipipe, opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1577

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1578
  	do {
70524490e   Jens Axboe   [PATCH] splice: a...
1579
1580
1581
1582
1583
1584
  		if (!opipe->readers) {
  			send_sig(SIGPIPE, current, 0);
  			if (!ret)
  				ret = -EPIPE;
  			break;
  		}
70524490e   Jens Axboe   [PATCH] splice: a...
1585

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1586
1587
1588
1589
  		/*
  		 * If we have iterated all input buffers or ran out of
  		 * output room, break.
  		 */
35f3d14db   Jens Axboe   pipe: add support...
1590
  		if (i >= ipipe->nrbufs || opipe->nrbufs >= opipe->buffers)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1591
  			break;
70524490e   Jens Axboe   [PATCH] splice: a...
1592

35f3d14db   Jens Axboe   pipe: add support...
1593
1594
  		ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (ipipe->buffers-1));
  		nbuf = (opipe->curbuf + opipe->nrbufs) & (opipe->buffers - 1);
70524490e   Jens Axboe   [PATCH] splice: a...
1595
1596
  
  		/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1597
1598
  		 * Get a reference to this pipe buffer,
  		 * so we can copy the contents over.
70524490e   Jens Axboe   [PATCH] splice: a...
1599
  		 */
7bf2d1df8   Miklos Szeredi   pipe: add pipe_bu...
1600
  		pipe_buf_get(ipipe, ibuf);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1601
1602
1603
  
  		obuf = opipe->bufs + nbuf;
  		*obuf = *ibuf;
2a27250e6   Jens Axboe   [PATCH] tee: link...
1604
  		/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1605
1606
  		 * Don't inherit the gift flag, we need to
  		 * prevent multiple steals of this page.
2a27250e6   Jens Axboe   [PATCH] tee: link...
1607
  		 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1608
  		obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
70524490e   Jens Axboe   [PATCH] splice: a...
1609

2af926fd5   Jann Horn   splice: don't mer...
1610
  		pipe_buf_mark_unmergeable(obuf);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1611
1612
  		if (obuf->len > len)
  			obuf->len = len;
70524490e   Jens Axboe   [PATCH] splice: a...
1613

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1614
1615
1616
1617
1618
  		opipe->nrbufs++;
  		ret += obuf->len;
  		len -= obuf->len;
  		i++;
  	} while (len);
70524490e   Jens Axboe   [PATCH] splice: a...
1619

02cf01aea   Jens Axboe   splice: only retu...
1620
1621
1622
1623
1624
1625
  	/*
  	 * 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...
1626
1627
  	pipe_unlock(ipipe);
  	pipe_unlock(opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1628

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1629
1630
1631
  	/*
  	 * If we put data in the output pipe, wakeup any potential readers.
  	 */
825cdcb1a   Namhyung Kim   splice: add wakeu...
1632
1633
  	if (ret > 0)
  		wakeup_pipe_readers(opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
  
  	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...
1647
1648
  	struct pipe_inode_info *ipipe = get_pipe_info(in);
  	struct pipe_inode_info *opipe = get_pipe_info(out);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1649
  	int ret = -EINVAL;
70524490e   Jens Axboe   [PATCH] splice: a...
1650
1651
  
  	/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1652
1653
  	 * Duplicate the contents of ipipe to opipe without actually
  	 * copying the data.
70524490e   Jens Axboe   [PATCH] splice: a...
1654
  	 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1655
1656
1657
1658
1659
  	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...
1660
  		ret = ipipe_prep(ipipe, flags);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1661
  		if (!ret) {
7c77f0b3f   Miklos Szeredi   splice: implement...
1662
  			ret = opipe_prep(opipe, flags);
02cf01aea   Jens Axboe   splice: only retu...
1663
  			if (!ret)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1664
  				ret = link_pipe(ipipe, opipe, len, flags);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1665
1666
  		}
  	}
70524490e   Jens Axboe   [PATCH] splice: a...
1667

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1668
  	return ret;
70524490e   Jens Axboe   [PATCH] splice: a...
1669
  }
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1670
  SYSCALL_DEFINE4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags)
70524490e   Jens Axboe   [PATCH] splice: a...
1671
  {
2903ff019   Al Viro   switch simple cas...
1672
1673
  	struct fd in;
  	int error;
70524490e   Jens Axboe   [PATCH] splice: a...
1674

3d6ea290f   Al Viro   splice/tee/vmspli...
1675
1676
  	if (unlikely(flags & ~SPLICE_F_ALL))
  		return -EINVAL;
70524490e   Jens Axboe   [PATCH] splice: a...
1677
1678
1679
1680
  	if (unlikely(!len))
  		return 0;
  
  	error = -EBADF;
2903ff019   Al Viro   switch simple cas...
1681
1682
1683
1684
1685
1686
1687
1688
1689
  	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...
1690
1691
  			}
  		}
2903ff019   Al Viro   switch simple cas...
1692
   		fdput(in);
70524490e   Jens Axboe   [PATCH] splice: a...
1693
1694
1695
1696
   	}
  
  	return error;
  }