Branch data Line data Source code
1 : : /*
2 : : FUSE: Filesystem in Userspace
3 : : Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu>
4 : :
5 : : This program can be distributed under the terms of the GNU GPL.
6 : : See the file COPYING.
7 : : */
8 : :
9 : : #include "fuse_i.h"
10 : :
11 : : #include <linux/pagemap.h>
12 : : #include <linux/slab.h>
13 : : #include <linux/kernel.h>
14 : : #include <linux/sched.h>
15 : : #include <linux/sched/signal.h>
16 : : #include <linux/module.h>
17 : : #include <linux/compat.h>
18 : : #include <linux/swap.h>
19 : : #include <linux/falloc.h>
20 : : #include <linux/uio.h>
21 : : #include <linux/fs.h>
22 : :
23 : : static struct page **fuse_pages_alloc(unsigned int npages, gfp_t flags,
24 : : struct fuse_page_desc **desc)
25 : : {
26 : : struct page **pages;
27 : :
28 : 0 : pages = kzalloc(npages * (sizeof(struct page *) +
29 : : sizeof(struct fuse_page_desc)), flags);
30 : 0 : *desc = (void *) (pages + npages);
31 : :
32 : : return pages;
33 : : }
34 : :
35 : 0 : static int fuse_send_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
36 : : int opcode, struct fuse_open_out *outargp)
37 : : {
38 : : struct fuse_open_in inarg;
39 : 0 : FUSE_ARGS(args);
40 : :
41 : 0 : memset(&inarg, 0, sizeof(inarg));
42 : 0 : inarg.flags = file->f_flags & ~(O_CREAT | O_EXCL | O_NOCTTY);
43 [ # # ]: 0 : if (!fc->atomic_o_trunc)
44 : 0 : inarg.flags &= ~O_TRUNC;
45 : 0 : args.opcode = opcode;
46 : 0 : args.nodeid = nodeid;
47 : 0 : args.in_numargs = 1;
48 : 0 : args.in_args[0].size = sizeof(inarg);
49 : 0 : args.in_args[0].value = &inarg;
50 : 0 : args.out_numargs = 1;
51 : 0 : args.out_args[0].size = sizeof(*outargp);
52 : 0 : args.out_args[0].value = outargp;
53 : :
54 : 0 : return fuse_simple_request(fc, &args);
55 : : }
56 : :
57 : : struct fuse_release_args {
58 : : struct fuse_args args;
59 : : struct fuse_release_in inarg;
60 : : struct inode *inode;
61 : : };
62 : :
63 : 0 : struct fuse_file *fuse_file_alloc(struct fuse_conn *fc)
64 : : {
65 : : struct fuse_file *ff;
66 : :
67 : 0 : ff = kzalloc(sizeof(struct fuse_file), GFP_KERNEL_ACCOUNT);
68 [ # # ]: 0 : if (unlikely(!ff))
69 : : return NULL;
70 : :
71 : 0 : ff->fc = fc;
72 : 0 : ff->release_args = kzalloc(sizeof(*ff->release_args),
73 : : GFP_KERNEL_ACCOUNT);
74 [ # # ]: 0 : if (!ff->release_args) {
75 : 0 : kfree(ff);
76 : 0 : return NULL;
77 : : }
78 : :
79 : 0 : INIT_LIST_HEAD(&ff->write_entry);
80 : 0 : mutex_init(&ff->readdir.lock);
81 : : refcount_set(&ff->count, 1);
82 : 0 : RB_CLEAR_NODE(&ff->polled_node);
83 : 0 : init_waitqueue_head(&ff->poll_wait);
84 : :
85 : 0 : ff->kh = atomic64_inc_return(&fc->khctr);
86 : :
87 : 0 : return ff;
88 : : }
89 : :
90 : 0 : void fuse_file_free(struct fuse_file *ff)
91 : : {
92 : 0 : kfree(ff->release_args);
93 : : mutex_destroy(&ff->readdir.lock);
94 : 0 : kfree(ff);
95 : 0 : }
96 : :
97 : : static struct fuse_file *fuse_file_get(struct fuse_file *ff)
98 : : {
99 : 0 : refcount_inc(&ff->count);
100 : : return ff;
101 : : }
102 : :
103 : 0 : static void fuse_release_end(struct fuse_conn *fc, struct fuse_args *args,
104 : : int error)
105 : : {
106 : : struct fuse_release_args *ra = container_of(args, typeof(*ra), args);
107 : :
108 : 0 : iput(ra->inode);
109 : 0 : kfree(ra);
110 : 0 : }
111 : :
112 : 0 : static void fuse_file_put(struct fuse_file *ff, bool sync, bool isdir)
113 : : {
114 [ # # ]: 0 : if (refcount_dec_and_test(&ff->count)) {
115 : 0 : struct fuse_args *args = &ff->release_args->args;
116 : :
117 [ # # # # ]: 0 : if (isdir ? ff->fc->no_opendir : ff->fc->no_open) {
118 : : /* Do nothing when client does not implement 'open' */
119 : : fuse_release_end(ff->fc, args, 0);
120 [ # # ]: 0 : } else if (sync) {
121 : 0 : fuse_simple_request(ff->fc, args);
122 : : fuse_release_end(ff->fc, args, 0);
123 : : } else {
124 : 0 : args->end = fuse_release_end;
125 [ # # ]: 0 : if (fuse_simple_background(ff->fc, args,
126 : : GFP_KERNEL | __GFP_NOFAIL))
127 : : fuse_release_end(ff->fc, args, -ENOTCONN);
128 : : }
129 : 0 : kfree(ff);
130 : : }
131 : 0 : }
132 : :
133 : 0 : int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
134 : : bool isdir)
135 : : {
136 : : struct fuse_file *ff;
137 [ # # ]: 0 : int opcode = isdir ? FUSE_OPENDIR : FUSE_OPEN;
138 : :
139 : 0 : ff = fuse_file_alloc(fc);
140 [ # # ]: 0 : if (!ff)
141 : : return -ENOMEM;
142 : :
143 : 0 : ff->fh = 0;
144 : : /* Default for no-open */
145 [ # # ]: 0 : ff->open_flags = FOPEN_KEEP_CACHE | (isdir ? FOPEN_CACHE_DIR : 0);
146 [ # # # # ]: 0 : if (isdir ? !fc->no_opendir : !fc->no_open) {
147 : : struct fuse_open_out outarg;
148 : : int err;
149 : :
150 : 0 : err = fuse_send_open(fc, nodeid, file, opcode, &outarg);
151 [ # # ]: 0 : if (!err) {
152 : 0 : ff->fh = outarg.fh;
153 : 0 : ff->open_flags = outarg.open_flags;
154 : :
155 [ # # ]: 0 : } else if (err != -ENOSYS) {
156 : : fuse_file_free(ff);
157 : 0 : return err;
158 : : } else {
159 [ # # ]: 0 : if (isdir)
160 : 0 : fc->no_opendir = 1;
161 : : else
162 : 0 : fc->no_open = 1;
163 : : }
164 : : }
165 : :
166 [ # # ]: 0 : if (isdir)
167 : 0 : ff->open_flags &= ~FOPEN_DIRECT_IO;
168 : :
169 : 0 : ff->nodeid = nodeid;
170 : 0 : file->private_data = ff;
171 : :
172 : 0 : return 0;
173 : : }
174 : : EXPORT_SYMBOL_GPL(fuse_do_open);
175 : :
176 : 0 : static void fuse_link_write_file(struct file *file)
177 : : {
178 : : struct inode *inode = file_inode(file);
179 : : struct fuse_inode *fi = get_fuse_inode(inode);
180 : 0 : struct fuse_file *ff = file->private_data;
181 : : /*
182 : : * file may be written through mmap, so chain it onto the
183 : : * inodes's write_file list
184 : : */
185 : : spin_lock(&fi->lock);
186 [ # # ]: 0 : if (list_empty(&ff->write_entry))
187 : 0 : list_add(&ff->write_entry, &fi->write_files);
188 : : spin_unlock(&fi->lock);
189 : 0 : }
190 : :
191 : 0 : void fuse_finish_open(struct inode *inode, struct file *file)
192 : : {
193 : 0 : struct fuse_file *ff = file->private_data;
194 : : struct fuse_conn *fc = get_fuse_conn(inode);
195 : :
196 [ # # ]: 0 : if (!(ff->open_flags & FOPEN_KEEP_CACHE))
197 : 0 : invalidate_inode_pages2(inode->i_mapping);
198 [ # # ]: 0 : if (ff->open_flags & FOPEN_STREAM)
199 : 0 : stream_open(inode, file);
200 [ # # ]: 0 : else if (ff->open_flags & FOPEN_NONSEEKABLE)
201 : 0 : nonseekable_open(inode, file);
202 [ # # # # ]: 0 : if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) {
203 : : struct fuse_inode *fi = get_fuse_inode(inode);
204 : :
205 : : spin_lock(&fi->lock);
206 : 0 : fi->attr_version = atomic64_inc_return(&fc->attr_version);
207 : : i_size_write(inode, 0);
208 : : spin_unlock(&fi->lock);
209 : 0 : fuse_invalidate_attr(inode);
210 [ # # ]: 0 : if (fc->writeback_cache)
211 : 0 : file_update_time(file);
212 : : }
213 [ # # # # ]: 0 : if ((file->f_mode & FMODE_WRITE) && fc->writeback_cache)
214 : 0 : fuse_link_write_file(file);
215 : 0 : }
216 : :
217 : 0 : int fuse_open_common(struct inode *inode, struct file *file, bool isdir)
218 : : {
219 : : struct fuse_conn *fc = get_fuse_conn(inode);
220 : : int err;
221 : 0 : bool is_wb_truncate = (file->f_flags & O_TRUNC) &&
222 [ # # # # ]: 0 : fc->atomic_o_trunc &&
223 : : fc->writeback_cache;
224 : :
225 : 0 : err = generic_file_open(inode, file);
226 [ # # ]: 0 : if (err)
227 : : return err;
228 : :
229 [ # # ]: 0 : if (is_wb_truncate) {
230 : : inode_lock(inode);
231 : 0 : fuse_set_nowrite(inode);
232 : : }
233 : :
234 : 0 : err = fuse_do_open(fc, get_node_id(inode), file, isdir);
235 : :
236 [ # # ]: 0 : if (!err)
237 : 0 : fuse_finish_open(inode, file);
238 : :
239 [ # # ]: 0 : if (is_wb_truncate) {
240 : 0 : fuse_release_nowrite(inode);
241 : : inode_unlock(inode);
242 : : }
243 : :
244 : 0 : return err;
245 : : }
246 : :
247 : 0 : static void fuse_prepare_release(struct fuse_inode *fi, struct fuse_file *ff,
248 : : int flags, int opcode)
249 : : {
250 : 0 : struct fuse_conn *fc = ff->fc;
251 : 0 : struct fuse_release_args *ra = ff->release_args;
252 : :
253 : : /* Inode is NULL on error path of fuse_create_open() */
254 [ # # ]: 0 : if (likely(fi)) {
255 : : spin_lock(&fi->lock);
256 : : list_del(&ff->write_entry);
257 : : spin_unlock(&fi->lock);
258 : : }
259 : : spin_lock(&fc->lock);
260 [ # # ]: 0 : if (!RB_EMPTY_NODE(&ff->polled_node))
261 : 0 : rb_erase(&ff->polled_node, &fc->polled_files);
262 : : spin_unlock(&fc->lock);
263 : :
264 : 0 : wake_up_interruptible_all(&ff->poll_wait);
265 : :
266 : 0 : ra->inarg.fh = ff->fh;
267 : 0 : ra->inarg.flags = flags;
268 : 0 : ra->args.in_numargs = 1;
269 : 0 : ra->args.in_args[0].size = sizeof(struct fuse_release_in);
270 : 0 : ra->args.in_args[0].value = &ra->inarg;
271 : 0 : ra->args.opcode = opcode;
272 : 0 : ra->args.nodeid = ff->nodeid;
273 : 0 : ra->args.force = true;
274 : 0 : ra->args.nocreds = true;
275 : 0 : }
276 : :
277 : 0 : void fuse_release_common(struct file *file, bool isdir)
278 : : {
279 : : struct fuse_inode *fi = get_fuse_inode(file_inode(file));
280 : 0 : struct fuse_file *ff = file->private_data;
281 : 0 : struct fuse_release_args *ra = ff->release_args;
282 [ # # ]: 0 : int opcode = isdir ? FUSE_RELEASEDIR : FUSE_RELEASE;
283 : :
284 : 0 : fuse_prepare_release(fi, ff, file->f_flags, opcode);
285 : :
286 [ # # ]: 0 : if (ff->flock) {
287 : 0 : ra->inarg.release_flags |= FUSE_RELEASE_FLOCK_UNLOCK;
288 : 0 : ra->inarg.lock_owner = fuse_lock_owner_id(ff->fc,
289 : : (fl_owner_t) file);
290 : : }
291 : : /* Hold inode until release is finished */
292 : 0 : ra->inode = igrab(file_inode(file));
293 : :
294 : : /*
295 : : * Normally this will send the RELEASE request, however if
296 : : * some asynchronous READ or WRITE requests are outstanding,
297 : : * the sending will be delayed.
298 : : *
299 : : * Make the release synchronous if this is a fuseblk mount,
300 : : * synchronous RELEASE is allowed (and desirable) in this case
301 : : * because the server can be trusted not to screw up.
302 : : */
303 : 0 : fuse_file_put(ff, ff->fc->destroy, isdir);
304 : 0 : }
305 : :
306 : 0 : static int fuse_open(struct inode *inode, struct file *file)
307 : : {
308 : 0 : return fuse_open_common(inode, file, false);
309 : : }
310 : :
311 : 0 : static int fuse_release(struct inode *inode, struct file *file)
312 : : {
313 : : struct fuse_conn *fc = get_fuse_conn(inode);
314 : :
315 : : /* see fuse_vma_close() for !writeback_cache case */
316 [ # # ]: 0 : if (fc->writeback_cache)
317 : 0 : write_inode_now(inode, 1);
318 : :
319 : 0 : fuse_release_common(file, false);
320 : :
321 : : /* return value is ignored by VFS */
322 : 0 : return 0;
323 : : }
324 : :
325 : 0 : void fuse_sync_release(struct fuse_inode *fi, struct fuse_file *ff, int flags)
326 : : {
327 [ # # ]: 0 : WARN_ON(refcount_read(&ff->count) > 1);
328 : 0 : fuse_prepare_release(fi, ff, flags, FUSE_RELEASE);
329 : : /*
330 : : * iput(NULL) is a no-op and since the refcount is 1 and everything's
331 : : * synchronous, we are fine with not doing igrab() here"
332 : : */
333 : 0 : fuse_file_put(ff, true, false);
334 : 0 : }
335 : : EXPORT_SYMBOL_GPL(fuse_sync_release);
336 : :
337 : : /*
338 : : * Scramble the ID space with XTEA, so that the value of the files_struct
339 : : * pointer is not exposed to userspace.
340 : : */
341 : 0 : u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id)
342 : : {
343 : 0 : u32 *k = fc->scramble_key;
344 : 0 : u64 v = (unsigned long) id;
345 : : u32 v0 = v;
346 : 0 : u32 v1 = v >> 32;
347 : : u32 sum = 0;
348 : : int i;
349 : :
350 [ # # ]: 0 : for (i = 0; i < 32; i++) {
351 : 0 : v0 += ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + k[sum & 3]);
352 : 0 : sum += 0x9E3779B9;
353 : 0 : v1 += ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + k[sum>>11 & 3]);
354 : : }
355 : :
356 : 0 : return (u64) v0 + ((u64) v1 << 32);
357 : : }
358 : :
359 : : struct fuse_writepage_args {
360 : : struct fuse_io_args ia;
361 : : struct list_head writepages_entry;
362 : : struct list_head queue_entry;
363 : : struct fuse_writepage_args *next;
364 : : struct inode *inode;
365 : : };
366 : :
367 : 0 : static struct fuse_writepage_args *fuse_find_writeback(struct fuse_inode *fi,
368 : : pgoff_t idx_from, pgoff_t idx_to)
369 : : {
370 : : struct fuse_writepage_args *wpa;
371 : :
372 [ # # ]: 0 : list_for_each_entry(wpa, &fi->writepages, writepages_entry) {
373 : : pgoff_t curr_index;
374 : :
375 [ # # ]: 0 : WARN_ON(get_fuse_inode(wpa->inode) != fi);
376 : 0 : curr_index = wpa->ia.write.in.offset >> PAGE_SHIFT;
377 [ # # # # ]: 0 : if (idx_from < curr_index + wpa->ia.ap.num_pages &&
378 : : curr_index <= idx_to) {
379 : 0 : return wpa;
380 : : }
381 : : }
382 : : return NULL;
383 : : }
384 : :
385 : : /*
386 : : * Check if any page in a range is under writeback
387 : : *
388 : : * This is currently done by walking the list of writepage requests
389 : : * for the inode, which can be pretty inefficient.
390 : : */
391 : 0 : static bool fuse_range_is_writeback(struct inode *inode, pgoff_t idx_from,
392 : : pgoff_t idx_to)
393 : : {
394 : : struct fuse_inode *fi = get_fuse_inode(inode);
395 : : bool found;
396 : :
397 : : spin_lock(&fi->lock);
398 : 0 : found = fuse_find_writeback(fi, idx_from, idx_to);
399 : : spin_unlock(&fi->lock);
400 : :
401 : 0 : return found;
402 : : }
403 : :
404 : : static inline bool fuse_page_is_writeback(struct inode *inode, pgoff_t index)
405 : : {
406 : 0 : return fuse_range_is_writeback(inode, index, index);
407 : : }
408 : :
409 : : /*
410 : : * Wait for page writeback to be completed.
411 : : *
412 : : * Since fuse doesn't rely on the VM writeback tracking, this has to
413 : : * use some other means.
414 : : */
415 : 0 : static void fuse_wait_on_page_writeback(struct inode *inode, pgoff_t index)
416 : : {
417 : : struct fuse_inode *fi = get_fuse_inode(inode);
418 : :
419 [ # # # # ]: 0 : wait_event(fi->page_waitq, !fuse_page_is_writeback(inode, index));
420 : 0 : }
421 : :
422 : : /*
423 : : * Wait for all pending writepages on the inode to finish.
424 : : *
425 : : * This is currently done by blocking further writes with FUSE_NOWRITE
426 : : * and waiting for all sent writes to complete.
427 : : *
428 : : * This must be called under i_mutex, otherwise the FUSE_NOWRITE usage
429 : : * could conflict with truncation.
430 : : */
431 : : static void fuse_sync_writes(struct inode *inode)
432 : : {
433 : 0 : fuse_set_nowrite(inode);
434 : 0 : fuse_release_nowrite(inode);
435 : : }
436 : :
437 : 0 : static int fuse_flush(struct file *file, fl_owner_t id)
438 : : {
439 : : struct inode *inode = file_inode(file);
440 : : struct fuse_conn *fc = get_fuse_conn(inode);
441 : 0 : struct fuse_file *ff = file->private_data;
442 : : struct fuse_flush_in inarg;
443 : 0 : FUSE_ARGS(args);
444 : : int err;
445 : :
446 [ # # ]: 0 : if (is_bad_inode(inode))
447 : : return -EIO;
448 : :
449 [ # # ]: 0 : if (fc->no_flush)
450 : : return 0;
451 : :
452 : 0 : err = write_inode_now(inode, 1);
453 [ # # ]: 0 : if (err)
454 : : return err;
455 : :
456 : : inode_lock(inode);
457 : : fuse_sync_writes(inode);
458 : : inode_unlock(inode);
459 : :
460 : 0 : err = filemap_check_errors(file->f_mapping);
461 [ # # ]: 0 : if (err)
462 : : return err;
463 : :
464 : 0 : memset(&inarg, 0, sizeof(inarg));
465 : 0 : inarg.fh = ff->fh;
466 : 0 : inarg.lock_owner = fuse_lock_owner_id(fc, id);
467 : 0 : args.opcode = FUSE_FLUSH;
468 : 0 : args.nodeid = get_node_id(inode);
469 : 0 : args.in_numargs = 1;
470 : 0 : args.in_args[0].size = sizeof(inarg);
471 : 0 : args.in_args[0].value = &inarg;
472 : 0 : args.force = true;
473 : :
474 : 0 : err = fuse_simple_request(fc, &args);
475 [ # # ]: 0 : if (err == -ENOSYS) {
476 : 0 : fc->no_flush = 1;
477 : : err = 0;
478 : : }
479 : 0 : return err;
480 : : }
481 : :
482 : 0 : int fuse_fsync_common(struct file *file, loff_t start, loff_t end,
483 : : int datasync, int opcode)
484 : : {
485 : 0 : struct inode *inode = file->f_mapping->host;
486 : : struct fuse_conn *fc = get_fuse_conn(inode);
487 : 0 : struct fuse_file *ff = file->private_data;
488 : 0 : FUSE_ARGS(args);
489 : : struct fuse_fsync_in inarg;
490 : :
491 : 0 : memset(&inarg, 0, sizeof(inarg));
492 : 0 : inarg.fh = ff->fh;
493 : 0 : inarg.fsync_flags = datasync ? FUSE_FSYNC_FDATASYNC : 0;
494 : 0 : args.opcode = opcode;
495 : 0 : args.nodeid = get_node_id(inode);
496 : 0 : args.in_numargs = 1;
497 : 0 : args.in_args[0].size = sizeof(inarg);
498 : 0 : args.in_args[0].value = &inarg;
499 : 0 : return fuse_simple_request(fc, &args);
500 : : }
501 : :
502 : 0 : static int fuse_fsync(struct file *file, loff_t start, loff_t end,
503 : : int datasync)
504 : : {
505 : 0 : struct inode *inode = file->f_mapping->host;
506 : : struct fuse_conn *fc = get_fuse_conn(inode);
507 : : int err;
508 : :
509 [ # # ]: 0 : if (is_bad_inode(inode))
510 : : return -EIO;
511 : :
512 : : inode_lock(inode);
513 : :
514 : : /*
515 : : * Start writeback against all dirty pages of the inode, then
516 : : * wait for all outstanding writes, before sending the FSYNC
517 : : * request.
518 : : */
519 : 0 : err = file_write_and_wait_range(file, start, end);
520 [ # # ]: 0 : if (err)
521 : : goto out;
522 : :
523 : : fuse_sync_writes(inode);
524 : :
525 : : /*
526 : : * Due to implementation of fuse writeback
527 : : * file_write_and_wait_range() does not catch errors.
528 : : * We have to do this directly after fuse_sync_writes()
529 : : */
530 : 0 : err = file_check_and_advance_wb_err(file);
531 [ # # ]: 0 : if (err)
532 : : goto out;
533 : :
534 : 0 : err = sync_inode_metadata(inode, 1);
535 [ # # ]: 0 : if (err)
536 : : goto out;
537 : :
538 [ # # ]: 0 : if (fc->no_fsync)
539 : : goto out;
540 : :
541 : 0 : err = fuse_fsync_common(file, start, end, datasync, FUSE_FSYNC);
542 [ # # ]: 0 : if (err == -ENOSYS) {
543 : 0 : fc->no_fsync = 1;
544 : : err = 0;
545 : : }
546 : : out:
547 : : inode_unlock(inode);
548 : :
549 : 0 : return err;
550 : : }
551 : :
552 : 0 : void fuse_read_args_fill(struct fuse_io_args *ia, struct file *file, loff_t pos,
553 : : size_t count, int opcode)
554 : : {
555 : 0 : struct fuse_file *ff = file->private_data;
556 : : struct fuse_args *args = &ia->ap.args;
557 : :
558 : 0 : ia->read.in.fh = ff->fh;
559 : 0 : ia->read.in.offset = pos;
560 : 0 : ia->read.in.size = count;
561 : 0 : ia->read.in.flags = file->f_flags;
562 : 0 : args->opcode = opcode;
563 : 0 : args->nodeid = ff->nodeid;
564 : 0 : args->in_numargs = 1;
565 : 0 : args->in_args[0].size = sizeof(ia->read.in);
566 : 0 : args->in_args[0].value = &ia->read.in;
567 : 0 : args->out_argvar = true;
568 : 0 : args->out_numargs = 1;
569 : 0 : args->out_args[0].size = count;
570 : 0 : }
571 : :
572 : 0 : static void fuse_release_user_pages(struct fuse_args_pages *ap,
573 : : bool should_dirty)
574 : : {
575 : : unsigned int i;
576 : :
577 [ # # ]: 0 : for (i = 0; i < ap->num_pages; i++) {
578 [ # # ]: 0 : if (should_dirty)
579 : 0 : set_page_dirty_lock(ap->pages[i]);
580 : 0 : put_page(ap->pages[i]);
581 : : }
582 : 0 : }
583 : :
584 : 0 : static void fuse_io_release(struct kref *kref)
585 : : {
586 : 0 : kfree(container_of(kref, struct fuse_io_priv, refcnt));
587 : 0 : }
588 : :
589 : : static ssize_t fuse_get_res_by_io(struct fuse_io_priv *io)
590 : : {
591 [ # # # # ]: 0 : if (io->err)
592 : : return io->err;
593 : :
594 [ # # # # : 0 : if (io->bytes >= 0 && io->write)
# # # # ]
595 : : return -EIO;
596 : :
597 [ # # # # ]: 0 : return io->bytes < 0 ? io->size : io->bytes;
598 : : }
599 : :
600 : : /**
601 : : * In case of short read, the caller sets 'pos' to the position of
602 : : * actual end of fuse request in IO request. Otherwise, if bytes_requested
603 : : * == bytes_transferred or rw == WRITE, the caller sets 'pos' to -1.
604 : : *
605 : : * An example:
606 : : * User requested DIO read of 64K. It was splitted into two 32K fuse requests,
607 : : * both submitted asynchronously. The first of them was ACKed by userspace as
608 : : * fully completed (req->out.args[0].size == 32K) resulting in pos == -1. The
609 : : * second request was ACKed as short, e.g. only 1K was read, resulting in
610 : : * pos == 33K.
611 : : *
612 : : * Thus, when all fuse requests are completed, the minimal non-negative 'pos'
613 : : * will be equal to the length of the longest contiguous fragment of
614 : : * transferred data starting from the beginning of IO request.
615 : : */
616 : 0 : static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos)
617 : : {
618 : : int left;
619 : :
620 : : spin_lock(&io->lock);
621 [ # # ]: 0 : if (err)
622 [ # # ]: 0 : io->err = io->err ? : err;
623 [ # # # # : 0 : else if (pos >= 0 && (io->bytes < 0 || pos < io->bytes))
# # ]
624 : 0 : io->bytes = pos;
625 : :
626 : 0 : left = --io->reqs;
627 [ # # # # ]: 0 : if (!left && io->blocking)
628 : 0 : complete(io->done);
629 : : spin_unlock(&io->lock);
630 : :
631 [ # # # # ]: 0 : if (!left && !io->blocking) {
632 : : ssize_t res = fuse_get_res_by_io(io);
633 : :
634 [ # # ]: 0 : if (res >= 0) {
635 : 0 : struct inode *inode = file_inode(io->iocb->ki_filp);
636 : : struct fuse_conn *fc = get_fuse_conn(inode);
637 : : struct fuse_inode *fi = get_fuse_inode(inode);
638 : :
639 : : spin_lock(&fi->lock);
640 : 0 : fi->attr_version = atomic64_inc_return(&fc->attr_version);
641 : : spin_unlock(&fi->lock);
642 : : }
643 : :
644 : 0 : io->iocb->ki_complete(io->iocb, res, 0);
645 : : }
646 : :
647 : 0 : kref_put(&io->refcnt, fuse_io_release);
648 : 0 : }
649 : :
650 : 0 : static struct fuse_io_args *fuse_io_alloc(struct fuse_io_priv *io,
651 : : unsigned int npages)
652 : : {
653 : : struct fuse_io_args *ia;
654 : :
655 : 0 : ia = kzalloc(sizeof(*ia), GFP_KERNEL);
656 [ # # ]: 0 : if (ia) {
657 : 0 : ia->io = io;
658 : 0 : ia->ap.pages = fuse_pages_alloc(npages, GFP_KERNEL,
659 : : &ia->ap.descs);
660 [ # # ]: 0 : if (!ia->ap.pages) {
661 : 0 : kfree(ia);
662 : : ia = NULL;
663 : : }
664 : : }
665 : 0 : return ia;
666 : : }
667 : :
668 : : static void fuse_io_free(struct fuse_io_args *ia)
669 : : {
670 : 0 : kfree(ia->ap.pages);
671 : 0 : kfree(ia);
672 : : }
673 : :
674 : 0 : static void fuse_aio_complete_req(struct fuse_conn *fc, struct fuse_args *args,
675 : : int err)
676 : : {
677 : 0 : struct fuse_io_args *ia = container_of(args, typeof(*ia), ap.args);
678 : 0 : struct fuse_io_priv *io = ia->io;
679 : : ssize_t pos = -1;
680 : :
681 : 0 : fuse_release_user_pages(&ia->ap, io->should_dirty);
682 : :
683 [ # # ]: 0 : if (err) {
684 : : /* Nothing */
685 [ # # ]: 0 : } else if (io->write) {
686 [ # # ]: 0 : if (ia->write.out.size > ia->write.in.size) {
687 : : err = -EIO;
688 [ # # ]: 0 : } else if (ia->write.in.size != ia->write.out.size) {
689 : 0 : pos = ia->write.in.offset - io->offset +
690 : : ia->write.out.size;
691 : : }
692 : : } else {
693 : 0 : u32 outsize = args->out_args[0].size;
694 : :
695 [ # # ]: 0 : if (ia->read.in.size != outsize)
696 : 0 : pos = ia->read.in.offset - io->offset + outsize;
697 : : }
698 : :
699 : 0 : fuse_aio_complete(io, err, pos);
700 : : fuse_io_free(ia);
701 : 0 : }
702 : :
703 : 0 : static ssize_t fuse_async_req_send(struct fuse_conn *fc,
704 : : struct fuse_io_args *ia, size_t num_bytes)
705 : : {
706 : : ssize_t err;
707 : 0 : struct fuse_io_priv *io = ia->io;
708 : :
709 : : spin_lock(&io->lock);
710 : : kref_get(&io->refcnt);
711 : 0 : io->size += num_bytes;
712 : 0 : io->reqs++;
713 : : spin_unlock(&io->lock);
714 : :
715 : 0 : ia->ap.args.end = fuse_aio_complete_req;
716 : 0 : ia->ap.args.may_block = io->should_dirty;
717 : 0 : err = fuse_simple_background(fc, &ia->ap.args, GFP_KERNEL);
718 [ # # ]: 0 : if (err)
719 : 0 : fuse_aio_complete_req(fc, &ia->ap.args, err);
720 : :
721 : 0 : return num_bytes;
722 : : }
723 : :
724 : 0 : static ssize_t fuse_send_read(struct fuse_io_args *ia, loff_t pos, size_t count,
725 : : fl_owner_t owner)
726 : : {
727 : 0 : struct file *file = ia->io->iocb->ki_filp;
728 : 0 : struct fuse_file *ff = file->private_data;
729 : 0 : struct fuse_conn *fc = ff->fc;
730 : :
731 : : fuse_read_args_fill(ia, file, pos, count, FUSE_READ);
732 [ # # ]: 0 : if (owner != NULL) {
733 : 0 : ia->read.in.read_flags |= FUSE_READ_LOCKOWNER;
734 : 0 : ia->read.in.lock_owner = fuse_lock_owner_id(fc, owner);
735 : : }
736 : :
737 [ # # ]: 0 : if (ia->io->async)
738 : 0 : return fuse_async_req_send(fc, ia, count);
739 : :
740 : 0 : return fuse_simple_request(fc, &ia->ap.args);
741 : : }
742 : :
743 : 0 : static void fuse_read_update_size(struct inode *inode, loff_t size,
744 : : u64 attr_ver)
745 : : {
746 : : struct fuse_conn *fc = get_fuse_conn(inode);
747 : : struct fuse_inode *fi = get_fuse_inode(inode);
748 : :
749 : : spin_lock(&fi->lock);
750 [ # # # # : 0 : if (attr_ver == fi->attr_version && size < inode->i_size &&
# # ]
751 : : !test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) {
752 : 0 : fi->attr_version = atomic64_inc_return(&fc->attr_version);
753 : : i_size_write(inode, size);
754 : : }
755 : : spin_unlock(&fi->lock);
756 : 0 : }
757 : :
758 : 0 : static void fuse_short_read(struct inode *inode, u64 attr_ver, size_t num_read,
759 : : struct fuse_args_pages *ap)
760 : : {
761 : : struct fuse_conn *fc = get_fuse_conn(inode);
762 : :
763 [ # # ]: 0 : if (fc->writeback_cache) {
764 : : /*
765 : : * A hole in a file. Some data after the hole are in page cache,
766 : : * but have not reached the client fs yet. So, the hole is not
767 : : * present there.
768 : : */
769 : : int i;
770 : 0 : int start_idx = num_read >> PAGE_SHIFT;
771 : 0 : size_t off = num_read & (PAGE_SIZE - 1);
772 : :
773 [ # # ]: 0 : for (i = start_idx; i < ap->num_pages; i++) {
774 : 0 : zero_user_segment(ap->pages[i], off, PAGE_SIZE);
775 : : off = 0;
776 : : }
777 : : } else {
778 : 0 : loff_t pos = page_offset(ap->pages[0]) + num_read;
779 : 0 : fuse_read_update_size(inode, pos, attr_ver);
780 : : }
781 : 0 : }
782 : :
783 : 0 : static int fuse_do_readpage(struct file *file, struct page *page)
784 : : {
785 : 0 : struct inode *inode = page->mapping->host;
786 : : struct fuse_conn *fc = get_fuse_conn(inode);
787 : : loff_t pos = page_offset(page);
788 : 0 : struct fuse_page_desc desc = { .length = PAGE_SIZE };
789 : 0 : struct fuse_io_args ia = {
790 : : .ap.args.page_zeroing = true,
791 : : .ap.args.out_pages = true,
792 : : .ap.num_pages = 1,
793 : : .ap.pages = &page,
794 : : .ap.descs = &desc,
795 : : };
796 : : ssize_t res;
797 : : u64 attr_ver;
798 : :
799 : : /*
800 : : * Page writeback can extend beyond the lifetime of the
801 : : * page-cache page, so make sure we read a properly synced
802 : : * page.
803 : : */
804 : 0 : fuse_wait_on_page_writeback(inode, page->index);
805 : :
806 : : attr_ver = fuse_get_attr_version(fc);
807 : :
808 : : /* Don't overflow end offset */
809 [ # # ]: 0 : if (pos + (desc.length - 1) == LLONG_MAX)
810 : 0 : desc.length--;
811 : :
812 : 0 : fuse_read_args_fill(&ia, file, pos, desc.length, FUSE_READ);
813 : 0 : res = fuse_simple_request(fc, &ia.ap.args);
814 [ # # ]: 0 : if (res < 0)
815 : : return res;
816 : : /*
817 : : * Short read means EOF. If file size is larger, truncate it
818 : : */
819 [ # # ]: 0 : if (res < desc.length)
820 : 0 : fuse_short_read(inode, attr_ver, res, &ia.ap);
821 : :
822 : 0 : SetPageUptodate(page);
823 : :
824 : 0 : return 0;
825 : : }
826 : :
827 : 0 : static int fuse_readpage(struct file *file, struct page *page)
828 : : {
829 : 0 : struct inode *inode = page->mapping->host;
830 : : int err;
831 : :
832 : : err = -EIO;
833 [ # # ]: 0 : if (is_bad_inode(inode))
834 : : goto out;
835 : :
836 : 0 : err = fuse_do_readpage(file, page);
837 : 0 : fuse_invalidate_atime(inode);
838 : : out:
839 : 0 : unlock_page(page);
840 : 0 : return err;
841 : : }
842 : :
843 : 0 : static void fuse_readpages_end(struct fuse_conn *fc, struct fuse_args *args,
844 : : int err)
845 : : {
846 : : int i;
847 : 0 : struct fuse_io_args *ia = container_of(args, typeof(*ia), ap.args);
848 : 0 : struct fuse_args_pages *ap = &ia->ap;
849 : 0 : size_t count = ia->read.in.size;
850 : 0 : size_t num_read = args->out_args[0].size;
851 : : struct address_space *mapping = NULL;
852 : :
853 [ # # # # ]: 0 : for (i = 0; mapping == NULL && i < ap->num_pages; i++)
854 : 0 : mapping = ap->pages[i]->mapping;
855 : :
856 [ # # ]: 0 : if (mapping) {
857 : 0 : struct inode *inode = mapping->host;
858 : :
859 : : /*
860 : : * Short read means EOF. If file size is larger, truncate it
861 : : */
862 [ # # ]: 0 : if (!err && num_read < count)
863 : 0 : fuse_short_read(inode, ia->read.attr_ver, num_read, ap);
864 : :
865 : 0 : fuse_invalidate_atime(inode);
866 : : }
867 : :
868 [ # # ]: 0 : for (i = 0; i < ap->num_pages; i++) {
869 : 0 : struct page *page = ap->pages[i];
870 : :
871 [ # # ]: 0 : if (!err)
872 : : SetPageUptodate(page);
873 : : else
874 : : SetPageError(page);
875 : 0 : unlock_page(page);
876 : 0 : put_page(page);
877 : : }
878 [ # # ]: 0 : if (ia->ff)
879 : 0 : fuse_file_put(ia->ff, false, false);
880 : :
881 : : fuse_io_free(ia);
882 : 0 : }
883 : :
884 : 0 : static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
885 : : {
886 : 0 : struct fuse_file *ff = file->private_data;
887 : 0 : struct fuse_conn *fc = ff->fc;
888 : : struct fuse_args_pages *ap = &ia->ap;
889 : 0 : loff_t pos = page_offset(ap->pages[0]);
890 : 0 : size_t count = ap->num_pages << PAGE_SHIFT;
891 : : ssize_t res;
892 : : int err;
893 : :
894 : 0 : ap->args.out_pages = true;
895 : 0 : ap->args.page_zeroing = true;
896 : 0 : ap->args.page_replace = true;
897 : :
898 : : /* Don't overflow end offset */
899 [ # # ]: 0 : if (pos + (count - 1) == LLONG_MAX) {
900 : : count--;
901 : 0 : ap->descs[ap->num_pages - 1].length--;
902 : : }
903 [ # # ]: 0 : WARN_ON((loff_t) (pos + count) < 0);
904 : :
905 : : fuse_read_args_fill(ia, file, pos, count, FUSE_READ);
906 : 0 : ia->read.attr_ver = fuse_get_attr_version(fc);
907 [ # # ]: 0 : if (fc->async_read) {
908 : 0 : ia->ff = fuse_file_get(ff);
909 : 0 : ap->args.end = fuse_readpages_end;
910 : 0 : err = fuse_simple_background(fc, &ap->args, GFP_KERNEL);
911 [ # # ]: 0 : if (!err)
912 : 0 : return;
913 : : } else {
914 : 0 : res = fuse_simple_request(fc, &ap->args);
915 : 0 : err = res < 0 ? res : 0;
916 : : }
917 : 0 : fuse_readpages_end(fc, &ap->args, err);
918 : : }
919 : :
920 : : struct fuse_fill_data {
921 : : struct fuse_io_args *ia;
922 : : struct file *file;
923 : : struct inode *inode;
924 : : unsigned int nr_pages;
925 : : unsigned int max_pages;
926 : : };
927 : :
928 : 0 : static int fuse_readpages_fill(void *_data, struct page *page)
929 : : {
930 : : struct fuse_fill_data *data = _data;
931 : 0 : struct fuse_io_args *ia = data->ia;
932 : 0 : struct fuse_args_pages *ap = &ia->ap;
933 : 0 : struct inode *inode = data->inode;
934 : : struct fuse_conn *fc = get_fuse_conn(inode);
935 : :
936 : 0 : fuse_wait_on_page_writeback(inode, page->index);
937 : :
938 [ # # # # ]: 0 : if (ap->num_pages &&
939 [ # # ]: 0 : (ap->num_pages == fc->max_pages ||
940 [ # # ]: 0 : (ap->num_pages + 1) * PAGE_SIZE > fc->max_read ||
941 : 0 : ap->pages[ap->num_pages - 1]->index + 1 != page->index)) {
942 : 0 : data->max_pages = min_t(unsigned int, data->nr_pages,
943 : : fc->max_pages);
944 : 0 : fuse_send_readpages(ia, data->file);
945 : 0 : data->ia = ia = fuse_io_alloc(NULL, data->max_pages);
946 [ # # ]: 0 : if (!ia) {
947 : 0 : unlock_page(page);
948 : 0 : return -ENOMEM;
949 : : }
950 : 0 : ap = &ia->ap;
951 : : }
952 : :
953 [ # # # # ]: 0 : if (WARN_ON(ap->num_pages >= data->max_pages)) {
954 : 0 : unlock_page(page);
955 : : fuse_io_free(ia);
956 : 0 : return -EIO;
957 : : }
958 : :
959 : 0 : get_page(page);
960 : 0 : ap->pages[ap->num_pages] = page;
961 : 0 : ap->descs[ap->num_pages].length = PAGE_SIZE;
962 : 0 : ap->num_pages++;
963 : 0 : data->nr_pages--;
964 : 0 : return 0;
965 : : }
966 : :
967 : 0 : static int fuse_readpages(struct file *file, struct address_space *mapping,
968 : : struct list_head *pages, unsigned nr_pages)
969 : : {
970 : 0 : struct inode *inode = mapping->host;
971 : : struct fuse_conn *fc = get_fuse_conn(inode);
972 : : struct fuse_fill_data data;
973 : : int err;
974 : :
975 : : err = -EIO;
976 [ # # ]: 0 : if (is_bad_inode(inode))
977 : : goto out;
978 : :
979 : 0 : data.file = file;
980 : 0 : data.inode = inode;
981 : 0 : data.nr_pages = nr_pages;
982 : 0 : data.max_pages = min_t(unsigned int, nr_pages, fc->max_pages);
983 : : ;
984 : 0 : data.ia = fuse_io_alloc(NULL, data.max_pages);
985 : : err = -ENOMEM;
986 [ # # ]: 0 : if (!data.ia)
987 : : goto out;
988 : :
989 : 0 : err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data);
990 [ # # ]: 0 : if (!err) {
991 [ # # ]: 0 : if (data.ia->ap.num_pages)
992 : 0 : fuse_send_readpages(data.ia, file);
993 : : else
994 : : fuse_io_free(data.ia);
995 : : }
996 : : out:
997 : 0 : return err;
998 : : }
999 : :
1000 : 0 : static ssize_t fuse_cache_read_iter(struct kiocb *iocb, struct iov_iter *to)
1001 : : {
1002 : 0 : struct inode *inode = iocb->ki_filp->f_mapping->host;
1003 : : struct fuse_conn *fc = get_fuse_conn(inode);
1004 : :
1005 : : /*
1006 : : * In auto invalidate mode, always update attributes on read.
1007 : : * Otherwise, only update if we attempt to read past EOF (to ensure
1008 : : * i_size is up to date).
1009 : : */
1010 [ # # # # ]: 0 : if (fc->auto_inval_data ||
1011 : 0 : (iocb->ki_pos + iov_iter_count(to) > i_size_read(inode))) {
1012 : : int err;
1013 : 0 : err = fuse_update_attributes(inode, iocb->ki_filp);
1014 [ # # ]: 0 : if (err)
1015 : : return err;
1016 : : }
1017 : :
1018 : 0 : return generic_file_read_iter(iocb, to);
1019 : : }
1020 : :
1021 : : static void fuse_write_args_fill(struct fuse_io_args *ia, struct fuse_file *ff,
1022 : : loff_t pos, size_t count)
1023 : : {
1024 : : struct fuse_args *args = &ia->ap.args;
1025 : :
1026 : 0 : ia->write.in.fh = ff->fh;
1027 : 0 : ia->write.in.offset = pos;
1028 : 0 : ia->write.in.size = count;
1029 : 0 : args->opcode = FUSE_WRITE;
1030 : 0 : args->nodeid = ff->nodeid;
1031 : 0 : args->in_numargs = 2;
1032 [ # # # # : 0 : if (ff->fc->minor < 9)
# # # # ]
1033 : 0 : args->in_args[0].size = FUSE_COMPAT_WRITE_IN_SIZE;
1034 : : else
1035 : 0 : args->in_args[0].size = sizeof(ia->write.in);
1036 : 0 : args->in_args[0].value = &ia->write.in;
1037 : 0 : args->in_args[1].size = count;
1038 : 0 : args->out_numargs = 1;
1039 : 0 : args->out_args[0].size = sizeof(ia->write.out);
1040 : 0 : args->out_args[0].value = &ia->write.out;
1041 : : }
1042 : :
1043 : : static unsigned int fuse_write_flags(struct kiocb *iocb)
1044 : : {
1045 : 0 : unsigned int flags = iocb->ki_filp->f_flags;
1046 : :
1047 [ # # # # ]: 0 : if (iocb->ki_flags & IOCB_DSYNC)
1048 : 0 : flags |= O_DSYNC;
1049 [ # # # # ]: 0 : if (iocb->ki_flags & IOCB_SYNC)
1050 : 0 : flags |= O_SYNC;
1051 : :
1052 : : return flags;
1053 : : }
1054 : :
1055 : 0 : static ssize_t fuse_send_write(struct fuse_io_args *ia, loff_t pos,
1056 : : size_t count, fl_owner_t owner)
1057 : : {
1058 : 0 : struct kiocb *iocb = ia->io->iocb;
1059 : 0 : struct file *file = iocb->ki_filp;
1060 : 0 : struct fuse_file *ff = file->private_data;
1061 : 0 : struct fuse_conn *fc = ff->fc;
1062 : : struct fuse_write_in *inarg = &ia->write.in;
1063 : : ssize_t err;
1064 : :
1065 : : fuse_write_args_fill(ia, ff, pos, count);
1066 : 0 : inarg->flags = fuse_write_flags(iocb);
1067 [ # # ]: 0 : if (owner != NULL) {
1068 : 0 : inarg->write_flags |= FUSE_WRITE_LOCKOWNER;
1069 : 0 : inarg->lock_owner = fuse_lock_owner_id(fc, owner);
1070 : : }
1071 : :
1072 [ # # ]: 0 : if (ia->io->async)
1073 : 0 : return fuse_async_req_send(fc, ia, count);
1074 : :
1075 : 0 : err = fuse_simple_request(fc, &ia->ap.args);
1076 [ # # # # ]: 0 : if (!err && ia->write.out.size > count)
1077 : : err = -EIO;
1078 : :
1079 [ # # ]: 0 : return err ?: ia->write.out.size;
1080 : : }
1081 : :
1082 : 0 : bool fuse_write_update_size(struct inode *inode, loff_t pos)
1083 : : {
1084 : : struct fuse_conn *fc = get_fuse_conn(inode);
1085 : : struct fuse_inode *fi = get_fuse_inode(inode);
1086 : : bool ret = false;
1087 : :
1088 : : spin_lock(&fi->lock);
1089 : 0 : fi->attr_version = atomic64_inc_return(&fc->attr_version);
1090 [ # # ]: 0 : if (pos > inode->i_size) {
1091 : : i_size_write(inode, pos);
1092 : : ret = true;
1093 : : }
1094 : : spin_unlock(&fi->lock);
1095 : :
1096 : 0 : return ret;
1097 : : }
1098 : :
1099 : 0 : static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
1100 : : struct kiocb *iocb, struct inode *inode,
1101 : : loff_t pos, size_t count)
1102 : : {
1103 : : struct fuse_args_pages *ap = &ia->ap;
1104 : 0 : struct file *file = iocb->ki_filp;
1105 : 0 : struct fuse_file *ff = file->private_data;
1106 : 0 : struct fuse_conn *fc = ff->fc;
1107 : : unsigned int offset, i;
1108 : : int err;
1109 : :
1110 [ # # ]: 0 : for (i = 0; i < ap->num_pages; i++)
1111 : 0 : fuse_wait_on_page_writeback(inode, ap->pages[i]->index);
1112 : :
1113 : : fuse_write_args_fill(ia, ff, pos, count);
1114 : 0 : ia->write.in.flags = fuse_write_flags(iocb);
1115 : :
1116 : 0 : err = fuse_simple_request(fc, &ap->args);
1117 [ # # # # ]: 0 : if (!err && ia->write.out.size > count)
1118 : : err = -EIO;
1119 : :
1120 : 0 : offset = ap->descs[0].offset;
1121 : 0 : count = ia->write.out.size;
1122 [ # # ]: 0 : for (i = 0; i < ap->num_pages; i++) {
1123 : 0 : struct page *page = ap->pages[i];
1124 : :
1125 [ # # # # ]: 0 : if (!err && !offset && count >= PAGE_SIZE)
1126 : : SetPageUptodate(page);
1127 : :
1128 [ # # ]: 0 : if (count > PAGE_SIZE - offset)
1129 : 0 : count -= PAGE_SIZE - offset;
1130 : : else
1131 : : count = 0;
1132 : : offset = 0;
1133 : :
1134 : 0 : unlock_page(page);
1135 : 0 : put_page(page);
1136 : : }
1137 : :
1138 : 0 : return err;
1139 : : }
1140 : :
1141 : 0 : static ssize_t fuse_fill_write_pages(struct fuse_args_pages *ap,
1142 : : struct address_space *mapping,
1143 : : struct iov_iter *ii, loff_t pos,
1144 : : unsigned int max_pages)
1145 : : {
1146 : 0 : struct fuse_conn *fc = get_fuse_conn(mapping->host);
1147 : 0 : unsigned offset = pos & (PAGE_SIZE - 1);
1148 : : size_t count = 0;
1149 : : int err;
1150 : :
1151 : 0 : ap->args.in_pages = true;
1152 : 0 : ap->descs[0].offset = offset;
1153 : :
1154 : : do {
1155 : : size_t tmp;
1156 : : struct page *page;
1157 : 0 : pgoff_t index = pos >> PAGE_SHIFT;
1158 : 0 : size_t bytes = min_t(size_t, PAGE_SIZE - offset,
1159 : : iov_iter_count(ii));
1160 : :
1161 : 0 : bytes = min_t(size_t, bytes, fc->max_write - count);
1162 : :
1163 : : again:
1164 : : err = -EFAULT;
1165 [ # # ]: 0 : if (iov_iter_fault_in_readable(ii, bytes))
1166 : : break;
1167 : :
1168 : : err = -ENOMEM;
1169 : 0 : page = grab_cache_page_write_begin(mapping, index, 0);
1170 [ # # ]: 0 : if (!page)
1171 : : break;
1172 : :
1173 [ # # ]: 0 : if (mapping_writably_mapped(mapping))
1174 : 0 : flush_dcache_page(page);
1175 : :
1176 : 0 : tmp = iov_iter_copy_from_user_atomic(page, ii, offset, bytes);
1177 : 0 : flush_dcache_page(page);
1178 : :
1179 : 0 : iov_iter_advance(ii, tmp);
1180 [ # # ]: 0 : if (!tmp) {
1181 : 0 : unlock_page(page);
1182 : 0 : put_page(page);
1183 : 0 : bytes = min(bytes, iov_iter_single_seg_count(ii));
1184 : 0 : goto again;
1185 : : }
1186 : :
1187 : : err = 0;
1188 : 0 : ap->pages[ap->num_pages] = page;
1189 : 0 : ap->descs[ap->num_pages].length = tmp;
1190 : 0 : ap->num_pages++;
1191 : :
1192 : 0 : count += tmp;
1193 : 0 : pos += tmp;
1194 : 0 : offset += tmp;
1195 [ # # ]: 0 : if (offset == PAGE_SIZE)
1196 : : offset = 0;
1197 : :
1198 [ # # ]: 0 : if (!fc->big_writes)
1199 : : break;
1200 [ # # # # ]: 0 : } while (iov_iter_count(ii) && count < fc->max_write &&
1201 [ # # # # ]: 0 : ap->num_pages < max_pages && offset == 0);
1202 : :
1203 [ # # ]: 0 : return count > 0 ? count : err;
1204 : : }
1205 : :
1206 : : static inline unsigned int fuse_wr_pages(loff_t pos, size_t len,
1207 : : unsigned int max_pages)
1208 : : {
1209 : 0 : return min_t(unsigned int,
1210 : : ((pos + len - 1) >> PAGE_SHIFT) -
1211 : : (pos >> PAGE_SHIFT) + 1,
1212 : : max_pages);
1213 : : }
1214 : :
1215 : 0 : static ssize_t fuse_perform_write(struct kiocb *iocb,
1216 : : struct address_space *mapping,
1217 : : struct iov_iter *ii, loff_t pos)
1218 : : {
1219 : 0 : struct inode *inode = mapping->host;
1220 : : struct fuse_conn *fc = get_fuse_conn(inode);
1221 : : struct fuse_inode *fi = get_fuse_inode(inode);
1222 : : int err = 0;
1223 : : ssize_t res = 0;
1224 : :
1225 [ # # ]: 0 : if (inode->i_size < pos + iov_iter_count(ii))
1226 : 0 : set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
1227 : :
1228 : : do {
1229 : : ssize_t count;
1230 : 0 : struct fuse_io_args ia = {};
1231 : : struct fuse_args_pages *ap = &ia.ap;
1232 : 0 : unsigned int nr_pages = fuse_wr_pages(pos, iov_iter_count(ii),
1233 : : fc->max_pages);
1234 : :
1235 : 0 : ap->pages = fuse_pages_alloc(nr_pages, GFP_KERNEL, &ap->descs);
1236 [ # # ]: 0 : if (!ap->pages) {
1237 : : err = -ENOMEM;
1238 : 0 : break;
1239 : : }
1240 : :
1241 : 0 : count = fuse_fill_write_pages(ap, mapping, ii, pos, nr_pages);
1242 [ # # ]: 0 : if (count <= 0) {
1243 : : err = count;
1244 : : } else {
1245 : 0 : err = fuse_send_write_pages(&ia, iocb, inode,
1246 : : pos, count);
1247 [ # # ]: 0 : if (!err) {
1248 : 0 : size_t num_written = ia.write.out.size;
1249 : :
1250 : 0 : res += num_written;
1251 : 0 : pos += num_written;
1252 : :
1253 : : /* break out of the loop on short write */
1254 [ # # ]: 0 : if (num_written != count)
1255 : : err = -EIO;
1256 : : }
1257 : : }
1258 : 0 : kfree(ap->pages);
1259 [ # # # # ]: 0 : } while (!err && iov_iter_count(ii));
1260 : :
1261 [ # # ]: 0 : if (res > 0)
1262 : 0 : fuse_write_update_size(inode, pos);
1263 : :
1264 : 0 : clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
1265 : 0 : fuse_invalidate_attr(inode);
1266 : :
1267 [ # # ]: 0 : return res > 0 ? res : err;
1268 : : }
1269 : :
1270 : 0 : static ssize_t fuse_cache_write_iter(struct kiocb *iocb, struct iov_iter *from)
1271 : : {
1272 : 0 : struct file *file = iocb->ki_filp;
1273 : 0 : struct address_space *mapping = file->f_mapping;
1274 : : ssize_t written = 0;
1275 : : ssize_t written_buffered = 0;
1276 : 0 : struct inode *inode = mapping->host;
1277 : : ssize_t err;
1278 : : loff_t endbyte = 0;
1279 : :
1280 [ # # ]: 0 : if (get_fuse_conn(inode)->writeback_cache) {
1281 : : /* Update size (EOF optimization) and mode (SUID clearing) */
1282 : 0 : err = fuse_update_attributes(mapping->host, file);
1283 [ # # ]: 0 : if (err)
1284 : : return err;
1285 : :
1286 : 0 : return generic_file_write_iter(iocb, from);
1287 : : }
1288 : :
1289 : : inode_lock(inode);
1290 : :
1291 : : /* We can write back this queue in page reclaim */
1292 : 0 : current->backing_dev_info = inode_to_bdi(inode);
1293 : :
1294 : 0 : err = generic_write_checks(iocb, from);
1295 [ # # ]: 0 : if (err <= 0)
1296 : : goto out;
1297 : :
1298 : 0 : err = file_remove_privs(file);
1299 [ # # ]: 0 : if (err)
1300 : : goto out;
1301 : :
1302 : 0 : err = file_update_time(file);
1303 [ # # ]: 0 : if (err)
1304 : : goto out;
1305 : :
1306 [ # # ]: 0 : if (iocb->ki_flags & IOCB_DIRECT) {
1307 : 0 : loff_t pos = iocb->ki_pos;
1308 : 0 : written = generic_file_direct_write(iocb, from);
1309 [ # # # # ]: 0 : if (written < 0 || !iov_iter_count(from))
1310 : : goto out;
1311 : :
1312 : 0 : pos += written;
1313 : :
1314 : 0 : written_buffered = fuse_perform_write(iocb, mapping, from, pos);
1315 [ # # ]: 0 : if (written_buffered < 0) {
1316 : : err = written_buffered;
1317 : : goto out;
1318 : : }
1319 : 0 : endbyte = pos + written_buffered - 1;
1320 : :
1321 : 0 : err = filemap_write_and_wait_range(file->f_mapping, pos,
1322 : : endbyte);
1323 [ # # ]: 0 : if (err)
1324 : : goto out;
1325 : :
1326 : 0 : invalidate_mapping_pages(file->f_mapping,
1327 : 0 : pos >> PAGE_SHIFT,
1328 : 0 : endbyte >> PAGE_SHIFT);
1329 : :
1330 : 0 : written += written_buffered;
1331 : 0 : iocb->ki_pos = pos + written_buffered;
1332 : : } else {
1333 : 0 : written = fuse_perform_write(iocb, mapping, from, iocb->ki_pos);
1334 [ # # ]: 0 : if (written >= 0)
1335 : 0 : iocb->ki_pos += written;
1336 : : }
1337 : : out:
1338 : 0 : current->backing_dev_info = NULL;
1339 : : inode_unlock(inode);
1340 [ # # ]: 0 : if (written > 0)
1341 : 0 : written = generic_write_sync(iocb, written);
1342 : :
1343 [ # # ]: 0 : return written ? written : err;
1344 : : }
1345 : :
1346 : : static inline void fuse_page_descs_length_init(struct fuse_page_desc *descs,
1347 : : unsigned int index,
1348 : : unsigned int nr_pages)
1349 : : {
1350 : : int i;
1351 : :
1352 [ # # # # ]: 0 : for (i = index; i < index + nr_pages; i++)
1353 : 0 : descs[i].length = PAGE_SIZE - descs[i].offset;
1354 : : }
1355 : :
1356 : : static inline unsigned long fuse_get_user_addr(const struct iov_iter *ii)
1357 : : {
1358 : 0 : return (unsigned long)ii->iov->iov_base + ii->iov_offset;
1359 : : }
1360 : :
1361 : : static inline size_t fuse_get_frag_size(const struct iov_iter *ii,
1362 : : size_t max_size)
1363 : : {
1364 : 0 : return min(iov_iter_single_seg_count(ii), max_size);
1365 : : }
1366 : :
1367 : 0 : static int fuse_get_user_pages(struct fuse_args_pages *ap, struct iov_iter *ii,
1368 : : size_t *nbytesp, int write,
1369 : : unsigned int max_pages)
1370 : : {
1371 : : size_t nbytes = 0; /* # bytes already packed in req */
1372 : : ssize_t ret = 0;
1373 : :
1374 : : /* Special case for kernel I/O: can copy directly into the buffer */
1375 [ # # ]: 0 : if (iov_iter_is_kvec(ii)) {
1376 : : unsigned long user_addr = fuse_get_user_addr(ii);
1377 : 0 : size_t frag_size = fuse_get_frag_size(ii, *nbytesp);
1378 : :
1379 [ # # ]: 0 : if (write)
1380 : 0 : ap->args.in_args[1].value = (void *) user_addr;
1381 : : else
1382 : 0 : ap->args.out_args[0].value = (void *) user_addr;
1383 : :
1384 : 0 : iov_iter_advance(ii, frag_size);
1385 : 0 : *nbytesp = frag_size;
1386 : 0 : return 0;
1387 : : }
1388 : :
1389 [ # # # # ]: 0 : while (nbytes < *nbytesp && ap->num_pages < max_pages) {
1390 : : unsigned npages;
1391 : : size_t start;
1392 : 0 : ret = iov_iter_get_pages(ii, &ap->pages[ap->num_pages],
1393 : : *nbytesp - nbytes,
1394 : : max_pages - ap->num_pages,
1395 : : &start);
1396 [ # # ]: 0 : if (ret < 0)
1397 : : break;
1398 : :
1399 : 0 : iov_iter_advance(ii, ret);
1400 : 0 : nbytes += ret;
1401 : :
1402 : 0 : ret += start;
1403 : 0 : npages = (ret + PAGE_SIZE - 1) / PAGE_SIZE;
1404 : :
1405 : 0 : ap->descs[ap->num_pages].offset = start;
1406 : 0 : fuse_page_descs_length_init(ap->descs, ap->num_pages, npages);
1407 : :
1408 : 0 : ap->num_pages += npages;
1409 : 0 : ap->descs[ap->num_pages - 1].length -=
1410 : 0 : (PAGE_SIZE - ret) & (PAGE_SIZE - 1);
1411 : : }
1412 : :
1413 [ # # ]: 0 : if (write)
1414 : 0 : ap->args.in_pages = 1;
1415 : : else
1416 : 0 : ap->args.out_pages = 1;
1417 : :
1418 : 0 : *nbytesp = nbytes;
1419 : :
1420 : 0 : return ret < 0 ? ret : 0;
1421 : : }
1422 : :
1423 : 0 : ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
1424 : : loff_t *ppos, int flags)
1425 : : {
1426 : 0 : int write = flags & FUSE_DIO_WRITE;
1427 : 0 : int cuse = flags & FUSE_DIO_CUSE;
1428 : 0 : struct file *file = io->iocb->ki_filp;
1429 : 0 : struct inode *inode = file->f_mapping->host;
1430 : 0 : struct fuse_file *ff = file->private_data;
1431 : 0 : struct fuse_conn *fc = ff->fc;
1432 [ # # ]: 0 : size_t nmax = write ? fc->max_write : fc->max_read;
1433 : 0 : loff_t pos = *ppos;
1434 : : size_t count = iov_iter_count(iter);
1435 : 0 : pgoff_t idx_from = pos >> PAGE_SHIFT;
1436 : 0 : pgoff_t idx_to = (pos + count - 1) >> PAGE_SHIFT;
1437 : : ssize_t res = 0;
1438 : : int err = 0;
1439 : : struct fuse_io_args *ia;
1440 : : unsigned int max_pages;
1441 : :
1442 : 0 : max_pages = iov_iter_npages(iter, fc->max_pages);
1443 : 0 : ia = fuse_io_alloc(io, max_pages);
1444 [ # # ]: 0 : if (!ia)
1445 : : return -ENOMEM;
1446 : :
1447 : 0 : ia->io = io;
1448 [ # # # # ]: 0 : if (!cuse && fuse_range_is_writeback(inode, idx_from, idx_to)) {
1449 [ # # ]: 0 : if (!write)
1450 : : inode_lock(inode);
1451 : : fuse_sync_writes(inode);
1452 [ # # ]: 0 : if (!write)
1453 : : inode_unlock(inode);
1454 : : }
1455 : :
1456 [ # # # # ]: 0 : io->should_dirty = !write && iter_is_iovec(iter);
1457 [ # # ]: 0 : while (count) {
1458 : : ssize_t nres;
1459 : 0 : fl_owner_t owner = current->files;
1460 : 0 : size_t nbytes = min(count, nmax);
1461 : :
1462 : 0 : err = fuse_get_user_pages(&ia->ap, iter, &nbytes, write,
1463 : : max_pages);
1464 [ # # # # ]: 0 : if (err && !nbytes)
1465 : : break;
1466 : :
1467 [ # # ]: 0 : if (write) {
1468 [ # # ]: 0 : if (!capable(CAP_FSETID))
1469 : 0 : ia->write.in.write_flags |= FUSE_WRITE_KILL_PRIV;
1470 : :
1471 : 0 : nres = fuse_send_write(ia, pos, nbytes, owner);
1472 : : } else {
1473 : 0 : nres = fuse_send_read(ia, pos, nbytes, owner);
1474 : : }
1475 : :
1476 [ # # # # ]: 0 : if (!io->async || nres < 0) {
1477 : 0 : fuse_release_user_pages(&ia->ap, io->should_dirty);
1478 : : fuse_io_free(ia);
1479 : : }
1480 : : ia = NULL;
1481 [ # # ]: 0 : if (nres < 0) {
1482 : 0 : iov_iter_revert(iter, nbytes);
1483 : 0 : err = nres;
1484 : 0 : break;
1485 : : }
1486 [ # # ]: 0 : WARN_ON(nres > nbytes);
1487 : :
1488 : 0 : count -= nres;
1489 : 0 : res += nres;
1490 : 0 : pos += nres;
1491 [ # # ]: 0 : if (nres != nbytes) {
1492 : 0 : iov_iter_revert(iter, nbytes - nres);
1493 : 0 : break;
1494 : : }
1495 [ # # ]: 0 : if (count) {
1496 : 0 : max_pages = iov_iter_npages(iter, fc->max_pages);
1497 : 0 : ia = fuse_io_alloc(io, max_pages);
1498 [ # # ]: 0 : if (!ia)
1499 : : break;
1500 : : }
1501 : : }
1502 [ # # ]: 0 : if (ia)
1503 : : fuse_io_free(ia);
1504 [ # # ]: 0 : if (res > 0)
1505 : 0 : *ppos = pos;
1506 : :
1507 [ # # ]: 0 : return res > 0 ? res : err;
1508 : : }
1509 : : EXPORT_SYMBOL_GPL(fuse_direct_io);
1510 : :
1511 : 0 : static ssize_t __fuse_direct_read(struct fuse_io_priv *io,
1512 : : struct iov_iter *iter,
1513 : : loff_t *ppos)
1514 : : {
1515 : : ssize_t res;
1516 : 0 : struct inode *inode = file_inode(io->iocb->ki_filp);
1517 : :
1518 : 0 : res = fuse_direct_io(io, iter, ppos, 0);
1519 : :
1520 : 0 : fuse_invalidate_atime(inode);
1521 : :
1522 : 0 : return res;
1523 : : }
1524 : :
1525 : : static ssize_t fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter);
1526 : :
1527 : 0 : static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to)
1528 : : {
1529 : : ssize_t res;
1530 : :
1531 [ # # # # ]: 0 : if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) {
1532 : 0 : res = fuse_direct_IO(iocb, to);
1533 : : } else {
1534 : 0 : struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb);
1535 : :
1536 : 0 : res = __fuse_direct_read(&io, to, &iocb->ki_pos);
1537 : : }
1538 : :
1539 : 0 : return res;
1540 : : }
1541 : :
1542 : 0 : static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from)
1543 : : {
1544 : 0 : struct inode *inode = file_inode(iocb->ki_filp);
1545 : 0 : struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb);
1546 : : ssize_t res;
1547 : :
1548 : : /* Don't allow parallel writes to the same file */
1549 : : inode_lock(inode);
1550 : 0 : res = generic_write_checks(iocb, from);
1551 [ # # ]: 0 : if (res > 0) {
1552 [ # # # # ]: 0 : if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) {
1553 : 0 : res = fuse_direct_IO(iocb, from);
1554 : : } else {
1555 : 0 : res = fuse_direct_io(&io, from, &iocb->ki_pos,
1556 : : FUSE_DIO_WRITE);
1557 : : }
1558 : : }
1559 : 0 : fuse_invalidate_attr(inode);
1560 [ # # ]: 0 : if (res > 0)
1561 : 0 : fuse_write_update_size(inode, iocb->ki_pos);
1562 : : inode_unlock(inode);
1563 : :
1564 : 0 : return res;
1565 : : }
1566 : :
1567 : 0 : static ssize_t fuse_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
1568 : : {
1569 : 0 : struct file *file = iocb->ki_filp;
1570 : 0 : struct fuse_file *ff = file->private_data;
1571 : :
1572 [ # # ]: 0 : if (is_bad_inode(file_inode(file)))
1573 : : return -EIO;
1574 : :
1575 [ # # ]: 0 : if (!(ff->open_flags & FOPEN_DIRECT_IO))
1576 : 0 : return fuse_cache_read_iter(iocb, to);
1577 : : else
1578 : 0 : return fuse_direct_read_iter(iocb, to);
1579 : : }
1580 : :
1581 : 0 : static ssize_t fuse_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
1582 : : {
1583 : 0 : struct file *file = iocb->ki_filp;
1584 : 0 : struct fuse_file *ff = file->private_data;
1585 : :
1586 [ # # ]: 0 : if (is_bad_inode(file_inode(file)))
1587 : : return -EIO;
1588 : :
1589 [ # # ]: 0 : if (!(ff->open_flags & FOPEN_DIRECT_IO))
1590 : 0 : return fuse_cache_write_iter(iocb, from);
1591 : : else
1592 : 0 : return fuse_direct_write_iter(iocb, from);
1593 : : }
1594 : :
1595 : 0 : static void fuse_writepage_free(struct fuse_writepage_args *wpa)
1596 : : {
1597 : : struct fuse_args_pages *ap = &wpa->ia.ap;
1598 : : int i;
1599 : :
1600 [ # # ]: 0 : for (i = 0; i < ap->num_pages; i++)
1601 : 0 : __free_page(ap->pages[i]);
1602 : :
1603 [ # # ]: 0 : if (wpa->ia.ff)
1604 : 0 : fuse_file_put(wpa->ia.ff, false, false);
1605 : :
1606 : 0 : kfree(ap->pages);
1607 : 0 : kfree(wpa);
1608 : 0 : }
1609 : :
1610 : 0 : static void fuse_writepage_finish(struct fuse_conn *fc,
1611 : : struct fuse_writepage_args *wpa)
1612 : : {
1613 : : struct fuse_args_pages *ap = &wpa->ia.ap;
1614 : 0 : struct inode *inode = wpa->inode;
1615 : : struct fuse_inode *fi = get_fuse_inode(inode);
1616 : 0 : struct backing_dev_info *bdi = inode_to_bdi(inode);
1617 : : int i;
1618 : :
1619 : : list_del(&wpa->writepages_entry);
1620 [ # # ]: 0 : for (i = 0; i < ap->num_pages; i++) {
1621 : 0 : dec_wb_stat(&bdi->wb, WB_WRITEBACK);
1622 : 0 : dec_node_page_state(ap->pages[i], NR_WRITEBACK_TEMP);
1623 : 0 : wb_writeout_inc(&bdi->wb);
1624 : : }
1625 : 0 : wake_up(&fi->page_waitq);
1626 : 0 : }
1627 : :
1628 : : /* Called under fi->lock, may release and reacquire it */
1629 : 0 : static void fuse_send_writepage(struct fuse_conn *fc,
1630 : : struct fuse_writepage_args *wpa, loff_t size)
1631 : : __releases(fi->lock)
1632 : : __acquires(fi->lock)
1633 : : {
1634 : : struct fuse_writepage_args *aux, *next;
1635 : 0 : struct fuse_inode *fi = get_fuse_inode(wpa->inode);
1636 : : struct fuse_write_in *inarg = &wpa->ia.write.in;
1637 : 0 : struct fuse_args *args = &wpa->ia.ap.args;
1638 : 0 : __u64 data_size = wpa->ia.ap.num_pages * PAGE_SIZE;
1639 : : int err;
1640 : :
1641 : 0 : fi->writectr++;
1642 [ # # ]: 0 : if (inarg->offset + data_size <= size) {
1643 : 0 : inarg->size = data_size;
1644 [ # # ]: 0 : } else if (inarg->offset < size) {
1645 : 0 : inarg->size = size - inarg->offset;
1646 : : } else {
1647 : : /* Got truncated off completely */
1648 : : goto out_free;
1649 : : }
1650 : :
1651 : 0 : args->in_args[1].size = inarg->size;
1652 : 0 : args->force = true;
1653 : 0 : args->nocreds = true;
1654 : :
1655 : 0 : err = fuse_simple_background(fc, args, GFP_ATOMIC);
1656 [ # # ]: 0 : if (err == -ENOMEM) {
1657 : : spin_unlock(&fi->lock);
1658 : 0 : err = fuse_simple_background(fc, args, GFP_NOFS | __GFP_NOFAIL);
1659 : : spin_lock(&fi->lock);
1660 : : }
1661 : :
1662 : : /* Fails on broken connection only */
1663 [ # # ]: 0 : if (unlikely(err))
1664 : : goto out_free;
1665 : :
1666 : 0 : return;
1667 : :
1668 : : out_free:
1669 : 0 : fi->writectr--;
1670 : 0 : fuse_writepage_finish(fc, wpa);
1671 : : spin_unlock(&fi->lock);
1672 : :
1673 : : /* After fuse_writepage_finish() aux request list is private */
1674 [ # # ]: 0 : for (aux = wpa->next; aux; aux = next) {
1675 : 0 : next = aux->next;
1676 : 0 : aux->next = NULL;
1677 : 0 : fuse_writepage_free(aux);
1678 : : }
1679 : :
1680 : 0 : fuse_writepage_free(wpa);
1681 : : spin_lock(&fi->lock);
1682 : : }
1683 : :
1684 : : /*
1685 : : * If fi->writectr is positive (no truncate or fsync going on) send
1686 : : * all queued writepage requests.
1687 : : *
1688 : : * Called with fi->lock
1689 : : */
1690 : 0 : void fuse_flush_writepages(struct inode *inode)
1691 : : __releases(fi->lock)
1692 : : __acquires(fi->lock)
1693 : : {
1694 : : struct fuse_conn *fc = get_fuse_conn(inode);
1695 : : struct fuse_inode *fi = get_fuse_inode(inode);
1696 : : loff_t crop = i_size_read(inode);
1697 : : struct fuse_writepage_args *wpa;
1698 : :
1699 [ # # # # ]: 0 : while (fi->writectr >= 0 && !list_empty(&fi->queued_writes)) {
1700 : 0 : wpa = list_entry(fi->queued_writes.next,
1701 : : struct fuse_writepage_args, queue_entry);
1702 : 0 : list_del_init(&wpa->queue_entry);
1703 : 0 : fuse_send_writepage(fc, wpa, crop);
1704 : : }
1705 : 0 : }
1706 : :
1707 : 0 : static void fuse_writepage_end(struct fuse_conn *fc, struct fuse_args *args,
1708 : : int error)
1709 : : {
1710 : : struct fuse_writepage_args *wpa =
1711 : 0 : container_of(args, typeof(*wpa), ia.ap.args);
1712 : 0 : struct inode *inode = wpa->inode;
1713 : : struct fuse_inode *fi = get_fuse_inode(inode);
1714 : :
1715 : 0 : mapping_set_error(inode->i_mapping, error);
1716 : : spin_lock(&fi->lock);
1717 [ # # ]: 0 : while (wpa->next) {
1718 : : struct fuse_conn *fc = get_fuse_conn(inode);
1719 : : struct fuse_write_in *inarg = &wpa->ia.write.in;
1720 : : struct fuse_writepage_args *next = wpa->next;
1721 : :
1722 : 0 : wpa->next = next->next;
1723 : 0 : next->next = NULL;
1724 : 0 : next->ia.ff = fuse_file_get(wpa->ia.ff);
1725 : 0 : list_add(&next->writepages_entry, &fi->writepages);
1726 : :
1727 : : /*
1728 : : * Skip fuse_flush_writepages() to make it easy to crop requests
1729 : : * based on primary request size.
1730 : : *
1731 : : * 1st case (trivial): there are no concurrent activities using
1732 : : * fuse_set/release_nowrite. Then we're on safe side because
1733 : : * fuse_flush_writepages() would call fuse_send_writepage()
1734 : : * anyway.
1735 : : *
1736 : : * 2nd case: someone called fuse_set_nowrite and it is waiting
1737 : : * now for completion of all in-flight requests. This happens
1738 : : * rarely and no more than once per page, so this should be
1739 : : * okay.
1740 : : *
1741 : : * 3rd case: someone (e.g. fuse_do_setattr()) is in the middle
1742 : : * of fuse_set_nowrite..fuse_release_nowrite section. The fact
1743 : : * that fuse_set_nowrite returned implies that all in-flight
1744 : : * requests were completed along with all of their secondary
1745 : : * requests. Further primary requests are blocked by negative
1746 : : * writectr. Hence there cannot be any in-flight requests and
1747 : : * no invocations of fuse_writepage_end() while we're in
1748 : : * fuse_set_nowrite..fuse_release_nowrite section.
1749 : : */
1750 : 0 : fuse_send_writepage(fc, next, inarg->offset + inarg->size);
1751 : : }
1752 : 0 : fi->writectr--;
1753 : 0 : fuse_writepage_finish(fc, wpa);
1754 : : spin_unlock(&fi->lock);
1755 : 0 : fuse_writepage_free(wpa);
1756 : 0 : }
1757 : :
1758 : 0 : static struct fuse_file *__fuse_write_file_get(struct fuse_conn *fc,
1759 : : struct fuse_inode *fi)
1760 : : {
1761 : : struct fuse_file *ff = NULL;
1762 : :
1763 : : spin_lock(&fi->lock);
1764 [ # # ]: 0 : if (!list_empty(&fi->write_files)) {
1765 : 0 : ff = list_entry(fi->write_files.next, struct fuse_file,
1766 : : write_entry);
1767 : : fuse_file_get(ff);
1768 : : }
1769 : : spin_unlock(&fi->lock);
1770 : :
1771 : 0 : return ff;
1772 : : }
1773 : :
1774 : 0 : static struct fuse_file *fuse_write_file_get(struct fuse_conn *fc,
1775 : : struct fuse_inode *fi)
1776 : : {
1777 : 0 : struct fuse_file *ff = __fuse_write_file_get(fc, fi);
1778 [ # # ]: 0 : WARN_ON(!ff);
1779 : 0 : return ff;
1780 : : }
1781 : :
1782 : 0 : int fuse_write_inode(struct inode *inode, struct writeback_control *wbc)
1783 : : {
1784 : : struct fuse_conn *fc = get_fuse_conn(inode);
1785 : : struct fuse_inode *fi = get_fuse_inode(inode);
1786 : : struct fuse_file *ff;
1787 : : int err;
1788 : :
1789 : 0 : ff = __fuse_write_file_get(fc, fi);
1790 : 0 : err = fuse_flush_times(inode, ff);
1791 [ # # ]: 0 : if (ff)
1792 : 0 : fuse_file_put(ff, false, false);
1793 : :
1794 : 0 : return err;
1795 : : }
1796 : :
1797 : 0 : static struct fuse_writepage_args *fuse_writepage_args_alloc(void)
1798 : : {
1799 : : struct fuse_writepage_args *wpa;
1800 : : struct fuse_args_pages *ap;
1801 : :
1802 : 0 : wpa = kzalloc(sizeof(*wpa), GFP_NOFS);
1803 [ # # ]: 0 : if (wpa) {
1804 : : ap = &wpa->ia.ap;
1805 : 0 : ap->num_pages = 0;
1806 : 0 : ap->pages = fuse_pages_alloc(1, GFP_NOFS, &ap->descs);
1807 [ # # ]: 0 : if (!ap->pages) {
1808 : 0 : kfree(wpa);
1809 : : wpa = NULL;
1810 : : }
1811 : : }
1812 : 0 : return wpa;
1813 : :
1814 : : }
1815 : :
1816 : 0 : static int fuse_writepage_locked(struct page *page)
1817 : : {
1818 : 0 : struct address_space *mapping = page->mapping;
1819 : 0 : struct inode *inode = mapping->host;
1820 : : struct fuse_conn *fc = get_fuse_conn(inode);
1821 : : struct fuse_inode *fi = get_fuse_inode(inode);
1822 : : struct fuse_writepage_args *wpa;
1823 : : struct fuse_args_pages *ap;
1824 : : struct page *tmp_page;
1825 : : int error = -ENOMEM;
1826 : :
1827 : : set_page_writeback(page);
1828 : :
1829 : 0 : wpa = fuse_writepage_args_alloc();
1830 [ # # ]: 0 : if (!wpa)
1831 : : goto err;
1832 : : ap = &wpa->ia.ap;
1833 : :
1834 : : tmp_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
1835 [ # # ]: 0 : if (!tmp_page)
1836 : : goto err_free;
1837 : :
1838 : : error = -EIO;
1839 : 0 : wpa->ia.ff = fuse_write_file_get(fc, fi);
1840 [ # # ]: 0 : if (!wpa->ia.ff)
1841 : : goto err_nofile;
1842 : :
1843 : : fuse_write_args_fill(&wpa->ia, wpa->ia.ff, page_offset(page), 0);
1844 : :
1845 : 0 : copy_highpage(tmp_page, page);
1846 : 0 : wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE;
1847 : 0 : wpa->next = NULL;
1848 : 0 : ap->args.in_pages = true;
1849 : 0 : ap->num_pages = 1;
1850 : 0 : ap->pages[0] = tmp_page;
1851 : 0 : ap->descs[0].offset = 0;
1852 : 0 : ap->descs[0].length = PAGE_SIZE;
1853 : 0 : ap->args.end = fuse_writepage_end;
1854 : 0 : wpa->inode = inode;
1855 : :
1856 : 0 : inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
1857 : 0 : inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP);
1858 : :
1859 : : spin_lock(&fi->lock);
1860 : 0 : list_add(&wpa->writepages_entry, &fi->writepages);
1861 : 0 : list_add_tail(&wpa->queue_entry, &fi->queued_writes);
1862 : 0 : fuse_flush_writepages(inode);
1863 : : spin_unlock(&fi->lock);
1864 : :
1865 : 0 : end_page_writeback(page);
1866 : :
1867 : 0 : return 0;
1868 : :
1869 : : err_nofile:
1870 : 0 : __free_page(tmp_page);
1871 : : err_free:
1872 : 0 : kfree(wpa);
1873 : : err:
1874 : 0 : mapping_set_error(page->mapping, error);
1875 : 0 : end_page_writeback(page);
1876 : 0 : return error;
1877 : : }
1878 : :
1879 : 0 : static int fuse_writepage(struct page *page, struct writeback_control *wbc)
1880 : : {
1881 : : int err;
1882 : :
1883 [ # # ]: 0 : if (fuse_page_is_writeback(page->mapping->host, page->index)) {
1884 : : /*
1885 : : * ->writepages() should be called for sync() and friends. We
1886 : : * should only get here on direct reclaim and then we are
1887 : : * allowed to skip a page which is already in flight
1888 : : */
1889 [ # # ]: 0 : WARN_ON(wbc->sync_mode == WB_SYNC_ALL);
1890 : :
1891 : 0 : redirty_page_for_writepage(wbc, page);
1892 : 0 : unlock_page(page);
1893 : 0 : return 0;
1894 : : }
1895 : :
1896 : 0 : err = fuse_writepage_locked(page);
1897 : 0 : unlock_page(page);
1898 : :
1899 : 0 : return err;
1900 : : }
1901 : :
1902 : : struct fuse_fill_wb_data {
1903 : : struct fuse_writepage_args *wpa;
1904 : : struct fuse_file *ff;
1905 : : struct inode *inode;
1906 : : struct page **orig_pages;
1907 : : unsigned int max_pages;
1908 : : };
1909 : :
1910 : 0 : static bool fuse_pages_realloc(struct fuse_fill_wb_data *data)
1911 : : {
1912 : 0 : struct fuse_args_pages *ap = &data->wpa->ia.ap;
1913 : 0 : struct fuse_conn *fc = get_fuse_conn(data->inode);
1914 : : struct page **pages;
1915 : : struct fuse_page_desc *descs;
1916 : 0 : unsigned int npages = min_t(unsigned int,
1917 : : max_t(unsigned int, data->max_pages * 2,
1918 : : FUSE_DEFAULT_MAX_PAGES_PER_REQ),
1919 : : fc->max_pages);
1920 [ # # ]: 0 : WARN_ON(npages <= data->max_pages);
1921 : :
1922 : : pages = fuse_pages_alloc(npages, GFP_NOFS, &descs);
1923 [ # # ]: 0 : if (!pages)
1924 : : return false;
1925 : :
1926 : 0 : memcpy(pages, ap->pages, sizeof(struct page *) * ap->num_pages);
1927 : 0 : memcpy(descs, ap->descs, sizeof(struct fuse_page_desc) * ap->num_pages);
1928 : 0 : kfree(ap->pages);
1929 : 0 : ap->pages = pages;
1930 : 0 : ap->descs = descs;
1931 : 0 : data->max_pages = npages;
1932 : :
1933 : 0 : return true;
1934 : : }
1935 : :
1936 : 0 : static void fuse_writepages_send(struct fuse_fill_wb_data *data)
1937 : : {
1938 : 0 : struct fuse_writepage_args *wpa = data->wpa;
1939 : 0 : struct inode *inode = data->inode;
1940 : : struct fuse_inode *fi = get_fuse_inode(inode);
1941 : 0 : int num_pages = wpa->ia.ap.num_pages;
1942 : : int i;
1943 : :
1944 : 0 : wpa->ia.ff = fuse_file_get(data->ff);
1945 : : spin_lock(&fi->lock);
1946 : 0 : list_add_tail(&wpa->queue_entry, &fi->queued_writes);
1947 : 0 : fuse_flush_writepages(inode);
1948 : : spin_unlock(&fi->lock);
1949 : :
1950 [ # # ]: 0 : for (i = 0; i < num_pages; i++)
1951 : 0 : end_page_writeback(data->orig_pages[i]);
1952 : 0 : }
1953 : :
1954 : : /*
1955 : : * First recheck under fi->lock if the offending offset is still under
1956 : : * writeback. If yes, then iterate auxiliary write requests, to see if there's
1957 : : * one already added for a page at this offset. If there's none, then insert
1958 : : * this new request onto the auxiliary list, otherwise reuse the existing one by
1959 : : * copying the new page contents over to the old temporary page.
1960 : : */
1961 : 0 : static bool fuse_writepage_in_flight(struct fuse_writepage_args *new_wpa,
1962 : : struct page *page)
1963 : : {
1964 : 0 : struct fuse_inode *fi = get_fuse_inode(new_wpa->inode);
1965 : : struct fuse_writepage_args *tmp;
1966 : : struct fuse_writepage_args *old_wpa;
1967 : : struct fuse_args_pages *new_ap = &new_wpa->ia.ap;
1968 : :
1969 [ # # ]: 0 : WARN_ON(new_ap->num_pages != 0);
1970 : :
1971 : : spin_lock(&fi->lock);
1972 : : list_del(&new_wpa->writepages_entry);
1973 : 0 : old_wpa = fuse_find_writeback(fi, page->index, page->index);
1974 [ # # ]: 0 : if (!old_wpa) {
1975 : 0 : list_add(&new_wpa->writepages_entry, &fi->writepages);
1976 : : spin_unlock(&fi->lock);
1977 : 0 : return false;
1978 : : }
1979 : :
1980 : 0 : new_ap->num_pages = 1;
1981 [ # # ]: 0 : for (tmp = old_wpa->next; tmp; tmp = tmp->next) {
1982 : : pgoff_t curr_index;
1983 : :
1984 [ # # ]: 0 : WARN_ON(tmp->inode != new_wpa->inode);
1985 : 0 : curr_index = tmp->ia.write.in.offset >> PAGE_SHIFT;
1986 [ # # ]: 0 : if (curr_index == page->index) {
1987 [ # # ]: 0 : WARN_ON(tmp->ia.ap.num_pages != 1);
1988 : 0 : swap(tmp->ia.ap.pages[0], new_ap->pages[0]);
1989 : 0 : break;
1990 : : }
1991 : : }
1992 : :
1993 [ # # ]: 0 : if (!tmp) {
1994 : 0 : new_wpa->next = old_wpa->next;
1995 : 0 : old_wpa->next = new_wpa;
1996 : : }
1997 : :
1998 : : spin_unlock(&fi->lock);
1999 : :
2000 [ # # ]: 0 : if (tmp) {
2001 : 0 : struct backing_dev_info *bdi = inode_to_bdi(new_wpa->inode);
2002 : :
2003 : 0 : dec_wb_stat(&bdi->wb, WB_WRITEBACK);
2004 : 0 : dec_node_page_state(new_ap->pages[0], NR_WRITEBACK_TEMP);
2005 : 0 : wb_writeout_inc(&bdi->wb);
2006 : 0 : fuse_writepage_free(new_wpa);
2007 : : }
2008 : :
2009 : : return true;
2010 : : }
2011 : :
2012 : 0 : static int fuse_writepages_fill(struct page *page,
2013 : : struct writeback_control *wbc, void *_data)
2014 : : {
2015 : : struct fuse_fill_wb_data *data = _data;
2016 : 0 : struct fuse_writepage_args *wpa = data->wpa;
2017 : 0 : struct fuse_args_pages *ap = &wpa->ia.ap;
2018 : 0 : struct inode *inode = data->inode;
2019 : : struct fuse_inode *fi = get_fuse_inode(inode);
2020 : : struct fuse_conn *fc = get_fuse_conn(inode);
2021 : : struct page *tmp_page;
2022 : : bool is_writeback;
2023 : : int err;
2024 : :
2025 [ # # ]: 0 : if (!data->ff) {
2026 : : err = -EIO;
2027 : 0 : data->ff = fuse_write_file_get(fc, fi);
2028 [ # # ]: 0 : if (!data->ff)
2029 : : goto out_unlock;
2030 : : }
2031 : :
2032 : : /*
2033 : : * Being under writeback is unlikely but possible. For example direct
2034 : : * read to an mmaped fuse file will set the page dirty twice; once when
2035 : : * the pages are faulted with get_user_pages(), and then after the read
2036 : : * completed.
2037 : : */
2038 : 0 : is_writeback = fuse_page_is_writeback(inode, page->index);
2039 : :
2040 [ # # # # : 0 : if (wpa && ap->num_pages &&
# # ]
2041 [ # # # # ]: 0 : (is_writeback || ap->num_pages == fc->max_pages ||
2042 [ # # ]: 0 : (ap->num_pages + 1) * PAGE_SIZE > fc->max_write ||
2043 : 0 : data->orig_pages[ap->num_pages - 1]->index + 1 != page->index)) {
2044 : 0 : fuse_writepages_send(data);
2045 : 0 : data->wpa = NULL;
2046 [ # # # # ]: 0 : } else if (wpa && ap->num_pages == data->max_pages) {
2047 [ # # ]: 0 : if (!fuse_pages_realloc(data)) {
2048 : 0 : fuse_writepages_send(data);
2049 : 0 : data->wpa = NULL;
2050 : : }
2051 : : }
2052 : :
2053 : : err = -ENOMEM;
2054 : : tmp_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
2055 [ # # ]: 0 : if (!tmp_page)
2056 : : goto out_unlock;
2057 : :
2058 : : /*
2059 : : * The page must not be redirtied until the writeout is completed
2060 : : * (i.e. userspace has sent a reply to the write request). Otherwise
2061 : : * there could be more than one temporary page instance for each real
2062 : : * page.
2063 : : *
2064 : : * This is ensured by holding the page lock in page_mkwrite() while
2065 : : * checking fuse_page_is_writeback(). We already hold the page lock
2066 : : * since clear_page_dirty_for_io() and keep it held until we add the
2067 : : * request to the fi->writepages list and increment ap->num_pages.
2068 : : * After this fuse_page_is_writeback() will indicate that the page is
2069 : : * under writeback, so we can release the page lock.
2070 : : */
2071 [ # # ]: 0 : if (data->wpa == NULL) {
2072 : : err = -ENOMEM;
2073 : 0 : wpa = fuse_writepage_args_alloc();
2074 [ # # ]: 0 : if (!wpa) {
2075 : 0 : __free_page(tmp_page);
2076 : 0 : goto out_unlock;
2077 : : }
2078 : 0 : data->max_pages = 1;
2079 : :
2080 : 0 : ap = &wpa->ia.ap;
2081 : 0 : fuse_write_args_fill(&wpa->ia, data->ff, page_offset(page), 0);
2082 : 0 : wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE;
2083 : 0 : wpa->next = NULL;
2084 : 0 : ap->args.in_pages = true;
2085 : 0 : ap->args.end = fuse_writepage_end;
2086 : 0 : ap->num_pages = 0;
2087 : 0 : wpa->inode = inode;
2088 : :
2089 : : spin_lock(&fi->lock);
2090 : 0 : list_add(&wpa->writepages_entry, &fi->writepages);
2091 : : spin_unlock(&fi->lock);
2092 : :
2093 : 0 : data->wpa = wpa;
2094 : : }
2095 : : set_page_writeback(page);
2096 : :
2097 : 0 : copy_highpage(tmp_page, page);
2098 : 0 : ap->pages[ap->num_pages] = tmp_page;
2099 : 0 : ap->descs[ap->num_pages].offset = 0;
2100 : 0 : ap->descs[ap->num_pages].length = PAGE_SIZE;
2101 : :
2102 : 0 : inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
2103 : 0 : inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP);
2104 : :
2105 : : err = 0;
2106 [ # # # # ]: 0 : if (is_writeback && fuse_writepage_in_flight(wpa, page)) {
2107 : 0 : end_page_writeback(page);
2108 : 0 : data->wpa = NULL;
2109 : 0 : goto out_unlock;
2110 : : }
2111 : 0 : data->orig_pages[ap->num_pages] = page;
2112 : :
2113 : : /*
2114 : : * Protected by fi->lock against concurrent access by
2115 : : * fuse_page_is_writeback().
2116 : : */
2117 : : spin_lock(&fi->lock);
2118 : 0 : ap->num_pages++;
2119 : : spin_unlock(&fi->lock);
2120 : :
2121 : : out_unlock:
2122 : 0 : unlock_page(page);
2123 : :
2124 : 0 : return err;
2125 : : }
2126 : :
2127 : 0 : static int fuse_writepages(struct address_space *mapping,
2128 : : struct writeback_control *wbc)
2129 : : {
2130 : 0 : struct inode *inode = mapping->host;
2131 : : struct fuse_conn *fc = get_fuse_conn(inode);
2132 : : struct fuse_fill_wb_data data;
2133 : : int err;
2134 : :
2135 : : err = -EIO;
2136 [ # # ]: 0 : if (is_bad_inode(inode))
2137 : : goto out;
2138 : :
2139 : 0 : data.inode = inode;
2140 : 0 : data.wpa = NULL;
2141 : 0 : data.ff = NULL;
2142 : :
2143 : : err = -ENOMEM;
2144 : 0 : data.orig_pages = kcalloc(fc->max_pages,
2145 : : sizeof(struct page *),
2146 : : GFP_NOFS);
2147 [ # # ]: 0 : if (!data.orig_pages)
2148 : : goto out;
2149 : :
2150 : 0 : err = write_cache_pages(mapping, wbc, fuse_writepages_fill, &data);
2151 [ # # ]: 0 : if (data.wpa) {
2152 [ # # ]: 0 : WARN_ON(!data.wpa->ia.ap.num_pages);
2153 : 0 : fuse_writepages_send(&data);
2154 : : }
2155 [ # # ]: 0 : if (data.ff)
2156 : 0 : fuse_file_put(data.ff, false, false);
2157 : :
2158 : 0 : kfree(data.orig_pages);
2159 : : out:
2160 : 0 : return err;
2161 : : }
2162 : :
2163 : : /*
2164 : : * It's worthy to make sure that space is reserved on disk for the write,
2165 : : * but how to implement it without killing performance need more thinking.
2166 : : */
2167 : 0 : static int fuse_write_begin(struct file *file, struct address_space *mapping,
2168 : : loff_t pos, unsigned len, unsigned flags,
2169 : : struct page **pagep, void **fsdata)
2170 : : {
2171 : 0 : pgoff_t index = pos >> PAGE_SHIFT;
2172 : : struct fuse_conn *fc = get_fuse_conn(file_inode(file));
2173 : : struct page *page;
2174 : : loff_t fsize;
2175 : : int err = -ENOMEM;
2176 : :
2177 [ # # ]: 0 : WARN_ON(!fc->writeback_cache);
2178 : :
2179 : 0 : page = grab_cache_page_write_begin(mapping, index, flags);
2180 [ # # ]: 0 : if (!page)
2181 : : goto error;
2182 : :
2183 : 0 : fuse_wait_on_page_writeback(mapping->host, page->index);
2184 : :
2185 [ # # # # ]: 0 : if (PageUptodate(page) || len == PAGE_SIZE)
2186 : : goto success;
2187 : : /*
2188 : : * Check if the start this page comes after the end of file, in which
2189 : : * case the readpage can be optimized away.
2190 : : */
2191 : 0 : fsize = i_size_read(mapping->host);
2192 [ # # ]: 0 : if (fsize <= (pos & PAGE_MASK)) {
2193 : 0 : size_t off = pos & ~PAGE_MASK;
2194 [ # # ]: 0 : if (off)
2195 : : zero_user_segment(page, 0, off);
2196 : : goto success;
2197 : : }
2198 : 0 : err = fuse_do_readpage(file, page);
2199 [ # # ]: 0 : if (err)
2200 : : goto cleanup;
2201 : : success:
2202 : 0 : *pagep = page;
2203 : 0 : return 0;
2204 : :
2205 : : cleanup:
2206 : 0 : unlock_page(page);
2207 : 0 : put_page(page);
2208 : : error:
2209 : 0 : return err;
2210 : : }
2211 : :
2212 : 0 : static int fuse_write_end(struct file *file, struct address_space *mapping,
2213 : : loff_t pos, unsigned len, unsigned copied,
2214 : : struct page *page, void *fsdata)
2215 : : {
2216 : 0 : struct inode *inode = page->mapping->host;
2217 : :
2218 : : /* Haven't copied anything? Skip zeroing, size extending, dirtying. */
2219 [ # # ]: 0 : if (!copied)
2220 : : goto unlock;
2221 : :
2222 [ # # ]: 0 : if (!PageUptodate(page)) {
2223 : : /* Zero any unwritten bytes at the end of the page */
2224 : 0 : size_t endoff = (pos + copied) & ~PAGE_MASK;
2225 [ # # ]: 0 : if (endoff)
2226 : : zero_user_segment(page, endoff, PAGE_SIZE);
2227 : : SetPageUptodate(page);
2228 : : }
2229 : :
2230 : 0 : fuse_write_update_size(inode, pos + copied);
2231 : 0 : set_page_dirty(page);
2232 : :
2233 : : unlock:
2234 : 0 : unlock_page(page);
2235 : 0 : put_page(page);
2236 : :
2237 : 0 : return copied;
2238 : : }
2239 : :
2240 : 0 : static int fuse_launder_page(struct page *page)
2241 : : {
2242 : : int err = 0;
2243 [ # # ]: 0 : if (clear_page_dirty_for_io(page)) {
2244 : 0 : struct inode *inode = page->mapping->host;
2245 : 0 : err = fuse_writepage_locked(page);
2246 [ # # ]: 0 : if (!err)
2247 : 0 : fuse_wait_on_page_writeback(inode, page->index);
2248 : : }
2249 : 0 : return err;
2250 : : }
2251 : :
2252 : : /*
2253 : : * Write back dirty pages now, because there may not be any suitable
2254 : : * open files later
2255 : : */
2256 : 0 : static void fuse_vma_close(struct vm_area_struct *vma)
2257 : : {
2258 : 0 : filemap_write_and_wait(vma->vm_file->f_mapping);
2259 : 0 : }
2260 : :
2261 : : /*
2262 : : * Wait for writeback against this page to complete before allowing it
2263 : : * to be marked dirty again, and hence written back again, possibly
2264 : : * before the previous writepage completed.
2265 : : *
2266 : : * Block here, instead of in ->writepage(), so that the userspace fs
2267 : : * can only block processes actually operating on the filesystem.
2268 : : *
2269 : : * Otherwise unprivileged userspace fs would be able to block
2270 : : * unrelated:
2271 : : *
2272 : : * - page migration
2273 : : * - sync(2)
2274 : : * - try_to_free_pages() with order > PAGE_ALLOC_COSTLY_ORDER
2275 : : */
2276 : 0 : static vm_fault_t fuse_page_mkwrite(struct vm_fault *vmf)
2277 : : {
2278 : 0 : struct page *page = vmf->page;
2279 : 0 : struct inode *inode = file_inode(vmf->vma->vm_file);
2280 : :
2281 : 0 : file_update_time(vmf->vma->vm_file);
2282 : 0 : lock_page(page);
2283 [ # # ]: 0 : if (page->mapping != inode->i_mapping) {
2284 : 0 : unlock_page(page);
2285 : 0 : return VM_FAULT_NOPAGE;
2286 : : }
2287 : :
2288 : 0 : fuse_wait_on_page_writeback(inode, page->index);
2289 : 0 : return VM_FAULT_LOCKED;
2290 : : }
2291 : :
2292 : : static const struct vm_operations_struct fuse_file_vm_ops = {
2293 : : .close = fuse_vma_close,
2294 : : .fault = filemap_fault,
2295 : : .map_pages = filemap_map_pages,
2296 : : .page_mkwrite = fuse_page_mkwrite,
2297 : : };
2298 : :
2299 : 0 : static int fuse_file_mmap(struct file *file, struct vm_area_struct *vma)
2300 : : {
2301 : 0 : struct fuse_file *ff = file->private_data;
2302 : :
2303 [ # # ]: 0 : if (ff->open_flags & FOPEN_DIRECT_IO) {
2304 : : /* Can't provide the coherency needed for MAP_SHARED */
2305 [ # # ]: 0 : if (vma->vm_flags & VM_MAYSHARE)
2306 : : return -ENODEV;
2307 : :
2308 : 0 : invalidate_inode_pages2(file->f_mapping);
2309 : :
2310 : 0 : return generic_file_mmap(file, vma);
2311 : : }
2312 : :
2313 [ # # ]: 0 : if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE))
2314 : 0 : fuse_link_write_file(file);
2315 : :
2316 : : file_accessed(file);
2317 : 0 : vma->vm_ops = &fuse_file_vm_ops;
2318 : 0 : return 0;
2319 : : }
2320 : :
2321 : 0 : static int convert_fuse_file_lock(struct fuse_conn *fc,
2322 : : const struct fuse_file_lock *ffl,
2323 : : struct file_lock *fl)
2324 : : {
2325 [ # # # ]: 0 : switch (ffl->type) {
2326 : : case F_UNLCK:
2327 : : break;
2328 : :
2329 : : case F_RDLCK:
2330 : : case F_WRLCK:
2331 [ # # # # : 0 : if (ffl->start > OFFSET_MAX || ffl->end > OFFSET_MAX ||
# # ]
2332 : : ffl->end < ffl->start)
2333 : : return -EIO;
2334 : :
2335 : 0 : fl->fl_start = ffl->start;
2336 : 0 : fl->fl_end = ffl->end;
2337 : :
2338 : : /*
2339 : : * Convert pid into init's pid namespace. The locks API will
2340 : : * translate it into the caller's pid namespace.
2341 : : */
2342 : : rcu_read_lock();
2343 : 0 : fl->fl_pid = pid_nr_ns(find_pid_ns(ffl->pid, fc->pid_ns), &init_pid_ns);
2344 : : rcu_read_unlock();
2345 : : break;
2346 : :
2347 : : default:
2348 : : return -EIO;
2349 : : }
2350 : 0 : fl->fl_type = ffl->type;
2351 : 0 : return 0;
2352 : : }
2353 : :
2354 : 0 : static void fuse_lk_fill(struct fuse_args *args, struct file *file,
2355 : : const struct file_lock *fl, int opcode, pid_t pid,
2356 : : int flock, struct fuse_lk_in *inarg)
2357 : : {
2358 : : struct inode *inode = file_inode(file);
2359 : : struct fuse_conn *fc = get_fuse_conn(inode);
2360 : 0 : struct fuse_file *ff = file->private_data;
2361 : :
2362 : 0 : memset(inarg, 0, sizeof(*inarg));
2363 : 0 : inarg->fh = ff->fh;
2364 : 0 : inarg->owner = fuse_lock_owner_id(fc, fl->fl_owner);
2365 : 0 : inarg->lk.start = fl->fl_start;
2366 : 0 : inarg->lk.end = fl->fl_end;
2367 : 0 : inarg->lk.type = fl->fl_type;
2368 : 0 : inarg->lk.pid = pid;
2369 [ # # ]: 0 : if (flock)
2370 : 0 : inarg->lk_flags |= FUSE_LK_FLOCK;
2371 : 0 : args->opcode = opcode;
2372 : 0 : args->nodeid = get_node_id(inode);
2373 : 0 : args->in_numargs = 1;
2374 : 0 : args->in_args[0].size = sizeof(*inarg);
2375 : 0 : args->in_args[0].value = inarg;
2376 : 0 : }
2377 : :
2378 : 0 : static int fuse_getlk(struct file *file, struct file_lock *fl)
2379 : : {
2380 : : struct inode *inode = file_inode(file);
2381 : : struct fuse_conn *fc = get_fuse_conn(inode);
2382 : 0 : FUSE_ARGS(args);
2383 : : struct fuse_lk_in inarg;
2384 : : struct fuse_lk_out outarg;
2385 : : int err;
2386 : :
2387 : 0 : fuse_lk_fill(&args, file, fl, FUSE_GETLK, 0, 0, &inarg);
2388 : 0 : args.out_numargs = 1;
2389 : 0 : args.out_args[0].size = sizeof(outarg);
2390 : 0 : args.out_args[0].value = &outarg;
2391 : 0 : err = fuse_simple_request(fc, &args);
2392 [ # # ]: 0 : if (!err)
2393 : 0 : err = convert_fuse_file_lock(fc, &outarg.lk, fl);
2394 : :
2395 : 0 : return err;
2396 : : }
2397 : :
2398 : 0 : static int fuse_setlk(struct file *file, struct file_lock *fl, int flock)
2399 : : {
2400 : : struct inode *inode = file_inode(file);
2401 : : struct fuse_conn *fc = get_fuse_conn(inode);
2402 : 0 : FUSE_ARGS(args);
2403 : : struct fuse_lk_in inarg;
2404 [ # # ]: 0 : int opcode = (fl->fl_flags & FL_SLEEP) ? FUSE_SETLKW : FUSE_SETLK;
2405 [ # # ]: 0 : struct pid *pid = fl->fl_type != F_UNLCK ? task_tgid(current) : NULL;
2406 : 0 : pid_t pid_nr = pid_nr_ns(pid, fc->pid_ns);
2407 : : int err;
2408 : :
2409 [ # # # # ]: 0 : if (fl->fl_lmops && fl->fl_lmops->lm_grant) {
2410 : : /* NLM needs asynchronous locks, which we don't support yet */
2411 : : return -ENOLCK;
2412 : : }
2413 : :
2414 : : /* Unlock on close is handled by the flush method */
2415 [ # # ]: 0 : if ((fl->fl_flags & FL_CLOSE_POSIX) == FL_CLOSE_POSIX)
2416 : : return 0;
2417 : :
2418 : 0 : fuse_lk_fill(&args, file, fl, opcode, pid_nr, flock, &inarg);
2419 : 0 : err = fuse_simple_request(fc, &args);
2420 : :
2421 : : /* locking is restartable */
2422 [ # # ]: 0 : if (err == -EINTR)
2423 : : err = -ERESTARTSYS;
2424 : :
2425 : 0 : return err;
2426 : : }
2427 : :
2428 : 0 : static int fuse_file_lock(struct file *file, int cmd, struct file_lock *fl)
2429 : : {
2430 : : struct inode *inode = file_inode(file);
2431 : : struct fuse_conn *fc = get_fuse_conn(inode);
2432 : : int err;
2433 : :
2434 [ # # ]: 0 : if (cmd == F_CANCELLK) {
2435 : : err = 0;
2436 [ # # ]: 0 : } else if (cmd == F_GETLK) {
2437 [ # # ]: 0 : if (fc->no_lock) {
2438 : 0 : posix_test_lock(file, fl);
2439 : : err = 0;
2440 : : } else
2441 : 0 : err = fuse_getlk(file, fl);
2442 : : } else {
2443 [ # # ]: 0 : if (fc->no_lock)
2444 : 0 : err = posix_lock_file(file, fl, NULL);
2445 : : else
2446 : 0 : err = fuse_setlk(file, fl, 0);
2447 : : }
2448 : 0 : return err;
2449 : : }
2450 : :
2451 : 0 : static int fuse_file_flock(struct file *file, int cmd, struct file_lock *fl)
2452 : : {
2453 : : struct inode *inode = file_inode(file);
2454 : : struct fuse_conn *fc = get_fuse_conn(inode);
2455 : : int err;
2456 : :
2457 [ # # ]: 0 : if (fc->no_flock) {
2458 : : err = locks_lock_file_wait(file, fl);
2459 : : } else {
2460 : 0 : struct fuse_file *ff = file->private_data;
2461 : :
2462 : : /* emulate flock with POSIX locks */
2463 : 0 : ff->flock = true;
2464 : 0 : err = fuse_setlk(file, fl, 1);
2465 : : }
2466 : :
2467 : 0 : return err;
2468 : : }
2469 : :
2470 : 0 : static sector_t fuse_bmap(struct address_space *mapping, sector_t block)
2471 : : {
2472 : 0 : struct inode *inode = mapping->host;
2473 : : struct fuse_conn *fc = get_fuse_conn(inode);
2474 : 0 : FUSE_ARGS(args);
2475 : : struct fuse_bmap_in inarg;
2476 : : struct fuse_bmap_out outarg;
2477 : : int err;
2478 : :
2479 [ # # # # ]: 0 : if (!inode->i_sb->s_bdev || fc->no_bmap)
2480 : : return 0;
2481 : :
2482 : 0 : memset(&inarg, 0, sizeof(inarg));
2483 : 0 : inarg.block = block;
2484 : 0 : inarg.blocksize = inode->i_sb->s_blocksize;
2485 : 0 : args.opcode = FUSE_BMAP;
2486 : 0 : args.nodeid = get_node_id(inode);
2487 : 0 : args.in_numargs = 1;
2488 : 0 : args.in_args[0].size = sizeof(inarg);
2489 : 0 : args.in_args[0].value = &inarg;
2490 : 0 : args.out_numargs = 1;
2491 : 0 : args.out_args[0].size = sizeof(outarg);
2492 : 0 : args.out_args[0].value = &outarg;
2493 : 0 : err = fuse_simple_request(fc, &args);
2494 [ # # ]: 0 : if (err == -ENOSYS)
2495 : 0 : fc->no_bmap = 1;
2496 : :
2497 [ # # ]: 0 : return err ? 0 : outarg.block;
2498 : : }
2499 : :
2500 : 0 : static loff_t fuse_lseek(struct file *file, loff_t offset, int whence)
2501 : : {
2502 : 0 : struct inode *inode = file->f_mapping->host;
2503 : : struct fuse_conn *fc = get_fuse_conn(inode);
2504 : 0 : struct fuse_file *ff = file->private_data;
2505 : 0 : FUSE_ARGS(args);
2506 : 0 : struct fuse_lseek_in inarg = {
2507 : 0 : .fh = ff->fh,
2508 : : .offset = offset,
2509 : : .whence = whence
2510 : : };
2511 : : struct fuse_lseek_out outarg;
2512 : : int err;
2513 : :
2514 [ # # ]: 0 : if (fc->no_lseek)
2515 : : goto fallback;
2516 : :
2517 : 0 : args.opcode = FUSE_LSEEK;
2518 : 0 : args.nodeid = ff->nodeid;
2519 : 0 : args.in_numargs = 1;
2520 : 0 : args.in_args[0].size = sizeof(inarg);
2521 : 0 : args.in_args[0].value = &inarg;
2522 : 0 : args.out_numargs = 1;
2523 : 0 : args.out_args[0].size = sizeof(outarg);
2524 : 0 : args.out_args[0].value = &outarg;
2525 : 0 : err = fuse_simple_request(fc, &args);
2526 [ # # ]: 0 : if (err) {
2527 [ # # ]: 0 : if (err == -ENOSYS) {
2528 : 0 : fc->no_lseek = 1;
2529 : 0 : goto fallback;
2530 : : }
2531 : 0 : return err;
2532 : : }
2533 : :
2534 : 0 : return vfs_setpos(file, outarg.offset, inode->i_sb->s_maxbytes);
2535 : :
2536 : : fallback:
2537 : 0 : err = fuse_update_attributes(inode, file);
2538 [ # # ]: 0 : if (!err)
2539 : 0 : return generic_file_llseek(file, offset, whence);
2540 : : else
2541 : 0 : return err;
2542 : : }
2543 : :
2544 : 0 : static loff_t fuse_file_llseek(struct file *file, loff_t offset, int whence)
2545 : : {
2546 : : loff_t retval;
2547 : : struct inode *inode = file_inode(file);
2548 : :
2549 [ # # # # ]: 0 : switch (whence) {
2550 : : case SEEK_SET:
2551 : : case SEEK_CUR:
2552 : : /* No i_mutex protection necessary for SEEK_CUR and SEEK_SET */
2553 : 0 : retval = generic_file_llseek(file, offset, whence);
2554 : 0 : break;
2555 : : case SEEK_END:
2556 : : inode_lock(inode);
2557 : 0 : retval = fuse_update_attributes(inode, file);
2558 [ # # ]: 0 : if (!retval)
2559 : 0 : retval = generic_file_llseek(file, offset, whence);
2560 : : inode_unlock(inode);
2561 : : break;
2562 : : case SEEK_HOLE:
2563 : : case SEEK_DATA:
2564 : : inode_lock(inode);
2565 : 0 : retval = fuse_lseek(file, offset, whence);
2566 : : inode_unlock(inode);
2567 : : break;
2568 : : default:
2569 : : retval = -EINVAL;
2570 : : }
2571 : :
2572 : 0 : return retval;
2573 : : }
2574 : :
2575 : : /*
2576 : : * CUSE servers compiled on 32bit broke on 64bit kernels because the
2577 : : * ABI was defined to be 'struct iovec' which is different on 32bit
2578 : : * and 64bit. Fortunately we can determine which structure the server
2579 : : * used from the size of the reply.
2580 : : */
2581 : : static int fuse_copy_ioctl_iovec_old(struct iovec *dst, void *src,
2582 : : size_t transferred, unsigned count,
2583 : : bool is_compat)
2584 : : {
2585 : : #ifdef CONFIG_COMPAT
2586 : : if (count * sizeof(struct compat_iovec) == transferred) {
2587 : : struct compat_iovec *ciov = src;
2588 : : unsigned i;
2589 : :
2590 : : /*
2591 : : * With this interface a 32bit server cannot support
2592 : : * non-compat (i.e. ones coming from 64bit apps) ioctl
2593 : : * requests
2594 : : */
2595 : : if (!is_compat)
2596 : : return -EINVAL;
2597 : :
2598 : : for (i = 0; i < count; i++) {
2599 : : dst[i].iov_base = compat_ptr(ciov[i].iov_base);
2600 : : dst[i].iov_len = ciov[i].iov_len;
2601 : : }
2602 : : return 0;
2603 : : }
2604 : : #endif
2605 : :
2606 [ # # ]: 0 : if (count * sizeof(struct iovec) != transferred)
2607 : : return -EIO;
2608 : :
2609 : 0 : memcpy(dst, src, transferred);
2610 : : return 0;
2611 : : }
2612 : :
2613 : : /* Make sure iov_length() won't overflow */
2614 : : static int fuse_verify_ioctl_iov(struct fuse_conn *fc, struct iovec *iov,
2615 : : size_t count)
2616 : : {
2617 : : size_t n;
2618 : 0 : u32 max = fc->max_pages << PAGE_SHIFT;
2619 : :
2620 [ # # # # ]: 0 : for (n = 0; n < count; n++, iov++) {
2621 [ # # # # ]: 0 : if (iov->iov_len > (size_t) max)
2622 : : return -ENOMEM;
2623 : 0 : max -= iov->iov_len;
2624 : : }
2625 : : return 0;
2626 : : }
2627 : :
2628 : 0 : static int fuse_copy_ioctl_iovec(struct fuse_conn *fc, struct iovec *dst,
2629 : : void *src, size_t transferred, unsigned count,
2630 : : bool is_compat)
2631 : : {
2632 : : unsigned i;
2633 : : struct fuse_ioctl_iovec *fiov = src;
2634 : :
2635 [ # # ]: 0 : if (fc->minor < 16) {
2636 : 0 : return fuse_copy_ioctl_iovec_old(dst, src, transferred,
2637 : : count, is_compat);
2638 : : }
2639 : :
2640 [ # # ]: 0 : if (count * sizeof(struct fuse_ioctl_iovec) != transferred)
2641 : : return -EIO;
2642 : :
2643 [ # # ]: 0 : for (i = 0; i < count; i++) {
2644 : : /* Did the server supply an inappropriate value? */
2645 [ # # # # ]: 0 : if (fiov[i].base != (unsigned long) fiov[i].base ||
2646 : 0 : fiov[i].len != (unsigned long) fiov[i].len)
2647 : : return -EIO;
2648 : :
2649 : 0 : dst[i].iov_base = (void __user *) (unsigned long) fiov[i].base;
2650 : 0 : dst[i].iov_len = (size_t) fiov[i].len;
2651 : :
2652 : : #ifdef CONFIG_COMPAT
2653 : : if (is_compat &&
2654 : : (ptr_to_compat(dst[i].iov_base) != fiov[i].base ||
2655 : : (compat_size_t) dst[i].iov_len != fiov[i].len))
2656 : : return -EIO;
2657 : : #endif
2658 : : }
2659 : :
2660 : : return 0;
2661 : : }
2662 : :
2663 : :
2664 : : /*
2665 : : * For ioctls, there is no generic way to determine how much memory
2666 : : * needs to be read and/or written. Furthermore, ioctls are allowed
2667 : : * to dereference the passed pointer, so the parameter requires deep
2668 : : * copying but FUSE has no idea whatsoever about what to copy in or
2669 : : * out.
2670 : : *
2671 : : * This is solved by allowing FUSE server to retry ioctl with
2672 : : * necessary in/out iovecs. Let's assume the ioctl implementation
2673 : : * needs to read in the following structure.
2674 : : *
2675 : : * struct a {
2676 : : * char *buf;
2677 : : * size_t buflen;
2678 : : * }
2679 : : *
2680 : : * On the first callout to FUSE server, inarg->in_size and
2681 : : * inarg->out_size will be NULL; then, the server completes the ioctl
2682 : : * with FUSE_IOCTL_RETRY set in out->flags, out->in_iovs set to 1 and
2683 : : * the actual iov array to
2684 : : *
2685 : : * { { .iov_base = inarg.arg, .iov_len = sizeof(struct a) } }
2686 : : *
2687 : : * which tells FUSE to copy in the requested area and retry the ioctl.
2688 : : * On the second round, the server has access to the structure and
2689 : : * from that it can tell what to look for next, so on the invocation,
2690 : : * it sets FUSE_IOCTL_RETRY, out->in_iovs to 2 and iov array to
2691 : : *
2692 : : * { { .iov_base = inarg.arg, .iov_len = sizeof(struct a) },
2693 : : * { .iov_base = a.buf, .iov_len = a.buflen } }
2694 : : *
2695 : : * FUSE will copy both struct a and the pointed buffer from the
2696 : : * process doing the ioctl and retry ioctl with both struct a and the
2697 : : * buffer.
2698 : : *
2699 : : * This time, FUSE server has everything it needs and completes ioctl
2700 : : * without FUSE_IOCTL_RETRY which finishes the ioctl call.
2701 : : *
2702 : : * Copying data out works the same way.
2703 : : *
2704 : : * Note that if FUSE_IOCTL_UNRESTRICTED is clear, the kernel
2705 : : * automatically initializes in and out iovs by decoding @cmd with
2706 : : * _IOC_* macros and the server is not allowed to request RETRY. This
2707 : : * limits ioctl data transfers to well-formed ioctls and is the forced
2708 : : * behavior for all FUSE servers.
2709 : : */
2710 : 0 : long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
2711 : : unsigned int flags)
2712 : : {
2713 : 0 : struct fuse_file *ff = file->private_data;
2714 : 0 : struct fuse_conn *fc = ff->fc;
2715 : 0 : struct fuse_ioctl_in inarg = {
2716 : 0 : .fh = ff->fh,
2717 : : .cmd = cmd,
2718 : : .arg = arg,
2719 : : .flags = flags
2720 : : };
2721 : : struct fuse_ioctl_out outarg;
2722 : : struct iovec *iov_page = NULL;
2723 : : struct iovec *in_iov = NULL, *out_iov = NULL;
2724 : : unsigned int in_iovs = 0, out_iovs = 0, max_pages;
2725 : : size_t in_size, out_size, c;
2726 : : ssize_t transferred;
2727 : : int err, i;
2728 : : struct iov_iter ii;
2729 : 0 : struct fuse_args_pages ap = {};
2730 : :
2731 : : #if BITS_PER_LONG == 32
2732 : 0 : inarg.flags |= FUSE_IOCTL_32BIT;
2733 : : #else
2734 : : if (flags & FUSE_IOCTL_COMPAT) {
2735 : : inarg.flags |= FUSE_IOCTL_32BIT;
2736 : : #ifdef CONFIG_X86_X32
2737 : : if (in_x32_syscall())
2738 : : inarg.flags |= FUSE_IOCTL_COMPAT_X32;
2739 : : #endif
2740 : : }
2741 : : #endif
2742 : :
2743 : : /* assume all the iovs returned by client always fits in a page */
2744 : : BUILD_BUG_ON(sizeof(struct fuse_ioctl_iovec) * FUSE_IOCTL_MAX_IOV > PAGE_SIZE);
2745 : :
2746 : : err = -ENOMEM;
2747 : 0 : ap.pages = fuse_pages_alloc(fc->max_pages, GFP_KERNEL, &ap.descs);
2748 : 0 : iov_page = (struct iovec *) __get_free_page(GFP_KERNEL);
2749 [ # # # # ]: 0 : if (!ap.pages || !iov_page)
2750 : : goto out;
2751 : :
2752 : 0 : fuse_page_descs_length_init(ap.descs, 0, fc->max_pages);
2753 : :
2754 : : /*
2755 : : * If restricted, initialize IO parameters as encoded in @cmd.
2756 : : * RETRY from server is not allowed.
2757 : : */
2758 [ # # ]: 0 : if (!(flags & FUSE_IOCTL_UNRESTRICTED)) {
2759 : : struct iovec *iov = iov_page;
2760 : :
2761 : 0 : iov->iov_base = (void __user *)arg;
2762 : :
2763 [ # # ]: 0 : switch (cmd) {
2764 : : case FS_IOC_GETFLAGS:
2765 : : case FS_IOC_SETFLAGS:
2766 : 0 : iov->iov_len = sizeof(int);
2767 : 0 : break;
2768 : : default:
2769 : 0 : iov->iov_len = _IOC_SIZE(cmd);
2770 : 0 : break;
2771 : : }
2772 : :
2773 [ # # ]: 0 : if (_IOC_DIR(cmd) & _IOC_WRITE) {
2774 : : in_iov = iov;
2775 : : in_iovs = 1;
2776 : : }
2777 : :
2778 [ # # ]: 0 : if (_IOC_DIR(cmd) & _IOC_READ) {
2779 : : out_iov = iov;
2780 : : out_iovs = 1;
2781 : : }
2782 : : }
2783 : :
2784 : : retry:
2785 : 0 : inarg.in_size = in_size = iov_length(in_iov, in_iovs);
2786 : 0 : inarg.out_size = out_size = iov_length(out_iov, out_iovs);
2787 : :
2788 : : /*
2789 : : * Out data can be used either for actual out data or iovs,
2790 : : * make sure there always is at least one page.
2791 : : */
2792 : 0 : out_size = max_t(size_t, out_size, PAGE_SIZE);
2793 : 0 : max_pages = DIV_ROUND_UP(max(in_size, out_size), PAGE_SIZE);
2794 : :
2795 : : /* make sure there are enough buffer pages and init request with them */
2796 : : err = -ENOMEM;
2797 [ # # ]: 0 : if (max_pages > fc->max_pages)
2798 : : goto out;
2799 [ # # ]: 0 : while (ap.num_pages < max_pages) {
2800 : 0 : ap.pages[ap.num_pages] = alloc_page(GFP_KERNEL | __GFP_HIGHMEM);
2801 [ # # ]: 0 : if (!ap.pages[ap.num_pages])
2802 : : goto out;
2803 : 0 : ap.num_pages++;
2804 : : }
2805 : :
2806 : :
2807 : : /* okay, let's send it to the client */
2808 : 0 : ap.args.opcode = FUSE_IOCTL;
2809 : 0 : ap.args.nodeid = ff->nodeid;
2810 : 0 : ap.args.in_numargs = 1;
2811 : 0 : ap.args.in_args[0].size = sizeof(inarg);
2812 : 0 : ap.args.in_args[0].value = &inarg;
2813 [ # # ]: 0 : if (in_size) {
2814 : 0 : ap.args.in_numargs++;
2815 : 0 : ap.args.in_args[1].size = in_size;
2816 : 0 : ap.args.in_pages = true;
2817 : :
2818 : : err = -EFAULT;
2819 : 0 : iov_iter_init(&ii, WRITE, in_iov, in_iovs, in_size);
2820 [ # # # # : 0 : for (i = 0; iov_iter_count(&ii) && !WARN_ON(i >= ap.num_pages); i++) {
# # ]
2821 : 0 : c = copy_page_from_iter(ap.pages[i], 0, PAGE_SIZE, &ii);
2822 [ # # # # ]: 0 : if (c != PAGE_SIZE && iov_iter_count(&ii))
2823 : : goto out;
2824 : : }
2825 : : }
2826 : :
2827 : 0 : ap.args.out_numargs = 2;
2828 : 0 : ap.args.out_args[0].size = sizeof(outarg);
2829 : 0 : ap.args.out_args[0].value = &outarg;
2830 : 0 : ap.args.out_args[1].size = out_size;
2831 : 0 : ap.args.out_pages = true;
2832 : 0 : ap.args.out_argvar = true;
2833 : :
2834 : 0 : transferred = fuse_simple_request(fc, &ap.args);
2835 : : err = transferred;
2836 [ # # ]: 0 : if (transferred < 0)
2837 : : goto out;
2838 : :
2839 : : /* did it ask for retry? */
2840 [ # # ]: 0 : if (outarg.flags & FUSE_IOCTL_RETRY) {
2841 : : void *vaddr;
2842 : :
2843 : : /* no retry if in restricted mode */
2844 : : err = -EIO;
2845 [ # # ]: 0 : if (!(flags & FUSE_IOCTL_UNRESTRICTED))
2846 : : goto out;
2847 : :
2848 : 0 : in_iovs = outarg.in_iovs;
2849 : 0 : out_iovs = outarg.out_iovs;
2850 : :
2851 : : /*
2852 : : * Make sure things are in boundary, separate checks
2853 : : * are to protect against overflow.
2854 : : */
2855 : : err = -ENOMEM;
2856 [ # # ]: 0 : if (in_iovs > FUSE_IOCTL_MAX_IOV ||
2857 [ # # ]: 0 : out_iovs > FUSE_IOCTL_MAX_IOV ||
2858 : 0 : in_iovs + out_iovs > FUSE_IOCTL_MAX_IOV)
2859 : : goto out;
2860 : :
2861 : 0 : vaddr = kmap_atomic(ap.pages[0]);
2862 : 0 : err = fuse_copy_ioctl_iovec(fc, iov_page, vaddr,
2863 : : transferred, in_iovs + out_iovs,
2864 : 0 : (flags & FUSE_IOCTL_COMPAT) != 0);
2865 : : kunmap_atomic(vaddr);
2866 [ # # ]: 0 : if (err)
2867 : : goto out;
2868 : :
2869 : : in_iov = iov_page;
2870 : 0 : out_iov = in_iov + in_iovs;
2871 : :
2872 : : err = fuse_verify_ioctl_iov(fc, in_iov, in_iovs);
2873 [ # # ]: 0 : if (err)
2874 : : goto out;
2875 : :
2876 : : err = fuse_verify_ioctl_iov(fc, out_iov, out_iovs);
2877 [ # # ]: 0 : if (err)
2878 : : goto out;
2879 : :
2880 : : goto retry;
2881 : : }
2882 : :
2883 : : err = -EIO;
2884 [ # # ]: 0 : if (transferred > inarg.out_size)
2885 : : goto out;
2886 : :
2887 : : err = -EFAULT;
2888 : 0 : iov_iter_init(&ii, READ, out_iov, out_iovs, transferred);
2889 [ # # # # : 0 : for (i = 0; iov_iter_count(&ii) && !WARN_ON(i >= ap.num_pages); i++) {
# # ]
2890 : 0 : c = copy_page_to_iter(ap.pages[i], 0, PAGE_SIZE, &ii);
2891 [ # # # # ]: 0 : if (c != PAGE_SIZE && iov_iter_count(&ii))
2892 : : goto out;
2893 : : }
2894 : : err = 0;
2895 : : out:
2896 : 0 : free_page((unsigned long) iov_page);
2897 [ # # ]: 0 : while (ap.num_pages)
2898 : 0 : __free_page(ap.pages[--ap.num_pages]);
2899 : 0 : kfree(ap.pages);
2900 : :
2901 [ # # ]: 0 : return err ? err : outarg.result;
2902 : : }
2903 : : EXPORT_SYMBOL_GPL(fuse_do_ioctl);
2904 : :
2905 : 0 : long fuse_ioctl_common(struct file *file, unsigned int cmd,
2906 : : unsigned long arg, unsigned int flags)
2907 : : {
2908 : : struct inode *inode = file_inode(file);
2909 : : struct fuse_conn *fc = get_fuse_conn(inode);
2910 : :
2911 [ # # ]: 0 : if (!fuse_allow_current_process(fc))
2912 : : return -EACCES;
2913 : :
2914 [ # # ]: 0 : if (is_bad_inode(inode))
2915 : : return -EIO;
2916 : :
2917 : 0 : return fuse_do_ioctl(file, cmd, arg, flags);
2918 : : }
2919 : :
2920 : 0 : static long fuse_file_ioctl(struct file *file, unsigned int cmd,
2921 : : unsigned long arg)
2922 : : {
2923 : 0 : return fuse_ioctl_common(file, cmd, arg, 0);
2924 : : }
2925 : :
2926 : 0 : static long fuse_file_compat_ioctl(struct file *file, unsigned int cmd,
2927 : : unsigned long arg)
2928 : : {
2929 : 0 : return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_COMPAT);
2930 : : }
2931 : :
2932 : : /*
2933 : : * All files which have been polled are linked to RB tree
2934 : : * fuse_conn->polled_files which is indexed by kh. Walk the tree and
2935 : : * find the matching one.
2936 : : */
2937 : : static struct rb_node **fuse_find_polled_node(struct fuse_conn *fc, u64 kh,
2938 : : struct rb_node **parent_out)
2939 : : {
2940 : 0 : struct rb_node **link = &fc->polled_files.rb_node;
2941 : : struct rb_node *last = NULL;
2942 : :
2943 [ # # # # ]: 0 : while (*link) {
2944 : : struct fuse_file *ff;
2945 : :
2946 : : last = *link;
2947 : : ff = rb_entry(last, struct fuse_file, polled_node);
2948 : :
2949 [ # # # # ]: 0 : if (kh < ff->kh)
2950 : 0 : link = &last->rb_left;
2951 [ # # # # ]: 0 : else if (kh > ff->kh)
2952 : 0 : link = &last->rb_right;
2953 : : else
2954 : : return link;
2955 : : }
2956 : :
2957 : : if (parent_out)
2958 : 0 : *parent_out = last;
2959 : : return link;
2960 : : }
2961 : :
2962 : : /*
2963 : : * The file is about to be polled. Make sure it's on the polled_files
2964 : : * RB tree. Note that files once added to the polled_files tree are
2965 : : * not removed before the file is released. This is because a file
2966 : : * polled once is likely to be polled again.
2967 : : */
2968 : 0 : static void fuse_register_polled_file(struct fuse_conn *fc,
2969 : : struct fuse_file *ff)
2970 : : {
2971 : : spin_lock(&fc->lock);
2972 [ # # ]: 0 : if (RB_EMPTY_NODE(&ff->polled_node)) {
2973 : : struct rb_node **link, *uninitialized_var(parent);
2974 : :
2975 : 0 : link = fuse_find_polled_node(fc, ff->kh, &parent);
2976 [ # # ]: 0 : BUG_ON(*link);
2977 : : rb_link_node(&ff->polled_node, parent, link);
2978 : 0 : rb_insert_color(&ff->polled_node, &fc->polled_files);
2979 : : }
2980 : : spin_unlock(&fc->lock);
2981 : 0 : }
2982 : :
2983 : 0 : __poll_t fuse_file_poll(struct file *file, poll_table *wait)
2984 : : {
2985 : 0 : struct fuse_file *ff = file->private_data;
2986 : 0 : struct fuse_conn *fc = ff->fc;
2987 : 0 : struct fuse_poll_in inarg = { .fh = ff->fh, .kh = ff->kh };
2988 : : struct fuse_poll_out outarg;
2989 : 0 : FUSE_ARGS(args);
2990 : : int err;
2991 : :
2992 [ # # ]: 0 : if (fc->no_poll)
2993 : : return DEFAULT_POLLMASK;
2994 : :
2995 : 0 : poll_wait(file, &ff->poll_wait, wait);
2996 : 0 : inarg.events = mangle_poll(poll_requested_events(wait));
2997 : :
2998 : : /*
2999 : : * Ask for notification iff there's someone waiting for it.
3000 : : * The client may ignore the flag and always notify.
3001 : : */
3002 [ # # ]: 0 : if (waitqueue_active(&ff->poll_wait)) {
3003 : 0 : inarg.flags |= FUSE_POLL_SCHEDULE_NOTIFY;
3004 : 0 : fuse_register_polled_file(fc, ff);
3005 : : }
3006 : :
3007 : 0 : args.opcode = FUSE_POLL;
3008 : 0 : args.nodeid = ff->nodeid;
3009 : 0 : args.in_numargs = 1;
3010 : 0 : args.in_args[0].size = sizeof(inarg);
3011 : 0 : args.in_args[0].value = &inarg;
3012 : 0 : args.out_numargs = 1;
3013 : 0 : args.out_args[0].size = sizeof(outarg);
3014 : 0 : args.out_args[0].value = &outarg;
3015 : 0 : err = fuse_simple_request(fc, &args);
3016 : :
3017 [ # # ]: 0 : if (!err)
3018 : 0 : return demangle_poll(outarg.revents);
3019 [ # # ]: 0 : if (err == -ENOSYS) {
3020 : 0 : fc->no_poll = 1;
3021 : 0 : return DEFAULT_POLLMASK;
3022 : : }
3023 : : return EPOLLERR;
3024 : : }
3025 : : EXPORT_SYMBOL_GPL(fuse_file_poll);
3026 : :
3027 : : /*
3028 : : * This is called from fuse_handle_notify() on FUSE_NOTIFY_POLL and
3029 : : * wakes up the poll waiters.
3030 : : */
3031 : 0 : int fuse_notify_poll_wakeup(struct fuse_conn *fc,
3032 : : struct fuse_notify_poll_wakeup_out *outarg)
3033 : : {
3034 : 0 : u64 kh = outarg->kh;
3035 : : struct rb_node **link;
3036 : :
3037 : : spin_lock(&fc->lock);
3038 : :
3039 : : link = fuse_find_polled_node(fc, kh, NULL);
3040 [ # # ]: 0 : if (*link) {
3041 : : struct fuse_file *ff;
3042 : :
3043 : 0 : ff = rb_entry(*link, struct fuse_file, polled_node);
3044 : 0 : wake_up_interruptible_sync(&ff->poll_wait);
3045 : : }
3046 : :
3047 : : spin_unlock(&fc->lock);
3048 : 0 : return 0;
3049 : : }
3050 : :
3051 : 0 : static void fuse_do_truncate(struct file *file)
3052 : : {
3053 : 0 : struct inode *inode = file->f_mapping->host;
3054 : : struct iattr attr;
3055 : :
3056 : 0 : attr.ia_valid = ATTR_SIZE;
3057 : 0 : attr.ia_size = i_size_read(inode);
3058 : :
3059 : 0 : attr.ia_file = file;
3060 : 0 : attr.ia_valid |= ATTR_FILE;
3061 : :
3062 : 0 : fuse_do_setattr(file_dentry(file), &attr, file);
3063 : 0 : }
3064 : :
3065 : : static inline loff_t fuse_round_up(struct fuse_conn *fc, loff_t off)
3066 : : {
3067 : 0 : return round_up(off, fc->max_pages << PAGE_SHIFT);
3068 : : }
3069 : :
3070 : : static ssize_t
3071 : 0 : fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
3072 : : {
3073 : 0 : DECLARE_COMPLETION_ONSTACK(wait);
3074 : : ssize_t ret = 0;
3075 : 0 : struct file *file = iocb->ki_filp;
3076 : 0 : struct fuse_file *ff = file->private_data;
3077 : 0 : bool async_dio = ff->fc->async_dio;
3078 : 0 : loff_t pos = 0;
3079 : : struct inode *inode;
3080 : : loff_t i_size;
3081 : : size_t count = iov_iter_count(iter);
3082 : 0 : loff_t offset = iocb->ki_pos;
3083 : : struct fuse_io_priv *io;
3084 : :
3085 : 0 : pos = offset;
3086 : 0 : inode = file->f_mapping->host;
3087 : : i_size = i_size_read(inode);
3088 : :
3089 [ # # # # ]: 0 : if ((iov_iter_rw(iter) == READ) && (offset > i_size))
3090 : : return 0;
3091 : :
3092 : : /* optimization for short read */
3093 [ # # # # : 0 : if (async_dio && iov_iter_rw(iter) != WRITE && offset + count > i_size) {
# # ]
3094 [ # # ]: 0 : if (offset >= i_size)
3095 : : return 0;
3096 : 0 : iov_iter_truncate(iter, fuse_round_up(ff->fc, i_size - offset));
3097 : : count = iov_iter_count(iter);
3098 : : }
3099 : :
3100 : : io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL);
3101 [ # # ]: 0 : if (!io)
3102 : : return -ENOMEM;
3103 : 0 : spin_lock_init(&io->lock);
3104 : : kref_init(&io->refcnt);
3105 : 0 : io->reqs = 1;
3106 : 0 : io->bytes = -1;
3107 : 0 : io->size = 0;
3108 : 0 : io->offset = offset;
3109 : 0 : io->write = (iov_iter_rw(iter) == WRITE);
3110 : 0 : io->err = 0;
3111 : : /*
3112 : : * By default, we want to optimize all I/Os with async request
3113 : : * submission to the client filesystem if supported.
3114 : : */
3115 : 0 : io->async = async_dio;
3116 : 0 : io->iocb = iocb;
3117 : 0 : io->blocking = is_sync_kiocb(iocb);
3118 : :
3119 : : /*
3120 : : * We cannot asynchronously extend the size of a file.
3121 : : * In such case the aio will behave exactly like sync io.
3122 : : */
3123 [ # # # # ]: 0 : if ((offset + count > i_size) && iov_iter_rw(iter) == WRITE)
3124 : 0 : io->blocking = true;
3125 : :
3126 [ # # # # ]: 0 : if (io->async && io->blocking) {
3127 : : /*
3128 : : * Additional reference to keep io around after
3129 : : * calling fuse_aio_complete()
3130 : : */
3131 : : kref_get(&io->refcnt);
3132 : 0 : io->done = &wait;
3133 : : }
3134 : :
3135 [ # # ]: 0 : if (iov_iter_rw(iter) == WRITE) {
3136 : 0 : ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE);
3137 : 0 : fuse_invalidate_attr(inode);
3138 : : } else {
3139 : 0 : ret = __fuse_direct_read(io, iter, &pos);
3140 : : }
3141 : :
3142 [ # # ]: 0 : if (io->async) {
3143 : 0 : bool blocking = io->blocking;
3144 : :
3145 : 0 : fuse_aio_complete(io, ret < 0 ? ret : 0, -1);
3146 : :
3147 : : /* we have a non-extending, async request, so return */
3148 [ # # ]: 0 : if (!blocking)
3149 : : return -EIOCBQUEUED;
3150 : :
3151 : 0 : wait_for_completion(&wait);
3152 : : ret = fuse_get_res_by_io(io);
3153 : : }
3154 : :
3155 : 0 : kref_put(&io->refcnt, fuse_io_release);
3156 : :
3157 [ # # ]: 0 : if (iov_iter_rw(iter) == WRITE) {
3158 [ # # ]: 0 : if (ret > 0)
3159 : 0 : fuse_write_update_size(inode, pos);
3160 [ # # # # ]: 0 : else if (ret < 0 && offset + count > i_size)
3161 : 0 : fuse_do_truncate(file);
3162 : : }
3163 : :
3164 : 0 : return ret;
3165 : : }
3166 : :
3167 : 0 : static int fuse_writeback_range(struct inode *inode, loff_t start, loff_t end)
3168 : : {
3169 : 0 : int err = filemap_write_and_wait_range(inode->i_mapping, start, end);
3170 : :
3171 [ # # ]: 0 : if (!err)
3172 : : fuse_sync_writes(inode);
3173 : :
3174 : 0 : return err;
3175 : : }
3176 : :
3177 : 0 : static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
3178 : : loff_t length)
3179 : : {
3180 : 0 : struct fuse_file *ff = file->private_data;
3181 : : struct inode *inode = file_inode(file);
3182 : : struct fuse_inode *fi = get_fuse_inode(inode);
3183 : 0 : struct fuse_conn *fc = ff->fc;
3184 : 0 : FUSE_ARGS(args);
3185 : 0 : struct fuse_fallocate_in inarg = {
3186 : 0 : .fh = ff->fh,
3187 : : .offset = offset,
3188 : : .length = length,
3189 : : .mode = mode
3190 : : };
3191 : : int err;
3192 : 0 : bool lock_inode = !(mode & FALLOC_FL_KEEP_SIZE) ||
3193 : : (mode & FALLOC_FL_PUNCH_HOLE);
3194 : :
3195 [ # # ]: 0 : if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
3196 : : return -EOPNOTSUPP;
3197 : :
3198 [ # # ]: 0 : if (fc->no_fallocate)
3199 : : return -EOPNOTSUPP;
3200 : :
3201 [ # # ]: 0 : if (lock_inode) {
3202 : : inode_lock(inode);
3203 [ # # ]: 0 : if (mode & FALLOC_FL_PUNCH_HOLE) {
3204 : 0 : loff_t endbyte = offset + length - 1;
3205 : :
3206 : 0 : err = fuse_writeback_range(inode, offset, endbyte);
3207 [ # # ]: 0 : if (err)
3208 : : goto out;
3209 : : }
3210 : : }
3211 : :
3212 [ # # # # ]: 0 : if (!(mode & FALLOC_FL_KEEP_SIZE) &&
3213 : 0 : offset + length > i_size_read(inode)) {
3214 : 0 : err = inode_newsize_ok(inode, offset + length);
3215 [ # # ]: 0 : if (err)
3216 : : goto out;
3217 : : }
3218 : :
3219 [ # # ]: 0 : if (!(mode & FALLOC_FL_KEEP_SIZE))
3220 : 0 : set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
3221 : :
3222 : 0 : args.opcode = FUSE_FALLOCATE;
3223 : 0 : args.nodeid = ff->nodeid;
3224 : 0 : args.in_numargs = 1;
3225 : 0 : args.in_args[0].size = sizeof(inarg);
3226 : 0 : args.in_args[0].value = &inarg;
3227 : 0 : err = fuse_simple_request(fc, &args);
3228 [ # # ]: 0 : if (err == -ENOSYS) {
3229 : 0 : fc->no_fallocate = 1;
3230 : : err = -EOPNOTSUPP;
3231 : : }
3232 [ # # ]: 0 : if (err)
3233 : : goto out;
3234 : :
3235 : : /* we could have extended the file */
3236 [ # # ]: 0 : if (!(mode & FALLOC_FL_KEEP_SIZE)) {
3237 : 0 : bool changed = fuse_write_update_size(inode, offset + length);
3238 : :
3239 [ # # # # ]: 0 : if (changed && fc->writeback_cache)
3240 : 0 : file_update_time(file);
3241 : : }
3242 : :
3243 [ # # ]: 0 : if (mode & FALLOC_FL_PUNCH_HOLE)
3244 : 0 : truncate_pagecache_range(inode, offset, offset + length - 1);
3245 : :
3246 : 0 : fuse_invalidate_attr(inode);
3247 : :
3248 : : out:
3249 [ # # ]: 0 : if (!(mode & FALLOC_FL_KEEP_SIZE))
3250 : 0 : clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
3251 : :
3252 [ # # ]: 0 : if (lock_inode)
3253 : : inode_unlock(inode);
3254 : :
3255 : 0 : return err;
3256 : : }
3257 : :
3258 : 0 : static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in,
3259 : : struct file *file_out, loff_t pos_out,
3260 : : size_t len, unsigned int flags)
3261 : : {
3262 : 0 : struct fuse_file *ff_in = file_in->private_data;
3263 : 0 : struct fuse_file *ff_out = file_out->private_data;
3264 : : struct inode *inode_in = file_inode(file_in);
3265 : : struct inode *inode_out = file_inode(file_out);
3266 : : struct fuse_inode *fi_out = get_fuse_inode(inode_out);
3267 : 0 : struct fuse_conn *fc = ff_in->fc;
3268 : 0 : FUSE_ARGS(args);
3269 : 0 : struct fuse_copy_file_range_in inarg = {
3270 : 0 : .fh_in = ff_in->fh,
3271 : : .off_in = pos_in,
3272 : 0 : .nodeid_out = ff_out->nodeid,
3273 : 0 : .fh_out = ff_out->fh,
3274 : : .off_out = pos_out,
3275 : : .len = len,
3276 : : .flags = flags
3277 : : };
3278 : : struct fuse_write_out outarg;
3279 : : ssize_t err;
3280 : : /* mark unstable when write-back is not used, and file_out gets
3281 : : * extended */
3282 [ # # # # ]: 0 : bool is_unstable = (!fc->writeback_cache) &&
3283 : 0 : ((pos_out + len) > inode_out->i_size);
3284 : :
3285 [ # # ]: 0 : if (fc->no_copy_file_range)
3286 : : return -EOPNOTSUPP;
3287 : :
3288 [ # # ]: 0 : if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb)
3289 : : return -EXDEV;
3290 : :
3291 : : inode_lock(inode_in);
3292 : 0 : err = fuse_writeback_range(inode_in, pos_in, pos_in + len - 1);
3293 : : inode_unlock(inode_in);
3294 [ # # ]: 0 : if (err)
3295 : : return err;
3296 : :
3297 : : inode_lock(inode_out);
3298 : :
3299 : 0 : err = file_modified(file_out);
3300 [ # # ]: 0 : if (err)
3301 : : goto out;
3302 : :
3303 : : /*
3304 : : * Write out dirty pages in the destination file before sending the COPY
3305 : : * request to userspace. After the request is completed, truncate off
3306 : : * pages (including partial ones) from the cache that have been copied,
3307 : : * since these contain stale data at that point.
3308 : : *
3309 : : * This should be mostly correct, but if the COPY writes to partial
3310 : : * pages (at the start or end) and the parts not covered by the COPY are
3311 : : * written through a memory map after calling fuse_writeback_range(),
3312 : : * then these partial page modifications will be lost on truncation.
3313 : : *
3314 : : * It is unlikely that someone would rely on such mixed style
3315 : : * modifications. Yet this does give less guarantees than if the
3316 : : * copying was performed with write(2).
3317 : : *
3318 : : * To fix this a i_mmap_sem style lock could be used to prevent new
3319 : : * faults while the copy is ongoing.
3320 : : */
3321 : 0 : err = fuse_writeback_range(inode_out, pos_out, pos_out + len - 1);
3322 [ # # ]: 0 : if (err)
3323 : : goto out;
3324 : :
3325 [ # # ]: 0 : if (is_unstable)
3326 : 0 : set_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state);
3327 : :
3328 : 0 : args.opcode = FUSE_COPY_FILE_RANGE;
3329 : 0 : args.nodeid = ff_in->nodeid;
3330 : 0 : args.in_numargs = 1;
3331 : 0 : args.in_args[0].size = sizeof(inarg);
3332 : 0 : args.in_args[0].value = &inarg;
3333 : 0 : args.out_numargs = 1;
3334 : 0 : args.out_args[0].size = sizeof(outarg);
3335 : 0 : args.out_args[0].value = &outarg;
3336 : 0 : err = fuse_simple_request(fc, &args);
3337 [ # # ]: 0 : if (err == -ENOSYS) {
3338 : 0 : fc->no_copy_file_range = 1;
3339 : : err = -EOPNOTSUPP;
3340 : : }
3341 [ # # ]: 0 : if (err)
3342 : : goto out;
3343 : :
3344 : 0 : truncate_inode_pages_range(inode_out->i_mapping,
3345 : : ALIGN_DOWN(pos_out, PAGE_SIZE),
3346 : 0 : ALIGN(pos_out + outarg.size, PAGE_SIZE) - 1);
3347 : :
3348 [ # # ]: 0 : if (fc->writeback_cache) {
3349 : 0 : fuse_write_update_size(inode_out, pos_out + outarg.size);
3350 : 0 : file_update_time(file_out);
3351 : : }
3352 : :
3353 : 0 : fuse_invalidate_attr(inode_out);
3354 : :
3355 : 0 : err = outarg.size;
3356 : : out:
3357 [ # # ]: 0 : if (is_unstable)
3358 : 0 : clear_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state);
3359 : :
3360 : : inode_unlock(inode_out);
3361 : : file_accessed(file_in);
3362 : :
3363 : 0 : return err;
3364 : : }
3365 : :
3366 : 0 : static ssize_t fuse_copy_file_range(struct file *src_file, loff_t src_off,
3367 : : struct file *dst_file, loff_t dst_off,
3368 : : size_t len, unsigned int flags)
3369 : : {
3370 : : ssize_t ret;
3371 : :
3372 : 0 : ret = __fuse_copy_file_range(src_file, src_off, dst_file, dst_off,
3373 : : len, flags);
3374 : :
3375 [ # # ]: 0 : if (ret == -EOPNOTSUPP || ret == -EXDEV)
3376 : 0 : ret = generic_copy_file_range(src_file, src_off, dst_file,
3377 : : dst_off, len, flags);
3378 : 0 : return ret;
3379 : : }
3380 : :
3381 : : static const struct file_operations fuse_file_operations = {
3382 : : .llseek = fuse_file_llseek,
3383 : : .read_iter = fuse_file_read_iter,
3384 : : .write_iter = fuse_file_write_iter,
3385 : : .mmap = fuse_file_mmap,
3386 : : .open = fuse_open,
3387 : : .flush = fuse_flush,
3388 : : .release = fuse_release,
3389 : : .fsync = fuse_fsync,
3390 : : .lock = fuse_file_lock,
3391 : : .flock = fuse_file_flock,
3392 : : .splice_read = generic_file_splice_read,
3393 : : .splice_write = iter_file_splice_write,
3394 : : .unlocked_ioctl = fuse_file_ioctl,
3395 : : .compat_ioctl = fuse_file_compat_ioctl,
3396 : : .poll = fuse_file_poll,
3397 : : .fallocate = fuse_file_fallocate,
3398 : : .copy_file_range = fuse_copy_file_range,
3399 : : };
3400 : :
3401 : : static const struct address_space_operations fuse_file_aops = {
3402 : : .readpage = fuse_readpage,
3403 : : .writepage = fuse_writepage,
3404 : : .writepages = fuse_writepages,
3405 : : .launder_page = fuse_launder_page,
3406 : : .readpages = fuse_readpages,
3407 : : .set_page_dirty = __set_page_dirty_nobuffers,
3408 : : .bmap = fuse_bmap,
3409 : : .direct_IO = fuse_direct_IO,
3410 : : .write_begin = fuse_write_begin,
3411 : : .write_end = fuse_write_end,
3412 : : };
3413 : :
3414 : 0 : void fuse_init_file_inode(struct inode *inode)
3415 : : {
3416 : : struct fuse_inode *fi = get_fuse_inode(inode);
3417 : :
3418 : 0 : inode->i_fop = &fuse_file_operations;
3419 : 0 : inode->i_data.a_ops = &fuse_file_aops;
3420 : :
3421 : 0 : INIT_LIST_HEAD(&fi->write_files);
3422 : 0 : INIT_LIST_HEAD(&fi->queued_writes);
3423 : 0 : fi->writectr = 0;
3424 : 0 : init_waitqueue_head(&fi->page_waitq);
3425 : 0 : INIT_LIST_HEAD(&fi->writepages);
3426 : 0 : }
|