Blame view

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

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

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

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

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

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

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

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

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

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

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

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

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

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

79fddc4ef   Al Viro   new helper: add_t...
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
  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...
229
  	pipe_buf_release(pipe, buf);
79fddc4ef   Al Viro   new helper: add_t...
230
231
232
  	return ret;
  }
  EXPORT_SYMBOL(add_to_pipe);
708e3508c   Hugh Dickins   tmpfs: clone shme...
233
  void spd_release_page(struct splice_pipe_desc *spd, unsigned int i)
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
234
  {
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
235
  	put_page(spd->pages[i]);
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
236
  }
35f3d14db   Jens Axboe   pipe: add support...
237
238
239
240
  /*
   * Check if we need to grow the arrays holding pages and partial page
   * descriptions.
   */
047fe3605   Eric Dumazet   splice: fix racy ...
241
  int splice_grow_spd(const struct pipe_inode_info *pipe, struct splice_pipe_desc *spd)
35f3d14db   Jens Axboe   pipe: add support...
242
  {
047fe3605   Eric Dumazet   splice: fix racy ...
243
244
245
246
  	unsigned int buffers = ACCESS_ONCE(pipe->buffers);
  
  	spd->nr_pages_max = buffers;
  	if (buffers <= PIPE_DEF_BUFFERS)
35f3d14db   Jens Axboe   pipe: add support...
247
  		return 0;
047fe3605   Eric Dumazet   splice: fix racy ...
248
249
  	spd->pages = kmalloc(buffers * sizeof(struct page *), GFP_KERNEL);
  	spd->partial = kmalloc(buffers * sizeof(struct partial_page), GFP_KERNEL);
35f3d14db   Jens Axboe   pipe: add support...
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
291
  	iov_iter_pipe(&to, ITER_PIPE | READ, pipe, len);
  	idx = to.idx;
  	init_sync_kiocb(&kiocb, in);
  	kiocb.ki_pos = *ppos;
  	ret = in->f_op->read_iter(&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;
  }
7bb307e89   Al Viro   export kernel_wri...
347
  ssize_t kernel_write(struct file *file, const char *buf, size_t count,
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
348
  			    loff_t pos)
0b0a47f5c   Miklos Szeredi   splice: implement...
349
350
351
352
353
354
355
  {
  	mm_segment_t old_fs;
  	ssize_t res;
  
  	old_fs = get_fs();
  	set_fs(get_ds());
  	/* The cast to a user pointer is valid due to the set_fs() */
7bb307e89   Al Viro   export kernel_wri...
356
  	res = vfs_write(file, (__force const char __user *)buf, count, &pos);
0b0a47f5c   Miklos Szeredi   splice: implement...
357
358
359
360
  	set_fs(old_fs);
  
  	return res;
  }
7bb307e89   Al Viro   export kernel_wri...
361
  EXPORT_SYMBOL(kernel_write);
0b0a47f5c   Miklos Szeredi   splice: implement...
362

82c156f85   Al Viro   switch generic_fi...
363
  static ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
6818173bd   Miklos Szeredi   splice: implement...
364
365
366
  				 struct pipe_inode_info *pipe, size_t len,
  				 unsigned int flags)
  {
523ac9afc   Al Viro   switch default_fi...
367
368
369
  	struct kvec *vec, __vec[PIPE_DEF_BUFFERS];
  	struct iov_iter to;
  	struct page **pages;
6818173bd   Miklos Szeredi   splice: implement...
370
  	unsigned int nr_pages;
523ac9afc   Al Viro   switch default_fi...
371
  	size_t offset, dummy, copied = 0;
6818173bd   Miklos Szeredi   splice: implement...
372
  	ssize_t res;
6818173bd   Miklos Szeredi   splice: implement...
373
  	int i;
35f3d14db   Jens Axboe   pipe: add support...
374

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

523ac9afc   Al Viro   switch default_fi...
378
379
380
381
  	/*
  	 * 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...
382
  	offset = *ppos & ~PAGE_MASK;
6818173bd   Miklos Szeredi   splice: implement...
383

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

523ac9afc   Al Viro   switch default_fi...
386
387
388
  	res = iov_iter_get_pages_alloc(&to, &pages, len + offset, &dummy);
  	if (res <= 0)
  		return -ENOMEM;
6818173bd   Miklos Szeredi   splice: implement...
389

8e54cadab   Al Viro   fix default_file_...
390
391
  	BUG_ON(dummy);
  	nr_pages = DIV_ROUND_UP(res, PAGE_SIZE);
6818173bd   Miklos Szeredi   splice: implement...
392

523ac9afc   Al Viro   switch default_fi...
393
394
395
396
397
398
399
  	vec = __vec;
  	if (nr_pages > PIPE_DEF_BUFFERS) {
  		vec = kmalloc(nr_pages * sizeof(struct kvec), GFP_KERNEL);
  		if (unlikely(!vec)) {
  			res = -ENOMEM;
  			goto out;
  		}
77f6bf57b   Andrew Morton   splice: fix error...
400
  	}
6818173bd   Miklos Szeredi   splice: implement...
401

523ac9afc   Al Viro   switch default_fi...
402
403
404
405
406
407
408
409
410
  	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...
411
  	}
6818173bd   Miklos Szeredi   splice: implement...
412

523ac9afc   Al Viro   switch default_fi...
413
414
415
  	res = kernel_readv(in, vec, nr_pages, *ppos);
  	if (res > 0) {
  		copied = res;
6818173bd   Miklos Szeredi   splice: implement...
416
  		*ppos += res;
523ac9afc   Al Viro   switch default_fi...
417
  	}
6818173bd   Miklos Szeredi   splice: implement...
418

35f3d14db   Jens Axboe   pipe: add support...
419
420
  	if (vec != __vec)
  		kfree(vec);
523ac9afc   Al Viro   switch default_fi...
421
422
423
424
425
  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...
426
  	return res;
6818173bd   Miklos Szeredi   splice: implement...
427
  }
6818173bd   Miklos Szeredi   splice: implement...
428

5274f052e   Jens Axboe   [PATCH] Introduce...
429
  /*
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
430
   * Send 'sd->len' bytes to socket from 'sd->file' at position 'sd->pos'
016b661e2   Jens Axboe   [PATCH] splice: f...
431
   * using sendpage(). Return the number of bytes sent.
5274f052e   Jens Axboe   [PATCH] Introduce...
432
   */
76ad4d111   Jens Axboe   [PATCH] splice: r...
433
  static int pipe_to_sendpage(struct pipe_inode_info *pipe,
5274f052e   Jens Axboe   [PATCH] Introduce...
434
435
  			    struct pipe_buffer *buf, struct splice_desc *sd)
  {
6a14b90bb   Jens Axboe   vmsplice: add vms...
436
  	struct file *file = sd->u.file;
5274f052e   Jens Axboe   [PATCH] Introduce...
437
  	loff_t pos = sd->pos;
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
438
  	int more;
5274f052e   Jens Axboe   [PATCH] Introduce...
439

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

a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
447
448
  	return file->f_op->sendpage(file, buf->page, buf->offset,
  				    sd->len, &pos, more);
5274f052e   Jens Axboe   [PATCH] Introduce...
449
  }
b3c2d2ddd   Miklos Szeredi   splice: split up ...
450
451
452
453
454
455
456
  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...
457
  /**
b3c2d2ddd   Miklos Szeredi   splice: split up ...
458
   * splice_from_pipe_feed - feed available data from a pipe to a file
932cc6d4f   Jens Axboe   splice: completel...
459
460
461
462
463
   * @pipe:	pipe to splice from
   * @sd:		information to @actor
   * @actor:	handler that splices the data
   *
   * Description:
b3c2d2ddd   Miklos Szeredi   splice: split up ...
464
465
466
467
468
469
470
   *    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...
471
   *
b3c2d2ddd   Miklos Szeredi   splice: split up ...
472
473
474
475
   *    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...
476
   */
96f9bc8fb   Al Viro   fs/splice.c: remo...
477
  static int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_desc *sd,
b3c2d2ddd   Miklos Szeredi   splice: split up ...
478
  			  splice_actor *actor)
5274f052e   Jens Axboe   [PATCH] Introduce...
479
  {
b3c2d2ddd   Miklos Szeredi   splice: split up ...
480
  	int ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
481

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

b3c2d2ddd   Miklos Szeredi   splice: split up ...
485
486
487
  		sd->len = buf->len;
  		if (sd->len > sd->total_len)
  			sd->len = sd->total_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
488

fba597db4   Miklos Szeredi   pipe: add pipe_bu...
489
  		ret = pipe_buf_confirm(pipe, buf);
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
490
  		if (unlikely(ret)) {
b3c2d2ddd   Miklos Szeredi   splice: split up ...
491
492
493
494
  			if (ret == -ENODATA)
  				ret = 0;
  			return ret;
  		}
a8adbe378   MichaÅ‚ MirosÅ‚aw   fs/splice: Pull b...
495
496
497
498
  
  		ret = actor(pipe, buf, sd);
  		if (ret <= 0)
  			return ret;
b3c2d2ddd   Miklos Szeredi   splice: split up ...
499
500
501
502
503
504
505
506
507
  		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...
508
  			pipe_buf_release(pipe, buf);
35f3d14db   Jens Axboe   pipe: add support...
509
  			pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1);
b3c2d2ddd   Miklos Szeredi   splice: split up ...
510
  			pipe->nrbufs--;
6447a3cf1   Al Viro   get rid of pipe->...
511
  			if (pipe->files)
b3c2d2ddd   Miklos Szeredi   splice: split up ...
512
513
  				sd->need_wakeup = true;
  		}
5274f052e   Jens Axboe   [PATCH] Introduce...
514

b3c2d2ddd   Miklos Szeredi   splice: split up ...
515
516
517
  		if (!sd->total_len)
  			return 0;
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
518

b3c2d2ddd   Miklos Szeredi   splice: split up ...
519
520
  	return 1;
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
521

b3c2d2ddd   Miklos Szeredi   splice: split up ...
522
523
524
525
526
527
528
529
530
531
  /**
   * 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...
532
  static int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd)
b3c2d2ddd   Miklos Szeredi   splice: split up ...
533
  {
c725bfce7   Jan Kara   vfs: Make sendfil...
534
535
536
537
538
539
  	/*
  	 * 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 ...
540
541
542
  	while (!pipe->nrbufs) {
  		if (!pipe->writers)
  			return 0;
016b661e2   Jens Axboe   [PATCH] splice: f...
543

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

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

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

b3c2d2ddd   Miklos Szeredi   splice: split up ...
553
554
555
  		if (sd->need_wakeup) {
  			wakeup_pipe_writers(pipe);
  			sd->need_wakeup = false;
5274f052e   Jens Axboe   [PATCH] Introduce...
556
  		}
b3c2d2ddd   Miklos Szeredi   splice: split up ...
557
558
  		pipe_wait(pipe);
  	}
29e350944   Linus Torvalds   splice: add SPLIC...
559

b3c2d2ddd   Miklos Szeredi   splice: split up ...
560
561
  	return 1;
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
562

b3c2d2ddd   Miklos Szeredi   splice: split up ...
563
564
  /**
   * splice_from_pipe_begin - start splicing from pipe
b80901bbf   Randy Dunlap   splice: fix new k...
565
   * @sd:		information about the splice operation
b3c2d2ddd   Miklos Szeredi   splice: split up ...
566
567
568
569
570
571
   *
   * 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...
572
  static void splice_from_pipe_begin(struct splice_desc *sd)
b3c2d2ddd   Miklos Szeredi   splice: split up ...
573
574
575
576
  {
  	sd->num_spliced = 0;
  	sd->need_wakeup = false;
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
577

b3c2d2ddd   Miklos Szeredi   splice: split up ...
578
579
580
581
582
583
584
585
586
587
  /**
   * 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...
588
  static void splice_from_pipe_end(struct pipe_inode_info *pipe, struct splice_desc *sd)
b3c2d2ddd   Miklos Szeredi   splice: split up ...
589
590
591
592
  {
  	if (sd->need_wakeup)
  		wakeup_pipe_writers(pipe);
  }
5274f052e   Jens Axboe   [PATCH] Introduce...
593

b3c2d2ddd   Miklos Szeredi   splice: split up ...
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
  /**
   * __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...
611

b3c2d2ddd   Miklos Szeredi   splice: split up ...
612
613
  	splice_from_pipe_begin(sd);
  	do {
c2489e07c   Jan Kara   vfs: Avoid softlo...
614
  		cond_resched();
b3c2d2ddd   Miklos Szeredi   splice: split up ...
615
616
617
618
619
620
621
  		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...
622
  }
40bee44ea   Mark Fasheh   Export __splice_f...
623
  EXPORT_SYMBOL(__splice_from_pipe);
5274f052e   Jens Axboe   [PATCH] Introduce...
624

932cc6d4f   Jens Axboe   splice: completel...
625
626
627
628
629
630
631
632
633
634
  /**
   * 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_...
635
   *    See __splice_from_pipe. This function locks the pipe inode,
932cc6d4f   Jens Axboe   splice: completel...
636
637
638
   *    otherwise it's identical to __splice_from_pipe().
   *
   */
6da618098   Mark Fasheh   [PATCH] Introduce...
639
640
641
642
643
  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 ...
644
645
646
647
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
648
  		.u.file = out,
c66ab6fa7   Jens Axboe   splice: abstract ...
649
  	};
6da618098   Mark Fasheh   [PATCH] Introduce...
650

61e0d47c3   Miklos Szeredi   splice: add helpe...
651
  	pipe_lock(pipe);
c66ab6fa7   Jens Axboe   splice: abstract ...
652
  	ret = __splice_from_pipe(pipe, &sd, actor);
61e0d47c3   Miklos Szeredi   splice: add helpe...
653
  	pipe_unlock(pipe);
6da618098   Mark Fasheh   [PATCH] Introduce...
654
655
656
657
658
  
  	return ret;
  }
  
  /**
8d0207652   Al Viro   ->splice_write() ...
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
   * 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() ...
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
  		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...
724
  			ret = pipe_buf_confirm(pipe, buf);
8d0207652   Al Viro   ->splice_write() ...
725
726
727
728
729
730
731
732
733
734
735
  			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...
736
737
  		iov_iter_bvec(&from, ITER_BVEC | WRITE, array, n,
  			      sd.total_len - left);
dbe4e192a   Christoph Hellwig   fs: add vfs_iter_...
738
  		ret = vfs_iter_write(out, &from, &sd.pos);
8d0207652   Al Viro   ->splice_write() ...
739
740
741
742
743
  		if (ret <= 0)
  			break;
  
  		sd.num_spliced += ret;
  		sd.total_len -= ret;
dbe4e192a   Christoph Hellwig   fs: add vfs_iter_...
744
  		*ppos = sd.pos;
8d0207652   Al Viro   ->splice_write() ...
745
746
747
748
749
  
  		/* 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() ...
750
751
  				ret -= buf->len;
  				buf->len = 0;
a779638cf   Miklos Szeredi   pipe: add pipe_bu...
752
  				pipe_buf_release(pipe, buf);
8d0207652   Al Viro   ->splice_write() ...
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
  				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...
777
778
  static int write_pipe_buf(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  			  struct splice_desc *sd)
0b0a47f5c   Miklos Szeredi   splice: implement...
779
  {
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
780
781
  	int ret;
  	void *data;
06ae43f34   Al Viro   Don't bother with...
782
  	loff_t tmp = sd->pos;
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
783

fbb32750a   Al Viro   pipe: kill ->map(...
784
  	data = kmap(buf->page);
06ae43f34   Al Viro   Don't bother with...
785
  	ret = __kernel_write(sd->u.file, data + buf->offset, sd->len, &tmp);
fbb32750a   Al Viro   pipe: kill ->map(...
786
  	kunmap(buf->page);
b2858d7d1   Miklos Szeredi   splice: fix kmaps...
787
788
  
  	return ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
789
790
791
792
793
794
  }
  
  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...
795
  	ssize_t ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
796

b2858d7d1   Miklos Szeredi   splice: fix kmaps...
797
798
799
  	ret = splice_from_pipe(pipe, out, ppos, len, flags, write_pipe_buf);
  	if (ret > 0)
  		*ppos += ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
800

b2858d7d1   Miklos Szeredi   splice: fix kmaps...
801
  	return ret;
0b0a47f5c   Miklos Szeredi   splice: implement...
802
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
803
804
  /**
   * generic_splice_sendpage - splice data from a pipe to a socket
932cc6d4f   Jens Axboe   splice: completel...
805
   * @pipe:	pipe to splice from
83f9135bd   Jens Axboe   [PATCH] splice: a...
806
   * @out:	socket to write to
932cc6d4f   Jens Axboe   splice: completel...
807
   * @ppos:	position in @out
83f9135bd   Jens Axboe   [PATCH] splice: a...
808
809
810
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
811
812
813
   * Description:
   *    Will send @len bytes from the pipe to a network socket. No data copying
   *    is involved.
83f9135bd   Jens Axboe   [PATCH] splice: a...
814
815
   *
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
816
  ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
817
  				loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
818
  {
00522fb41   Jens Axboe   [PATCH] splice: r...
819
  	return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_sendpage);
5274f052e   Jens Axboe   [PATCH] Introduce...
820
  }
059a8f373   Jens Axboe   [PATCH] splice: e...
821
  EXPORT_SYMBOL(generic_splice_sendpage);
a0f067802   Jeff Garzik   [PATCH] splice ex...
822

83f9135bd   Jens Axboe   [PATCH] splice: a...
823
824
825
  /*
   * Attempt to initiate a splice from pipe to file.
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
826
  static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
827
  			   loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
828
  {
0b0a47f5c   Miklos Szeredi   splice: implement...
829
830
  	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
  				loff_t *, size_t, unsigned int);
5274f052e   Jens Axboe   [PATCH] Introduce...
831

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

bcd4f3acb   Jens Axboe   splice: direct sp...
931
  		ret = do_splice_to(in, &pos, pipe, len, flags);
51a92c0f6   Jens Axboe   splice: fix offse...
932
  		if (unlikely(ret <= 0))
b92ce5589   Jens Axboe   [PATCH] splice: a...
933
934
935
  			goto out_release;
  
  		read_len = ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
936
  		sd->total_len = read_len;
b92ce5589   Jens Axboe   [PATCH] splice: a...
937
938
  
  		/*
0ff28d9f4   Christophe Leroy   splice: sendfile(...
939
940
941
942
943
944
945
946
947
  		 * 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...
948
949
950
951
  		 * 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 ...
952
  		ret = actor(pipe, sd);
a82c53a0e   Tom Zanussi   splice: fix sendf...
953
954
  		if (unlikely(ret <= 0)) {
  			sd->pos = prev_pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
955
  			goto out_release;
a82c53a0e   Tom Zanussi   splice: fix sendf...
956
  		}
b92ce5589   Jens Axboe   [PATCH] splice: a...
957
958
959
  
  		bytes += ret;
  		len -= ret;
bcd4f3acb   Jens Axboe   splice: direct sp...
960
  		sd->pos = pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
961

a82c53a0e   Tom Zanussi   splice: fix sendf...
962
963
  		if (ret < read_len) {
  			sd->pos = prev_pos + ret;
51a92c0f6   Jens Axboe   splice: fix offse...
964
  			goto out_release;
a82c53a0e   Tom Zanussi   splice: fix sendf...
965
  		}
b92ce5589   Jens Axboe   [PATCH] splice: a...
966
  	}
9e97198db   Jens Axboe   splice: fix probl...
967
  done:
b92ce5589   Jens Axboe   [PATCH] splice: a...
968
  	pipe->nrbufs = pipe->curbuf = 0;
808487085   Jens Axboe   splice: always up...
969
  	file_accessed(in);
b92ce5589   Jens Axboe   [PATCH] splice: a...
970
971
972
973
974
975
976
  	return bytes;
  
  out_release:
  	/*
  	 * If we did an incomplete transfer we must release
  	 * the pipe buffers in question:
  	 */
35f3d14db   Jens Axboe   pipe: add support...
977
  	for (i = 0; i < pipe->buffers; i++) {
b92ce5589   Jens Axboe   [PATCH] splice: a...
978
  		struct pipe_buffer *buf = pipe->bufs + i;
a779638cf   Miklos Szeredi   pipe: add pipe_bu...
979
980
  		if (buf->ops)
  			pipe_buf_release(pipe, buf);
b92ce5589   Jens Axboe   [PATCH] splice: a...
981
  	}
b92ce5589   Jens Axboe   [PATCH] splice: a...
982

9e97198db   Jens Axboe   splice: fix probl...
983
984
  	if (!bytes)
  		bytes = ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
985

9e97198db   Jens Axboe   splice: fix probl...
986
  	goto done;
c66ab6fa7   Jens Axboe   splice: abstract ...
987
988
989
990
991
992
  }
  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...
993
  	struct file *file = sd->u.file;
c66ab6fa7   Jens Axboe   splice: abstract ...
994

7995bd287   Al Viro   splice: don't pas...
995
  	return do_splice_from(pipe, file, sd->opos, sd->total_len,
2cb4b05e7   Changli Gao   splice: direct_sp...
996
  			      sd->flags);
c66ab6fa7   Jens Axboe   splice: abstract ...
997
  }
932cc6d4f   Jens Axboe   splice: completel...
998
999
1000
1001
1002
  /**
   * 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...
1003
   * @opos:	output file offset
932cc6d4f   Jens Axboe   splice: completel...
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
   * @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 ...
1014
  long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
7995bd287   Al Viro   splice: don't pas...
1015
  		      loff_t *opos, size_t len, unsigned int flags)
c66ab6fa7   Jens Axboe   splice: abstract ...
1016
1017
1018
1019
1020
1021
  {
  	struct splice_desc sd = {
  		.len		= len,
  		.total_len	= len,
  		.flags		= flags,
  		.pos		= *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
1022
  		.u.file		= out,
7995bd287   Al Viro   splice: don't pas...
1023
  		.opos		= opos,
c66ab6fa7   Jens Axboe   splice: abstract ...
1024
  	};
51a92c0f6   Jens Axboe   splice: fix offse...
1025
  	long ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
1026

18c67cb9f   Al Viro   splice: lift chec...
1027
1028
1029
1030
1031
1032
1033
1034
1035
  	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 ...
1036
  	ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
51a92c0f6   Jens Axboe   splice: fix offse...
1037
  	if (ret > 0)
a82c53a0e   Tom Zanussi   splice: fix sendf...
1038
  		*ppos = sd.pos;
51a92c0f6   Jens Axboe   splice: fix offse...
1039

c66ab6fa7   Jens Axboe   splice: abstract ...
1040
  	return ret;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1041
  }
1c118596a   Miklos Szeredi   vfs: export do_sp...
1042
  EXPORT_SYMBOL(do_splice_direct);
b92ce5589   Jens Axboe   [PATCH] splice: a...
1043

8924feff6   Al Viro   splice: lift pipe...
1044
1045
  static int wait_for_space(struct pipe_inode_info *pipe, unsigned flags)
  {
b6cce9b8e   Linus Torvalds   splice: reinstate...
1046
1047
1048
1049
1050
1051
1052
  	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...
1053
1054
1055
1056
1057
1058
1059
1060
  		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...
1061
  }
7c77f0b3f   Miklos Szeredi   splice: implement...
1062
1063
1064
  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...
1065
1066
  
  /*
83f9135bd   Jens Axboe   [PATCH] splice: a...
1067
1068
   * Determine where to splice to/from.
   */
529565dcb   Ingo Molnar   [PATCH] splice: a...
1069
1070
1071
  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...
1072
  {
7c77f0b3f   Miklos Szeredi   splice: implement...
1073
1074
  	struct pipe_inode_info *ipipe;
  	struct pipe_inode_info *opipe;
7995bd287   Al Viro   splice: don't pas...
1075
  	loff_t offset;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1076
  	long ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
1077

71993e62a   Linus Torvalds   Rename 'pipe_info...
1078
1079
  	ipipe = get_pipe_info(in);
  	opipe = get_pipe_info(out);
7c77f0b3f   Miklos Szeredi   splice: implement...
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
  
  	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...
1099
1100
  		if (off_in)
  			return -ESPIPE;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1101
  		if (off_out) {
19c9a49b4   Changli Gao   splice: check f_m...
1102
  			if (!(out->f_mode & FMODE_PWRITE))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1103
  				return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1104
  			if (copy_from_user(&offset, off_out, sizeof(loff_t)))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1105
  				return -EFAULT;
7995bd287   Al Viro   splice: don't pas...
1106
1107
1108
  		} else {
  			offset = out->f_pos;
  		}
529565dcb   Ingo Molnar   [PATCH] splice: a...
1109

18c67cb9f   Al Viro   splice: lift chec...
1110
1111
1112
1113
1114
1115
1116
1117
1118
  		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...
1119
  		file_start_write(out);
7995bd287   Al Viro   splice: don't pas...
1120
  		ret = do_splice_from(ipipe, out, &offset, len, flags);
500368f7f   Al Viro   lift file_*_write...
1121
  		file_end_write(out);
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1122

7995bd287   Al Viro   splice: don't pas...
1123
1124
1125
  		if (!off_out)
  			out->f_pos = offset;
  		else if (copy_to_user(off_out, &offset, sizeof(loff_t)))
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1126
1127
1128
  			ret = -EFAULT;
  
  		return ret;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1129
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1130

7c77f0b3f   Miklos Szeredi   splice: implement...
1131
  	if (opipe) {
529565dcb   Ingo Molnar   [PATCH] splice: a...
1132
1133
  		if (off_out)
  			return -ESPIPE;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1134
  		if (off_in) {
19c9a49b4   Changli Gao   splice: check f_m...
1135
  			if (!(in->f_mode & FMODE_PREAD))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1136
  				return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1137
  			if (copy_from_user(&offset, off_in, sizeof(loff_t)))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1138
  				return -EFAULT;
7995bd287   Al Viro   splice: don't pas...
1139
1140
1141
  		} else {
  			offset = in->f_pos;
  		}
529565dcb   Ingo Molnar   [PATCH] splice: a...
1142

8924feff6   Al Viro   splice: lift pipe...
1143
1144
1145
1146
1147
1148
1149
  		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...
1150
1151
1152
  		if (!off_in)
  			in->f_pos = offset;
  		else if (copy_to_user(off_in, &offset, sizeof(loff_t)))
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1153
1154
1155
  			ret = -EFAULT;
  
  		return ret;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1156
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1157
1158
1159
  
  	return -EINVAL;
  }
79fddc4ef   Al Viro   new helper: add_t...
1160
1161
1162
  static int iter_to_pipe(struct iov_iter *from,
  			struct pipe_inode_info *pipe,
  			unsigned flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1163
  {
79fddc4ef   Al Viro   new helper: add_t...
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
  	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...
1174
1175
  		ssize_t copied;
  		size_t start;
79fddc4ef   Al Viro   new helper: add_t...
1176
  		int n;
db85a9eb2   Al Viro   splice: switch ge...
1177

79fddc4ef   Al Viro   new helper: add_t...
1178
1179
1180
1181
1182
  		copied = iov_iter_get_pages(from, pages, ~0UL, 16, &start);
  		if (copied <= 0) {
  			ret = copied;
  			break;
  		}
db85a9eb2   Al Viro   splice: switch ge...
1183

79fddc4ef   Al Viro   new helper: add_t...
1184
  		for (n = 0; copied; n++, start = 0) {
db85a9eb2   Al Viro   splice: switch ge...
1185
  			int size = min_t(int, copied, PAGE_SIZE - start);
79fddc4ef   Al Viro   new helper: add_t...
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
  			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...
1200
  			copied -= size;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1201
  		}
912d35f86   Jens Axboe   [PATCH] Add suppo...
1202
  	}
79fddc4ef   Al Viro   new helper: add_t...
1203
  	return total ? total : ret;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1204
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1205
1206
1207
  static int pipe_to_user(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  			struct splice_desc *sd)
  {
6130f5315   Al Viro   switch vmsplice_t...
1208
1209
  	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...
1210
1211
1212
1213
1214
1215
  }
  
  /*
   * For lack of a better implementation, implement vmsplice() to userspace
   * as a simple copy of the pipes pages to the user iov.
   */
6130f5315   Al Viro   switch vmsplice_t...
1216
  static long vmsplice_to_user(struct file *file, const struct iovec __user *uiov,
6a14b90bb   Jens Axboe   vmsplice: add vms...
1217
1218
1219
1220
  			     unsigned long nr_segs, unsigned int flags)
  {
  	struct pipe_inode_info *pipe;
  	struct splice_desc sd;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1221
  	long ret;
6130f5315   Al Viro   switch vmsplice_t...
1222
1223
1224
  	struct iovec iovstack[UIO_FASTIOV];
  	struct iovec *iov = iovstack;
  	struct iov_iter iter;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1225

71993e62a   Linus Torvalds   Rename 'pipe_info...
1226
  	pipe = get_pipe_info(file);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1227
1228
  	if (!pipe)
  		return -EBADF;
345995fa4   Al Viro   vmsplice_to_user(...
1229
1230
1231
1232
  	ret = import_iovec(READ, uiov, nr_segs,
  			   ARRAY_SIZE(iovstack), &iov, &iter);
  	if (ret < 0)
  		return ret;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1233

345995fa4   Al Viro   vmsplice_to_user(...
1234
  	sd.total_len = iov_iter_count(&iter);
6130f5315   Al Viro   switch vmsplice_t...
1235
  	sd.len = 0;
6130f5315   Al Viro   switch vmsplice_t...
1236
1237
1238
  	sd.flags = flags;
  	sd.u.data = &iter;
  	sd.pos = 0;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1239

345995fa4   Al Viro   vmsplice_to_user(...
1240
1241
1242
1243
1244
  	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...
1245

345995fa4   Al Viro   vmsplice_to_user(...
1246
  	kfree(iov);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1247
1248
  	return ret;
  }
912d35f86   Jens Axboe   [PATCH] Add suppo...
1249
1250
1251
1252
  /*
   * 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...
1253
   */
db85a9eb2   Al Viro   splice: switch ge...
1254
  static long vmsplice_to_pipe(struct file *file, const struct iovec __user *uiov,
6a14b90bb   Jens Axboe   vmsplice: add vms...
1255
  			     unsigned long nr_segs, unsigned int flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1256
  {
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1257
  	struct pipe_inode_info *pipe;
db85a9eb2   Al Viro   splice: switch ge...
1258
1259
1260
  	struct iovec iovstack[UIO_FASTIOV];
  	struct iovec *iov = iovstack;
  	struct iov_iter from;
35f3d14db   Jens Axboe   pipe: add support...
1261
  	long ret;
79fddc4ef   Al Viro   new helper: add_t...
1262
1263
1264
1265
  	unsigned buf_flag = 0;
  
  	if (flags & SPLICE_F_GIFT)
  		buf_flag = PIPE_BUF_FLAG_GIFT;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1266

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

db85a9eb2   Al Viro   splice: switch ge...
1271
1272
1273
1274
  	ret = import_iovec(WRITE, uiov, nr_segs,
  			   ARRAY_SIZE(iovstack), &iov, &from);
  	if (ret < 0)
  		return ret;
8924feff6   Al Viro   splice: lift pipe...
1275
1276
  	pipe_lock(pipe);
  	ret = wait_for_space(pipe, flags);
79fddc4ef   Al Viro   new helper: add_t...
1277
1278
  	if (!ret)
  		ret = iter_to_pipe(&from, pipe, buf_flag);
8924feff6   Al Viro   splice: lift pipe...
1279
1280
1281
  	pipe_unlock(pipe);
  	if (ret > 0)
  		wakeup_pipe_readers(pipe);
db85a9eb2   Al Viro   splice: switch ge...
1282
  	kfree(iov);
35f3d14db   Jens Axboe   pipe: add support...
1283
  	return ret;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1284
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
  /*
   * Note that vmsplice only really supports true splicing _from_ user memory
   * to a pipe, not the other way around. Splicing from user memory is a simple
   * operation that can be supported without any funky alignment restrictions
   * or nasty vm tricks. We simply map in the user memory and fill them into
   * a pipe. The reverse isn't quite as easy, though. There are two possible
   * solutions for that:
   *
   *	- memcpy() the data internally, at which point we might as well just
   *	  do a regular read() on the buffer anyway.
   *	- Lots of nasty vm tricks, that are neither fast nor flexible (it
   *	  has restriction limitations on both ends of the pipe).
   *
   * Currently we punt and implement it as a normal copy, see pipe_to_user().
   *
   */
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1301
1302
  SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,
  		unsigned long, nr_segs, unsigned int, flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1303
  {
2903ff019   Al Viro   switch simple cas...
1304
  	struct fd f;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1305
  	long error;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1306

6a14b90bb   Jens Axboe   vmsplice: add vms...
1307
1308
1309
1310
  	if (unlikely(nr_segs > UIO_MAXIOV))
  		return -EINVAL;
  	else if (unlikely(!nr_segs))
  		return 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1311
  	error = -EBADF;
2903ff019   Al Viro   switch simple cas...
1312
1313
1314
1315
1316
1317
1318
1319
  	f = fdget(fd);
  	if (f.file) {
  		if (f.file->f_mode & FMODE_WRITE)
  			error = vmsplice_to_pipe(f.file, iov, nr_segs, flags);
  		else if (f.file->f_mode & FMODE_READ)
  			error = vmsplice_to_user(f.file, iov, nr_segs, flags);
  
  		fdput(f);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1320
1321
1322
1323
  	}
  
  	return error;
  }
76b021d05   Al Viro   convert vmsplice ...
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
  #ifdef CONFIG_COMPAT
  COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, iov32,
  		    unsigned int, nr_segs, unsigned int, flags)
  {
  	unsigned i;
  	struct iovec __user *iov;
  	if (nr_segs > UIO_MAXIOV)
  		return -EINVAL;
  	iov = compat_alloc_user_space(nr_segs * sizeof(struct iovec));
  	for (i = 0; i < nr_segs; i++) {
  		struct compat_iovec v;
  		if (get_user(v.iov_base, &iov32[i].iov_base) ||
  		    get_user(v.iov_len, &iov32[i].iov_len) ||
  		    put_user(compat_ptr(v.iov_base), &iov[i].iov_base) ||
  		    put_user(v.iov_len, &iov[i].iov_len))
  			return -EFAULT;
  	}
  	return sys_vmsplice(fd, iov, nr_segs, flags);
  }
  #endif
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1344
1345
1346
  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...
1347
  {
2903ff019   Al Viro   switch simple cas...
1348
  	struct fd in, out;
5274f052e   Jens Axboe   [PATCH] Introduce...
1349
  	long error;
5274f052e   Jens Axboe   [PATCH] Introduce...
1350
1351
1352
1353
1354
  
  	if (unlikely(!len))
  		return 0;
  
  	error = -EBADF;
2903ff019   Al Viro   switch simple cas...
1355
1356
1357
1358
1359
1360
1361
1362
  	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...
1363
  							  len, flags);
2903ff019   Al Viro   switch simple cas...
1364
  				fdput(out);
5274f052e   Jens Axboe   [PATCH] Introduce...
1365
1366
  			}
  		}
2903ff019   Al Viro   switch simple cas...
1367
  		fdput(in);
5274f052e   Jens Axboe   [PATCH] Introduce...
1368
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1369
1370
  	return error;
  }
70524490e   Jens Axboe   [PATCH] splice: a...
1371
1372
  
  /*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1373
1374
1375
   * Make sure there's data to read. Wait for input if we can, otherwise
   * return an appropriate error.
   */
7c77f0b3f   Miklos Szeredi   splice: implement...
1376
  static int ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
  {
  	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...
1388
  	pipe_lock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
  
  	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...
1405
  	pipe_unlock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1406
1407
1408
1409
1410
1411
1412
  	return ret;
  }
  
  /*
   * Make sure there's writeable room. Wait for room if we can, otherwise
   * return an appropriate error.
   */
7c77f0b3f   Miklos Szeredi   splice: implement...
1413
  static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1414
1415
1416
1417
1418
1419
1420
  {
  	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...
1421
  	if (pipe->nrbufs < pipe->buffers)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1422
1423
1424
  		return 0;
  
  	ret = 0;
61e0d47c3   Miklos Szeredi   splice: add helpe...
1425
  	pipe_lock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1426

35f3d14db   Jens Axboe   pipe: add support...
1427
  	while (pipe->nrbufs >= pipe->buffers) {
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
  		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...
1445
  	pipe_unlock(pipe);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1446
1447
1448
1449
  	return ret;
  }
  
  /*
7c77f0b3f   Miklos Szeredi   splice: implement...
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
1490
1491
   * 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...
1492
  		if (!ipipe->nrbufs || opipe->nrbufs >= opipe->buffers) {
7c77f0b3f   Miklos Szeredi   splice: implement...
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
  			/* 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...
1513
  		nbuf = (opipe->curbuf + opipe->nrbufs) & (opipe->buffers - 1);
7c77f0b3f   Miklos Szeredi   splice: implement...
1514
1515
1516
1517
1518
1519
1520
1521
1522
  		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...
1523
  			ipipe->curbuf = (ipipe->curbuf + 1) & (ipipe->buffers - 1);
7c77f0b3f   Miklos Szeredi   splice: implement...
1524
1525
1526
1527
1528
1529
1530
  			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...
1531
  			pipe_buf_get(ipipe, ibuf);
7c77f0b3f   Miklos Szeredi   splice: implement...
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
  			*obuf = *ibuf;
  
  			/*
  			 * Don't inherit the gift flag, we need to
  			 * prevent multiple steals of this page.
  			 */
  			obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
  
  			obuf->len = len;
  			opipe->nrbufs++;
  			ibuf->offset += obuf->len;
  			ibuf->len -= obuf->len;
  		}
  		ret += obuf->len;
  		len -= obuf->len;
  	} while (len);
  
  	pipe_unlock(ipipe);
  	pipe_unlock(opipe);
  
  	/*
  	 * If we put data in the output pipe, wakeup any potential readers.
  	 */
825cdcb1a   Namhyung Kim   splice: add wakeu...
1555
1556
  	if (ret > 0)
  		wakeup_pipe_readers(opipe);
7c77f0b3f   Miklos Szeredi   splice: implement...
1557
1558
1559
1560
1561
1562
1563
  	if (input_wakeup)
  		wakeup_pipe_writers(ipipe);
  
  	return ret;
  }
  
  /*
70524490e   Jens Axboe   [PATCH] splice: a...
1564
1565
1566
1567
1568
1569
1570
   * 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...
1571
  	int ret = 0, i = 0, nbuf;
70524490e   Jens Axboe   [PATCH] splice: a...
1572
1573
1574
  
  	/*
  	 * Potential ABBA deadlock, work around it by ordering lock
61e0d47c3   Miklos Szeredi   splice: add helpe...
1575
  	 * grabbing by pipe info address. Otherwise two different processes
70524490e   Jens Axboe   [PATCH] splice: a...
1576
1577
  	 * could deadlock (one doing tee from A -> B, the other from B -> A).
  	 */
61e0d47c3   Miklos Szeredi   splice: add helpe...
1578
  	pipe_double_lock(ipipe, opipe);
70524490e   Jens Axboe   [PATCH] splice: a...
1579

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

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

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

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1612
1613
  		if (obuf->len > len)
  			obuf->len = len;
70524490e   Jens Axboe   [PATCH] splice: a...
1614

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

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

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

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1669
  	return ret;
70524490e   Jens Axboe   [PATCH] splice: a...
1670
  }
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1671
  SYSCALL_DEFINE4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags)
70524490e   Jens Axboe   [PATCH] splice: a...
1672
  {
2903ff019   Al Viro   switch simple cas...
1673
1674
  	struct fd in;
  	int error;
70524490e   Jens Axboe   [PATCH] splice: a...
1675
1676
1677
1678
1679
  
  	if (unlikely(!len))
  		return 0;
  
  	error = -EBADF;
2903ff019   Al Viro   switch simple cas...
1680
1681
1682
1683
1684
1685
1686
1687
1688
  	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...
1689
1690
  			}
  		}
2903ff019   Al Viro   switch simple cas...
1691
   		fdput(in);
70524490e   Jens Axboe   [PATCH] splice: a...
1692
1693
1694
1695
   	}
  
  	return error;
  }