This source file includes following definitions.
- fuse_advise_use_readdirplus
- __fuse_dentry_settime
- fuse_dentry_time
- __fuse_dentry_settime
- fuse_dentry_time
- fuse_dentry_settime
- time_to_jiffies
- fuse_change_entry_timeout
- attr_timeout
- entry_attr_timeout
- fuse_invalidate_attr_mask
- fuse_invalidate_attr
- fuse_dir_changed
- fuse_invalidate_atime
- fuse_invalidate_entry_cache
- fuse_invalidate_entry
- fuse_lookup_init
- fuse_dentry_revalidate
- fuse_dentry_init
- fuse_dentry_release
- fuse_dentry_delete
- fuse_valid_type
- fuse_invalid_attr
- fuse_lookup_name
- fuse_lookup
- fuse_create_open
- fuse_atomic_open
- create_new_entry
- fuse_mknod
- fuse_create
- fuse_mkdir
- fuse_symlink
- fuse_update_ctime
- fuse_unlink
- fuse_rmdir
- fuse_rename_common
- fuse_rename2
- fuse_link
- fuse_fillattr
- fuse_do_getattr
- fuse_update_get_attr
- fuse_update_attributes
- fuse_reverse_inval_entry
- fuse_allow_current_process
- fuse_access
- fuse_perm_getattr
- fuse_permission
- fuse_readlink_page
- fuse_get_link
- fuse_dir_open
- fuse_dir_release
- fuse_dir_fsync
- fuse_dir_ioctl
- fuse_dir_compat_ioctl
- update_mtime
- iattr_to_fattr
- fuse_set_nowrite
- __fuse_release_nowrite
- fuse_release_nowrite
- fuse_setattr_fill
- fuse_flush_times
- fuse_do_setattr
- fuse_setattr
- fuse_getattr
- fuse_init_common
- fuse_init_dir
- fuse_symlink_readpage
- fuse_init_symlink
1
2
3
4
5
6
7
8
9 #include "fuse_i.h"
10
11 #include <linux/pagemap.h>
12 #include <linux/file.h>
13 #include <linux/sched.h>
14 #include <linux/namei.h>
15 #include <linux/slab.h>
16 #include <linux/xattr.h>
17 #include <linux/iversion.h>
18 #include <linux/posix_acl.h>
19
20 static void fuse_advise_use_readdirplus(struct inode *dir)
21 {
22 struct fuse_inode *fi = get_fuse_inode(dir);
23
24 set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state);
25 }
26
27 #if BITS_PER_LONG >= 64
28 static inline void __fuse_dentry_settime(struct dentry *entry, u64 time)
29 {
30 entry->d_fsdata = (void *) time;
31 }
32
33 static inline u64 fuse_dentry_time(const struct dentry *entry)
34 {
35 return (u64)entry->d_fsdata;
36 }
37
38 #else
39 union fuse_dentry {
40 u64 time;
41 struct rcu_head rcu;
42 };
43
44 static inline void __fuse_dentry_settime(struct dentry *dentry, u64 time)
45 {
46 ((union fuse_dentry *) dentry->d_fsdata)->time = time;
47 }
48
49 static inline u64 fuse_dentry_time(const struct dentry *entry)
50 {
51 return ((union fuse_dentry *) entry->d_fsdata)->time;
52 }
53 #endif
54
55 static void fuse_dentry_settime(struct dentry *dentry, u64 time)
56 {
57 struct fuse_conn *fc = get_fuse_conn_super(dentry->d_sb);
58 bool delete = !time && fc->delete_stale;
59
60
61
62
63 if ((!delete && (dentry->d_flags & DCACHE_OP_DELETE)) ||
64 (delete && !(dentry->d_flags & DCACHE_OP_DELETE))) {
65 spin_lock(&dentry->d_lock);
66 if (!delete)
67 dentry->d_flags &= ~DCACHE_OP_DELETE;
68 else
69 dentry->d_flags |= DCACHE_OP_DELETE;
70 spin_unlock(&dentry->d_lock);
71 }
72
73 __fuse_dentry_settime(dentry, time);
74 }
75
76
77
78
79
80
81
82
83
84
85 static u64 time_to_jiffies(u64 sec, u32 nsec)
86 {
87 if (sec || nsec) {
88 struct timespec64 ts = {
89 sec,
90 min_t(u32, nsec, NSEC_PER_SEC - 1)
91 };
92
93 return get_jiffies_64() + timespec64_to_jiffies(&ts);
94 } else
95 return 0;
96 }
97
98
99
100
101
102 void fuse_change_entry_timeout(struct dentry *entry, struct fuse_entry_out *o)
103 {
104 fuse_dentry_settime(entry,
105 time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
106 }
107
108 static u64 attr_timeout(struct fuse_attr_out *o)
109 {
110 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
111 }
112
113 u64 entry_attr_timeout(struct fuse_entry_out *o)
114 {
115 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
116 }
117
118 static void fuse_invalidate_attr_mask(struct inode *inode, u32 mask)
119 {
120 set_mask_bits(&get_fuse_inode(inode)->inval_mask, 0, mask);
121 }
122
123
124
125
126
127 void fuse_invalidate_attr(struct inode *inode)
128 {
129 fuse_invalidate_attr_mask(inode, STATX_BASIC_STATS);
130 }
131
132 static void fuse_dir_changed(struct inode *dir)
133 {
134 fuse_invalidate_attr(dir);
135 inode_maybe_inc_iversion(dir, false);
136 }
137
138
139
140
141
142 void fuse_invalidate_atime(struct inode *inode)
143 {
144 if (!IS_RDONLY(inode))
145 fuse_invalidate_attr_mask(inode, STATX_ATIME);
146 }
147
148
149
150
151
152
153
154
155
156 void fuse_invalidate_entry_cache(struct dentry *entry)
157 {
158 fuse_dentry_settime(entry, 0);
159 }
160
161
162
163
164
165 static void fuse_invalidate_entry(struct dentry *entry)
166 {
167 d_invalidate(entry);
168 fuse_invalidate_entry_cache(entry);
169 }
170
171 static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_args *args,
172 u64 nodeid, const struct qstr *name,
173 struct fuse_entry_out *outarg)
174 {
175 memset(outarg, 0, sizeof(struct fuse_entry_out));
176 args->opcode = FUSE_LOOKUP;
177 args->nodeid = nodeid;
178 args->in_numargs = 1;
179 args->in_args[0].size = name->len + 1;
180 args->in_args[0].value = name->name;
181 args->out_numargs = 1;
182 args->out_args[0].size = sizeof(struct fuse_entry_out);
183 args->out_args[0].value = outarg;
184 }
185
186
187
188
189
190
191
192
193
194
195 static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
196 {
197 struct inode *inode;
198 struct dentry *parent;
199 struct fuse_conn *fc;
200 struct fuse_inode *fi;
201 int ret;
202
203 inode = d_inode_rcu(entry);
204 if (inode && is_bad_inode(inode))
205 goto invalid;
206 else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
207 (flags & LOOKUP_REVAL)) {
208 struct fuse_entry_out outarg;
209 FUSE_ARGS(args);
210 struct fuse_forget_link *forget;
211 u64 attr_version;
212
213
214 if (!inode)
215 goto invalid;
216
217 ret = -ECHILD;
218 if (flags & LOOKUP_RCU)
219 goto out;
220
221 fc = get_fuse_conn(inode);
222
223 forget = fuse_alloc_forget();
224 ret = -ENOMEM;
225 if (!forget)
226 goto out;
227
228 attr_version = fuse_get_attr_version(fc);
229
230 parent = dget_parent(entry);
231 fuse_lookup_init(fc, &args, get_node_id(d_inode(parent)),
232 &entry->d_name, &outarg);
233 ret = fuse_simple_request(fc, &args);
234 dput(parent);
235
236 if (!ret && !outarg.nodeid)
237 ret = -ENOENT;
238 if (!ret) {
239 fi = get_fuse_inode(inode);
240 if (outarg.nodeid != get_node_id(inode)) {
241 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
242 goto invalid;
243 }
244 spin_lock(&fi->lock);
245 fi->nlookup++;
246 spin_unlock(&fi->lock);
247 }
248 kfree(forget);
249 if (ret == -ENOMEM)
250 goto out;
251 if (ret || fuse_invalid_attr(&outarg.attr) ||
252 (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
253 goto invalid;
254
255 forget_all_cached_acls(inode);
256 fuse_change_attributes(inode, &outarg.attr,
257 entry_attr_timeout(&outarg),
258 attr_version);
259 fuse_change_entry_timeout(entry, &outarg);
260 } else if (inode) {
261 fi = get_fuse_inode(inode);
262 if (flags & LOOKUP_RCU) {
263 if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state))
264 return -ECHILD;
265 } else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) {
266 parent = dget_parent(entry);
267 fuse_advise_use_readdirplus(d_inode(parent));
268 dput(parent);
269 }
270 }
271 ret = 1;
272 out:
273 return ret;
274
275 invalid:
276 ret = 0;
277 goto out;
278 }
279
280 #if BITS_PER_LONG < 64
281 static int fuse_dentry_init(struct dentry *dentry)
282 {
283 dentry->d_fsdata = kzalloc(sizeof(union fuse_dentry),
284 GFP_KERNEL_ACCOUNT | __GFP_RECLAIMABLE);
285
286 return dentry->d_fsdata ? 0 : -ENOMEM;
287 }
288 static void fuse_dentry_release(struct dentry *dentry)
289 {
290 union fuse_dentry *fd = dentry->d_fsdata;
291
292 kfree_rcu(fd, rcu);
293 }
294 #endif
295
296 static int fuse_dentry_delete(const struct dentry *dentry)
297 {
298 return time_before64(fuse_dentry_time(dentry), get_jiffies_64());
299 }
300
301 const struct dentry_operations fuse_dentry_operations = {
302 .d_revalidate = fuse_dentry_revalidate,
303 .d_delete = fuse_dentry_delete,
304 #if BITS_PER_LONG < 64
305 .d_init = fuse_dentry_init,
306 .d_release = fuse_dentry_release,
307 #endif
308 };
309
310 const struct dentry_operations fuse_root_dentry_operations = {
311 #if BITS_PER_LONG < 64
312 .d_init = fuse_dentry_init,
313 .d_release = fuse_dentry_release,
314 #endif
315 };
316
317 int fuse_valid_type(int m)
318 {
319 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
320 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
321 }
322
323 bool fuse_invalid_attr(struct fuse_attr *attr)
324 {
325 return !fuse_valid_type(attr->mode) ||
326 attr->size > LLONG_MAX;
327 }
328
329 int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name,
330 struct fuse_entry_out *outarg, struct inode **inode)
331 {
332 struct fuse_conn *fc = get_fuse_conn_super(sb);
333 FUSE_ARGS(args);
334 struct fuse_forget_link *forget;
335 u64 attr_version;
336 int err;
337
338 *inode = NULL;
339 err = -ENAMETOOLONG;
340 if (name->len > FUSE_NAME_MAX)
341 goto out;
342
343
344 forget = fuse_alloc_forget();
345 err = -ENOMEM;
346 if (!forget)
347 goto out;
348
349 attr_version = fuse_get_attr_version(fc);
350
351 fuse_lookup_init(fc, &args, nodeid, name, outarg);
352 err = fuse_simple_request(fc, &args);
353
354 if (err || !outarg->nodeid)
355 goto out_put_forget;
356
357 err = -EIO;
358 if (!outarg->nodeid)
359 goto out_put_forget;
360 if (fuse_invalid_attr(&outarg->attr))
361 goto out_put_forget;
362
363 *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
364 &outarg->attr, entry_attr_timeout(outarg),
365 attr_version);
366 err = -ENOMEM;
367 if (!*inode) {
368 fuse_queue_forget(fc, forget, outarg->nodeid, 1);
369 goto out;
370 }
371 err = 0;
372
373 out_put_forget:
374 kfree(forget);
375 out:
376 return err;
377 }
378
379 static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
380 unsigned int flags)
381 {
382 int err;
383 struct fuse_entry_out outarg;
384 struct inode *inode;
385 struct dentry *newent;
386 bool outarg_valid = true;
387 bool locked;
388
389 locked = fuse_lock_inode(dir);
390 err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
391 &outarg, &inode);
392 fuse_unlock_inode(dir, locked);
393 if (err == -ENOENT) {
394 outarg_valid = false;
395 err = 0;
396 }
397 if (err)
398 goto out_err;
399
400 err = -EIO;
401 if (inode && get_node_id(inode) == FUSE_ROOT_ID)
402 goto out_iput;
403
404 newent = d_splice_alias(inode, entry);
405 err = PTR_ERR(newent);
406 if (IS_ERR(newent))
407 goto out_err;
408
409 entry = newent ? newent : entry;
410 if (outarg_valid)
411 fuse_change_entry_timeout(entry, &outarg);
412 else
413 fuse_invalidate_entry_cache(entry);
414
415 if (inode)
416 fuse_advise_use_readdirplus(dir);
417 return newent;
418
419 out_iput:
420 iput(inode);
421 out_err:
422 return ERR_PTR(err);
423 }
424
425
426
427
428
429
430
431 static int fuse_create_open(struct inode *dir, struct dentry *entry,
432 struct file *file, unsigned flags,
433 umode_t mode)
434 {
435 int err;
436 struct inode *inode;
437 struct fuse_conn *fc = get_fuse_conn(dir);
438 FUSE_ARGS(args);
439 struct fuse_forget_link *forget;
440 struct fuse_create_in inarg;
441 struct fuse_open_out outopen;
442 struct fuse_entry_out outentry;
443 struct fuse_inode *fi;
444 struct fuse_file *ff;
445
446
447 BUG_ON((mode & S_IFMT) != S_IFREG);
448
449 forget = fuse_alloc_forget();
450 err = -ENOMEM;
451 if (!forget)
452 goto out_err;
453
454 err = -ENOMEM;
455 ff = fuse_file_alloc(fc);
456 if (!ff)
457 goto out_put_forget_req;
458
459 if (!fc->dont_mask)
460 mode &= ~current_umask();
461
462 flags &= ~O_NOCTTY;
463 memset(&inarg, 0, sizeof(inarg));
464 memset(&outentry, 0, sizeof(outentry));
465 inarg.flags = flags;
466 inarg.mode = mode;
467 inarg.umask = current_umask();
468 args.opcode = FUSE_CREATE;
469 args.nodeid = get_node_id(dir);
470 args.in_numargs = 2;
471 args.in_args[0].size = sizeof(inarg);
472 args.in_args[0].value = &inarg;
473 args.in_args[1].size = entry->d_name.len + 1;
474 args.in_args[1].value = entry->d_name.name;
475 args.out_numargs = 2;
476 args.out_args[0].size = sizeof(outentry);
477 args.out_args[0].value = &outentry;
478 args.out_args[1].size = sizeof(outopen);
479 args.out_args[1].value = &outopen;
480 err = fuse_simple_request(fc, &args);
481 if (err)
482 goto out_free_ff;
483
484 err = -EIO;
485 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid) ||
486 fuse_invalid_attr(&outentry.attr))
487 goto out_free_ff;
488
489 ff->fh = outopen.fh;
490 ff->nodeid = outentry.nodeid;
491 ff->open_flags = outopen.open_flags;
492 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
493 &outentry.attr, entry_attr_timeout(&outentry), 0);
494 if (!inode) {
495 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
496 fuse_sync_release(NULL, ff, flags);
497 fuse_queue_forget(fc, forget, outentry.nodeid, 1);
498 err = -ENOMEM;
499 goto out_err;
500 }
501 kfree(forget);
502 d_instantiate(entry, inode);
503 fuse_change_entry_timeout(entry, &outentry);
504 fuse_dir_changed(dir);
505 err = finish_open(file, entry, generic_file_open);
506 if (err) {
507 fi = get_fuse_inode(inode);
508 fuse_sync_release(fi, ff, flags);
509 } else {
510 file->private_data = ff;
511 fuse_finish_open(inode, file);
512 }
513 return err;
514
515 out_free_ff:
516 fuse_file_free(ff);
517 out_put_forget_req:
518 kfree(forget);
519 out_err:
520 return err;
521 }
522
523 static int fuse_mknod(struct inode *, struct dentry *, umode_t, dev_t);
524 static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
525 struct file *file, unsigned flags,
526 umode_t mode)
527 {
528 int err;
529 struct fuse_conn *fc = get_fuse_conn(dir);
530 struct dentry *res = NULL;
531
532 if (d_in_lookup(entry)) {
533 res = fuse_lookup(dir, entry, 0);
534 if (IS_ERR(res))
535 return PTR_ERR(res);
536
537 if (res)
538 entry = res;
539 }
540
541 if (!(flags & O_CREAT) || d_really_is_positive(entry))
542 goto no_open;
543
544
545 file->f_mode |= FMODE_CREATED;
546
547 if (fc->no_create)
548 goto mknod;
549
550 err = fuse_create_open(dir, entry, file, flags, mode);
551 if (err == -ENOSYS) {
552 fc->no_create = 1;
553 goto mknod;
554 }
555 out_dput:
556 dput(res);
557 return err;
558
559 mknod:
560 err = fuse_mknod(dir, entry, mode, 0);
561 if (err)
562 goto out_dput;
563 no_open:
564 return finish_no_open(file, res);
565 }
566
567
568
569
570 static int create_new_entry(struct fuse_conn *fc, struct fuse_args *args,
571 struct inode *dir, struct dentry *entry,
572 umode_t mode)
573 {
574 struct fuse_entry_out outarg;
575 struct inode *inode;
576 struct dentry *d;
577 int err;
578 struct fuse_forget_link *forget;
579
580 forget = fuse_alloc_forget();
581 if (!forget)
582 return -ENOMEM;
583
584 memset(&outarg, 0, sizeof(outarg));
585 args->nodeid = get_node_id(dir);
586 args->out_numargs = 1;
587 args->out_args[0].size = sizeof(outarg);
588 args->out_args[0].value = &outarg;
589 err = fuse_simple_request(fc, args);
590 if (err)
591 goto out_put_forget_req;
592
593 err = -EIO;
594 if (invalid_nodeid(outarg.nodeid) || fuse_invalid_attr(&outarg.attr))
595 goto out_put_forget_req;
596
597 if ((outarg.attr.mode ^ mode) & S_IFMT)
598 goto out_put_forget_req;
599
600 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
601 &outarg.attr, entry_attr_timeout(&outarg), 0);
602 if (!inode) {
603 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
604 return -ENOMEM;
605 }
606 kfree(forget);
607
608 d_drop(entry);
609 d = d_splice_alias(inode, entry);
610 if (IS_ERR(d))
611 return PTR_ERR(d);
612
613 if (d) {
614 fuse_change_entry_timeout(d, &outarg);
615 dput(d);
616 } else {
617 fuse_change_entry_timeout(entry, &outarg);
618 }
619 fuse_dir_changed(dir);
620 return 0;
621
622 out_put_forget_req:
623 kfree(forget);
624 return err;
625 }
626
627 static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode,
628 dev_t rdev)
629 {
630 struct fuse_mknod_in inarg;
631 struct fuse_conn *fc = get_fuse_conn(dir);
632 FUSE_ARGS(args);
633
634 if (!fc->dont_mask)
635 mode &= ~current_umask();
636
637 memset(&inarg, 0, sizeof(inarg));
638 inarg.mode = mode;
639 inarg.rdev = new_encode_dev(rdev);
640 inarg.umask = current_umask();
641 args.opcode = FUSE_MKNOD;
642 args.in_numargs = 2;
643 args.in_args[0].size = sizeof(inarg);
644 args.in_args[0].value = &inarg;
645 args.in_args[1].size = entry->d_name.len + 1;
646 args.in_args[1].value = entry->d_name.name;
647 return create_new_entry(fc, &args, dir, entry, mode);
648 }
649
650 static int fuse_create(struct inode *dir, struct dentry *entry, umode_t mode,
651 bool excl)
652 {
653 return fuse_mknod(dir, entry, mode, 0);
654 }
655
656 static int fuse_mkdir(struct inode *dir, struct dentry *entry, umode_t mode)
657 {
658 struct fuse_mkdir_in inarg;
659 struct fuse_conn *fc = get_fuse_conn(dir);
660 FUSE_ARGS(args);
661
662 if (!fc->dont_mask)
663 mode &= ~current_umask();
664
665 memset(&inarg, 0, sizeof(inarg));
666 inarg.mode = mode;
667 inarg.umask = current_umask();
668 args.opcode = FUSE_MKDIR;
669 args.in_numargs = 2;
670 args.in_args[0].size = sizeof(inarg);
671 args.in_args[0].value = &inarg;
672 args.in_args[1].size = entry->d_name.len + 1;
673 args.in_args[1].value = entry->d_name.name;
674 return create_new_entry(fc, &args, dir, entry, S_IFDIR);
675 }
676
677 static int fuse_symlink(struct inode *dir, struct dentry *entry,
678 const char *link)
679 {
680 struct fuse_conn *fc = get_fuse_conn(dir);
681 unsigned len = strlen(link) + 1;
682 FUSE_ARGS(args);
683
684 args.opcode = FUSE_SYMLINK;
685 args.in_numargs = 2;
686 args.in_args[0].size = entry->d_name.len + 1;
687 args.in_args[0].value = entry->d_name.name;
688 args.in_args[1].size = len;
689 args.in_args[1].value = link;
690 return create_new_entry(fc, &args, dir, entry, S_IFLNK);
691 }
692
693 void fuse_update_ctime(struct inode *inode)
694 {
695 if (!IS_NOCMTIME(inode)) {
696 inode->i_ctime = current_time(inode);
697 mark_inode_dirty_sync(inode);
698 }
699 }
700
701 static int fuse_unlink(struct inode *dir, struct dentry *entry)
702 {
703 int err;
704 struct fuse_conn *fc = get_fuse_conn(dir);
705 FUSE_ARGS(args);
706
707 args.opcode = FUSE_UNLINK;
708 args.nodeid = get_node_id(dir);
709 args.in_numargs = 1;
710 args.in_args[0].size = entry->d_name.len + 1;
711 args.in_args[0].value = entry->d_name.name;
712 err = fuse_simple_request(fc, &args);
713 if (!err) {
714 struct inode *inode = d_inode(entry);
715 struct fuse_inode *fi = get_fuse_inode(inode);
716
717 spin_lock(&fi->lock);
718 fi->attr_version = atomic64_inc_return(&fc->attr_version);
719
720
721
722
723
724
725 if (inode->i_nlink > 0)
726 drop_nlink(inode);
727 spin_unlock(&fi->lock);
728 fuse_invalidate_attr(inode);
729 fuse_dir_changed(dir);
730 fuse_invalidate_entry_cache(entry);
731 fuse_update_ctime(inode);
732 } else if (err == -EINTR)
733 fuse_invalidate_entry(entry);
734 return err;
735 }
736
737 static int fuse_rmdir(struct inode *dir, struct dentry *entry)
738 {
739 int err;
740 struct fuse_conn *fc = get_fuse_conn(dir);
741 FUSE_ARGS(args);
742
743 args.opcode = FUSE_RMDIR;
744 args.nodeid = get_node_id(dir);
745 args.in_numargs = 1;
746 args.in_args[0].size = entry->d_name.len + 1;
747 args.in_args[0].value = entry->d_name.name;
748 err = fuse_simple_request(fc, &args);
749 if (!err) {
750 clear_nlink(d_inode(entry));
751 fuse_dir_changed(dir);
752 fuse_invalidate_entry_cache(entry);
753 } else if (err == -EINTR)
754 fuse_invalidate_entry(entry);
755 return err;
756 }
757
758 static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
759 struct inode *newdir, struct dentry *newent,
760 unsigned int flags, int opcode, size_t argsize)
761 {
762 int err;
763 struct fuse_rename2_in inarg;
764 struct fuse_conn *fc = get_fuse_conn(olddir);
765 FUSE_ARGS(args);
766
767 memset(&inarg, 0, argsize);
768 inarg.newdir = get_node_id(newdir);
769 inarg.flags = flags;
770 args.opcode = opcode;
771 args.nodeid = get_node_id(olddir);
772 args.in_numargs = 3;
773 args.in_args[0].size = argsize;
774 args.in_args[0].value = &inarg;
775 args.in_args[1].size = oldent->d_name.len + 1;
776 args.in_args[1].value = oldent->d_name.name;
777 args.in_args[2].size = newent->d_name.len + 1;
778 args.in_args[2].value = newent->d_name.name;
779 err = fuse_simple_request(fc, &args);
780 if (!err) {
781
782 fuse_invalidate_attr(d_inode(oldent));
783 fuse_update_ctime(d_inode(oldent));
784
785 if (flags & RENAME_EXCHANGE) {
786 fuse_invalidate_attr(d_inode(newent));
787 fuse_update_ctime(d_inode(newent));
788 }
789
790 fuse_dir_changed(olddir);
791 if (olddir != newdir)
792 fuse_dir_changed(newdir);
793
794
795 if (!(flags & RENAME_EXCHANGE) && d_really_is_positive(newent)) {
796 fuse_invalidate_attr(d_inode(newent));
797 fuse_invalidate_entry_cache(newent);
798 fuse_update_ctime(d_inode(newent));
799 }
800 } else if (err == -EINTR) {
801
802
803
804
805
806 fuse_invalidate_entry(oldent);
807 if (d_really_is_positive(newent))
808 fuse_invalidate_entry(newent);
809 }
810
811 return err;
812 }
813
814 static int fuse_rename2(struct inode *olddir, struct dentry *oldent,
815 struct inode *newdir, struct dentry *newent,
816 unsigned int flags)
817 {
818 struct fuse_conn *fc = get_fuse_conn(olddir);
819 int err;
820
821 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
822 return -EINVAL;
823
824 if (flags) {
825 if (fc->no_rename2 || fc->minor < 23)
826 return -EINVAL;
827
828 err = fuse_rename_common(olddir, oldent, newdir, newent, flags,
829 FUSE_RENAME2,
830 sizeof(struct fuse_rename2_in));
831 if (err == -ENOSYS) {
832 fc->no_rename2 = 1;
833 err = -EINVAL;
834 }
835 } else {
836 err = fuse_rename_common(olddir, oldent, newdir, newent, 0,
837 FUSE_RENAME,
838 sizeof(struct fuse_rename_in));
839 }
840
841 return err;
842 }
843
844 static int fuse_link(struct dentry *entry, struct inode *newdir,
845 struct dentry *newent)
846 {
847 int err;
848 struct fuse_link_in inarg;
849 struct inode *inode = d_inode(entry);
850 struct fuse_conn *fc = get_fuse_conn(inode);
851 FUSE_ARGS(args);
852
853 memset(&inarg, 0, sizeof(inarg));
854 inarg.oldnodeid = get_node_id(inode);
855 args.opcode = FUSE_LINK;
856 args.in_numargs = 2;
857 args.in_args[0].size = sizeof(inarg);
858 args.in_args[0].value = &inarg;
859 args.in_args[1].size = newent->d_name.len + 1;
860 args.in_args[1].value = newent->d_name.name;
861 err = create_new_entry(fc, &args, newdir, newent, inode->i_mode);
862
863
864
865
866
867
868 if (!err) {
869 struct fuse_inode *fi = get_fuse_inode(inode);
870
871 spin_lock(&fi->lock);
872 fi->attr_version = atomic64_inc_return(&fc->attr_version);
873 if (likely(inode->i_nlink < UINT_MAX))
874 inc_nlink(inode);
875 spin_unlock(&fi->lock);
876 fuse_invalidate_attr(inode);
877 fuse_update_ctime(inode);
878 } else if (err == -EINTR) {
879 fuse_invalidate_attr(inode);
880 }
881 return err;
882 }
883
884 static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
885 struct kstat *stat)
886 {
887 unsigned int blkbits;
888 struct fuse_conn *fc = get_fuse_conn(inode);
889
890
891 if (fc->writeback_cache && S_ISREG(inode->i_mode)) {
892 attr->size = i_size_read(inode);
893 attr->mtime = inode->i_mtime.tv_sec;
894 attr->mtimensec = inode->i_mtime.tv_nsec;
895 attr->ctime = inode->i_ctime.tv_sec;
896 attr->ctimensec = inode->i_ctime.tv_nsec;
897 }
898
899 stat->dev = inode->i_sb->s_dev;
900 stat->ino = attr->ino;
901 stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
902 stat->nlink = attr->nlink;
903 stat->uid = make_kuid(fc->user_ns, attr->uid);
904 stat->gid = make_kgid(fc->user_ns, attr->gid);
905 stat->rdev = inode->i_rdev;
906 stat->atime.tv_sec = attr->atime;
907 stat->atime.tv_nsec = attr->atimensec;
908 stat->mtime.tv_sec = attr->mtime;
909 stat->mtime.tv_nsec = attr->mtimensec;
910 stat->ctime.tv_sec = attr->ctime;
911 stat->ctime.tv_nsec = attr->ctimensec;
912 stat->size = attr->size;
913 stat->blocks = attr->blocks;
914
915 if (attr->blksize != 0)
916 blkbits = ilog2(attr->blksize);
917 else
918 blkbits = inode->i_sb->s_blocksize_bits;
919
920 stat->blksize = 1 << blkbits;
921 }
922
923 static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
924 struct file *file)
925 {
926 int err;
927 struct fuse_getattr_in inarg;
928 struct fuse_attr_out outarg;
929 struct fuse_conn *fc = get_fuse_conn(inode);
930 FUSE_ARGS(args);
931 u64 attr_version;
932
933 attr_version = fuse_get_attr_version(fc);
934
935 memset(&inarg, 0, sizeof(inarg));
936 memset(&outarg, 0, sizeof(outarg));
937
938 if (file && S_ISREG(inode->i_mode)) {
939 struct fuse_file *ff = file->private_data;
940
941 inarg.getattr_flags |= FUSE_GETATTR_FH;
942 inarg.fh = ff->fh;
943 }
944 args.opcode = FUSE_GETATTR;
945 args.nodeid = get_node_id(inode);
946 args.in_numargs = 1;
947 args.in_args[0].size = sizeof(inarg);
948 args.in_args[0].value = &inarg;
949 args.out_numargs = 1;
950 args.out_args[0].size = sizeof(outarg);
951 args.out_args[0].value = &outarg;
952 err = fuse_simple_request(fc, &args);
953 if (!err) {
954 if (fuse_invalid_attr(&outarg.attr) ||
955 (inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
956 make_bad_inode(inode);
957 err = -EIO;
958 } else {
959 fuse_change_attributes(inode, &outarg.attr,
960 attr_timeout(&outarg),
961 attr_version);
962 if (stat)
963 fuse_fillattr(inode, &outarg.attr, stat);
964 }
965 }
966 return err;
967 }
968
969 static int fuse_update_get_attr(struct inode *inode, struct file *file,
970 struct kstat *stat, u32 request_mask,
971 unsigned int flags)
972 {
973 struct fuse_inode *fi = get_fuse_inode(inode);
974 int err = 0;
975 bool sync;
976
977 if (flags & AT_STATX_FORCE_SYNC)
978 sync = true;
979 else if (flags & AT_STATX_DONT_SYNC)
980 sync = false;
981 else if (request_mask & READ_ONCE(fi->inval_mask))
982 sync = true;
983 else
984 sync = time_before64(fi->i_time, get_jiffies_64());
985
986 if (sync) {
987 forget_all_cached_acls(inode);
988 err = fuse_do_getattr(inode, stat, file);
989 } else if (stat) {
990 generic_fillattr(inode, stat);
991 stat->mode = fi->orig_i_mode;
992 stat->ino = fi->orig_ino;
993 }
994
995 return err;
996 }
997
998 int fuse_update_attributes(struct inode *inode, struct file *file)
999 {
1000
1001 return fuse_update_get_attr(inode, file, NULL,
1002 STATX_BASIC_STATS & ~STATX_ATIME, 0);
1003 }
1004
1005 int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
1006 u64 child_nodeid, struct qstr *name)
1007 {
1008 int err = -ENOTDIR;
1009 struct inode *parent;
1010 struct dentry *dir;
1011 struct dentry *entry;
1012
1013 parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
1014 if (!parent)
1015 return -ENOENT;
1016
1017 inode_lock(parent);
1018 if (!S_ISDIR(parent->i_mode))
1019 goto unlock;
1020
1021 err = -ENOENT;
1022 dir = d_find_alias(parent);
1023 if (!dir)
1024 goto unlock;
1025
1026 name->hash = full_name_hash(dir, name->name, name->len);
1027 entry = d_lookup(dir, name);
1028 dput(dir);
1029 if (!entry)
1030 goto unlock;
1031
1032 fuse_dir_changed(parent);
1033 fuse_invalidate_entry(entry);
1034
1035 if (child_nodeid != 0 && d_really_is_positive(entry)) {
1036 inode_lock(d_inode(entry));
1037 if (get_node_id(d_inode(entry)) != child_nodeid) {
1038 err = -ENOENT;
1039 goto badentry;
1040 }
1041 if (d_mountpoint(entry)) {
1042 err = -EBUSY;
1043 goto badentry;
1044 }
1045 if (d_is_dir(entry)) {
1046 shrink_dcache_parent(entry);
1047 if (!simple_empty(entry)) {
1048 err = -ENOTEMPTY;
1049 goto badentry;
1050 }
1051 d_inode(entry)->i_flags |= S_DEAD;
1052 }
1053 dont_mount(entry);
1054 clear_nlink(d_inode(entry));
1055 err = 0;
1056 badentry:
1057 inode_unlock(d_inode(entry));
1058 if (!err)
1059 d_delete(entry);
1060 } else {
1061 err = 0;
1062 }
1063 dput(entry);
1064
1065 unlock:
1066 inode_unlock(parent);
1067 iput(parent);
1068 return err;
1069 }
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084 int fuse_allow_current_process(struct fuse_conn *fc)
1085 {
1086 const struct cred *cred;
1087
1088 if (fc->allow_other)
1089 return current_in_userns(fc->user_ns);
1090
1091 cred = current_cred();
1092 if (uid_eq(cred->euid, fc->user_id) &&
1093 uid_eq(cred->suid, fc->user_id) &&
1094 uid_eq(cred->uid, fc->user_id) &&
1095 gid_eq(cred->egid, fc->group_id) &&
1096 gid_eq(cred->sgid, fc->group_id) &&
1097 gid_eq(cred->gid, fc->group_id))
1098 return 1;
1099
1100 return 0;
1101 }
1102
1103 static int fuse_access(struct inode *inode, int mask)
1104 {
1105 struct fuse_conn *fc = get_fuse_conn(inode);
1106 FUSE_ARGS(args);
1107 struct fuse_access_in inarg;
1108 int err;
1109
1110 BUG_ON(mask & MAY_NOT_BLOCK);
1111
1112 if (fc->no_access)
1113 return 0;
1114
1115 memset(&inarg, 0, sizeof(inarg));
1116 inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
1117 args.opcode = FUSE_ACCESS;
1118 args.nodeid = get_node_id(inode);
1119 args.in_numargs = 1;
1120 args.in_args[0].size = sizeof(inarg);
1121 args.in_args[0].value = &inarg;
1122 err = fuse_simple_request(fc, &args);
1123 if (err == -ENOSYS) {
1124 fc->no_access = 1;
1125 err = 0;
1126 }
1127 return err;
1128 }
1129
1130 static int fuse_perm_getattr(struct inode *inode, int mask)
1131 {
1132 if (mask & MAY_NOT_BLOCK)
1133 return -ECHILD;
1134
1135 forget_all_cached_acls(inode);
1136 return fuse_do_getattr(inode, NULL, NULL);
1137 }
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152 static int fuse_permission(struct inode *inode, int mask)
1153 {
1154 struct fuse_conn *fc = get_fuse_conn(inode);
1155 bool refreshed = false;
1156 int err = 0;
1157
1158 if (!fuse_allow_current_process(fc))
1159 return -EACCES;
1160
1161
1162
1163
1164 if (fc->default_permissions ||
1165 ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
1166 struct fuse_inode *fi = get_fuse_inode(inode);
1167 u32 perm_mask = STATX_MODE | STATX_UID | STATX_GID;
1168
1169 if (perm_mask & READ_ONCE(fi->inval_mask) ||
1170 time_before64(fi->i_time, get_jiffies_64())) {
1171 refreshed = true;
1172
1173 err = fuse_perm_getattr(inode, mask);
1174 if (err)
1175 return err;
1176 }
1177 }
1178
1179 if (fc->default_permissions) {
1180 err = generic_permission(inode, mask);
1181
1182
1183
1184
1185 if (err == -EACCES && !refreshed) {
1186 err = fuse_perm_getattr(inode, mask);
1187 if (!err)
1188 err = generic_permission(inode, mask);
1189 }
1190
1191
1192
1193
1194
1195 } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
1196 err = fuse_access(inode, mask);
1197 } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1198 if (!(inode->i_mode & S_IXUGO)) {
1199 if (refreshed)
1200 return -EACCES;
1201
1202 err = fuse_perm_getattr(inode, mask);
1203 if (!err && !(inode->i_mode & S_IXUGO))
1204 return -EACCES;
1205 }
1206 }
1207 return err;
1208 }
1209
1210 static int fuse_readlink_page(struct inode *inode, struct page *page)
1211 {
1212 struct fuse_conn *fc = get_fuse_conn(inode);
1213 struct fuse_page_desc desc = { .length = PAGE_SIZE - 1 };
1214 struct fuse_args_pages ap = {
1215 .num_pages = 1,
1216 .pages = &page,
1217 .descs = &desc,
1218 };
1219 char *link;
1220 ssize_t res;
1221
1222 ap.args.opcode = FUSE_READLINK;
1223 ap.args.nodeid = get_node_id(inode);
1224 ap.args.out_pages = true;
1225 ap.args.out_argvar = true;
1226 ap.args.page_zeroing = true;
1227 ap.args.out_numargs = 1;
1228 ap.args.out_args[0].size = desc.length;
1229 res = fuse_simple_request(fc, &ap.args);
1230
1231 fuse_invalidate_atime(inode);
1232
1233 if (res < 0)
1234 return res;
1235
1236 if (WARN_ON(res >= PAGE_SIZE))
1237 return -EIO;
1238
1239 link = page_address(page);
1240 link[res] = '\0';
1241
1242 return 0;
1243 }
1244
1245 static const char *fuse_get_link(struct dentry *dentry, struct inode *inode,
1246 struct delayed_call *callback)
1247 {
1248 struct fuse_conn *fc = get_fuse_conn(inode);
1249 struct page *page;
1250 int err;
1251
1252 err = -EIO;
1253 if (is_bad_inode(inode))
1254 goto out_err;
1255
1256 if (fc->cache_symlinks)
1257 return page_get_link(dentry, inode, callback);
1258
1259 err = -ECHILD;
1260 if (!dentry)
1261 goto out_err;
1262
1263 page = alloc_page(GFP_KERNEL);
1264 err = -ENOMEM;
1265 if (!page)
1266 goto out_err;
1267
1268 err = fuse_readlink_page(inode, page);
1269 if (err) {
1270 __free_page(page);
1271 goto out_err;
1272 }
1273
1274 set_delayed_call(callback, page_put_link, page);
1275
1276 return page_address(page);
1277
1278 out_err:
1279 return ERR_PTR(err);
1280 }
1281
1282 static int fuse_dir_open(struct inode *inode, struct file *file)
1283 {
1284 return fuse_open_common(inode, file, true);
1285 }
1286
1287 static int fuse_dir_release(struct inode *inode, struct file *file)
1288 {
1289 fuse_release_common(file, true);
1290
1291 return 0;
1292 }
1293
1294 static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1295 int datasync)
1296 {
1297 struct inode *inode = file->f_mapping->host;
1298 struct fuse_conn *fc = get_fuse_conn(inode);
1299 int err;
1300
1301 if (is_bad_inode(inode))
1302 return -EIO;
1303
1304 if (fc->no_fsyncdir)
1305 return 0;
1306
1307 inode_lock(inode);
1308 err = fuse_fsync_common(file, start, end, datasync, FUSE_FSYNCDIR);
1309 if (err == -ENOSYS) {
1310 fc->no_fsyncdir = 1;
1311 err = 0;
1312 }
1313 inode_unlock(inode);
1314
1315 return err;
1316 }
1317
1318 static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1319 unsigned long arg)
1320 {
1321 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1322
1323
1324 if (fc->minor < 18)
1325 return -ENOTTY;
1326
1327 return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1328 }
1329
1330 static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1331 unsigned long arg)
1332 {
1333 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1334
1335 if (fc->minor < 18)
1336 return -ENOTTY;
1337
1338 return fuse_ioctl_common(file, cmd, arg,
1339 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1340 }
1341
1342 static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
1343 {
1344
1345 if (ivalid & ATTR_MTIME_SET)
1346 return true;
1347
1348
1349 if (trust_local_mtime)
1350 return true;
1351
1352
1353 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1354 return false;
1355
1356
1357 return true;
1358 }
1359
1360 static void iattr_to_fattr(struct fuse_conn *fc, struct iattr *iattr,
1361 struct fuse_setattr_in *arg, bool trust_local_cmtime)
1362 {
1363 unsigned ivalid = iattr->ia_valid;
1364
1365 if (ivalid & ATTR_MODE)
1366 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
1367 if (ivalid & ATTR_UID)
1368 arg->valid |= FATTR_UID, arg->uid = from_kuid(fc->user_ns, iattr->ia_uid);
1369 if (ivalid & ATTR_GID)
1370 arg->valid |= FATTR_GID, arg->gid = from_kgid(fc->user_ns, iattr->ia_gid);
1371 if (ivalid & ATTR_SIZE)
1372 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
1373 if (ivalid & ATTR_ATIME) {
1374 arg->valid |= FATTR_ATIME;
1375 arg->atime = iattr->ia_atime.tv_sec;
1376 arg->atimensec = iattr->ia_atime.tv_nsec;
1377 if (!(ivalid & ATTR_ATIME_SET))
1378 arg->valid |= FATTR_ATIME_NOW;
1379 }
1380 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
1381 arg->valid |= FATTR_MTIME;
1382 arg->mtime = iattr->ia_mtime.tv_sec;
1383 arg->mtimensec = iattr->ia_mtime.tv_nsec;
1384 if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
1385 arg->valid |= FATTR_MTIME_NOW;
1386 }
1387 if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
1388 arg->valid |= FATTR_CTIME;
1389 arg->ctime = iattr->ia_ctime.tv_sec;
1390 arg->ctimensec = iattr->ia_ctime.tv_nsec;
1391 }
1392 }
1393
1394
1395
1396
1397
1398
1399
1400 void fuse_set_nowrite(struct inode *inode)
1401 {
1402 struct fuse_inode *fi = get_fuse_inode(inode);
1403
1404 BUG_ON(!inode_is_locked(inode));
1405
1406 spin_lock(&fi->lock);
1407 BUG_ON(fi->writectr < 0);
1408 fi->writectr += FUSE_NOWRITE;
1409 spin_unlock(&fi->lock);
1410 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1411 }
1412
1413
1414
1415
1416
1417
1418
1419 static void __fuse_release_nowrite(struct inode *inode)
1420 {
1421 struct fuse_inode *fi = get_fuse_inode(inode);
1422
1423 BUG_ON(fi->writectr != FUSE_NOWRITE);
1424 fi->writectr = 0;
1425 fuse_flush_writepages(inode);
1426 }
1427
1428 void fuse_release_nowrite(struct inode *inode)
1429 {
1430 struct fuse_inode *fi = get_fuse_inode(inode);
1431
1432 spin_lock(&fi->lock);
1433 __fuse_release_nowrite(inode);
1434 spin_unlock(&fi->lock);
1435 }
1436
1437 static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
1438 struct inode *inode,
1439 struct fuse_setattr_in *inarg_p,
1440 struct fuse_attr_out *outarg_p)
1441 {
1442 args->opcode = FUSE_SETATTR;
1443 args->nodeid = get_node_id(inode);
1444 args->in_numargs = 1;
1445 args->in_args[0].size = sizeof(*inarg_p);
1446 args->in_args[0].value = inarg_p;
1447 args->out_numargs = 1;
1448 args->out_args[0].size = sizeof(*outarg_p);
1449 args->out_args[0].value = outarg_p;
1450 }
1451
1452
1453
1454
1455 int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
1456 {
1457 struct fuse_conn *fc = get_fuse_conn(inode);
1458 FUSE_ARGS(args);
1459 struct fuse_setattr_in inarg;
1460 struct fuse_attr_out outarg;
1461
1462 memset(&inarg, 0, sizeof(inarg));
1463 memset(&outarg, 0, sizeof(outarg));
1464
1465 inarg.valid = FATTR_MTIME;
1466 inarg.mtime = inode->i_mtime.tv_sec;
1467 inarg.mtimensec = inode->i_mtime.tv_nsec;
1468 if (fc->minor >= 23) {
1469 inarg.valid |= FATTR_CTIME;
1470 inarg.ctime = inode->i_ctime.tv_sec;
1471 inarg.ctimensec = inode->i_ctime.tv_nsec;
1472 }
1473 if (ff) {
1474 inarg.valid |= FATTR_FH;
1475 inarg.fh = ff->fh;
1476 }
1477 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
1478
1479 return fuse_simple_request(fc, &args);
1480 }
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490 int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
1491 struct file *file)
1492 {
1493 struct inode *inode = d_inode(dentry);
1494 struct fuse_conn *fc = get_fuse_conn(inode);
1495 struct fuse_inode *fi = get_fuse_inode(inode);
1496 FUSE_ARGS(args);
1497 struct fuse_setattr_in inarg;
1498 struct fuse_attr_out outarg;
1499 bool is_truncate = false;
1500 bool is_wb = fc->writeback_cache;
1501 loff_t oldsize;
1502 int err;
1503 bool trust_local_cmtime = is_wb && S_ISREG(inode->i_mode);
1504
1505 if (!fc->default_permissions)
1506 attr->ia_valid |= ATTR_FORCE;
1507
1508 err = setattr_prepare(dentry, attr);
1509 if (err)
1510 return err;
1511
1512 if (attr->ia_valid & ATTR_OPEN) {
1513
1514 WARN_ON(!(attr->ia_valid & ATTR_SIZE));
1515 WARN_ON(attr->ia_size != 0);
1516 if (fc->atomic_o_trunc) {
1517
1518
1519
1520
1521
1522 i_size_write(inode, 0);
1523 truncate_pagecache(inode, 0);
1524 return 0;
1525 }
1526 file = NULL;
1527 }
1528
1529 if (attr->ia_valid & ATTR_SIZE) {
1530 if (WARN_ON(!S_ISREG(inode->i_mode)))
1531 return -EIO;
1532 is_truncate = true;
1533 }
1534
1535
1536 if (is_wb && S_ISREG(inode->i_mode) &&
1537 attr->ia_valid &
1538 (ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_MTIME_SET |
1539 ATTR_TIMES_SET)) {
1540 err = write_inode_now(inode, true);
1541 if (err)
1542 return err;
1543
1544 fuse_set_nowrite(inode);
1545 fuse_release_nowrite(inode);
1546 }
1547
1548 if (is_truncate) {
1549 fuse_set_nowrite(inode);
1550 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
1551 if (trust_local_cmtime && attr->ia_size != inode->i_size)
1552 attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
1553 }
1554
1555 memset(&inarg, 0, sizeof(inarg));
1556 memset(&outarg, 0, sizeof(outarg));
1557 iattr_to_fattr(fc, attr, &inarg, trust_local_cmtime);
1558 if (file) {
1559 struct fuse_file *ff = file->private_data;
1560 inarg.valid |= FATTR_FH;
1561 inarg.fh = ff->fh;
1562 }
1563 if (attr->ia_valid & ATTR_SIZE) {
1564
1565 inarg.valid |= FATTR_LOCKOWNER;
1566 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1567 }
1568 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
1569 err = fuse_simple_request(fc, &args);
1570 if (err) {
1571 if (err == -EINTR)
1572 fuse_invalidate_attr(inode);
1573 goto error;
1574 }
1575
1576 if (fuse_invalid_attr(&outarg.attr) ||
1577 (inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1578 make_bad_inode(inode);
1579 err = -EIO;
1580 goto error;
1581 }
1582
1583 spin_lock(&fi->lock);
1584
1585 if (trust_local_cmtime) {
1586 if (attr->ia_valid & ATTR_MTIME)
1587 inode->i_mtime = attr->ia_mtime;
1588 if (attr->ia_valid & ATTR_CTIME)
1589 inode->i_ctime = attr->ia_ctime;
1590
1591 }
1592
1593 fuse_change_attributes_common(inode, &outarg.attr,
1594 attr_timeout(&outarg));
1595 oldsize = inode->i_size;
1596
1597 if (!is_wb || is_truncate || !S_ISREG(inode->i_mode))
1598 i_size_write(inode, outarg.attr.size);
1599
1600 if (is_truncate) {
1601
1602 __fuse_release_nowrite(inode);
1603 }
1604 spin_unlock(&fi->lock);
1605
1606
1607
1608
1609
1610 if ((is_truncate || !is_wb) &&
1611 S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
1612 truncate_pagecache(inode, outarg.attr.size);
1613 invalidate_inode_pages2(inode->i_mapping);
1614 }
1615
1616 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
1617 return 0;
1618
1619 error:
1620 if (is_truncate)
1621 fuse_release_nowrite(inode);
1622
1623 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
1624 return err;
1625 }
1626
1627 static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1628 {
1629 struct inode *inode = d_inode(entry);
1630 struct fuse_conn *fc = get_fuse_conn(inode);
1631 struct file *file = (attr->ia_valid & ATTR_FILE) ? attr->ia_file : NULL;
1632 int ret;
1633
1634 if (!fuse_allow_current_process(get_fuse_conn(inode)))
1635 return -EACCES;
1636
1637 if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
1638 attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
1639 ATTR_MODE);
1640
1641
1642
1643
1644
1645
1646
1647 if (!fc->handle_killpriv) {
1648
1649
1650
1651
1652 ret = fuse_do_getattr(inode, NULL, file);
1653 if (ret)
1654 return ret;
1655
1656 attr->ia_mode = inode->i_mode;
1657 if (inode->i_mode & S_ISUID) {
1658 attr->ia_valid |= ATTR_MODE;
1659 attr->ia_mode &= ~S_ISUID;
1660 }
1661 if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
1662 attr->ia_valid |= ATTR_MODE;
1663 attr->ia_mode &= ~S_ISGID;
1664 }
1665 }
1666 }
1667 if (!attr->ia_valid)
1668 return 0;
1669
1670 ret = fuse_do_setattr(entry, attr, file);
1671 if (!ret) {
1672
1673
1674
1675
1676 if (fc->posix_acl)
1677 forget_all_cached_acls(inode);
1678
1679
1680 if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE))
1681 fuse_invalidate_entry_cache(entry);
1682 }
1683 return ret;
1684 }
1685
1686 static int fuse_getattr(const struct path *path, struct kstat *stat,
1687 u32 request_mask, unsigned int flags)
1688 {
1689 struct inode *inode = d_inode(path->dentry);
1690 struct fuse_conn *fc = get_fuse_conn(inode);
1691
1692 if (!fuse_allow_current_process(fc))
1693 return -EACCES;
1694
1695 return fuse_update_get_attr(inode, NULL, stat, request_mask, flags);
1696 }
1697
1698 static const struct inode_operations fuse_dir_inode_operations = {
1699 .lookup = fuse_lookup,
1700 .mkdir = fuse_mkdir,
1701 .symlink = fuse_symlink,
1702 .unlink = fuse_unlink,
1703 .rmdir = fuse_rmdir,
1704 .rename = fuse_rename2,
1705 .link = fuse_link,
1706 .setattr = fuse_setattr,
1707 .create = fuse_create,
1708 .atomic_open = fuse_atomic_open,
1709 .mknod = fuse_mknod,
1710 .permission = fuse_permission,
1711 .getattr = fuse_getattr,
1712 .listxattr = fuse_listxattr,
1713 .get_acl = fuse_get_acl,
1714 .set_acl = fuse_set_acl,
1715 };
1716
1717 static const struct file_operations fuse_dir_operations = {
1718 .llseek = generic_file_llseek,
1719 .read = generic_read_dir,
1720 .iterate_shared = fuse_readdir,
1721 .open = fuse_dir_open,
1722 .release = fuse_dir_release,
1723 .fsync = fuse_dir_fsync,
1724 .unlocked_ioctl = fuse_dir_ioctl,
1725 .compat_ioctl = fuse_dir_compat_ioctl,
1726 };
1727
1728 static const struct inode_operations fuse_common_inode_operations = {
1729 .setattr = fuse_setattr,
1730 .permission = fuse_permission,
1731 .getattr = fuse_getattr,
1732 .listxattr = fuse_listxattr,
1733 .get_acl = fuse_get_acl,
1734 .set_acl = fuse_set_acl,
1735 };
1736
1737 static const struct inode_operations fuse_symlink_inode_operations = {
1738 .setattr = fuse_setattr,
1739 .get_link = fuse_get_link,
1740 .getattr = fuse_getattr,
1741 .listxattr = fuse_listxattr,
1742 };
1743
1744 void fuse_init_common(struct inode *inode)
1745 {
1746 inode->i_op = &fuse_common_inode_operations;
1747 }
1748
1749 void fuse_init_dir(struct inode *inode)
1750 {
1751 struct fuse_inode *fi = get_fuse_inode(inode);
1752
1753 inode->i_op = &fuse_dir_inode_operations;
1754 inode->i_fop = &fuse_dir_operations;
1755
1756 spin_lock_init(&fi->rdc.lock);
1757 fi->rdc.cached = false;
1758 fi->rdc.size = 0;
1759 fi->rdc.pos = 0;
1760 fi->rdc.version = 0;
1761 }
1762
1763 static int fuse_symlink_readpage(struct file *null, struct page *page)
1764 {
1765 int err = fuse_readlink_page(page->mapping->host, page);
1766
1767 if (!err)
1768 SetPageUptodate(page);
1769
1770 unlock_page(page);
1771
1772 return err;
1773 }
1774
1775 static const struct address_space_operations fuse_symlink_aops = {
1776 .readpage = fuse_symlink_readpage,
1777 };
1778
1779 void fuse_init_symlink(struct inode *inode)
1780 {
1781 inode->i_op = &fuse_symlink_inode_operations;
1782 inode->i_data.a_ops = &fuse_symlink_aops;
1783 inode_nohighmem(inode);
1784 }