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