Blame view

fs/splice.c 38.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
28
  #include <linux/writeback.h>
  #include <linux/buffer_head.h>
a0f067802   Jeff Garzik   [PATCH] splice ex...
29
  #include <linux/module.h>
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
30
  #include <linux/syscalls.h>
912d35f86   Jens Axboe   [PATCH] Add suppo...
31
  #include <linux/uio.h>
29ce20586   James Morris   security: revalid...
32
  #include <linux/security.h>
5274f052e   Jens Axboe   [PATCH] Introduce...
33

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

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

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

ca39d651d   Jens Axboe   splice: handle tr...
61
62
  		if (PagePrivate(page) && !try_to_release_page(page, GFP_KERNEL))
  			goto out_unlock;
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
63

9e94cd4fd   Jens Axboe   [PATCH] splice: r...
64
65
66
67
68
69
70
71
  		/*
  		 * 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...
72
  	}
5abc97aa2   Jens Axboe   [PATCH] splice: a...
73

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

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

3a326a2ce   Ingo Molnar   [PATCH] introduce...
175
176
  	if (pipe->inode)
  		mutex_lock(&pipe->inode->i_mutex);
5274f052e   Jens Axboe   [PATCH] Introduce...
177

5274f052e   Jens Axboe   [PATCH] Introduce...
178
  	for (;;) {
3a326a2ce   Ingo Molnar   [PATCH] introduce...
179
  		if (!pipe->readers) {
5274f052e   Jens Axboe   [PATCH] Introduce...
180
181
182
183
184
  			send_sig(SIGPIPE, current, 0);
  			if (!ret)
  				ret = -EPIPE;
  			break;
  		}
6f767b042   Jens Axboe   [PATCH] splice: s...
185
186
  		if (pipe->nrbufs < PIPE_BUFFERS) {
  			int newbuf = (pipe->curbuf + pipe->nrbufs) & (PIPE_BUFFERS - 1);
3a326a2ce   Ingo Molnar   [PATCH] introduce...
187
  			struct pipe_buffer *buf = pipe->bufs + newbuf;
5274f052e   Jens Axboe   [PATCH] Introduce...
188

912d35f86   Jens Axboe   [PATCH] Add suppo...
189
190
191
  			buf->page = spd->pages[page_nr];
  			buf->offset = spd->partial[page_nr].offset;
  			buf->len = spd->partial[page_nr].len;
497f9625c   Jens Axboe   pipe: allow passi...
192
  			buf->private = spd->partial[page_nr].private;
912d35f86   Jens Axboe   [PATCH] Add suppo...
193
  			buf->ops = spd->ops;
7afa6fd03   Jens Axboe   [PATCH] vmsplice:...
194
195
  			if (spd->flags & SPLICE_F_GIFT)
  				buf->flags |= PIPE_BUF_FLAG_GIFT;
6f767b042   Jens Axboe   [PATCH] splice: s...
196
  			pipe->nrbufs++;
912d35f86   Jens Axboe   [PATCH] Add suppo...
197
198
  			page_nr++;
  			ret += buf->len;
6f767b042   Jens Axboe   [PATCH] splice: s...
199
200
  			if (pipe->inode)
  				do_wakeup = 1;
5274f052e   Jens Axboe   [PATCH] Introduce...
201

912d35f86   Jens Axboe   [PATCH] Add suppo...
202
  			if (!--spd->nr_pages)
5274f052e   Jens Axboe   [PATCH] Introduce...
203
  				break;
6f767b042   Jens Axboe   [PATCH] splice: s...
204
  			if (pipe->nrbufs < PIPE_BUFFERS)
5274f052e   Jens Axboe   [PATCH] Introduce...
205
206
207
208
  				continue;
  
  			break;
  		}
912d35f86   Jens Axboe   [PATCH] Add suppo...
209
  		if (spd->flags & SPLICE_F_NONBLOCK) {
29e350944   Linus Torvalds   splice: add SPLIC...
210
211
212
213
  			if (!ret)
  				ret = -EAGAIN;
  			break;
  		}
5274f052e   Jens Axboe   [PATCH] Introduce...
214
215
216
217
218
219
220
  		if (signal_pending(current)) {
  			if (!ret)
  				ret = -ERESTARTSYS;
  			break;
  		}
  
  		if (do_wakeup) {
c0bd1f650   Jens Axboe   [PATCH] splice: o...
221
  			smp_mb();
3a326a2ce   Ingo Molnar   [PATCH] introduce...
222
223
224
  			if (waitqueue_active(&pipe->wait))
  				wake_up_interruptible_sync(&pipe->wait);
  			kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
5274f052e   Jens Axboe   [PATCH] Introduce...
225
226
  			do_wakeup = 0;
  		}
3a326a2ce   Ingo Molnar   [PATCH] introduce...
227
228
229
  		pipe->waiting_writers++;
  		pipe_wait(pipe);
  		pipe->waiting_writers--;
5274f052e   Jens Axboe   [PATCH] Introduce...
230
  	}
02676e5ae   Jens Axboe   splice: only chec...
231
  	if (pipe->inode) {
3a326a2ce   Ingo Molnar   [PATCH] introduce...
232
  		mutex_unlock(&pipe->inode->i_mutex);
5274f052e   Jens Axboe   [PATCH] Introduce...
233

02676e5ae   Jens Axboe   splice: only chec...
234
235
236
237
238
239
  		if (do_wakeup) {
  			smp_mb();
  			if (waitqueue_active(&pipe->wait))
  				wake_up_interruptible(&pipe->wait);
  			kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
  		}
5274f052e   Jens Axboe   [PATCH] Introduce...
240
  	}
00de00bda   Jens Axboe   splice: fix leak ...
241
  	while (page_nr < spd_pages)
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
242
  		spd->spd_release(spd, page_nr++);
5274f052e   Jens Axboe   [PATCH] Introduce...
243
244
245
  
  	return ret;
  }
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
246
247
248
249
  static void spd_release_page(struct splice_pipe_desc *spd, unsigned int i)
  {
  	page_cache_release(spd->pages[i]);
  }
3a326a2ce   Ingo Molnar   [PATCH] introduce...
250
  static int
cbb7e577e   Jens Axboe   [PATCH] splice: p...
251
252
253
  __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...
254
255
  {
  	struct address_space *mapping = in->f_mapping;
d8983910a   Fengguang Wu   readahead: pass r...
256
  	unsigned int loff, nr_pages, req_pages;
16c523dda   Jens Axboe   [PATCH] splice: c...
257
  	struct page *pages[PIPE_BUFFERS];
912d35f86   Jens Axboe   [PATCH] Add suppo...
258
  	struct partial_page partial[PIPE_BUFFERS];
5274f052e   Jens Axboe   [PATCH] Introduce...
259
  	struct page *page;
91ad66ef4   Jens Axboe   [PATCH] splice: c...
260
261
  	pgoff_t index, end_index;
  	loff_t isize;
eb20796bf   Jens Axboe   [PATCH] splice: m...
262
  	int error, page_nr;
912d35f86   Jens Axboe   [PATCH] Add suppo...
263
264
265
266
267
  	struct splice_pipe_desc spd = {
  		.pages = pages,
  		.partial = partial,
  		.flags = flags,
  		.ops = &page_cache_pipe_buf_ops,
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
268
  		.spd_release = spd_release_page,
912d35f86   Jens Axboe   [PATCH] Add suppo...
269
  	};
5274f052e   Jens Axboe   [PATCH] Introduce...
270

cbb7e577e   Jens Axboe   [PATCH] splice: p...
271
  	index = *ppos >> PAGE_CACHE_SHIFT;
912d35f86   Jens Axboe   [PATCH] Add suppo...
272
  	loff = *ppos & ~PAGE_CACHE_MASK;
d8983910a   Fengguang Wu   readahead: pass r...
273
274
  	req_pages = (len + loff + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
  	nr_pages = min(req_pages, (unsigned)PIPE_BUFFERS);
5274f052e   Jens Axboe   [PATCH] Introduce...
275
276
  
  	/*
eb20796bf   Jens Axboe   [PATCH] splice: m...
277
278
279
  	 * Lookup the (hopefully) full range of pages we need.
  	 */
  	spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages);
431a4820b   Fengguang Wu   readahead: move s...
280
  	index += spd.nr_pages;
82aa5d618   Jens Axboe   [PATCH] splice: f...
281

eb20796bf   Jens Axboe   [PATCH] splice: m...
282
283
  	/*
  	 * If find_get_pages_contig() returned fewer pages than we needed,
431a4820b   Fengguang Wu   readahead: move s...
284
  	 * readahead/allocate the rest and fill in the holes.
eb20796bf   Jens Axboe   [PATCH] splice: m...
285
  	 */
431a4820b   Fengguang Wu   readahead: move s...
286
  	if (spd.nr_pages < nr_pages)
cf914a7d6   Rusty Russell   readahead: split ...
287
288
  		page_cache_sync_readahead(mapping, &in->f_ra, in,
  				index, req_pages - spd.nr_pages);
431a4820b   Fengguang Wu   readahead: move s...
289

932cc6d4f   Jens Axboe   splice: completel...
290
  	error = 0;
eb20796bf   Jens Axboe   [PATCH] splice: m...
291
  	while (spd.nr_pages < nr_pages) {
82aa5d618   Jens Axboe   [PATCH] splice: f...
292
  		/*
eb20796bf   Jens Axboe   [PATCH] splice: m...
293
294
  		 * Page could be there, find_get_pages_contig() breaks on
  		 * the first hole.
5274f052e   Jens Axboe   [PATCH] Introduce...
295
  		 */
7480a9043   Jens Axboe   [PATCH] splice: s...
296
297
  		page = find_get_page(mapping, index);
  		if (!page) {
e27dedd84   Jens Axboe   [PATCH] splice: c...
298
  			/*
eb20796bf   Jens Axboe   [PATCH] splice: m...
299
  			 * page didn't exist, allocate one.
7480a9043   Jens Axboe   [PATCH] splice: s...
300
301
302
303
304
305
  			 */
  			page = page_cache_alloc_cold(mapping);
  			if (!page)
  				break;
  
  			error = add_to_page_cache_lru(page, mapping, index,
4cd135046   Hugh Dickins   splice: use mappi...
306
  						mapping_gfp_mask(mapping));
7480a9043   Jens Axboe   [PATCH] splice: s...
307
308
  			if (unlikely(error)) {
  				page_cache_release(page);
a0548871e   Jens Axboe   [PATCH] splice: r...
309
310
  				if (error == -EEXIST)
  					continue;
7480a9043   Jens Axboe   [PATCH] splice: s...
311
312
  				break;
  			}
eb20796bf   Jens Axboe   [PATCH] splice: m...
313
314
315
316
317
  			/*
  			 * add_to_page_cache() locks the page, unlock it
  			 * to avoid convoluting the logic below even more.
  			 */
  			unlock_page(page);
7480a9043   Jens Axboe   [PATCH] splice: s...
318
  		}
eb20796bf   Jens Axboe   [PATCH] splice: m...
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
  		pages[spd.nr_pages++] = page;
  		index++;
  	}
  
  	/*
  	 * Now loop over the map and see if we need to start IO on any
  	 * pages, fill in the partial map, etc.
  	 */
  	index = *ppos >> PAGE_CACHE_SHIFT;
  	nr_pages = spd.nr_pages;
  	spd.nr_pages = 0;
  	for (page_nr = 0; page_nr < nr_pages; page_nr++) {
  		unsigned int this_len;
  
  		if (!len)
  			break;
  
  		/*
  		 * this_len is the max we'll use from this page
  		 */
  		this_len = min_t(unsigned long, len, PAGE_CACHE_SIZE - loff);
  		page = pages[page_nr];
a08a166fe   Fengguang Wu   readahead: conver...
341
  		if (PageReadahead(page))
cf914a7d6   Rusty Russell   readahead: split ...
342
  			page_cache_async_readahead(mapping, &in->f_ra, in,
d8983910a   Fengguang Wu   readahead: pass r...
343
  					page, index, req_pages - page_nr);
a08a166fe   Fengguang Wu   readahead: conver...
344

7480a9043   Jens Axboe   [PATCH] splice: s...
345
346
347
348
  		/*
  		 * If the page isn't uptodate, we may need to start io on it
  		 */
  		if (!PageUptodate(page)) {
c4f895cbe   Jens Axboe   [PATCH] splice: c...
349
350
351
352
  			/*
  			 * If in nonblock mode then dont block on waiting
  			 * for an in-flight io page
  			 */
9ae9d68cb   Fengguang Wu   [PATCH] splice():...
353
  			if (flags & SPLICE_F_NONBLOCK) {
529ae9aaa   Nick Piggin   mm: rename page t...
354
  				if (!trylock_page(page)) {
8191ecd1d   Jens Axboe   splice: fix infin...
355
  					error = -EAGAIN;
9ae9d68cb   Fengguang Wu   [PATCH] splice():...
356
  					break;
8191ecd1d   Jens Axboe   splice: fix infin...
357
  				}
9ae9d68cb   Fengguang Wu   [PATCH] splice():...
358
359
  			} else
  				lock_page(page);
7480a9043   Jens Axboe   [PATCH] splice: s...
360
361
  
  			/*
32502b841   Miklos Szeredi   splice: fix gener...
362
363
364
365
  			 * Page was truncated, or invalidated by the
  			 * filesystem.  Redo the find/create, but this time the
  			 * page is kept locked, so there's no chance of another
  			 * race with truncate/invalidate.
7480a9043   Jens Axboe   [PATCH] splice: s...
366
367
368
  			 */
  			if (!page->mapping) {
  				unlock_page(page);
32502b841   Miklos Szeredi   splice: fix gener...
369
370
371
372
373
374
375
376
377
  				page = find_or_create_page(mapping, index,
  						mapping_gfp_mask(mapping));
  
  				if (!page) {
  					error = -ENOMEM;
  					break;
  				}
  				page_cache_release(pages[page_nr]);
  				pages[page_nr] = page;
7480a9043   Jens Axboe   [PATCH] splice: s...
378
379
380
381
382
383
384
385
  			}
  			/*
  			 * page was already under io and is now done, great
  			 */
  			if (PageUptodate(page)) {
  				unlock_page(page);
  				goto fill_it;
  			}
5274f052e   Jens Axboe   [PATCH] Introduce...
386

7480a9043   Jens Axboe   [PATCH] splice: s...
387
388
389
390
  			/*
  			 * need to read in the page
  			 */
  			error = mapping->a_ops->readpage(in, page);
5274f052e   Jens Axboe   [PATCH] Introduce...
391
  			if (unlikely(error)) {
eb20796bf   Jens Axboe   [PATCH] splice: m...
392
393
394
395
396
397
  				/*
  				 * We really should re-lookup the page here,
  				 * but it complicates things a lot. Instead
  				 * lets just do what we already stored, and
  				 * we'll get it the next time we are called.
  				 */
7480a9043   Jens Axboe   [PATCH] splice: s...
398
  				if (error == AOP_TRUNCATED_PAGE)
eb20796bf   Jens Axboe   [PATCH] splice: m...
399
  					error = 0;
5274f052e   Jens Axboe   [PATCH] Introduce...
400
401
  				break;
  			}
620a324b7   Jens Axboe   splice: __generic...
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
  		}
  fill_it:
  		/*
  		 * i_size must be checked after PageUptodate.
  		 */
  		isize = i_size_read(mapping->host);
  		end_index = (isize - 1) >> PAGE_CACHE_SHIFT;
  		if (unlikely(!isize || index > end_index))
  			break;
  
  		/*
  		 * if this is the last page, see if we need to shrink
  		 * the length and stop
  		 */
  		if (end_index == index) {
  			unsigned int plen;
91ad66ef4   Jens Axboe   [PATCH] splice: c...
418
419
  
  			/*
620a324b7   Jens Axboe   splice: __generic...
420
  			 * max good bytes in this page
91ad66ef4   Jens Axboe   [PATCH] splice: c...
421
  			 */
620a324b7   Jens Axboe   splice: __generic...
422
423
  			plen = ((isize - 1) & ~PAGE_CACHE_MASK) + 1;
  			if (plen <= loff)
91ad66ef4   Jens Axboe   [PATCH] splice: c...
424
  				break;
91ad66ef4   Jens Axboe   [PATCH] splice: c...
425
426
  
  			/*
620a324b7   Jens Axboe   splice: __generic...
427
  			 * force quit after adding this page
91ad66ef4   Jens Axboe   [PATCH] splice: c...
428
  			 */
620a324b7   Jens Axboe   splice: __generic...
429
430
  			this_len = min(this_len, plen - loff);
  			len = this_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
431
  		}
620a324b7   Jens Axboe   splice: __generic...
432

eb20796bf   Jens Axboe   [PATCH] splice: m...
433
434
  		partial[page_nr].offset = loff;
  		partial[page_nr].len = this_len;
82aa5d618   Jens Axboe   [PATCH] splice: f...
435
  		len -= this_len;
91ad66ef4   Jens Axboe   [PATCH] splice: c...
436
  		loff = 0;
eb20796bf   Jens Axboe   [PATCH] splice: m...
437
438
  		spd.nr_pages++;
  		index++;
5274f052e   Jens Axboe   [PATCH] Introduce...
439
  	}
eb20796bf   Jens Axboe   [PATCH] splice: m...
440
  	/*
475ecade6   Hugh Dickins   splice: __generic...
441
  	 * Release any pages at the end, if we quit early. 'page_nr' is how far
eb20796bf   Jens Axboe   [PATCH] splice: m...
442
443
444
445
  	 * we got, 'nr_pages' is how many pages are in the map.
  	 */
  	while (page_nr < nr_pages)
  		page_cache_release(pages[page_nr++]);
f4e6b498d   Fengguang Wu   readahead: combin...
446
  	in->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT;
eb20796bf   Jens Axboe   [PATCH] splice: m...
447

912d35f86   Jens Axboe   [PATCH] Add suppo...
448
  	if (spd.nr_pages)
00522fb41   Jens Axboe   [PATCH] splice: r...
449
  		return splice_to_pipe(pipe, &spd);
5274f052e   Jens Axboe   [PATCH] Introduce...
450

7480a9043   Jens Axboe   [PATCH] splice: s...
451
  	return error;
5274f052e   Jens Axboe   [PATCH] Introduce...
452
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
453
454
455
  /**
   * generic_file_splice_read - splice data from file to a pipe
   * @in:		file to splice from
932cc6d4f   Jens Axboe   splice: completel...
456
   * @ppos:	position in @in
83f9135bd   Jens Axboe   [PATCH] splice: a...
457
458
459
460
   * @pipe:	pipe to splice to
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
461
462
463
464
465
   * Description:
   *    Will read pages from given file and fill them into a pipe. Can be
   *    used as long as the address_space operations for the source implements
   *    a readpage() hook.
   *
83f9135bd   Jens Axboe   [PATCH] splice: a...
466
   */
cbb7e577e   Jens Axboe   [PATCH] splice: p...
467
468
469
  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...
470
  {
d366d3988   Jens Axboe   splice: move inod...
471
  	loff_t isize, left;
8191ecd1d   Jens Axboe   splice: fix infin...
472
  	int ret;
d366d3988   Jens Axboe   splice: move inod...
473
474
475
476
477
478
479
480
  
  	isize = i_size_read(in->f_mapping->host);
  	if (unlikely(*ppos >= isize))
  		return 0;
  
  	left = isize - *ppos;
  	if (unlikely(left < len))
  		len = left;
5274f052e   Jens Axboe   [PATCH] Introduce...
481

8191ecd1d   Jens Axboe   splice: fix infin...
482
483
  	ret = __generic_file_splice_read(in, ppos, pipe, len, flags);
  	if (ret > 0)
cbb7e577e   Jens Axboe   [PATCH] splice: p...
484
  		*ppos += ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
485
486
487
  
  	return ret;
  }
059a8f373   Jens Axboe   [PATCH] splice: e...
488
  EXPORT_SYMBOL(generic_file_splice_read);
5274f052e   Jens Axboe   [PATCH] Introduce...
489
  /*
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
490
   * Send 'sd->len' bytes to socket from 'sd->file' at position 'sd->pos'
016b661e2   Jens Axboe   [PATCH] splice: f...
491
   * using sendpage(). Return the number of bytes sent.
5274f052e   Jens Axboe   [PATCH] Introduce...
492
   */
76ad4d111   Jens Axboe   [PATCH] splice: r...
493
  static int pipe_to_sendpage(struct pipe_inode_info *pipe,
5274f052e   Jens Axboe   [PATCH] Introduce...
494
495
  			    struct pipe_buffer *buf, struct splice_desc *sd)
  {
6a14b90bb   Jens Axboe   vmsplice: add vms...
496
  	struct file *file = sd->u.file;
5274f052e   Jens Axboe   [PATCH] Introduce...
497
  	loff_t pos = sd->pos;
f84d75199   Jens Axboe   [PATCH] pipe: int...
498
  	int ret, more;
5274f052e   Jens Axboe   [PATCH] Introduce...
499

cac36bb06   Jens Axboe   pipe: change the ...
500
  	ret = buf->ops->confirm(pipe, buf);
f84d75199   Jens Axboe   [PATCH] pipe: int...
501
502
  	if (!ret) {
  		more = (sd->flags & SPLICE_F_MORE) || sd->len < sd->total_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
503

f84d75199   Jens Axboe   [PATCH] pipe: int...
504
505
506
  		ret = file->f_op->sendpage(file, buf->page, buf->offset,
  					   sd->len, &pos, more);
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
507

016b661e2   Jens Axboe   [PATCH] splice: f...
508
  	return ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
  }
  
  /*
   * This is a little more tricky than the file -> pipe splicing. There are
   * basically three cases:
   *
   *	- Destination page already exists in the address space and there
   *	  are users of it. For that case we have no other option that
   *	  copying the data. Tough luck.
   *	- Destination page already exists in the address space, but there
   *	  are no users of it. Make sure it's uptodate, then drop it. Fall
   *	  through to last case.
   *	- Destination page does not exist, we can add the pipe page to
   *	  the page cache and avoid the copy.
   *
83f9135bd   Jens Axboe   [PATCH] splice: a...
524
525
526
527
528
529
   * If asked to move pages to the output file (SPLICE_F_MOVE is set in
   * sd->flags), we attempt to migrate pages from the pipe to the output
   * file address space page cache. This is possible if no one else has
   * the pipe page referenced outside of the pipe and page cache. If
   * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create
   * a new page in the output file page cache and fill/dirty that.
5274f052e   Jens Axboe   [PATCH] Introduce...
530
   */
76ad4d111   Jens Axboe   [PATCH] splice: r...
531
  static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
5274f052e   Jens Axboe   [PATCH] Introduce...
532
533
  			struct splice_desc *sd)
  {
6a14b90bb   Jens Axboe   vmsplice: add vms...
534
  	struct file *file = sd->u.file;
5274f052e   Jens Axboe   [PATCH] Introduce...
535
  	struct address_space *mapping = file->f_mapping;
016b661e2   Jens Axboe   [PATCH] splice: f...
536
  	unsigned int offset, this_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
537
  	struct page *page;
afddba49d   Nick Piggin   fs: introduce wri...
538
  	void *fsdata;
3e7ee3e7b   Jens Axboe   [PATCH] splice: f...
539
  	int ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
540
541
  
  	/*
49d0b21be   Jens Axboe   [PATCH] splice: o...
542
  	 * make sure the data in this buffer is uptodate
5274f052e   Jens Axboe   [PATCH] Introduce...
543
  	 */
cac36bb06   Jens Axboe   pipe: change the ...
544
  	ret = buf->ops->confirm(pipe, buf);
f84d75199   Jens Axboe   [PATCH] pipe: int...
545
546
  	if (unlikely(ret))
  		return ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
547

5274f052e   Jens Axboe   [PATCH] Introduce...
548
  	offset = sd->pos & ~PAGE_CACHE_MASK;
016b661e2   Jens Axboe   [PATCH] splice: f...
549
550
551
  	this_len = sd->len;
  	if (this_len + offset > PAGE_CACHE_SIZE)
  		this_len = PAGE_CACHE_SIZE - offset;
afddba49d   Nick Piggin   fs: introduce wri...
552
553
554
555
  	ret = pagecache_write_begin(file, mapping, sd->pos, this_len,
  				AOP_FLAG_UNINTERRUPTIBLE, &page, &fsdata);
  	if (unlikely(ret))
  		goto out;
5274f052e   Jens Axboe   [PATCH] Introduce...
556

0568b409c   Jens Axboe   [PATCH] splice: f...
557
  	if (buf->page != page) {
f84d75199   Jens Axboe   [PATCH] pipe: int...
558
559
560
  		/*
  		 * Careful, ->map() uses KM_USER0!
  		 */
76ad4d111   Jens Axboe   [PATCH] splice: r...
561
  		char *src = buf->ops->map(pipe, buf, 1);
f84d75199   Jens Axboe   [PATCH] pipe: int...
562
  		char *dst = kmap_atomic(page, KM_USER1);
5abc97aa2   Jens Axboe   [PATCH] splice: a...
563

016b661e2   Jens Axboe   [PATCH] splice: f...
564
  		memcpy(dst + offset, src + buf->offset, this_len);
5abc97aa2   Jens Axboe   [PATCH] splice: a...
565
  		flush_dcache_page(page);
f84d75199   Jens Axboe   [PATCH] pipe: int...
566
  		kunmap_atomic(dst, KM_USER1);
76ad4d111   Jens Axboe   [PATCH] splice: r...
567
  		buf->ops->unmap(pipe, buf, src);
5abc97aa2   Jens Axboe   [PATCH] splice: a...
568
  	}
afddba49d   Nick Piggin   fs: introduce wri...
569
570
  	ret = pagecache_write_end(file, mapping, sd->pos, this_len, this_len,
  				page, fsdata);
5274f052e   Jens Axboe   [PATCH] Introduce...
571
  out:
5274f052e   Jens Axboe   [PATCH] Introduce...
572
573
  	return ret;
  }
932cc6d4f   Jens Axboe   splice: completel...
574
575
576
577
578
579
580
581
582
583
584
585
  /**
   * __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.
   *
83f9135bd   Jens Axboe   [PATCH] splice: a...
586
   */
c66ab6fa7   Jens Axboe   splice: abstract ...
587
588
  ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd,
  			   splice_actor *actor)
5274f052e   Jens Axboe   [PATCH] Introduce...
589
  {
5274f052e   Jens Axboe   [PATCH] Introduce...
590
  	int ret, do_wakeup, err;
5274f052e   Jens Axboe   [PATCH] Introduce...
591
592
593
  
  	ret = 0;
  	do_wakeup = 0;
5274f052e   Jens Axboe   [PATCH] Introduce...
594
  	for (;;) {
6f767b042   Jens Axboe   [PATCH] splice: s...
595
596
  		if (pipe->nrbufs) {
  			struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
d4c3cca94   Eric Dumazet   [PATCH] constify ...
597
  			const struct pipe_buf_operations *ops = buf->ops;
5274f052e   Jens Axboe   [PATCH] Introduce...
598

c66ab6fa7   Jens Axboe   splice: abstract ...
599
600
601
  			sd->len = buf->len;
  			if (sd->len > sd->total_len)
  				sd->len = sd->total_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
602

c66ab6fa7   Jens Axboe   splice: abstract ...
603
  			err = actor(pipe, buf, sd);
016b661e2   Jens Axboe   [PATCH] splice: f...
604
  			if (err <= 0) {
5274f052e   Jens Axboe   [PATCH] Introduce...
605
606
607
608
609
  				if (!ret && err != -ENODATA)
  					ret = err;
  
  				break;
  			}
016b661e2   Jens Axboe   [PATCH] splice: f...
610
611
612
  			ret += err;
  			buf->offset += err;
  			buf->len -= err;
c66ab6fa7   Jens Axboe   splice: abstract ...
613
614
615
616
  			sd->len -= err;
  			sd->pos += err;
  			sd->total_len -= err;
  			if (sd->len)
016b661e2   Jens Axboe   [PATCH] splice: f...
617
  				continue;
73d62d83e   Ingo Molnar   [PATCH] splice: c...
618

5274f052e   Jens Axboe   [PATCH] Introduce...
619
620
  			if (!buf->len) {
  				buf->ops = NULL;
3a326a2ce   Ingo Molnar   [PATCH] introduce...
621
  				ops->release(pipe, buf);
6f767b042   Jens Axboe   [PATCH] splice: s...
622
623
624
625
  				pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);
  				pipe->nrbufs--;
  				if (pipe->inode)
  					do_wakeup = 1;
5274f052e   Jens Axboe   [PATCH] Introduce...
626
  			}
c66ab6fa7   Jens Axboe   splice: abstract ...
627
  			if (!sd->total_len)
5274f052e   Jens Axboe   [PATCH] Introduce...
628
629
  				break;
  		}
6f767b042   Jens Axboe   [PATCH] splice: s...
630
  		if (pipe->nrbufs)
5274f052e   Jens Axboe   [PATCH] Introduce...
631
  			continue;
3a326a2ce   Ingo Molnar   [PATCH] introduce...
632
  		if (!pipe->writers)
5274f052e   Jens Axboe   [PATCH] Introduce...
633
  			break;
3a326a2ce   Ingo Molnar   [PATCH] introduce...
634
  		if (!pipe->waiting_writers) {
5274f052e   Jens Axboe   [PATCH] Introduce...
635
636
637
  			if (ret)
  				break;
  		}
c66ab6fa7   Jens Axboe   splice: abstract ...
638
  		if (sd->flags & SPLICE_F_NONBLOCK) {
29e350944   Linus Torvalds   splice: add SPLIC...
639
640
641
642
  			if (!ret)
  				ret = -EAGAIN;
  			break;
  		}
5274f052e   Jens Axboe   [PATCH] Introduce...
643
644
645
646
647
648
649
  		if (signal_pending(current)) {
  			if (!ret)
  				ret = -ERESTARTSYS;
  			break;
  		}
  
  		if (do_wakeup) {
c0bd1f650   Jens Axboe   [PATCH] splice: o...
650
  			smp_mb();
3a326a2ce   Ingo Molnar   [PATCH] introduce...
651
652
653
  			if (waitqueue_active(&pipe->wait))
  				wake_up_interruptible_sync(&pipe->wait);
  			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
5274f052e   Jens Axboe   [PATCH] Introduce...
654
655
  			do_wakeup = 0;
  		}
3a326a2ce   Ingo Molnar   [PATCH] introduce...
656
  		pipe_wait(pipe);
5274f052e   Jens Axboe   [PATCH] Introduce...
657
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
658
  	if (do_wakeup) {
c0bd1f650   Jens Axboe   [PATCH] splice: o...
659
  		smp_mb();
3a326a2ce   Ingo Molnar   [PATCH] introduce...
660
661
662
  		if (waitqueue_active(&pipe->wait))
  			wake_up_interruptible(&pipe->wait);
  		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
5274f052e   Jens Axboe   [PATCH] Introduce...
663
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
664
  	return ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
665
  }
40bee44ea   Mark Fasheh   Export __splice_f...
666
  EXPORT_SYMBOL(__splice_from_pipe);
5274f052e   Jens Axboe   [PATCH] Introduce...
667

932cc6d4f   Jens Axboe   splice: completel...
668
669
670
671
672
673
674
675
676
677
678
679
680
681
  /**
   * 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:
   *    See __splice_from_pipe. This function locks the input and output inodes,
   *    otherwise it's identical to __splice_from_pipe().
   *
   */
6da618098   Mark Fasheh   [PATCH] Introduce...
682
683
684
685
686
687
  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;
  	struct inode *inode = out->f_mapping->host;
c66ab6fa7   Jens Axboe   splice: abstract ...
688
689
690
691
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
692
  		.u.file = out,
c66ab6fa7   Jens Axboe   splice: abstract ...
693
  	};
6da618098   Mark Fasheh   [PATCH] Introduce...
694
695
  
  	/*
4e02ed4b4   Nick Piggin   fs: remove prepar...
696
697
  	 * The actor worker might be calling ->write_begin and
  	 * ->write_end. Most of the time, these expect i_mutex to
6da618098   Mark Fasheh   [PATCH] Introduce...
698
699
700
701
  	 * be held. Since this may result in an ABBA deadlock with
  	 * pipe->inode, we have to order lock acquiry here.
  	 */
  	inode_double_lock(inode, pipe->inode);
c66ab6fa7   Jens Axboe   splice: abstract ...
702
  	ret = __splice_from_pipe(pipe, &sd, actor);
6da618098   Mark Fasheh   [PATCH] Introduce...
703
704
705
706
707
708
709
710
711
  	inode_double_unlock(inode, pipe->inode);
  
  	return ret;
  }
  
  /**
   * generic_file_splice_write_nolock - generic_file_splice_write without mutexes
   * @pipe:	pipe info
   * @out:	file to write to
932cc6d4f   Jens Axboe   splice: completel...
712
   * @ppos:	position in @out
6da618098   Mark Fasheh   [PATCH] Introduce...
713
714
715
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
716
717
718
719
   * Description:
   *    Will either move or copy pages (determined by @flags options) from
   *    the given pipe inode to the given file. The caller is responsible
   *    for acquiring i_mutex on both inodes.
6da618098   Mark Fasheh   [PATCH] Introduce...
720
721
722
723
724
725
726
727
   *
   */
  ssize_t
  generic_file_splice_write_nolock(struct pipe_inode_info *pipe, struct file *out,
  				 loff_t *ppos, size_t len, unsigned int flags)
  {
  	struct address_space *mapping = out->f_mapping;
  	struct inode *inode = mapping->host;
c66ab6fa7   Jens Axboe   splice: abstract ...
728
729
730
731
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
732
  		.u.file = out,
c66ab6fa7   Jens Axboe   splice: abstract ...
733
  	};
6da618098   Mark Fasheh   [PATCH] Introduce...
734
735
  	ssize_t ret;
  	int err;
2f1936b87   Miklos Szeredi   [patch 3/5] vfs: ...
736
  	err = file_remove_suid(out);
8c34e2d63   Jens Axboe   [PATCH] Remove SU...
737
738
  	if (unlikely(err))
  		return err;
c66ab6fa7   Jens Axboe   splice: abstract ...
739
  	ret = __splice_from_pipe(pipe, &sd, pipe_to_file);
6da618098   Mark Fasheh   [PATCH] Introduce...
740
  	if (ret > 0) {
17ee4f49a   Jens Axboe   splice: adjust ba...
741
  		unsigned long nr_pages;
6da618098   Mark Fasheh   [PATCH] Introduce...
742
  		*ppos += ret;
17ee4f49a   Jens Axboe   splice: adjust ba...
743
  		nr_pages = (ret + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
6da618098   Mark Fasheh   [PATCH] Introduce...
744
745
746
747
748
749
750
751
752
753
754
755
  
  		/*
  		 * If file or inode is SYNC and we actually wrote some data,
  		 * sync it.
  		 */
  		if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) {
  			err = generic_osync_inode(inode, mapping,
  						  OSYNC_METADATA|OSYNC_DATA);
  
  			if (err)
  				ret = err;
  		}
17ee4f49a   Jens Axboe   splice: adjust ba...
756
  		balance_dirty_pages_ratelimited_nr(mapping, nr_pages);
6da618098   Mark Fasheh   [PATCH] Introduce...
757
758
759
760
761
762
  	}
  
  	return ret;
  }
  
  EXPORT_SYMBOL(generic_file_splice_write_nolock);
83f9135bd   Jens Axboe   [PATCH] splice: a...
763
764
  /**
   * generic_file_splice_write - splice data from a pipe to a file
3a326a2ce   Ingo Molnar   [PATCH] introduce...
765
   * @pipe:	pipe info
83f9135bd   Jens Axboe   [PATCH] splice: a...
766
   * @out:	file to write to
932cc6d4f   Jens Axboe   splice: completel...
767
   * @ppos:	position in @out
83f9135bd   Jens Axboe   [PATCH] splice: a...
768
769
770
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
771
772
773
   * Description:
   *    Will either move or copy pages (determined by @flags options) from
   *    the given pipe inode to the given file.
83f9135bd   Jens Axboe   [PATCH] splice: a...
774
775
   *
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
776
777
  ssize_t
  generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
778
  			  loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
779
  {
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
780
  	struct address_space *mapping = out->f_mapping;
8c34e2d63   Jens Axboe   [PATCH] Remove SU...
781
  	struct inode *inode = mapping->host;
7f3d4ee10   Miklos Szeredi   vfs: splice remov...
782
783
784
785
786
787
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
  		.u.file = out,
  	};
3a326a2ce   Ingo Molnar   [PATCH] introduce...
788
  	ssize_t ret;
7f3d4ee10   Miklos Szeredi   vfs: splice remov...
789
  	inode_double_lock(inode, pipe->inode);
2f1936b87   Miklos Szeredi   [patch 3/5] vfs: ...
790
  	ret = file_remove_suid(out);
7f3d4ee10   Miklos Szeredi   vfs: splice remov...
791
792
793
  	if (likely(!ret))
  		ret = __splice_from_pipe(pipe, &sd, pipe_to_file);
  	inode_double_unlock(inode, pipe->inode);
a4514ebd8   Jens Axboe   [PATCH] splice: o...
794
  	if (ret > 0) {
17ee4f49a   Jens Axboe   splice: adjust ba...
795
  		unsigned long nr_pages;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
796
  		*ppos += ret;
17ee4f49a   Jens Axboe   splice: adjust ba...
797
  		nr_pages = (ret + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
798
799
800
801
802
803
  
  		/*
  		 * If file or inode is SYNC and we actually wrote some data,
  		 * sync it.
  		 */
  		if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) {
7f3d4ee10   Miklos Szeredi   vfs: splice remov...
804
  			int err;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
805
806
807
808
  			mutex_lock(&inode->i_mutex);
  			err = generic_osync_inode(inode, mapping,
  						  OSYNC_METADATA|OSYNC_DATA);
  			mutex_unlock(&inode->i_mutex);
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
809

a4514ebd8   Jens Axboe   [PATCH] splice: o...
810
811
812
  			if (err)
  				ret = err;
  		}
17ee4f49a   Jens Axboe   splice: adjust ba...
813
  		balance_dirty_pages_ratelimited_nr(mapping, nr_pages);
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
814
815
816
  	}
  
  	return ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
817
  }
059a8f373   Jens Axboe   [PATCH] splice: e...
818
  EXPORT_SYMBOL(generic_file_splice_write);
83f9135bd   Jens Axboe   [PATCH] splice: a...
819
820
  /**
   * generic_splice_sendpage - splice data from a pipe to a socket
932cc6d4f   Jens Axboe   splice: completel...
821
   * @pipe:	pipe to splice from
83f9135bd   Jens Axboe   [PATCH] splice: a...
822
   * @out:	socket to write to
932cc6d4f   Jens Axboe   splice: completel...
823
   * @ppos:	position in @out
83f9135bd   Jens Axboe   [PATCH] splice: a...
824
825
826
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
827
828
829
   * Description:
   *    Will send @len bytes from the pipe to a network socket. No data copying
   *    is involved.
83f9135bd   Jens Axboe   [PATCH] splice: a...
830
831
   *
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
832
  ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
833
  				loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
834
  {
00522fb41   Jens Axboe   [PATCH] splice: r...
835
  	return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_sendpage);
5274f052e   Jens Axboe   [PATCH] Introduce...
836
  }
059a8f373   Jens Axboe   [PATCH] splice: e...
837
  EXPORT_SYMBOL(generic_splice_sendpage);
a0f067802   Jeff Garzik   [PATCH] splice ex...
838

83f9135bd   Jens Axboe   [PATCH] splice: a...
839
840
841
  /*
   * Attempt to initiate a splice from pipe to file.
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
842
  static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
843
  			   loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
844
  {
5274f052e   Jens Axboe   [PATCH] Introduce...
845
  	int ret;
49570e9b2   Jens Axboe   [PATCH] splice: u...
846
  	if (unlikely(!out->f_op || !out->f_op->splice_write))
5274f052e   Jens Axboe   [PATCH] Introduce...
847
  		return -EINVAL;
49570e9b2   Jens Axboe   [PATCH] splice: u...
848
  	if (unlikely(!(out->f_mode & FMODE_WRITE)))
5274f052e   Jens Axboe   [PATCH] Introduce...
849
  		return -EBADF;
efc968d45   Linus Torvalds   Don't allow splic...
850
851
  	if (unlikely(out->f_flags & O_APPEND))
  		return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
852
  	ret = rw_verify_area(WRITE, out, ppos, len);
5274f052e   Jens Axboe   [PATCH] Introduce...
853
854
  	if (unlikely(ret < 0))
  		return ret;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
855
  	return out->f_op->splice_write(pipe, out, ppos, len, flags);
5274f052e   Jens Axboe   [PATCH] Introduce...
856
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
857
858
859
  /*
   * Attempt to initiate a splice from a file to a pipe.
   */
cbb7e577e   Jens Axboe   [PATCH] splice: p...
860
861
862
  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...
863
  {
5274f052e   Jens Axboe   [PATCH] Introduce...
864
  	int ret;
49570e9b2   Jens Axboe   [PATCH] splice: u...
865
  	if (unlikely(!in->f_op || !in->f_op->splice_read))
5274f052e   Jens Axboe   [PATCH] Introduce...
866
  		return -EINVAL;
49570e9b2   Jens Axboe   [PATCH] splice: u...
867
  	if (unlikely(!(in->f_mode & FMODE_READ)))
5274f052e   Jens Axboe   [PATCH] Introduce...
868
  		return -EBADF;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
869
  	ret = rw_verify_area(READ, in, ppos, len);
5274f052e   Jens Axboe   [PATCH] Introduce...
870
871
  	if (unlikely(ret < 0))
  		return ret;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
872
  	return in->f_op->splice_read(in, ppos, pipe, len, flags);
5274f052e   Jens Axboe   [PATCH] Introduce...
873
  }
932cc6d4f   Jens Axboe   splice: completel...
874
875
876
877
878
879
880
881
882
  /**
   * 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...
883
   *    pipe is cached in the process, and reused during the lifetime of
932cc6d4f   Jens Axboe   splice: completel...
884
885
   *    that process.
   *
c66ab6fa7   Jens Axboe   splice: abstract ...
886
887
888
   */
  ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
  			       splice_direct_actor *actor)
b92ce5589   Jens Axboe   [PATCH] splice: a...
889
890
891
892
  {
  	struct pipe_inode_info *pipe;
  	long ret, bytes;
  	umode_t i_mode;
c66ab6fa7   Jens Axboe   splice: abstract ...
893
894
  	size_t len;
  	int i, flags;
b92ce5589   Jens Axboe   [PATCH] splice: a...
895
896
897
898
899
900
  
  	/*
  	 * We require the input being a regular file, as we don't want to
  	 * randomly drop data for eg socket -> socket splicing. Use the
  	 * piped splicing for that!
  	 */
0f7fc9e4d   Josef "Jeff" Sipek   [PATCH] VFS: chan...
901
  	i_mode = in->f_path.dentry->d_inode->i_mode;
b92ce5589   Jens Axboe   [PATCH] splice: a...
902
903
904
905
906
907
908
909
  	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...
910
  	if (unlikely(!pipe)) {
b92ce5589   Jens Axboe   [PATCH] splice: a...
911
912
913
914
915
916
  		pipe = alloc_pipe_info(NULL);
  		if (!pipe)
  			return -ENOMEM;
  
  		/*
  		 * We don't have an immediate reader, but we'll read the stuff
00522fb41   Jens Axboe   [PATCH] splice: r...
917
  		 * out of the pipe right after the splice_to_pipe(). So set
b92ce5589   Jens Axboe   [PATCH] splice: a...
918
919
920
921
922
923
924
925
  		 * PIPE_READERS appropriately.
  		 */
  		pipe->readers = 1;
  
  		current->splice_pipe = pipe;
  	}
  
  	/*
73d62d83e   Ingo Molnar   [PATCH] splice: c...
926
  	 * Do the splice.
b92ce5589   Jens Axboe   [PATCH] splice: a...
927
928
929
  	 */
  	ret = 0;
  	bytes = 0;
c66ab6fa7   Jens Axboe   splice: abstract ...
930
931
932
933
934
935
936
  	len = sd->total_len;
  	flags = sd->flags;
  
  	/*
  	 * Don't block on output, we have to drain the direct pipe.
  	 */
  	sd->flags &= ~SPLICE_F_NONBLOCK;
b92ce5589   Jens Axboe   [PATCH] splice: a...
937
938
  
  	while (len) {
51a92c0f6   Jens Axboe   splice: fix offse...
939
  		size_t read_len;
a82c53a0e   Tom Zanussi   splice: fix sendf...
940
  		loff_t pos = sd->pos, prev_pos = pos;
b92ce5589   Jens Axboe   [PATCH] splice: a...
941

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

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

9e97198db   Jens Axboe   splice: fix probl...
988
989
  	if (!bytes)
  		bytes = ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
990

9e97198db   Jens Axboe   splice: fix probl...
991
  	goto done;
c66ab6fa7   Jens Axboe   splice: abstract ...
992
993
994
995
996
997
  }
  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...
998
  	struct file *file = sd->u.file;
c66ab6fa7   Jens Axboe   splice: abstract ...
999
1000
1001
  
  	return do_splice_from(pipe, file, &sd->pos, sd->total_len, sd->flags);
  }
932cc6d4f   Jens Axboe   splice: completel...
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
  /**
   * do_splice_direct - splices data directly between two files
   * @in:		file to splice from
   * @ppos:	input file offset
   * @out:	file to splice to
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
   * Description:
   *    For use by do_sendfile(). splice can easily emulate sendfile, but
   *    doing it in the application would incur an extra system call
   *    (splice in + splice out, as compared to just sendfile()). So this helper
   *    can splice directly through a process-private pipe.
   *
   */
c66ab6fa7   Jens Axboe   splice: abstract ...
1017
1018
1019
1020
1021
1022
1023
1024
  long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
  		      size_t len, unsigned int flags)
  {
  	struct splice_desc sd = {
  		.len		= len,
  		.total_len	= len,
  		.flags		= flags,
  		.pos		= *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
1025
  		.u.file		= out,
c66ab6fa7   Jens Axboe   splice: abstract ...
1026
  	};
51a92c0f6   Jens Axboe   splice: fix offse...
1027
  	long ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
1028
1029
  
  	ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
51a92c0f6   Jens Axboe   splice: fix offse...
1030
  	if (ret > 0)
a82c53a0e   Tom Zanussi   splice: fix sendf...
1031
  		*ppos = sd.pos;
51a92c0f6   Jens Axboe   splice: fix offse...
1032

c66ab6fa7   Jens Axboe   splice: abstract ...
1033
  	return ret;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1034
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
1035
  /*
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
   * After the inode slimming patch, i_pipe/i_bdev/i_cdev share the same
   * location, so checking ->i_pipe is not enough to verify that this is a
   * pipe.
   */
  static inline struct pipe_inode_info *pipe_info(struct inode *inode)
  {
  	if (S_ISFIFO(inode->i_mode))
  		return inode->i_pipe;
  
  	return NULL;
  }
  
  /*
83f9135bd   Jens Axboe   [PATCH] splice: a...
1049
1050
   * Determine where to splice to/from.
   */
529565dcb   Ingo Molnar   [PATCH] splice: a...
1051
1052
1053
  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...
1054
  {
3a326a2ce   Ingo Molnar   [PATCH] introduce...
1055
  	struct pipe_inode_info *pipe;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1056
  	loff_t offset, *off;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1057
  	long ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
1058

0f7fc9e4d   Josef "Jeff" Sipek   [PATCH] VFS: chan...
1059
  	pipe = pipe_info(in->f_path.dentry->d_inode);
529565dcb   Ingo Molnar   [PATCH] splice: a...
1060
1061
1062
  	if (pipe) {
  		if (off_in)
  			return -ESPIPE;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1063
1064
1065
  		if (off_out) {
  			if (out->f_op->llseek == no_llseek)
  				return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1066
  			if (copy_from_user(&offset, off_out, sizeof(loff_t)))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1067
  				return -EFAULT;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1068
1069
1070
  			off = &offset;
  		} else
  			off = &out->f_pos;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1071

a4514ebd8   Jens Axboe   [PATCH] splice: o...
1072
1073
1074
1075
1076
1077
  		ret = do_splice_from(pipe, out, off, len, flags);
  
  		if (off_out && copy_to_user(off_out, off, sizeof(loff_t)))
  			ret = -EFAULT;
  
  		return ret;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1078
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1079

0f7fc9e4d   Josef "Jeff" Sipek   [PATCH] VFS: chan...
1080
  	pipe = pipe_info(out->f_path.dentry->d_inode);
529565dcb   Ingo Molnar   [PATCH] splice: a...
1081
1082
1083
  	if (pipe) {
  		if (off_out)
  			return -ESPIPE;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1084
1085
1086
  		if (off_in) {
  			if (in->f_op->llseek == no_llseek)
  				return -EINVAL;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1087
  			if (copy_from_user(&offset, off_in, sizeof(loff_t)))
b92ce5589   Jens Axboe   [PATCH] splice: a...
1088
  				return -EFAULT;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1089
1090
1091
  			off = &offset;
  		} else
  			off = &in->f_pos;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1092

a4514ebd8   Jens Axboe   [PATCH] splice: o...
1093
1094
1095
1096
1097
1098
  		ret = do_splice_to(in, off, pipe, len, flags);
  
  		if (off_in && copy_to_user(off_in, off, sizeof(loff_t)))
  			ret = -EFAULT;
  
  		return ret;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1099
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1100
1101
1102
  
  	return -EINVAL;
  }
912d35f86   Jens Axboe   [PATCH] Add suppo...
1103
1104
1105
1106
1107
1108
1109
1110
1111
  /*
   * Map an iov into an array of pages and offset/length tupples. With the
   * partial_page structure, we can map several non-contiguous ranges into
   * our ones pages[] map instead of splitting that operation into pieces.
   * Could easily be exported as a generic helper for other users, in which
   * case one would probably want to add a 'max_nr_pages' parameter as well.
   */
  static int get_iovec_page_array(const struct iovec __user *iov,
  				unsigned int nr_vecs, struct page **pages,
7afa6fd03   Jens Axboe   [PATCH] vmsplice:...
1112
  				struct partial_page *partial, int aligned)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1113
1114
  {
  	int buffers = 0, error = 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1115
1116
  	while (nr_vecs) {
  		unsigned long off, npages;
757239576   Linus Torvalds   Fix possible spli...
1117
  		struct iovec entry;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1118
1119
1120
  		void __user *base;
  		size_t len;
  		int i;
757239576   Linus Torvalds   Fix possible spli...
1121
  		error = -EFAULT;
bc40d73c9   Nick Piggin   splice: use get_u...
1122
  		if (copy_from_user(&entry, iov, sizeof(entry)))
912d35f86   Jens Axboe   [PATCH] Add suppo...
1123
  			break;
757239576   Linus Torvalds   Fix possible spli...
1124
1125
  		base = entry.iov_base;
  		len = entry.iov_len;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1126
1127
1128
  		/*
  		 * Sanity check this iovec. 0 read succeeds.
  		 */
757239576   Linus Torvalds   Fix possible spli...
1129
  		error = 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1130
1131
1132
  		if (unlikely(!len))
  			break;
  		error = -EFAULT;
712a30e63   Bastian Blank   splice: fix user ...
1133
  		if (!access_ok(VERIFY_READ, base, len))
912d35f86   Jens Axboe   [PATCH] Add suppo...
1134
1135
1136
1137
1138
1139
1140
  			break;
  
  		/*
  		 * Get this base offset and number of pages, then map
  		 * in the user pages.
  		 */
  		off = (unsigned long) base & ~PAGE_MASK;
7afa6fd03   Jens Axboe   [PATCH] vmsplice:...
1141
1142
1143
1144
1145
1146
1147
1148
  
  		/*
  		 * If asked for alignment, the offset must be zero and the
  		 * length a multiple of the PAGE_SIZE.
  		 */
  		error = -EINVAL;
  		if (aligned && (off || len & ~PAGE_MASK))
  			break;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1149
1150
1151
  		npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
  		if (npages > PIPE_BUFFERS - buffers)
  			npages = PIPE_BUFFERS - buffers;
bc40d73c9   Nick Piggin   splice: use get_u...
1152
1153
  		error = get_user_pages_fast((unsigned long)base, npages,
  					0, &pages[buffers]);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1154
1155
1156
1157
1158
1159
1160
1161
  
  		if (unlikely(error <= 0))
  			break;
  
  		/*
  		 * Fill this contiguous range into the partial page map.
  		 */
  		for (i = 0; i < error; i++) {
7591489a8   Jens Axboe   [PATCH] vmsplice:...
1162
  			const int plen = min_t(size_t, len, PAGE_SIZE - off);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
  
  			partial[buffers].offset = off;
  			partial[buffers].len = plen;
  
  			off = 0;
  			len -= plen;
  			buffers++;
  		}
  
  		/*
  		 * We didn't complete this iov, stop here since it probably
  		 * means we have to move some of this into a pipe to
  		 * be able to continue.
  		 */
  		if (len)
  			break;
  
  		/*
  		 * Don't continue if we mapped fewer pages than we asked for,
  		 * or if we mapped the max number of pages that we have
  		 * room for.
  		 */
  		if (error < npages || buffers == PIPE_BUFFERS)
  			break;
  
  		nr_vecs--;
  		iov++;
  	}
912d35f86   Jens Axboe   [PATCH] Add suppo...
1191
1192
1193
1194
1195
  	if (buffers)
  		return buffers;
  
  	return error;
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1196
1197
1198
1199
1200
  static int pipe_to_user(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
  			struct splice_desc *sd)
  {
  	char *src;
  	int ret;
cac36bb06   Jens Axboe   pipe: change the ...
1201
  	ret = buf->ops->confirm(pipe, buf);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
  	if (unlikely(ret))
  		return ret;
  
  	/*
  	 * See if we can use the atomic maps, by prefaulting in the
  	 * pages and doing an atomic copy
  	 */
  	if (!fault_in_pages_writeable(sd->u.userptr, sd->len)) {
  		src = buf->ops->map(pipe, buf, 1);
  		ret = __copy_to_user_inatomic(sd->u.userptr, src + buf->offset,
  							sd->len);
  		buf->ops->unmap(pipe, buf, src);
  		if (!ret) {
  			ret = sd->len;
  			goto out;
  		}
  	}
  
  	/*
  	 * No dice, use slow non-atomic map and copy
   	 */
  	src = buf->ops->map(pipe, buf, 0);
  
  	ret = sd->len;
  	if (copy_to_user(sd->u.userptr, src + buf->offset, sd->len))
  		ret = -EFAULT;
6866bef40   Jens Axboe   splice: fix doubl...
1228
  	buf->ops->unmap(pipe, buf, src);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1229
1230
1231
  out:
  	if (ret > 0)
  		sd->u.userptr += ret;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
  	return ret;
  }
  
  /*
   * For lack of a better implementation, implement vmsplice() to userspace
   * as a simple copy of the pipes pages to the user iov.
   */
  static long vmsplice_to_user(struct file *file, const struct iovec __user *iov,
  			     unsigned long nr_segs, unsigned int flags)
  {
  	struct pipe_inode_info *pipe;
  	struct splice_desc sd;
  	ssize_t size;
  	int error;
  	long ret;
  
  	pipe = pipe_info(file->f_path.dentry->d_inode);
  	if (!pipe)
  		return -EBADF;
  
  	if (pipe->inode)
  		mutex_lock(&pipe->inode->i_mutex);
  
  	error = ret = 0;
  	while (nr_segs) {
  		void __user *base;
  		size_t len;
  
  		/*
  		 * Get user address base and length for this iovec.
  		 */
  		error = get_user(base, &iov->iov_base);
  		if (unlikely(error))
  			break;
  		error = get_user(len, &iov->iov_len);
  		if (unlikely(error))
  			break;
  
  		/*
  		 * Sanity check this iovec. 0 read succeeds.
  		 */
  		if (unlikely(!len))
  			break;
  		if (unlikely(!base)) {
  			error = -EFAULT;
  			break;
  		}
8811930dc   Jens Axboe   splice: missing u...
1279
1280
1281
1282
  		if (unlikely(!access_ok(VERIFY_WRITE, base, len))) {
  			error = -EFAULT;
  			break;
  		}
6a14b90bb   Jens Axboe   vmsplice: add vms...
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
  		sd.len = 0;
  		sd.total_len = len;
  		sd.flags = flags;
  		sd.u.userptr = base;
  		sd.pos = 0;
  
  		size = __splice_from_pipe(pipe, &sd, pipe_to_user);
  		if (size < 0) {
  			if (!ret)
  				ret = size;
  
  			break;
  		}
  
  		ret += size;
  
  		if (size < len)
  			break;
  
  		nr_segs--;
  		iov++;
  	}
  
  	if (pipe->inode)
  		mutex_unlock(&pipe->inode->i_mutex);
  
  	if (!ret)
  		ret = error;
  
  	return ret;
  }
912d35f86   Jens Axboe   [PATCH] Add suppo...
1314
1315
1316
1317
  /*
   * 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...
1318
   */
6a14b90bb   Jens Axboe   vmsplice: add vms...
1319
1320
  static long vmsplice_to_pipe(struct file *file, const struct iovec __user *iov,
  			     unsigned long nr_segs, unsigned int flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1321
  {
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1322
  	struct pipe_inode_info *pipe;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1323
1324
1325
1326
1327
1328
1329
  	struct page *pages[PIPE_BUFFERS];
  	struct partial_page partial[PIPE_BUFFERS];
  	struct splice_pipe_desc spd = {
  		.pages = pages,
  		.partial = partial,
  		.flags = flags,
  		.ops = &user_page_pipe_buf_ops,
bbdfc2f70   Jens Axboe   [SPLICE]: Don't a...
1330
  		.spd_release = spd_release_page,
912d35f86   Jens Axboe   [PATCH] Add suppo...
1331
  	};
0f7fc9e4d   Josef "Jeff" Sipek   [PATCH] VFS: chan...
1332
  	pipe = pipe_info(file->f_path.dentry->d_inode);
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1333
  	if (!pipe)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1334
  		return -EBADF;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1335

7afa6fd03   Jens Axboe   [PATCH] vmsplice:...
1336
1337
  	spd.nr_pages = get_iovec_page_array(iov, nr_segs, pages, partial,
  					    flags & SPLICE_F_GIFT);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1338
1339
  	if (spd.nr_pages <= 0)
  		return spd.nr_pages;
00522fb41   Jens Axboe   [PATCH] splice: r...
1340
  	return splice_to_pipe(pipe, &spd);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1341
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
  /*
   * 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...
1358
1359
  SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,
  		unsigned long, nr_segs, unsigned int, flags)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1360
1361
1362
1363
  {
  	struct file *file;
  	long error;
  	int fput;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1364
1365
1366
1367
  	if (unlikely(nr_segs > UIO_MAXIOV))
  		return -EINVAL;
  	else if (unlikely(!nr_segs))
  		return 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1368
1369
1370
1371
  	error = -EBADF;
  	file = fget_light(fd, &fput);
  	if (file) {
  		if (file->f_mode & FMODE_WRITE)
6a14b90bb   Jens Axboe   vmsplice: add vms...
1372
1373
1374
  			error = vmsplice_to_pipe(file, iov, nr_segs, flags);
  		else if (file->f_mode & FMODE_READ)
  			error = vmsplice_to_user(file, iov, nr_segs, flags);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1375
1376
1377
1378
1379
1380
  
  		fput_light(file, fput);
  	}
  
  	return error;
  }
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1381
1382
1383
  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...
1384
1385
1386
1387
1388
1389
1390
1391
1392
  {
  	long error;
  	struct file *in, *out;
  	int fput_in, fput_out;
  
  	if (unlikely(!len))
  		return 0;
  
  	error = -EBADF;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1393
  	in = fget_light(fd_in, &fput_in);
5274f052e   Jens Axboe   [PATCH] Introduce...
1394
1395
  	if (in) {
  		if (in->f_mode & FMODE_READ) {
529565dcb   Ingo Molnar   [PATCH] splice: a...
1396
  			out = fget_light(fd_out, &fput_out);
5274f052e   Jens Axboe   [PATCH] Introduce...
1397
1398
  			if (out) {
  				if (out->f_mode & FMODE_WRITE)
529565dcb   Ingo Molnar   [PATCH] splice: a...
1399
1400
1401
  					error = do_splice(in, off_in,
  							  out, off_out,
  							  len, flags);
5274f052e   Jens Axboe   [PATCH] Introduce...
1402
1403
1404
1405
1406
1407
1408
1409
1410
  				fput_light(out, fput_out);
  			}
  		}
  
  		fput_light(in, fput_in);
  	}
  
  	return error;
  }
70524490e   Jens Axboe   [PATCH] splice: a...
1411
1412
  
  /*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
   * Make sure there's data to read. Wait for input if we can, otherwise
   * return an appropriate error.
   */
  static int link_ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
  {
  	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;
  	mutex_lock(&pipe->inode->i_mutex);
  
  	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);
  	}
  
  	mutex_unlock(&pipe->inode->i_mutex);
  	return ret;
  }
  
  /*
   * Make sure there's writeable room. Wait for room if we can, otherwise
   * return an appropriate error.
   */
  static int link_opipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
  {
  	int ret;
  
  	/*
  	 * Check ->nrbufs without the inode lock first. This function
  	 * is speculative anyways, so missing one is ok.
  	 */
  	if (pipe->nrbufs < PIPE_BUFFERS)
  		return 0;
  
  	ret = 0;
  	mutex_lock(&pipe->inode->i_mutex);
  
  	while (pipe->nrbufs >= PIPE_BUFFERS) {
  		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--;
  	}
  
  	mutex_unlock(&pipe->inode->i_mutex);
  	return ret;
  }
  
  /*
70524490e   Jens Axboe   [PATCH] splice: a...
1492
1493
1494
1495
1496
1497
1498
   * 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...
1499
  	int ret = 0, i = 0, nbuf;
70524490e   Jens Axboe   [PATCH] splice: a...
1500
1501
1502
1503
1504
1505
  
  	/*
  	 * Potential ABBA deadlock, work around it by ordering lock
  	 * grabbing by inode address. Otherwise two different processes
  	 * could deadlock (one doing tee from A -> B, the other from B -> A).
  	 */
62752ee19   Mark Fasheh   [PATCH] Take i_mu...
1506
  	inode_double_lock(ipipe->inode, opipe->inode);
70524490e   Jens Axboe   [PATCH] splice: a...
1507

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1508
  	do {
70524490e   Jens Axboe   [PATCH] splice: a...
1509
1510
1511
1512
1513
1514
  		if (!opipe->readers) {
  			send_sig(SIGPIPE, current, 0);
  			if (!ret)
  				ret = -EPIPE;
  			break;
  		}
70524490e   Jens Axboe   [PATCH] splice: a...
1515

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1516
1517
1518
1519
1520
1521
  		/*
  		 * If we have iterated all input buffers or ran out of
  		 * output room, break.
  		 */
  		if (i >= ipipe->nrbufs || opipe->nrbufs >= PIPE_BUFFERS)
  			break;
70524490e   Jens Axboe   [PATCH] splice: a...
1522

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1523
1524
  		ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (PIPE_BUFFERS - 1));
  		nbuf = (opipe->curbuf + opipe->nrbufs) & (PIPE_BUFFERS - 1);
70524490e   Jens Axboe   [PATCH] splice: a...
1525
1526
  
  		/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1527
1528
  		 * Get a reference to this pipe buffer,
  		 * so we can copy the contents over.
70524490e   Jens Axboe   [PATCH] splice: a...
1529
  		 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1530
1531
1532
1533
  		ibuf->ops->get(ipipe, ibuf);
  
  		obuf = opipe->bufs + nbuf;
  		*obuf = *ibuf;
2a27250e6   Jens Axboe   [PATCH] tee: link...
1534
  		/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1535
1536
  		 * Don't inherit the gift flag, we need to
  		 * prevent multiple steals of this page.
2a27250e6   Jens Axboe   [PATCH] tee: link...
1537
  		 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1538
  		obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
70524490e   Jens Axboe   [PATCH] splice: a...
1539

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1540
1541
  		if (obuf->len > len)
  			obuf->len = len;
70524490e   Jens Axboe   [PATCH] splice: a...
1542

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1543
1544
1545
1546
1547
  		opipe->nrbufs++;
  		ret += obuf->len;
  		len -= obuf->len;
  		i++;
  	} while (len);
70524490e   Jens Axboe   [PATCH] splice: a...
1548

02cf01aea   Jens Axboe   splice: only retu...
1549
1550
1551
1552
1553
1554
  	/*
  	 * 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;
62752ee19   Mark Fasheh   [PATCH] Take i_mu...
1555
  	inode_double_unlock(ipipe->inode, opipe->inode);
70524490e   Jens Axboe   [PATCH] splice: a...
1556

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1557
1558
1559
1560
  	/*
  	 * If we put data in the output pipe, wakeup any potential readers.
  	 */
  	if (ret > 0) {
70524490e   Jens Axboe   [PATCH] splice: a...
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
  		smp_mb();
  		if (waitqueue_active(&opipe->wait))
  			wake_up_interruptible(&opipe->wait);
  		kill_fasync(&opipe->fasync_readers, SIGIO, POLL_IN);
  	}
  
  	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)
  {
0f7fc9e4d   Josef "Jeff" Sipek   [PATCH] VFS: chan...
1579
1580
  	struct pipe_inode_info *ipipe = pipe_info(in->f_path.dentry->d_inode);
  	struct pipe_inode_info *opipe = pipe_info(out->f_path.dentry->d_inode);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1581
  	int ret = -EINVAL;
70524490e   Jens Axboe   [PATCH] splice: a...
1582
1583
  
  	/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1584
1585
  	 * Duplicate the contents of ipipe to opipe without actually
  	 * copying the data.
70524490e   Jens Axboe   [PATCH] splice: a...
1586
  	 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1587
1588
1589
1590
1591
1592
1593
1594
  	if (ipipe && opipe && ipipe != opipe) {
  		/*
  		 * Keep going, unless we encounter an error. The ipipe/opipe
  		 * ordering doesn't really matter.
  		 */
  		ret = link_ipipe_prep(ipipe, flags);
  		if (!ret) {
  			ret = link_opipe_prep(opipe, flags);
02cf01aea   Jens Axboe   splice: only retu...
1595
  			if (!ret)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1596
  				ret = link_pipe(ipipe, opipe, len, flags);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1597
1598
  		}
  	}
70524490e   Jens Axboe   [PATCH] splice: a...
1599

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1600
  	return ret;
70524490e   Jens Axboe   [PATCH] splice: a...
1601
  }
836f92adf   Heiko Carstens   [CVE-2009-0029] S...
1602
  SYSCALL_DEFINE4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags)
70524490e   Jens Axboe   [PATCH] splice: a...
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
  {
  	struct file *in;
  	int error, fput_in;
  
  	if (unlikely(!len))
  		return 0;
  
  	error = -EBADF;
  	in = fget_light(fdin, &fput_in);
  	if (in) {
  		if (in->f_mode & FMODE_READ) {
  			int fput_out;
  			struct file *out = fget_light(fdout, &fput_out);
  
  			if (out) {
  				if (out->f_mode & FMODE_WRITE)
  					error = do_tee(in, out, len, flags);
  				fput_light(out, fput_out);
  			}
  		}
   		fput_light(in, fput_in);
   	}
  
  	return error;
  }