Blame view

fs/splice.c 40.4 KB
457c89965   Thomas Gleixner   treewide: Add SPD...
1
  // SPDX-License-Identifier: GPL-2.0-only
5274f052e   Jens Axboe   [PATCH] Introduce...
2
3
4
5
6
7
8
9
10
11
12
  /*
   * "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...
13
14
   * Jens to support splicing to files, network, direct splicing, etc and
   * fixing lots of bugs.
5274f052e   Jens Axboe   [PATCH] Introduce...
15
   *
0fe234795   Jens Axboe   [PATCH] Update ax...
16
   * Copyright (C) 2005-2006 Jens Axboe <axboe@kernel.dk>
c2058e061   Jens Axboe   [PATCH] splice: a...
17
18
   * Copyright (C) 2005-2006 Linus Torvalds <torvalds@osdl.org>
   * Copyright (C) 2006 Ingo Molnar <mingo@elte.hu>
5274f052e   Jens Axboe   [PATCH] Introduce...
19
20
   *
   */
be297968d   Christoph Hellwig   mm: only include ...
21
  #include <linux/bvec.h>
5274f052e   Jens Axboe   [PATCH] Introduce...
22
23
24
  #include <linux/fs.h>
  #include <linux/file.h>
  #include <linux/pagemap.h>
d6b29d7ce   Jens Axboe   splice: divorce t...
25
  #include <linux/splice.h>
08e552c69   KAMEZAWA Hiroyuki   memcg: synchroniz...
26
  #include <linux/memcontrol.h>
5274f052e   Jens Axboe   [PATCH] Introduce...
27
  #include <linux/mm_inline.h>
5abc97aa2   Jens Axboe   [PATCH] splice: a...
28
  #include <linux/swap.h>
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
29
  #include <linux/writeback.h>
630d9c472   Paul Gortmaker   fs: reduce the us...
30
  #include <linux/export.h>
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
31
  #include <linux/syscalls.h>
912d35f86   Jens Axboe   [PATCH] Add suppo...
32
  #include <linux/uio.h>
29ce20586   James Morris   security: revalid...
33
  #include <linux/security.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
34
  #include <linux/gfp.h>
35f9c09fe   Eric Dumazet   tcp: tcp_sendpage...
35
  #include <linux/socket.h>
76b021d05   Al Viro   convert vmsplice ...
36
  #include <linux/compat.h>
174cd4b1e   Ingo Molnar   sched/headers: Pr...
37
  #include <linux/sched/signal.h>
06ae43f34   Al Viro   Don't bother with...
38
  #include "internal.h"
5274f052e   Jens Axboe   [PATCH] Introduce...
39

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

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

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

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

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

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

49d0b21be   Jens Axboe   [PATCH] splice: o...
117
  		/*
73d62d83e   Ingo Molnar   [PATCH] splice: c...
118
  		 * Uh oh, read-error from disk.
49d0b21be   Jens Axboe   [PATCH] splice: o...
119
120
121
122
123
124
125
  		 */
  		if (!PageUptodate(page)) {
  			err = -EIO;
  			goto error;
  		}
  
  		/*
f84d75199   Jens Axboe   [PATCH] pipe: int...
126
  		 * Page is ok afterall, we are done.
49d0b21be   Jens Axboe   [PATCH] splice: o...
127
  		 */
5274f052e   Jens Axboe   [PATCH] Introduce...
128
  		unlock_page(page);
5274f052e   Jens Axboe   [PATCH] Introduce...
129
  	}
f84d75199   Jens Axboe   [PATCH] pipe: int...
130
  	return 0;
49d0b21be   Jens Axboe   [PATCH] splice: o...
131
132
  error:
  	unlock_page(page);
f84d75199   Jens Axboe   [PATCH] pipe: int...
133
  	return err;
70524490e   Jens Axboe   [PATCH] splice: a...
134
  }
708e3508c   Hugh Dickins   tmpfs: clone shme...
135
  const struct pipe_buf_operations page_cache_pipe_buf_ops = {
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 = {
cac36bb06   Jens Axboe   pipe: change the ...
150
  	.confirm = generic_pipe_buf_confirm,
912d35f86   Jens Axboe   [PATCH] Add suppo...
151
152
  	.release = page_cache_pipe_buf_release,
  	.steal = user_page_pipe_buf_steal,
f84d75199   Jens Axboe   [PATCH] pipe: int...
153
  	.get = generic_pipe_buf_get,
912d35f86   Jens Axboe   [PATCH] Add suppo...
154
  };
825cdcb1a   Namhyung Kim   splice: add wakeu...
155
156
157
158
159
160
161
  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...
162
163
164
165
166
167
  /**
   * splice_to_pipe - fill passed data into a pipe
   * @pipe:	pipe to fill
   * @spd:	data to fill
   *
   * Description:
79685b8de   Randy Dunlap   docbook: add pipe...
168
   *    @spd contains a map of pages and len/offset tuples, along with
932cc6d4f   Jens Axboe   splice: completel...
169
170
171
   *    the struct pipe_buf_operations associated with these pages. This
   *    function will link that data to the pipe.
   *
83f9135bd   Jens Axboe   [PATCH] splice: a...
172
   */
d6b29d7ce   Jens Axboe   splice: divorce t...
173
174
  ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
  		       struct splice_pipe_desc *spd)
5274f052e   Jens Axboe   [PATCH] Introduce...
175
  {
00de00bda   Jens Axboe   splice: fix leak ...
176
  	unsigned int spd_pages = spd->nr_pages;
8924feff6   Al Viro   splice: lift pipe...
177
  	int ret = 0, page_nr = 0;
5274f052e   Jens Axboe   [PATCH] Introduce...
178

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

8924feff6   Al Viro   splice: lift pipe...
187
188
189
  	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...
190

8924feff6   Al Viro   splice: lift pipe...
191
192
193
194
195
  		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...
196
  		buf->flags = 0;
5274f052e   Jens Axboe   [PATCH] Introduce...
197

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

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

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

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

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

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

523ac9afc   Al Viro   switch default_fi...
359
360
361
362
  	/*
  	 * 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...
363
  	offset = *ppos & ~PAGE_MASK;
6818173bd   Miklos Szeredi   splice: implement...
364

aa563d7bc   David Howells   iov_iter: Separat...
365
  	iov_iter_pipe(&to, READ, pipe, len + offset);
6818173bd   Miklos Szeredi   splice: implement...
366

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

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

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

523ac9afc   Al Viro   switch default_fi...
382
383
384
385
386
387
388
389
390
  	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...
391
  	}
6818173bd   Miklos Szeredi   splice: implement...
392

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

35f3d14db   Jens Axboe   pipe: add support...
399
400
  	if (vec != __vec)
  		kfree(vec);
523ac9afc   Al Viro   switch default_fi...
401
402
403
404
405
  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...
406
  	return res;
6818173bd   Miklos Szeredi   splice: implement...
407
  }
6818173bd   Miklos Szeredi   splice: implement...
408

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

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

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

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

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

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

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

b3c2d2ddd   Miklos Szeredi   splice: split up ...
499
500
  	return 1;
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
501

b3c2d2ddd   Miklos Szeredi   splice: split up ...
502
503
504
505
506
507
508
509
510
511
  /**
   * 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...
512
  static int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd)
b3c2d2ddd   Miklos Szeredi   splice: split up ...
513
  {
c725bfce7   Jan Kara   vfs: Make sendfil...
514
515
516
517
518
519
  	/*
  	 * 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 ...
520
521
522
  	while (!pipe->nrbufs) {
  		if (!pipe->writers)
  			return 0;
016b661e2   Jens Axboe   [PATCH] splice: f...
523

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

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

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

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

b3c2d2ddd   Miklos Szeredi   splice: split up ...
540
541
  	return 1;
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
542

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

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

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

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

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

61e0d47c3   Miklos Szeredi   splice: add helpe...
631
  	pipe_lock(pipe);
c66ab6fa7   Jens Axboe   splice: abstract ...
632
  	ret = __splice_from_pipe(pipe, &sd, actor);
61e0d47c3   Miklos Szeredi   splice: add helpe...
633
  	pipe_unlock(pipe);
6da618098   Mark Fasheh   [PATCH] Introduce...
634
635
636
637
638
  
  	return ret;
  }
  
  /**
8d0207652   Al Viro   ->splice_write() ...
639
640
641
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
   * 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() ...
675
676
677
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
  		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...
704
  			ret = pipe_buf_confirm(pipe, buf);
8d0207652   Al Viro   ->splice_write() ...
705
706
707
708
709
710
711
712
713
714
715
  			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;
  		}
aa563d7bc   David Howells   iov_iter: Separat...
716
  		iov_iter_bvec(&from, WRITE, array, n, sd.total_len - left);
abbb65899   Christoph Hellwig   fs: implement vfs...
717
  		ret = vfs_iter_write(out, &from, &sd.pos, 0);
8d0207652   Al Viro   ->splice_write() ...
718
719
720
721
722
  		if (ret <= 0)
  			break;
  
  		sd.num_spliced += ret;
  		sd.total_len -= ret;
dbe4e192a   Christoph Hellwig   fs: add vfs_iter_...
723
  		*ppos = sd.pos;
8d0207652   Al Viro   ->splice_write() ...
724
725
726
727
728
  
  		/* 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() ...
729
730
  				ret -= buf->len;
  				buf->len = 0;
a779638cf   Miklos Szeredi   pipe: add pipe_bu...
731
  				pipe_buf_release(pipe, buf);
8d0207652   Al Viro   ->splice_write() ...
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
  				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...
756
757
  static int write_pipe_buf(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  			  struct splice_desc *sd)
0b0a47f5c   Miklos Szeredi   splice: implement...
758
  {
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
759
760
  	int ret;
  	void *data;
06ae43f34   Al Viro   Don't bother with...
761
  	loff_t tmp = sd->pos;
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
762

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

b2858d7d1   Miklos Szeredi   splice: fix kmaps...
776
777
778
  	ret = splice_from_pipe(pipe, out, ppos, len, flags, write_pipe_buf);
  	if (ret > 0)
  		*ppos += ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
779

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

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

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

176144455   Darrick J. Wong   splice: don't rea...
906
  	WARN_ON_ONCE(pipe->nrbufs != 0);
b92ce5589   Jens Axboe   [PATCH] splice: a...
907
  	while (len) {
70d3c881e   Darrick J. Wong   splice: only read...
908
  		unsigned int pipe_pages;
51a92c0f6   Jens Axboe   splice: fix offse...
909
  		size_t read_len;
a82c53a0e   Tom Zanussi   splice: fix sendf...
910
  		loff_t pos = sd->pos, prev_pos = pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
911

176144455   Darrick J. Wong   splice: don't rea...
912
  		/* Don't try to read more the pipe has space for. */
70d3c881e   Darrick J. Wong   splice: only read...
913
914
  		pipe_pages = pipe->buffers - pipe->nrbufs;
  		read_len = min(len, (size_t)pipe_pages << PAGE_SHIFT);
176144455   Darrick J. Wong   splice: don't rea...
915
  		ret = do_splice_to(in, &pos, pipe, read_len, flags);
51a92c0f6   Jens Axboe   splice: fix offse...
916
  		if (unlikely(ret <= 0))
b92ce5589   Jens Axboe   [PATCH] splice: a...
917
918
919
  			goto out_release;
  
  		read_len = ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
920
  		sd->total_len = read_len;
b92ce5589   Jens Axboe   [PATCH] splice: a...
921
922
  
  		/*
0ff28d9f4   Christophe Leroy   splice: sendfile(...
923
924
925
926
927
928
929
930
931
  		 * 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...
932
933
934
935
  		 * 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 ...
936
  		ret = actor(pipe, sd);
a82c53a0e   Tom Zanussi   splice: fix sendf...
937
938
  		if (unlikely(ret <= 0)) {
  			sd->pos = prev_pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
939
  			goto out_release;
a82c53a0e   Tom Zanussi   splice: fix sendf...
940
  		}
b92ce5589   Jens Axboe   [PATCH] splice: a...
941
942
943
  
  		bytes += ret;
  		len -= ret;
bcd4f3acb   Jens Axboe   splice: direct sp...
944
  		sd->pos = pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
945

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

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

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

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

18c67cb9f   Al Viro   splice: lift chec...
1011
1012
1013
1014
1015
1016
1017
1018
1019
  	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 ...
1020
  	ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
51a92c0f6   Jens Axboe   splice: fix offse...
1021
  	if (ret > 0)
a82c53a0e   Tom Zanussi   splice: fix sendf...
1022
  		*ppos = sd.pos;
51a92c0f6   Jens Axboe   splice: fix offse...
1023

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

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

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

18c67cb9f   Al Viro   splice: lift chec...
1095
1096
1097
1098
1099
1100
1101
1102
1103
  		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;
ee5e00119   Slavomir Kaslev   fs: Make splice()...
1104
1105
  		if (in->f_flags & O_NONBLOCK)
  			flags |= SPLICE_F_NONBLOCK;
500368f7f   Al Viro   lift file_*_write...
1106
  		file_start_write(out);
7995bd287   Al Viro   splice: don't pas...
1107
  		ret = do_splice_from(ipipe, out, &offset, len, flags);
500368f7f   Al Viro   lift file_*_write...
1108
  		file_end_write(out);
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1109

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

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

ee5e00119   Slavomir Kaslev   fs: Make splice()...
1130
1131
  		if (out->f_flags & O_NONBLOCK)
  			flags |= SPLICE_F_NONBLOCK;
8924feff6   Al Viro   splice: lift pipe...
1132
1133
  		pipe_lock(opipe);
  		ret = wait_for_space(opipe, flags);
70d3c881e   Darrick J. Wong   splice: only read...
1134
1135
1136
1137
1138
1139
  		if (!ret) {
  			unsigned int pipe_pages;
  
  			/* Don't try to read more the pipe has space for. */
  			pipe_pages = opipe->buffers - opipe->nrbufs;
  			len = min(len, (size_t)pipe_pages << PAGE_SHIFT);
8924feff6   Al Viro   splice: lift pipe...
1140
  			ret = do_splice_to(in, &offset, opipe, len, flags);
70d3c881e   Darrick J. Wong   splice: only read...
1141
  		}
8924feff6   Al Viro   splice: lift pipe...
1142
1143
1144
  		pipe_unlock(opipe);
  		if (ret > 0)
  			wakeup_pipe_readers(opipe);
7995bd287   Al Viro   splice: don't pas...
1145
1146
1147
  		if (!off_in)
  			in->f_pos = offset;
  		else if (copy_to_user(off_in, &offset, sizeof(loff_t)))
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1148
1149
1150
  			ret = -EFAULT;
  
  		return ret;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1151
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1152
1153
1154
  
  	return -EINVAL;
  }
79fddc4ef   Al Viro   new helper: add_t...
1155
1156
1157
  static int iter_to_pipe(struct iov_iter *from,
  			struct pipe_inode_info *pipe,
  			unsigned flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1158
  {
79fddc4ef   Al Viro   new helper: add_t...
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
  	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...
1169
1170
  		ssize_t copied;
  		size_t start;
79fddc4ef   Al Viro   new helper: add_t...
1171
  		int n;
db85a9eb2   Al Viro   splice: switch ge...
1172

79fddc4ef   Al Viro   new helper: add_t...
1173
1174
1175
1176
1177
  		copied = iov_iter_get_pages(from, pages, ~0UL, 16, &start);
  		if (copied <= 0) {
  			ret = copied;
  			break;
  		}
db85a9eb2   Al Viro   splice: switch ge...
1178

79fddc4ef   Al Viro   new helper: add_t...
1179
  		for (n = 0; copied; n++, start = 0) {
db85a9eb2   Al Viro   splice: switch ge...
1180
  			int size = min_t(int, copied, PAGE_SIZE - start);
79fddc4ef   Al Viro   new helper: add_t...
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
  			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...
1195
  			copied -= size;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1196
  		}
912d35f86   Jens Axboe   [PATCH] Add suppo...
1197
  	}
79fddc4ef   Al Viro   new helper: add_t...
1198
  	return total ? total : ret;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1199
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1200
1201
1202
  static int pipe_to_user(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  			struct splice_desc *sd)
  {
6130f5315   Al Viro   switch vmsplice_t...
1203
1204
  	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...
1205
1206
1207
1208
1209
1210
  }
  
  /*
   * 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 ...
1211
1212
  static long vmsplice_to_user(struct file *file, struct iov_iter *iter,
  			     unsigned int flags)
6a14b90bb   Jens Axboe   vmsplice: add vms...
1213
  {
87a3002af   Al Viro   vmsplice(): lift ...
1214
1215
1216
1217
1218
1219
1220
  	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...
1221

6a14b90bb   Jens Axboe   vmsplice: add vms...
1222
1223
  	if (!pipe)
  		return -EBADF;
345995fa4   Al Viro   vmsplice_to_user(...
1224
1225
1226
1227
1228
  	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...
1229
1230
1231
  
  	return ret;
  }
912d35f86   Jens Axboe   [PATCH] Add suppo...
1232
1233
1234
1235
  /*
   * 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...
1236
   */
87a3002af   Al Viro   vmsplice(): lift ...
1237
1238
  static long vmsplice_to_pipe(struct file *file, struct iov_iter *iter,
  			     unsigned int flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1239
  {
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1240
  	struct pipe_inode_info *pipe;
87a3002af   Al Viro   vmsplice(): lift ...
1241
  	long ret = 0;
79fddc4ef   Al Viro   new helper: add_t...
1242
1243
1244
1245
  	unsigned buf_flag = 0;
  
  	if (flags & SPLICE_F_GIFT)
  		buf_flag = PIPE_BUF_FLAG_GIFT;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1246

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

8924feff6   Al Viro   splice: lift pipe...
1251
1252
  	pipe_lock(pipe);
  	ret = wait_for_space(pipe, flags);
79fddc4ef   Al Viro   new helper: add_t...
1253
  	if (!ret)
87a3002af   Al Viro   vmsplice(): lift ...
1254
  		ret = iter_to_pipe(iter, pipe, buf_flag);
8924feff6   Al Viro   splice: lift pipe...
1255
1256
1257
  	pipe_unlock(pipe);
  	if (ret > 0)
  		wakeup_pipe_readers(pipe);
35f3d14db   Jens Axboe   pipe: add support...
1258
  	return ret;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1259
  }
87a3002af   Al Viro   vmsplice(): lift ...
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
  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...
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
  /*
   * 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 ...
1290
  static long do_vmsplice(struct file *f, struct iov_iter *iter, unsigned int flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1291
  {
3d6ea290f   Al Viro   splice/tee/vmspli...
1292
1293
  	if (unlikely(flags & ~SPLICE_F_ALL))
  		return -EINVAL;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1294

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

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

35f3d14db   Jens Axboe   pipe: add support...
1437
  	while (pipe->nrbufs >= pipe->buffers) {
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
  		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...
1455
  	pipe_unlock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1456
1457
1458
1459
  	return ret;
  }
  
  /*
7c77f0b3f   Miklos Szeredi   splice: implement...
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
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
   * 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...
1502
  		if (!ipipe->nrbufs || opipe->nrbufs >= opipe->buffers) {
7c77f0b3f   Miklos Szeredi   splice: implement...
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
  			/* 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...
1523
  		nbuf = (opipe->curbuf + opipe->nrbufs) & (opipe->buffers - 1);
7c77f0b3f   Miklos Szeredi   splice: implement...
1524
1525
1526
1527
1528
1529
1530
1531
1532
  		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...
1533
  			ipipe->curbuf = (ipipe->curbuf + 1) & (ipipe->buffers - 1);
7c77f0b3f   Miklos Szeredi   splice: implement...
1534
1535
1536
1537
1538
1539
1540
  			ipipe->nrbufs--;
  			input_wakeup = true;
  		} else {
  			/*
  			 * Get a reference to this pipe buffer,
  			 * so we can copy the contents over.
  			 */
15fab63e1   Matthew Wilcox   fs: prevent page ...
1541
1542
1543
1544
1545
  			if (!pipe_buf_get(ipipe, ibuf)) {
  				if (ret == 0)
  					ret = -EFAULT;
  				break;
  			}
7c77f0b3f   Miklos Szeredi   splice: implement...
1546
1547
1548
1549
1550
1551
1552
  			*obuf = *ibuf;
  
  			/*
  			 * Don't inherit the gift flag, we need to
  			 * prevent multiple steals of this page.
  			 */
  			obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
a0ce2f0aa   Jann Horn   splice: don't mer...
1553
  			pipe_buf_mark_unmergeable(obuf);
7c77f0b3f   Miklos Szeredi   splice: implement...
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
  			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...
1569
1570
  	if (ret > 0)
  		wakeup_pipe_readers(opipe);
7c77f0b3f   Miklos Szeredi   splice: implement...
1571
1572
1573
1574
1575
1576
1577
  	if (input_wakeup)
  		wakeup_pipe_writers(ipipe);
  
  	return ret;
  }
  
  /*
70524490e   Jens Axboe   [PATCH] splice: a...
1578
1579
1580
1581
1582
1583
1584
   * 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...
1585
  	int ret = 0, i = 0, nbuf;
70524490e   Jens Axboe   [PATCH] splice: a...
1586
1587
1588
  
  	/*
  	 * Potential ABBA deadlock, work around it by ordering lock
61e0d47c3   Miklos Szeredi   splice: add helpe...
1589
  	 * grabbing by pipe info address. Otherwise two different processes
70524490e   Jens Axboe   [PATCH] splice: a...
1590
1591
  	 * could deadlock (one doing tee from A -> B, the other from B -> A).
  	 */
61e0d47c3   Miklos Szeredi   splice: add helpe...
1592
  	pipe_double_lock(ipipe, opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1593

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1594
  	do {
70524490e   Jens Axboe   [PATCH] splice: a...
1595
1596
1597
1598
1599
1600
  		if (!opipe->readers) {
  			send_sig(SIGPIPE, current, 0);
  			if (!ret)
  				ret = -EPIPE;
  			break;
  		}
70524490e   Jens Axboe   [PATCH] splice: a...
1601

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1602
1603
1604
1605
  		/*
  		 * If we have iterated all input buffers or ran out of
  		 * output room, break.
  		 */
35f3d14db   Jens Axboe   pipe: add support...
1606
  		if (i >= ipipe->nrbufs || opipe->nrbufs >= opipe->buffers)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1607
  			break;
70524490e   Jens Axboe   [PATCH] splice: a...
1608

35f3d14db   Jens Axboe   pipe: add support...
1609
1610
  		ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (ipipe->buffers-1));
  		nbuf = (opipe->curbuf + opipe->nrbufs) & (opipe->buffers - 1);
70524490e   Jens Axboe   [PATCH] splice: a...
1611
1612
  
  		/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1613
1614
  		 * Get a reference to this pipe buffer,
  		 * so we can copy the contents over.
70524490e   Jens Axboe   [PATCH] splice: a...
1615
  		 */
15fab63e1   Matthew Wilcox   fs: prevent page ...
1616
1617
1618
1619
1620
  		if (!pipe_buf_get(ipipe, ibuf)) {
  			if (ret == 0)
  				ret = -EFAULT;
  			break;
  		}
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1621
1622
1623
  
  		obuf = opipe->bufs + nbuf;
  		*obuf = *ibuf;
2a27250e6   Jens Axboe   [PATCH] tee: link...
1624
  		/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1625
1626
  		 * Don't inherit the gift flag, we need to
  		 * prevent multiple steals of this page.
2a27250e6   Jens Axboe   [PATCH] tee: link...
1627
  		 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1628
  		obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
70524490e   Jens Axboe   [PATCH] splice: a...
1629

a0ce2f0aa   Jann Horn   splice: don't mer...
1630
  		pipe_buf_mark_unmergeable(obuf);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1631
1632
  		if (obuf->len > len)
  			obuf->len = len;
70524490e   Jens Axboe   [PATCH] splice: a...
1633

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1634
1635
1636
1637
1638
  		opipe->nrbufs++;
  		ret += obuf->len;
  		len -= obuf->len;
  		i++;
  	} while (len);
70524490e   Jens Axboe   [PATCH] splice: a...
1639

02cf01aea   Jens Axboe   splice: only retu...
1640
1641
1642
1643
1644
1645
  	/*
  	 * 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...
1646
1647
  	pipe_unlock(ipipe);
  	pipe_unlock(opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1648

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1649
1650
1651
  	/*
  	 * If we put data in the output pipe, wakeup any potential readers.
  	 */
825cdcb1a   Namhyung Kim   splice: add wakeu...
1652
1653
  	if (ret > 0)
  		wakeup_pipe_readers(opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
  
  	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...
1667
1668
  	struct pipe_inode_info *ipipe = get_pipe_info(in);
  	struct pipe_inode_info *opipe = get_pipe_info(out);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1669
  	int ret = -EINVAL;
70524490e   Jens Axboe   [PATCH] splice: a...
1670
1671
  
  	/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1672
1673
  	 * Duplicate the contents of ipipe to opipe without actually
  	 * copying the data.
70524490e   Jens Axboe   [PATCH] splice: a...
1674
  	 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1675
  	if (ipipe && opipe && ipipe != opipe) {
ee5e00119   Slavomir Kaslev   fs: Make splice()...
1676
1677
  		if ((in->f_flags | out->f_flags) & O_NONBLOCK)
  			flags |= SPLICE_F_NONBLOCK;
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1678
1679
1680
1681
  		/*
  		 * Keep going, unless we encounter an error. The ipipe/opipe
  		 * ordering doesn't really matter.
  		 */
7c77f0b3f   Miklos Szeredi   splice: implement...
1682
  		ret = ipipe_prep(ipipe, flags);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1683
  		if (!ret) {
7c77f0b3f   Miklos Szeredi   splice: implement...
1684
  			ret = opipe_prep(opipe, flags);
02cf01aea   Jens Axboe   splice: only retu...
1685
  			if (!ret)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1686
  				ret = link_pipe(ipipe, opipe, len, flags);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1687
1688
  		}
  	}
70524490e   Jens Axboe   [PATCH] splice: a...
1689

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1690
  	return ret;
70524490e   Jens Axboe   [PATCH] splice: a...
1691
  }
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1692
  SYSCALL_DEFINE4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags)
70524490e   Jens Axboe   [PATCH] splice: a...
1693
  {
2903ff019   Al Viro   switch simple cas...
1694
1695
  	struct fd in;
  	int error;
70524490e   Jens Axboe   [PATCH] splice: a...
1696

3d6ea290f   Al Viro   splice/tee/vmspli...
1697
1698
  	if (unlikely(flags & ~SPLICE_F_ALL))
  		return -EINVAL;
70524490e   Jens Axboe   [PATCH] splice: a...
1699
1700
1701
1702
  	if (unlikely(!len))
  		return 0;
  
  	error = -EBADF;
2903ff019   Al Viro   switch simple cas...
1703
1704
1705
1706
1707
1708
1709
1710
1711
  	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...
1712
1713
  			}
  		}
2903ff019   Al Viro   switch simple cas...
1714
   		fdput(in);
70524490e   Jens Axboe   [PATCH] splice: a...
1715
1716
1717
1718
   	}
  
  	return error;
  }