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>
5274f052e   Jens Axboe   [PATCH] Introduce...
24
  #include <linux/mm_inline.h>
5abc97aa2   Jens Axboe   [PATCH] splice: a...
25
  #include <linux/swap.h>
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
26
27
  #include <linux/writeback.h>
  #include <linux/buffer_head.h>
a0f067802   Jeff Garzik   [PATCH] splice ex...
28
  #include <linux/module.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>
5274f052e   Jens Axboe   [PATCH] Introduce...
32

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

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

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

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

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

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

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

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

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

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

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

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

cbb7e577e   Jens Axboe   [PATCH] splice: p...
270
  	index = *ppos >> PAGE_CACHE_SHIFT;
912d35f86   Jens Axboe   [PATCH] Add suppo...
271
  	loff = *ppos & ~PAGE_CACHE_MASK;
d8983910a   Fengguang Wu   readahead: pass r...
272
273
  	req_pages = (len + loff + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
  	nr_pages = min(req_pages, (unsigned)PIPE_BUFFERS);
5274f052e   Jens Axboe   [PATCH] Introduce...
274
275
  
  	/*
eb20796bf   Jens Axboe   [PATCH] splice: m...
276
277
278
  	 * 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...
279
  	index += spd.nr_pages;
82aa5d618   Jens Axboe   [PATCH] splice: f...
280

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

932cc6d4f   Jens Axboe   splice: completel...
289
  	error = 0;
eb20796bf   Jens Axboe   [PATCH] splice: m...
290
  	while (spd.nr_pages < nr_pages) {
82aa5d618   Jens Axboe   [PATCH] splice: f...
291
  		/*
eb20796bf   Jens Axboe   [PATCH] splice: m...
292
293
  		 * Page could be there, find_get_pages_contig() breaks on
  		 * the first hole.
5274f052e   Jens Axboe   [PATCH] Introduce...
294
  		 */
7480a9043   Jens Axboe   [PATCH] splice: s...
295
296
  		page = find_get_page(mapping, index);
  		if (!page) {
e27dedd84   Jens Axboe   [PATCH] splice: c...
297
  			/*
eb20796bf   Jens Axboe   [PATCH] splice: m...
298
  			 * page didn't exist, allocate one.
7480a9043   Jens Axboe   [PATCH] splice: s...
299
300
301
302
303
304
  			 */
  			page = page_cache_alloc_cold(mapping);
  			if (!page)
  				break;
  
  			error = add_to_page_cache_lru(page, mapping, index,
4cd135046   Hugh Dickins   splice: use mappi...
305
  						mapping_gfp_mask(mapping));
7480a9043   Jens Axboe   [PATCH] splice: s...
306
307
  			if (unlikely(error)) {
  				page_cache_release(page);
a0548871e   Jens Axboe   [PATCH] splice: r...
308
309
  				if (error == -EEXIST)
  					continue;
7480a9043   Jens Axboe   [PATCH] splice: s...
310
311
  				break;
  			}
eb20796bf   Jens Axboe   [PATCH] splice: m...
312
313
314
315
316
  			/*
  			 * 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...
317
  		}
eb20796bf   Jens Axboe   [PATCH] splice: m...
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
  		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...
340
  		if (PageReadahead(page))
cf914a7d6   Rusty Russell   readahead: split ...
341
  			page_cache_async_readahead(mapping, &in->f_ra, in,
d8983910a   Fengguang Wu   readahead: pass r...
342
  					page, index, req_pages - page_nr);
a08a166fe   Fengguang Wu   readahead: conver...
343

7480a9043   Jens Axboe   [PATCH] splice: s...
344
345
346
347
  		/*
  		 * If the page isn't uptodate, we may need to start io on it
  		 */
  		if (!PageUptodate(page)) {
c4f895cbe   Jens Axboe   [PATCH] splice: c...
348
349
350
351
  			/*
  			 * If in nonblock mode then dont block on waiting
  			 * for an in-flight io page
  			 */
9ae9d68cb   Fengguang Wu   [PATCH] splice():...
352
  			if (flags & SPLICE_F_NONBLOCK) {
529ae9aaa   Nick Piggin   mm: rename page t...
353
  				if (!trylock_page(page)) {
8191ecd1d   Jens Axboe   splice: fix infin...
354
  					error = -EAGAIN;
9ae9d68cb   Fengguang Wu   [PATCH] splice():...
355
  					break;
8191ecd1d   Jens Axboe   splice: fix infin...
356
  				}
9ae9d68cb   Fengguang Wu   [PATCH] splice():...
357
358
  			} else
  				lock_page(page);
7480a9043   Jens Axboe   [PATCH] splice: s...
359
360
  
  			/*
32502b841   Miklos Szeredi   splice: fix gener...
361
362
363
364
  			 * 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...
365
366
367
  			 */
  			if (!page->mapping) {
  				unlock_page(page);
32502b841   Miklos Szeredi   splice: fix gener...
368
369
370
371
372
373
374
375
376
  				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...
377
378
379
380
381
382
383
384
  			}
  			/*
  			 * page was already under io and is now done, great
  			 */
  			if (PageUptodate(page)) {
  				unlock_page(page);
  				goto fill_it;
  			}
5274f052e   Jens Axboe   [PATCH] Introduce...
385

7480a9043   Jens Axboe   [PATCH] splice: s...
386
387
388
389
  			/*
  			 * need to read in the page
  			 */
  			error = mapping->a_ops->readpage(in, page);
5274f052e   Jens Axboe   [PATCH] Introduce...
390
  			if (unlikely(error)) {
eb20796bf   Jens Axboe   [PATCH] splice: m...
391
392
393
394
395
396
  				/*
  				 * 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...
397
  				if (error == AOP_TRUNCATED_PAGE)
eb20796bf   Jens Axboe   [PATCH] splice: m...
398
  					error = 0;
5274f052e   Jens Axboe   [PATCH] Introduce...
399
400
  				break;
  			}
620a324b7   Jens Axboe   splice: __generic...
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
  		}
  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...
417
418
  
  			/*
620a324b7   Jens Axboe   splice: __generic...
419
  			 * max good bytes in this page
91ad66ef4   Jens Axboe   [PATCH] splice: c...
420
  			 */
620a324b7   Jens Axboe   splice: __generic...
421
422
  			plen = ((isize - 1) & ~PAGE_CACHE_MASK) + 1;
  			if (plen <= loff)
91ad66ef4   Jens Axboe   [PATCH] splice: c...
423
  				break;
91ad66ef4   Jens Axboe   [PATCH] splice: c...
424
425
  
  			/*
620a324b7   Jens Axboe   splice: __generic...
426
  			 * force quit after adding this page
91ad66ef4   Jens Axboe   [PATCH] splice: c...
427
  			 */
620a324b7   Jens Axboe   splice: __generic...
428
429
  			this_len = min(this_len, plen - loff);
  			len = this_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
430
  		}
620a324b7   Jens Axboe   splice: __generic...
431

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

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

7480a9043   Jens Axboe   [PATCH] splice: s...
450
  	return error;
5274f052e   Jens Axboe   [PATCH] Introduce...
451
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
452
453
454
  /**
   * generic_file_splice_read - splice data from file to a pipe
   * @in:		file to splice from
932cc6d4f   Jens Axboe   splice: completel...
455
   * @ppos:	position in @in
83f9135bd   Jens Axboe   [PATCH] splice: a...
456
457
458
459
   * @pipe:	pipe to splice to
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
460
461
462
463
464
   * 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...
465
   */
cbb7e577e   Jens Axboe   [PATCH] splice: p...
466
467
468
  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...
469
  {
d366d3988   Jens Axboe   splice: move inod...
470
  	loff_t isize, left;
8191ecd1d   Jens Axboe   splice: fix infin...
471
  	int ret;
d366d3988   Jens Axboe   splice: move inod...
472
473
474
475
476
477
478
479
  
  	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...
480

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

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

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

016b661e2   Jens Axboe   [PATCH] splice: f...
507
  	return ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
  }
  
  /*
   * 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...
523
524
525
526
527
528
   * 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...
529
   */
76ad4d111   Jens Axboe   [PATCH] splice: r...
530
  static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
5274f052e   Jens Axboe   [PATCH] Introduce...
531
532
  			struct splice_desc *sd)
  {
6a14b90bb   Jens Axboe   vmsplice: add vms...
533
  	struct file *file = sd->u.file;
5274f052e   Jens Axboe   [PATCH] Introduce...
534
  	struct address_space *mapping = file->f_mapping;
016b661e2   Jens Axboe   [PATCH] splice: f...
535
  	unsigned int offset, this_len;
5274f052e   Jens Axboe   [PATCH] Introduce...
536
  	struct page *page;
afddba49d   Nick Piggin   fs: introduce wri...
537
  	void *fsdata;
3e7ee3e7b   Jens Axboe   [PATCH] splice: f...
538
  	int ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
539
540
  
  	/*
49d0b21be   Jens Axboe   [PATCH] splice: o...
541
  	 * make sure the data in this buffer is uptodate
5274f052e   Jens Axboe   [PATCH] Introduce...
542
  	 */
cac36bb06   Jens Axboe   pipe: change the ...
543
  	ret = buf->ops->confirm(pipe, buf);
f84d75199   Jens Axboe   [PATCH] pipe: int...
544
545
  	if (unlikely(ret))
  		return ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
546

5274f052e   Jens Axboe   [PATCH] Introduce...
547
  	offset = sd->pos & ~PAGE_CACHE_MASK;
016b661e2   Jens Axboe   [PATCH] splice: f...
548
549
550
  	this_len = sd->len;
  	if (this_len + offset > PAGE_CACHE_SIZE)
  		this_len = PAGE_CACHE_SIZE - offset;
afddba49d   Nick Piggin   fs: introduce wri...
551
552
553
554
  	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...
555

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

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

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

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

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

932cc6d4f   Jens Axboe   splice: completel...
667
668
669
670
671
672
673
674
675
676
677
678
679
680
  /**
   * 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...
681
682
683
684
685
686
  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 ...
687
688
689
690
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
691
  		.u.file = out,
c66ab6fa7   Jens Axboe   splice: abstract ...
692
  	};
6da618098   Mark Fasheh   [PATCH] Introduce...
693
694
695
696
697
698
699
700
  
  	/*
  	 * The actor worker might be calling ->prepare_write and
  	 * ->commit_write. Most of the time, these expect i_mutex to
  	 * 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 ...
701
  	ret = __splice_from_pipe(pipe, &sd, actor);
6da618098   Mark Fasheh   [PATCH] Introduce...
702
703
704
705
706
707
708
709
710
  	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...
711
   * @ppos:	position in @out
6da618098   Mark Fasheh   [PATCH] Introduce...
712
713
714
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
715
716
717
718
   * 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...
719
720
721
722
723
724
725
726
   *
   */
  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 ...
727
728
729
730
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
6a14b90bb   Jens Axboe   vmsplice: add vms...
731
  		.u.file = out,
c66ab6fa7   Jens Axboe   splice: abstract ...
732
  	};
6da618098   Mark Fasheh   [PATCH] Introduce...
733
734
  	ssize_t ret;
  	int err;
2f1936b87   Miklos Szeredi   [patch 3/5] vfs: ...
735
  	err = file_remove_suid(out);
8c34e2d63   Jens Axboe   [PATCH] Remove SU...
736
737
  	if (unlikely(err))
  		return err;
c66ab6fa7   Jens Axboe   splice: abstract ...
738
  	ret = __splice_from_pipe(pipe, &sd, pipe_to_file);
6da618098   Mark Fasheh   [PATCH] Introduce...
739
  	if (ret > 0) {
17ee4f49a   Jens Axboe   splice: adjust ba...
740
  		unsigned long nr_pages;
6da618098   Mark Fasheh   [PATCH] Introduce...
741
  		*ppos += ret;
17ee4f49a   Jens Axboe   splice: adjust ba...
742
  		nr_pages = (ret + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
6da618098   Mark Fasheh   [PATCH] Introduce...
743
744
745
746
747
748
749
750
751
752
753
754
  
  		/*
  		 * 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...
755
  		balance_dirty_pages_ratelimited_nr(mapping, nr_pages);
6da618098   Mark Fasheh   [PATCH] Introduce...
756
757
758
759
760
761
  	}
  
  	return ret;
  }
  
  EXPORT_SYMBOL(generic_file_splice_write_nolock);
83f9135bd   Jens Axboe   [PATCH] splice: a...
762
763
  /**
   * generic_file_splice_write - splice data from a pipe to a file
3a326a2ce   Ingo Molnar   [PATCH] introduce...
764
   * @pipe:	pipe info
83f9135bd   Jens Axboe   [PATCH] splice: a...
765
   * @out:	file to write to
932cc6d4f   Jens Axboe   splice: completel...
766
   * @ppos:	position in @out
83f9135bd   Jens Axboe   [PATCH] splice: a...
767
768
769
   * @len:	number of bytes to splice
   * @flags:	splice modifier flags
   *
932cc6d4f   Jens Axboe   splice: completel...
770
771
772
   * 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...
773
774
   *
   */
3a326a2ce   Ingo Molnar   [PATCH] introduce...
775
776
  ssize_t
  generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
cbb7e577e   Jens Axboe   [PATCH] splice: p...
777
  			  loff_t *ppos, size_t len, unsigned int flags)
5274f052e   Jens Axboe   [PATCH] Introduce...
778
  {
4f6f0bd2f   Jens Axboe   [PATCH] splice: i...
779
  	struct address_space *mapping = out->f_mapping;
8c34e2d63   Jens Axboe   [PATCH] Remove SU...
780
  	struct inode *inode = mapping->host;
7f3d4ee10   Miklos Szeredi   vfs: splice remov...
781
782
783
784
785
786
  	struct splice_desc sd = {
  		.total_len = len,
  		.flags = flags,
  		.pos = *ppos,
  		.u.file = out,
  	};
3a326a2ce   Ingo Molnar   [PATCH] introduce...
787
  	ssize_t ret;
7f3d4ee10   Miklos Szeredi   vfs: splice remov...
788
  	inode_double_lock(inode, pipe->inode);
2f1936b87   Miklos Szeredi   [patch 3/5] vfs: ...
789
  	ret = file_remove_suid(out);
7f3d4ee10   Miklos Szeredi   vfs: splice remov...
790
791
792
  	if (likely(!ret))
  		ret = __splice_from_pipe(pipe, &sd, pipe_to_file);
  	inode_double_unlock(inode, pipe->inode);
a4514ebd8   Jens Axboe   [PATCH] splice: o...
793
  	if (ret > 0) {
17ee4f49a   Jens Axboe   splice: adjust ba...
794
  		unsigned long nr_pages;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
795
  		*ppos += ret;
17ee4f49a   Jens Axboe   splice: adjust ba...
796
  		nr_pages = (ret + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
797
798
799
800
801
802
  
  		/*
  		 * 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...
803
  			int err;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
804
805
806
807
  			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...
808

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

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

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

a82c53a0e   Tom Zanussi   splice: fix sendf...
963
964
  		if (ret < read_len) {
  			sd->pos = prev_pos + ret;
51a92c0f6   Jens Axboe   splice: fix offse...
965
  			goto out_release;
a82c53a0e   Tom Zanussi   splice: fix sendf...
966
  		}
b92ce5589   Jens Axboe   [PATCH] splice: a...
967
  	}
9e97198db   Jens Axboe   splice: fix probl...
968
  done:
b92ce5589   Jens Axboe   [PATCH] splice: a...
969
  	pipe->nrbufs = pipe->curbuf = 0;
808487085   Jens Axboe   splice: always up...
970
  	file_accessed(in);
b92ce5589   Jens Axboe   [PATCH] splice: a...
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
  	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...
986

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

9e97198db   Jens Axboe   splice: fix probl...
990
  	goto done;
c66ab6fa7   Jens Axboe   splice: abstract ...
991
992
993
994
995
996
  }
  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...
997
  	struct file *file = sd->u.file;
c66ab6fa7   Jens Axboe   splice: abstract ...
998
999
1000
  
  	return do_splice_from(pipe, file, &sd->pos, sd->total_len, sd->flags);
  }
932cc6d4f   Jens Axboe   splice: completel...
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
  /**
   * 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 ...
1016
1017
1018
1019
1020
1021
1022
1023
  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...
1024
  		.u.file		= out,
c66ab6fa7   Jens Axboe   splice: abstract ...
1025
  	};
51a92c0f6   Jens Axboe   splice: fix offse...
1026
  	long ret;
c66ab6fa7   Jens Axboe   splice: abstract ...
1027
1028
  
  	ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
51a92c0f6   Jens Axboe   splice: fix offse...
1029
  	if (ret > 0)
a82c53a0e   Tom Zanussi   splice: fix sendf...
1030
  		*ppos = sd.pos;
51a92c0f6   Jens Axboe   splice: fix offse...
1031

c66ab6fa7   Jens Axboe   splice: abstract ...
1032
  	return ret;
b92ce5589   Jens Axboe   [PATCH] splice: a...
1033
  }
83f9135bd   Jens Axboe   [PATCH] splice: a...
1034
  /*
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
   * 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...
1048
1049
   * Determine where to splice to/from.
   */
529565dcb   Ingo Molnar   [PATCH] splice: a...
1050
1051
1052
  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...
1053
  {
3a326a2ce   Ingo Molnar   [PATCH] introduce...
1054
  	struct pipe_inode_info *pipe;
cbb7e577e   Jens Axboe   [PATCH] splice: p...
1055
  	loff_t offset, *off;
a4514ebd8   Jens Axboe   [PATCH] splice: o...
1056
  	long ret;
5274f052e   Jens Axboe   [PATCH] Introduce...
1057

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

a4514ebd8   Jens Axboe   [PATCH] splice: o...
1071
1072
1073
1074
1075
1076
  		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...
1077
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1078

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

a4514ebd8   Jens Axboe   [PATCH] splice: o...
1092
1093
1094
1095
1096
1097
  		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...
1098
  	}
5274f052e   Jens Axboe   [PATCH] Introduce...
1099
1100
1101
  
  	return -EINVAL;
  }
912d35f86   Jens Axboe   [PATCH] Add suppo...
1102
1103
1104
1105
1106
1107
1108
1109
1110
  /*
   * 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:...
1111
  				struct partial_page *partial, int aligned)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1112
1113
  {
  	int buffers = 0, error = 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1114
1115
  	while (nr_vecs) {
  		unsigned long off, npages;
757239576   Linus Torvalds   Fix possible spli...
1116
  		struct iovec entry;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1117
1118
1119
  		void __user *base;
  		size_t len;
  		int i;
757239576   Linus Torvalds   Fix possible spli...
1120
  		error = -EFAULT;
bc40d73c9   Nick Piggin   splice: use get_u...
1121
  		if (copy_from_user(&entry, iov, sizeof(entry)))
912d35f86   Jens Axboe   [PATCH] Add suppo...
1122
  			break;
757239576   Linus Torvalds   Fix possible spli...
1123
1124
  		base = entry.iov_base;
  		len = entry.iov_len;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1125
1126
1127
  		/*
  		 * Sanity check this iovec. 0 read succeeds.
  		 */
757239576   Linus Torvalds   Fix possible spli...
1128
  		error = 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1129
1130
1131
  		if (unlikely(!len))
  			break;
  		error = -EFAULT;
712a30e63   Bastian Blank   splice: fix user ...
1132
  		if (!access_ok(VERIFY_READ, base, len))
912d35f86   Jens Axboe   [PATCH] Add suppo...
1133
1134
1135
1136
1137
1138
1139
  			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:...
1140
1141
1142
1143
1144
1145
1146
1147
  
  		/*
  		 * 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...
1148
1149
1150
  		npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
  		if (npages > PIPE_BUFFERS - buffers)
  			npages = PIPE_BUFFERS - buffers;
bc40d73c9   Nick Piggin   splice: use get_u...
1151
1152
  		error = get_user_pages_fast((unsigned long)base, npages,
  					0, &pages[buffers]);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1153
1154
1155
1156
1157
1158
1159
1160
  
  		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:...
1161
  			const int plen = min_t(size_t, len, PAGE_SIZE - off);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1162
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
  
  			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...
1190
1191
1192
1193
1194
  	if (buffers)
  		return buffers;
  
  	return error;
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1195
1196
1197
1198
1199
  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 ...
1200
  	ret = buf->ops->confirm(pipe, buf);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1201
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
  	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...
1227
  	buf->ops->unmap(pipe, buf, src);
6a14b90bb   Jens Axboe   vmsplice: add vms...
1228
1229
1230
  out:
  	if (ret > 0)
  		sd->u.userptr += ret;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1231
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
  	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...
1278
1279
1280
1281
  		if (unlikely(!access_ok(VERIFY_WRITE, base, len))) {
  			error = -EFAULT;
  			break;
  		}
6a14b90bb   Jens Axboe   vmsplice: add vms...
1282
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
  		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...
1313
1314
1315
1316
  /*
   * 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...
1317
   */
6a14b90bb   Jens Axboe   vmsplice: add vms...
1318
1319
  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...
1320
  {
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1321
  	struct pipe_inode_info *pipe;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1322
1323
1324
1325
1326
1327
1328
  	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...
1329
  		.spd_release = spd_release_page,
912d35f86   Jens Axboe   [PATCH] Add suppo...
1330
  	};
0f7fc9e4d   Josef "Jeff" Sipek   [PATCH] VFS: chan...
1331
  	pipe = pipe_info(file->f_path.dentry->d_inode);
ddac0d39c   Jens Axboe   [PATCH] splice: f...
1332
  	if (!pipe)
912d35f86   Jens Axboe   [PATCH] Add suppo...
1333
  		return -EBADF;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1334

7afa6fd03   Jens Axboe   [PATCH] vmsplice:...
1335
1336
  	spd.nr_pages = get_iovec_page_array(iov, nr_segs, pages, partial,
  					    flags & SPLICE_F_GIFT);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1337
1338
  	if (spd.nr_pages <= 0)
  		return spd.nr_pages;
00522fb41   Jens Axboe   [PATCH] splice: r...
1339
  	return splice_to_pipe(pipe, &spd);
912d35f86   Jens Axboe   [PATCH] Add suppo...
1340
  }
6a14b90bb   Jens Axboe   vmsplice: add vms...
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
  /*
   * 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().
   *
   */
912d35f86   Jens Axboe   [PATCH] Add suppo...
1357
1358
1359
1360
1361
1362
  asmlinkage long sys_vmsplice(int fd, const struct iovec __user *iov,
  			     unsigned long nr_segs, unsigned int flags)
  {
  	struct file *file;
  	long error;
  	int fput;
6a14b90bb   Jens Axboe   vmsplice: add vms...
1363
1364
1365
1366
  	if (unlikely(nr_segs > UIO_MAXIOV))
  		return -EINVAL;
  	else if (unlikely(!nr_segs))
  		return 0;
912d35f86   Jens Axboe   [PATCH] Add suppo...
1367
1368
1369
1370
  	error = -EBADF;
  	file = fget_light(fd, &fput);
  	if (file) {
  		if (file->f_mode & FMODE_WRITE)
6a14b90bb   Jens Axboe   vmsplice: add vms...
1371
1372
1373
  			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...
1374
1375
1376
1377
1378
1379
  
  		fput_light(file, fput);
  	}
  
  	return error;
  }
529565dcb   Ingo Molnar   [PATCH] splice: a...
1380
1381
1382
  asmlinkage long sys_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...
1383
1384
1385
1386
1387
1388
1389
1390
1391
  {
  	long error;
  	struct file *in, *out;
  	int fput_in, fput_out;
  
  	if (unlikely(!len))
  		return 0;
  
  	error = -EBADF;
529565dcb   Ingo Molnar   [PATCH] splice: a...
1392
  	in = fget_light(fd_in, &fput_in);
5274f052e   Jens Axboe   [PATCH] Introduce...
1393
1394
  	if (in) {
  		if (in->f_mode & FMODE_READ) {
529565dcb   Ingo Molnar   [PATCH] splice: a...
1395
  			out = fget_light(fd_out, &fput_out);
5274f052e   Jens Axboe   [PATCH] Introduce...
1396
1397
  			if (out) {
  				if (out->f_mode & FMODE_WRITE)
529565dcb   Ingo Molnar   [PATCH] splice: a...
1398
1399
1400
  					error = do_splice(in, off_in,
  							  out, off_out,
  							  len, flags);
5274f052e   Jens Axboe   [PATCH] Introduce...
1401
1402
1403
1404
1405
1406
1407
1408
1409
  				fput_light(out, fput_out);
  			}
  		}
  
  		fput_light(in, fput_in);
  	}
  
  	return error;
  }
70524490e   Jens Axboe   [PATCH] splice: a...
1410
1411
  
  /*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1412
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
   * 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...
1491
1492
1493
1494
1495
1496
1497
   * 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...
1498
  	int ret = 0, i = 0, nbuf;
70524490e   Jens Axboe   [PATCH] splice: a...
1499
1500
1501
1502
1503
1504
  
  	/*
  	 * 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...
1505
  	inode_double_lock(ipipe->inode, opipe->inode);
70524490e   Jens Axboe   [PATCH] splice: a...
1506

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

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1515
1516
1517
1518
1519
1520
  		/*
  		 * 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...
1521

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

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

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

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

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1556
1557
1558
1559
  	/*
  	 * If we put data in the output pipe, wakeup any potential readers.
  	 */
  	if (ret > 0) {
70524490e   Jens Axboe   [PATCH] splice: a...
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
  		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...
1578
1579
  	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...
1580
  	int ret = -EINVAL;
70524490e   Jens Axboe   [PATCH] splice: a...
1581
1582
  
  	/*
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1583
1584
  	 * Duplicate the contents of ipipe to opipe without actually
  	 * copying the data.
70524490e   Jens Axboe   [PATCH] splice: a...
1585
  	 */
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1586
1587
1588
1589
1590
1591
1592
1593
  	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...
1594
  			if (!ret)
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1595
  				ret = link_pipe(ipipe, opipe, len, flags);
aadd06e5c   Jens Axboe   [PATCH] splice: f...
1596
1597
  		}
  	}
70524490e   Jens Axboe   [PATCH] splice: a...
1598

aadd06e5c   Jens Axboe   [PATCH] splice: f...
1599
  	return ret;
70524490e   Jens Axboe   [PATCH] splice: a...
1600
1601
1602
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
  }
  
  asmlinkage long sys_tee(int fdin, int fdout, size_t len, unsigned int flags)
  {
  	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;
  }