1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 FUSE: Filesystem in Userspace
4 Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu>
5 */
6
7 #include "dev.h"
8 #include "fuse_i.h"
9
10 #include <linux/pagemap.h>
11 #include <linux/file.h>
12 #include <linux/fs_context.h>
13 #include <linux/moduleparam.h>
14 #include <linux/sched.h>
15 #include <linux/namei.h>
16 #include <linux/slab.h>
17 #include <linux/xattr.h>
18 #include <linux/iversion.h>
19 #include <linux/posix_acl.h>
20 #include <linux/security.h>
21 #include <linux/types.h>
22 #include <linux/kernel.h>
23
24 static bool __read_mostly allow_sys_admin_access;
25 module_param(allow_sys_admin_access, bool, 0644);
26 MODULE_PARM_DESC(allow_sys_admin_access,
27 "Allow users with CAP_SYS_ADMIN in initial userns to bypass allow_other access check");
28
29 struct dentry_bucket {
30 struct rb_root tree;
31 spinlock_t lock;
32 };
33
34 #define FUSE_HASH_BITS 5
35 #define FUSE_HASH_SIZE (1 << FUSE_HASH_BITS)
36 static struct dentry_bucket dentry_hash[FUSE_HASH_SIZE];
37 static struct delayed_work dentry_tree_work;
38
39 /* Minimum invalidation work queue frequency */
40 #define FUSE_DENTRY_INVAL_FREQ_MIN 5
41
42 unsigned __read_mostly inval_wq;
inval_wq_set(const char * val,const struct kernel_param * kp)43 static int inval_wq_set(const char *val, const struct kernel_param *kp)
44 {
45 unsigned int num;
46 unsigned int old = inval_wq;
47 int ret;
48
49 if (!val)
50 return -EINVAL;
51
52 ret = kstrtouint(val, 0, &num);
53 if (ret)
54 return ret;
55
56 if ((num < FUSE_DENTRY_INVAL_FREQ_MIN) && (num != 0))
57 return -EINVAL;
58
59 /* This should prevent overflow in secs_to_jiffies() */
60 if (num > USHRT_MAX)
61 return -EINVAL;
62
63 *((unsigned int *)kp->arg) = num;
64
65 if (num && !old)
66 schedule_delayed_work(&dentry_tree_work,
67 secs_to_jiffies(num));
68 else if (!num && old)
69 cancel_delayed_work_sync(&dentry_tree_work);
70
71 return 0;
72 }
73 static const struct kernel_param_ops inval_wq_ops = {
74 .set = inval_wq_set,
75 .get = param_get_uint,
76 };
77 module_param_cb(inval_wq, &inval_wq_ops, &inval_wq, 0644);
78 __MODULE_PARM_TYPE(inval_wq, "uint");
79 MODULE_PARM_DESC(inval_wq,
80 "Dentries invalidation work queue period in secs (>= "
81 __stringify(FUSE_DENTRY_INVAL_FREQ_MIN) ").");
82
get_dentry_bucket(struct dentry * dentry)83 static inline struct dentry_bucket *get_dentry_bucket(struct dentry *dentry)
84 {
85 int i = hash_ptr(dentry, FUSE_HASH_BITS);
86
87 return &dentry_hash[i];
88 }
89
fuse_advise_use_readdirplus(struct inode * dir)90 static void fuse_advise_use_readdirplus(struct inode *dir)
91 {
92 struct fuse_inode *fi = get_fuse_inode(dir);
93
94 set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state);
95 }
96
97 struct fuse_dentry {
98 u64 time;
99 u64 epoch;
100 union {
101 struct rcu_head rcu;
102 struct rb_node node;
103 };
104 struct dentry *dentry;
105 };
106
__fuse_dentry_tree_del_node(struct fuse_dentry * fd,struct dentry_bucket * bucket)107 static void __fuse_dentry_tree_del_node(struct fuse_dentry *fd,
108 struct dentry_bucket *bucket)
109 {
110 if (!RB_EMPTY_NODE(&fd->node)) {
111 rb_erase(&fd->node, &bucket->tree);
112 RB_CLEAR_NODE(&fd->node);
113 }
114 }
115
fuse_dentry_tree_del_node(struct dentry * dentry)116 static void fuse_dentry_tree_del_node(struct dentry *dentry)
117 {
118 struct fuse_dentry *fd = dentry->d_fsdata;
119 struct dentry_bucket *bucket = get_dentry_bucket(dentry);
120
121 spin_lock(&bucket->lock);
122 __fuse_dentry_tree_del_node(fd, bucket);
123 spin_unlock(&bucket->lock);
124 }
125
fuse_dentry_tree_add_node(struct dentry * dentry)126 static void fuse_dentry_tree_add_node(struct dentry *dentry)
127 {
128 struct fuse_dentry *fd = dentry->d_fsdata;
129 struct dentry_bucket *bucket;
130 struct fuse_dentry *cur;
131 struct rb_node **p, *parent = NULL;
132
133 if (!inval_wq)
134 return;
135
136 bucket = get_dentry_bucket(dentry);
137
138 spin_lock(&bucket->lock);
139
140 __fuse_dentry_tree_del_node(fd, bucket);
141
142 p = &bucket->tree.rb_node;
143 while (*p) {
144 parent = *p;
145 cur = rb_entry(*p, struct fuse_dentry, node);
146 if (fd->time < cur->time)
147 p = &(*p)->rb_left;
148 else
149 p = &(*p)->rb_right;
150 }
151 rb_link_node(&fd->node, parent, p);
152 rb_insert_color(&fd->node, &bucket->tree);
153 spin_unlock(&bucket->lock);
154 }
155
156 /*
157 * work queue which, when enabled, will periodically check for expired dentries
158 * in the dentries tree.
159 */
fuse_dentry_tree_work(struct work_struct * work)160 static void fuse_dentry_tree_work(struct work_struct *work)
161 {
162 LIST_HEAD(dispose);
163 struct fuse_dentry *fd;
164 struct rb_node *node;
165 int i;
166
167 for (i = 0; i < FUSE_HASH_SIZE; i++) {
168 spin_lock(&dentry_hash[i].lock);
169 node = rb_first(&dentry_hash[i].tree);
170 while (node) {
171 fd = rb_entry(node, struct fuse_dentry, node);
172 if (!time_before64(fd->time, get_jiffies_64()))
173 break;
174
175 rb_erase(&fd->node, &dentry_hash[i].tree);
176 RB_CLEAR_NODE(&fd->node);
177 spin_lock(&fd->dentry->d_lock);
178 /* If dentry is still referenced, let next dput release it */
179 fd->dentry->d_flags |= DCACHE_OP_DELETE;
180 __move_to_shrink_list(fd->dentry, &dispose);
181 spin_unlock(&fd->dentry->d_lock);
182 if (need_resched()) {
183 spin_unlock(&dentry_hash[i].lock);
184 cond_resched();
185 spin_lock(&dentry_hash[i].lock);
186 }
187 node = rb_first(&dentry_hash[i].tree);
188 }
189 spin_unlock(&dentry_hash[i].lock);
190 }
191 shrink_dentry_list(&dispose);
192
193 if (inval_wq)
194 schedule_delayed_work(&dentry_tree_work,
195 secs_to_jiffies(inval_wq));
196 }
197
fuse_epoch_work(struct work_struct * work)198 void fuse_epoch_work(struct work_struct *work)
199 {
200 struct fuse_conn *fc = container_of(work, struct fuse_conn,
201 epoch_work);
202 struct fuse_mount *fm;
203 struct inode *inode;
204
205 down_read(&fc->killsb);
206
207 inode = fuse_ilookup(fc, FUSE_ROOT_ID, &fm);
208 if (inode) {
209 iput(inode);
210 /* Remove all possible active references to cached inodes */
211 shrink_dcache_sb(fm->sb);
212 } else
213 pr_warn("Failed to get root inode");
214
215 up_read(&fc->killsb);
216 }
217
fuse_dentry_tree_init(void)218 void fuse_dentry_tree_init(void)
219 {
220 int i;
221
222 for (i = 0; i < FUSE_HASH_SIZE; i++) {
223 spin_lock_init(&dentry_hash[i].lock);
224 dentry_hash[i].tree = RB_ROOT;
225 }
226 INIT_DELAYED_WORK(&dentry_tree_work, fuse_dentry_tree_work);
227 }
228
fuse_dentry_tree_cleanup(void)229 void fuse_dentry_tree_cleanup(void)
230 {
231 int i;
232
233 inval_wq = 0;
234 cancel_delayed_work_sync(&dentry_tree_work);
235
236 for (i = 0; i < FUSE_HASH_SIZE; i++)
237 WARN_ON_ONCE(!RB_EMPTY_ROOT(&dentry_hash[i].tree));
238 }
239
fuse_dentry_set_epoch(struct dentry * dentry,u64 epoch)240 void fuse_dentry_set_epoch(struct dentry *dentry, u64 epoch)
241 {
242 struct fuse_dentry *fd = dentry->d_fsdata;
243
244 fd->epoch = epoch;
245 }
246
__fuse_dentry_settime(struct dentry * dentry,u64 time)247 static inline void __fuse_dentry_settime(struct dentry *dentry, u64 time)
248 {
249 ((struct fuse_dentry *) dentry->d_fsdata)->time = time;
250 }
251
fuse_dentry_time(const struct dentry * entry)252 static inline u64 fuse_dentry_time(const struct dentry *entry)
253 {
254 return ((struct fuse_dentry *) entry->d_fsdata)->time;
255 }
256
fuse_dentry_settime(struct dentry * dentry,u64 time)257 static void fuse_dentry_settime(struct dentry *dentry, u64 time)
258 {
259 struct fuse_conn *fc = get_fuse_conn_super(dentry->d_sb);
260 bool delete = !time && fc->delete_stale;
261 /*
262 * Mess with DCACHE_OP_DELETE because dput() will be faster without it.
263 * Don't care about races, either way it's just an optimization
264 */
265 if ((!delete && (dentry->d_flags & DCACHE_OP_DELETE)) ||
266 (delete && !(dentry->d_flags & DCACHE_OP_DELETE))) {
267 spin_lock(&dentry->d_lock);
268 if (!delete)
269 dentry->d_flags &= ~DCACHE_OP_DELETE;
270 else
271 dentry->d_flags |= DCACHE_OP_DELETE;
272 spin_unlock(&dentry->d_lock);
273 }
274
275 __fuse_dentry_settime(dentry, time);
276 fuse_dentry_tree_add_node(dentry);
277 }
278
279 /*
280 * FUSE caches dentries and attributes with separate timeout. The
281 * time in jiffies until the dentry/attributes are valid is stored in
282 * dentry->d_fsdata and fuse_inode->i_time respectively.
283 */
284
285 /*
286 * Calculate the time in jiffies until a dentry/attributes are valid
287 */
fuse_time_to_jiffies(u64 sec,u32 nsec)288 u64 fuse_time_to_jiffies(u64 sec, u32 nsec)
289 {
290 if (sec || nsec) {
291 struct timespec64 ts = {
292 sec,
293 min_t(u32, nsec, NSEC_PER_SEC - 1)
294 };
295
296 return get_jiffies_64() + timespec64_to_jiffies(&ts);
297 } else
298 return 0;
299 }
300
301 /*
302 * Set dentry and possibly attribute timeouts from the lookup/mk*
303 * replies
304 */
fuse_change_entry_timeout(struct dentry * entry,struct fuse_entry_out * o)305 void fuse_change_entry_timeout(struct dentry *entry, struct fuse_entry_out *o)
306 {
307 fuse_dentry_settime(entry,
308 fuse_time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
309 }
310
fuse_invalidate_attr_mask(struct inode * inode,u32 mask)311 void fuse_invalidate_attr_mask(struct inode *inode, u32 mask)
312 {
313 set_mask_bits(&get_fuse_inode(inode)->inval_mask, 0, mask);
314 }
315
316 /*
317 * Mark the attributes as stale, so that at the next call to
318 * ->getattr() they will be fetched from userspace
319 */
fuse_invalidate_attr(struct inode * inode)320 void fuse_invalidate_attr(struct inode *inode)
321 {
322 fuse_invalidate_attr_mask(inode, STATX_BASIC_STATS);
323 }
324
fuse_dir_changed(struct inode * dir)325 static void fuse_dir_changed(struct inode *dir)
326 {
327 fuse_invalidate_attr_mask(dir, FUSE_STATX_MODDIR);
328 inode_maybe_inc_iversion(dir, false);
329 }
330
331 /*
332 * Mark the attributes as stale due to an atime change. Avoid the invalidate if
333 * atime is not used.
334 */
fuse_invalidate_atime(struct inode * inode)335 void fuse_invalidate_atime(struct inode *inode)
336 {
337 if (!IS_RDONLY(inode))
338 fuse_invalidate_attr_mask(inode, STATX_ATIME);
339 }
340
341 /*
342 * Just mark the entry as stale, so that a next attempt to look it up
343 * will result in a new lookup call to userspace
344 *
345 * This is called when a dentry is about to become negative and the
346 * timeout is unknown (unlink, rmdir, rename and in some cases
347 * lookup)
348 */
fuse_invalidate_entry_cache(struct dentry * entry)349 void fuse_invalidate_entry_cache(struct dentry *entry)
350 {
351 fuse_dentry_settime(entry, 0);
352 }
353
354 /*
355 * Same as fuse_invalidate_entry_cache(), but also try to remove the
356 * dentry from the hash
357 */
fuse_invalidate_entry(struct dentry * entry)358 static void fuse_invalidate_entry(struct dentry *entry)
359 {
360 d_invalidate(entry);
361 fuse_invalidate_entry_cache(entry);
362 }
363
fuse_lookup_init(struct fuse_args * args,u64 nodeid,const struct qstr * name,struct fuse_entry_out * outarg)364 static void fuse_lookup_init(struct fuse_args *args, u64 nodeid,
365 const struct qstr *name,
366 struct fuse_entry_out *outarg)
367 {
368 memset(outarg, 0, sizeof(struct fuse_entry_out));
369 args->opcode = FUSE_LOOKUP;
370 args->nodeid = nodeid;
371 args->in_numargs = 3;
372 fuse_set_zero_arg0(args);
373 args->in_args[1].size = name->len;
374 args->in_args[1].value = name->name;
375 args->in_args[2].size = 1;
376 args->in_args[2].value = "";
377 args->out_numargs = 1;
378 args->out_args[0].size = sizeof(struct fuse_entry_out);
379 args->out_args[0].value = outarg;
380 }
381
382 /*
383 * Check whether the dentry is still valid
384 *
385 * If the entry validity timeout has expired and the dentry is
386 * positive, try to redo the lookup. If the lookup results in a
387 * different inode, then let the VFS invalidate the dentry and redo
388 * the lookup once more. If the lookup results in the same inode,
389 * then refresh the attributes, timeouts and mark the dentry valid.
390 */
fuse_dentry_revalidate(struct inode * dir,const struct qstr * name,struct dentry * entry,unsigned int flags)391 static int fuse_dentry_revalidate(struct inode *dir, const struct qstr *name,
392 struct dentry *entry, unsigned int flags)
393 {
394 struct inode *inode;
395 struct fuse_mount *fm;
396 struct fuse_conn *fc;
397 struct fuse_inode *fi;
398 struct fuse_dentry *fd = entry->d_fsdata;
399 int ret;
400
401 fc = get_fuse_conn_super(dir->i_sb);
402 if (fd->epoch < atomic_read(&fc->epoch))
403 goto invalid;
404
405 inode = d_inode_rcu(entry);
406 if (inode && fuse_is_bad(inode))
407 goto invalid;
408 else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
409 (flags & (LOOKUP_EXCL | LOOKUP_REVAL | LOOKUP_RENAME_TARGET))) {
410 struct fuse_entry_out outarg;
411 FUSE_ARGS(args);
412 struct fuse_forget_link *forget;
413 u64 attr_version;
414
415 /* For negative dentries, always do a fresh lookup */
416 if (!inode)
417 goto invalid;
418
419 ret = -ECHILD;
420 if (flags & LOOKUP_RCU)
421 goto out;
422
423 fm = get_fuse_mount(inode);
424
425 forget = fuse_alloc_forget();
426 ret = -ENOMEM;
427 if (!forget)
428 goto out;
429
430 attr_version = fuse_get_attr_version(fm->fc);
431
432 fuse_lookup_init(&args, get_node_id(dir), name, &outarg);
433 ret = fuse_simple_request(fm, &args);
434 /* Zero nodeid is same as -ENOENT */
435 if (!ret && !outarg.nodeid)
436 ret = -ENOENT;
437 if (!ret) {
438 fi = get_fuse_inode(inode);
439 if (outarg.nodeid != get_node_id(inode) ||
440 (bool) IS_AUTOMOUNT(inode) != (bool) (outarg.attr.flags & FUSE_ATTR_SUBMOUNT)) {
441 fuse_chan_queue_forget(fm->fc->chan, forget,
442 outarg.nodeid, 1);
443 goto invalid;
444 }
445 spin_lock(&fi->lock);
446 fi->nlookup++;
447 spin_unlock(&fi->lock);
448 }
449 kfree(forget);
450 if (ret == -ENOMEM || ret == -EINTR)
451 goto out;
452 if (ret || fuse_invalid_attr(&outarg.attr) ||
453 fuse_stale_inode(inode, outarg.generation, &outarg.attr))
454 goto invalid;
455
456 forget_all_cached_acls(inode);
457 fuse_change_attributes(inode, &outarg.attr, NULL,
458 ATTR_TIMEOUT(&outarg),
459 attr_version);
460 fuse_change_entry_timeout(entry, &outarg);
461 } else if (inode) {
462 fi = get_fuse_inode(inode);
463 if (flags & LOOKUP_RCU) {
464 if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state))
465 return -ECHILD;
466 } else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) {
467 fuse_advise_use_readdirplus(dir);
468 }
469 }
470 ret = 1;
471 out:
472 return ret;
473
474 invalid:
475 ret = 0;
476 goto out;
477 }
478
fuse_dentry_init(struct dentry * dentry)479 static int fuse_dentry_init(struct dentry *dentry)
480 {
481 struct fuse_dentry *fd;
482
483 fd = kzalloc_obj(struct fuse_dentry,
484 GFP_KERNEL_ACCOUNT | __GFP_RECLAIMABLE);
485 if (!fd)
486 return -ENOMEM;
487
488 fd->dentry = dentry;
489 RB_CLEAR_NODE(&fd->node);
490 dentry->d_fsdata = fd;
491 /*
492 * Initialising epoch to '0' ensures the dentry is invalid
493 * if compared to fc->epoch, which is initialized to '1'.
494 */
495 fuse_dentry_set_epoch(dentry, 0);
496
497 return 0;
498 }
499
fuse_dentry_release(struct dentry * dentry)500 static void fuse_dentry_release(struct dentry *dentry)
501 {
502 struct fuse_dentry *fd = dentry->d_fsdata;
503
504 if (!RB_EMPTY_NODE(&fd->node))
505 fuse_dentry_tree_del_node(dentry);
506 kfree_rcu(fd, rcu);
507 }
508
fuse_dentry_delete(const struct dentry * dentry)509 static int fuse_dentry_delete(const struct dentry *dentry)
510 {
511 return time_before64(fuse_dentry_time(dentry), get_jiffies_64());
512 }
513
514 /*
515 * Create a fuse_mount object with a new superblock (with path->dentry
516 * as the root), and return that mount so it can be auto-mounted on
517 * @path.
518 */
fuse_dentry_automount(struct path * path)519 static struct vfsmount *fuse_dentry_automount(struct path *path)
520 {
521 struct fs_context *fsc;
522 struct vfsmount *mnt;
523 struct fuse_inode *mp_fi = get_fuse_inode(d_inode(path->dentry));
524
525 fsc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry);
526 if (IS_ERR(fsc))
527 return ERR_CAST(fsc);
528
529 /* Pass the FUSE inode of the mount for fuse_get_tree_submount() */
530 fsc->fs_private = mp_fi;
531
532 /* Create the submount */
533 mnt = fc_mount(fsc);
534 put_fs_context(fsc);
535 return mnt;
536 }
537
538 const struct dentry_operations fuse_dentry_operations = {
539 .d_revalidate = fuse_dentry_revalidate,
540 .d_delete = fuse_dentry_delete,
541 .d_init = fuse_dentry_init,
542 .d_release = fuse_dentry_release,
543 .d_automount = fuse_dentry_automount,
544 };
545
fuse_valid_type(int m)546 int fuse_valid_type(int m)
547 {
548 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
549 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
550 }
551
fuse_valid_size(u64 size)552 static bool fuse_valid_size(u64 size)
553 {
554 return size <= LLONG_MAX;
555 }
556
fuse_invalid_attr(struct fuse_attr * attr)557 bool fuse_invalid_attr(struct fuse_attr *attr)
558 {
559 return !fuse_valid_type(attr->mode) || !fuse_valid_size(attr->size);
560 }
561
fuse_lookup_name(struct super_block * sb,u64 nodeid,const struct qstr * name,struct fuse_entry_out * outarg,struct inode ** inode)562 int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name,
563 struct fuse_entry_out *outarg, struct inode **inode)
564 {
565 struct fuse_mount *fm = get_fuse_mount_super(sb);
566 FUSE_ARGS(args);
567 struct fuse_forget_link *forget;
568 u64 attr_version, evict_ctr;
569 int err;
570
571 *inode = NULL;
572 err = -ENAMETOOLONG;
573 if (name->len > fm->fc->name_max)
574 goto out;
575
576
577 forget = fuse_alloc_forget();
578 err = -ENOMEM;
579 if (!forget)
580 goto out;
581
582 attr_version = fuse_get_attr_version(fm->fc);
583 evict_ctr = fuse_get_evict_ctr(fm->fc);
584
585 fuse_lookup_init(&args, nodeid, name, outarg);
586 err = fuse_simple_request(fm, &args);
587 /* Zero nodeid is same as -ENOENT, but with valid timeout */
588 if (err || !outarg->nodeid)
589 goto out_put_forget;
590
591 err = -EIO;
592 if (fuse_invalid_attr(&outarg->attr))
593 goto out_put_forget;
594 if (outarg->nodeid == FUSE_ROOT_ID && outarg->generation != 0) {
595 pr_warn_once("root generation should be zero\n");
596 outarg->generation = 0;
597 }
598
599 *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
600 &outarg->attr, ATTR_TIMEOUT(outarg),
601 attr_version, evict_ctr);
602 err = -ENOMEM;
603 if (!*inode) {
604 fuse_chan_queue_forget(fm->fc->chan, forget, outarg->nodeid, 1);
605 goto out;
606 }
607 err = 0;
608
609 out_put_forget:
610 kfree(forget);
611 out:
612 return err;
613 }
614
fuse_lookup(struct inode * dir,struct dentry * entry,unsigned int flags)615 static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
616 unsigned int flags)
617 {
618 struct fuse_entry_out outarg;
619 struct fuse_conn *fc;
620 struct inode *inode;
621 struct dentry *newent;
622 int err, epoch;
623 bool outarg_valid = true;
624 bool locked;
625
626 if (fuse_is_bad(dir))
627 return ERR_PTR(-EIO);
628
629 fc = get_fuse_conn_super(dir->i_sb);
630 epoch = atomic_read(&fc->epoch);
631
632 locked = fuse_lock_inode(dir);
633 err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
634 &outarg, &inode);
635 fuse_unlock_inode(dir, locked);
636 if (err == -ENOENT) {
637 outarg_valid = false;
638 err = 0;
639 }
640 if (err)
641 goto out_err;
642
643 err = -EIO;
644 if (inode && get_node_id(inode) == FUSE_ROOT_ID)
645 goto out_iput;
646
647 newent = d_splice_alias(inode, entry);
648 err = PTR_ERR(newent);
649 if (IS_ERR(newent))
650 goto out_err;
651
652 entry = newent ? newent : entry;
653 fuse_dentry_set_epoch(entry, epoch);
654 if (outarg_valid)
655 fuse_change_entry_timeout(entry, &outarg);
656 else
657 fuse_invalidate_entry_cache(entry);
658
659 if (inode)
660 fuse_advise_use_readdirplus(dir);
661 return newent;
662
663 out_iput:
664 iput(inode);
665 out_err:
666 return ERR_PTR(err);
667 }
668
get_security_context(struct dentry * entry,umode_t mode,struct fuse_in_arg * ext)669 static int get_security_context(struct dentry *entry, umode_t mode,
670 struct fuse_in_arg *ext)
671 {
672 struct fuse_secctx *fctx;
673 struct fuse_secctx_header *header;
674 struct lsm_context lsmctx = { };
675 void *ptr;
676 u32 total_len = sizeof(*header);
677 int err, nr_ctx = 0;
678 const char *name = NULL;
679 size_t namesize;
680
681 err = security_dentry_init_security(entry, mode, &entry->d_name,
682 &name, &lsmctx);
683
684 /* If no LSM is supporting this security hook ignore error */
685 if (err && err != -EOPNOTSUPP)
686 goto out_err;
687
688 if (lsmctx.len) {
689 nr_ctx = 1;
690 namesize = strlen(name) + 1;
691 err = -EIO;
692 if (WARN_ON(namesize > XATTR_NAME_MAX + 1 ||
693 lsmctx.len > S32_MAX))
694 goto out_err;
695 total_len += FUSE_REC_ALIGN(sizeof(*fctx) + namesize +
696 lsmctx.len);
697 }
698
699 err = -ENOMEM;
700 header = ptr = kzalloc(total_len, GFP_KERNEL);
701 if (!ptr)
702 goto out_err;
703
704 header->nr_secctx = nr_ctx;
705 header->size = total_len;
706 ptr += sizeof(*header);
707 if (nr_ctx) {
708 fctx = ptr;
709 fctx->size = lsmctx.len;
710 ptr += sizeof(*fctx);
711
712 strscpy(ptr, name, namesize);
713 ptr += namesize;
714
715 memcpy(ptr, lsmctx.context, lsmctx.len);
716 }
717 ext->size = total_len;
718 ext->value = header;
719 err = 0;
720 out_err:
721 if (nr_ctx)
722 security_release_secctx(&lsmctx);
723 return err;
724 }
725
extend_arg(struct fuse_in_arg * buf,u32 bytes)726 static void *extend_arg(struct fuse_in_arg *buf, u32 bytes)
727 {
728 void *p;
729 u32 newlen = buf->size + bytes;
730
731 p = krealloc(buf->value, newlen, GFP_KERNEL);
732 if (!p) {
733 kfree(buf->value);
734 buf->size = 0;
735 buf->value = NULL;
736 return NULL;
737 }
738
739 memset(p + buf->size, 0, bytes);
740 buf->value = p;
741 buf->size = newlen;
742
743 return p + newlen - bytes;
744 }
745
fuse_ext_size(size_t size)746 static u32 fuse_ext_size(size_t size)
747 {
748 return FUSE_REC_ALIGN(sizeof(struct fuse_ext_header) + size);
749 }
750
751 /*
752 * This adds just a single supplementary group that matches the parent's group.
753 */
get_create_supp_group(const struct mnt_idmap * idmap,struct inode * dir,struct fuse_in_arg * ext)754 static int get_create_supp_group(const struct mnt_idmap *idmap,
755 struct inode *dir,
756 struct fuse_in_arg *ext)
757 {
758 struct fuse_conn *fc = get_fuse_conn(dir);
759 struct fuse_ext_header *xh;
760 struct fuse_supp_groups *sg;
761 kgid_t kgid = dir->i_gid;
762 vfsgid_t vfsgid = make_vfsgid(idmap, fc->user_ns, kgid);
763 gid_t parent_gid = from_kgid(fc->user_ns, kgid);
764
765 u32 sg_len = fuse_ext_size(sizeof(*sg) + sizeof(sg->groups[0]));
766
767 if (parent_gid == (gid_t) -1 || vfsgid_eq_kgid(vfsgid, current_fsgid()) ||
768 !vfsgid_in_group_p(vfsgid))
769 return 0;
770
771 xh = extend_arg(ext, sg_len);
772 if (!xh)
773 return -ENOMEM;
774
775 xh->size = sg_len;
776 xh->type = FUSE_EXT_GROUPS;
777
778 sg = (struct fuse_supp_groups *) &xh[1];
779 sg->nr_groups = 1;
780 sg->groups[0] = parent_gid;
781
782 return 0;
783 }
784
get_create_ext(const struct mnt_idmap * idmap,struct fuse_args * args,struct inode * dir,struct dentry * dentry,umode_t mode)785 static int get_create_ext(const struct mnt_idmap *idmap,
786 struct fuse_args *args,
787 struct inode *dir, struct dentry *dentry,
788 umode_t mode)
789 {
790 struct fuse_conn *fc = get_fuse_conn_super(dentry->d_sb);
791 struct fuse_in_arg ext = { .size = 0, .value = NULL };
792 int err = 0;
793
794 if (fc->init_security)
795 err = get_security_context(dentry, mode, &ext);
796 if (!err && fc->create_supp_group)
797 err = get_create_supp_group(idmap, dir, &ext);
798
799 if (!err && ext.size) {
800 WARN_ON(args->in_numargs >= ARRAY_SIZE(args->in_args));
801 args->is_ext = true;
802 args->ext_idx = args->in_numargs++;
803 args->in_args[args->ext_idx] = ext;
804 } else {
805 kfree(ext.value);
806 }
807
808 return err;
809 }
810
free_ext_value(struct fuse_args * args)811 static void free_ext_value(struct fuse_args *args)
812 {
813 if (args->is_ext)
814 kfree(args->in_args[args->ext_idx].value);
815 }
816
817 /*
818 * Atomic create+open operation
819 *
820 * If the filesystem doesn't support this, then fall back to separate
821 * 'mknod' + 'open' requests.
822 */
fuse_create_open(const struct mnt_idmap * idmap,struct inode * dir,struct dentry * entry,struct file * file,unsigned int flags,umode_t mode,u32 opcode)823 static int fuse_create_open(const struct mnt_idmap *idmap, struct inode *dir,
824 struct dentry *entry, struct file *file,
825 unsigned int flags, umode_t mode, u32 opcode)
826 {
827 struct inode *inode;
828 struct fuse_mount *fm = get_fuse_mount(dir);
829 FUSE_ARGS(args);
830 struct fuse_forget_link *forget;
831 struct fuse_create_in inarg;
832 struct fuse_open_out *outopenp;
833 struct fuse_entry_out outentry;
834 struct fuse_inode *fi;
835 struct fuse_file *ff;
836 int epoch, err;
837 bool trunc = flags & O_TRUNC;
838
839 /* Userspace expects S_IFREG in create mode */
840 BUG_ON((mode & S_IFMT) != S_IFREG);
841
842 epoch = atomic_read(&fm->fc->epoch);
843 forget = fuse_alloc_forget();
844 err = -ENOMEM;
845 if (!forget)
846 goto out_err;
847
848 ff = fuse_file_alloc(fm, true);
849 if (!ff)
850 goto out_put_forget_req;
851
852 if (!fm->fc->dont_mask)
853 mode &= ~current_umask();
854
855 flags &= ~O_NOCTTY;
856 memset(&inarg, 0, sizeof(inarg));
857 memset(&outentry, 0, sizeof(outentry));
858 inarg.flags = flags;
859 inarg.mode = mode;
860 inarg.umask = current_umask();
861
862 if (fm->fc->handle_killpriv_v2 && trunc &&
863 !(flags & O_EXCL) && !capable(CAP_FSETID)) {
864 inarg.open_flags |= FUSE_OPEN_KILL_SUIDGID;
865 }
866
867 args.opcode = opcode;
868 args.nodeid = get_node_id(dir);
869 args.in_numargs = 2;
870 args.in_args[0].size = sizeof(inarg);
871 args.in_args[0].value = &inarg;
872 args.in_args[1].size = entry->d_name.len + 1;
873 args.in_args[1].value = entry->d_name.name;
874 args.out_numargs = 2;
875 args.out_args[0].size = sizeof(outentry);
876 args.out_args[0].value = &outentry;
877 /* Store outarg for fuse_finish_open() */
878 outopenp = &ff->args->open_outarg;
879 args.out_args[1].size = sizeof(*outopenp);
880 args.out_args[1].value = outopenp;
881
882 err = get_create_ext(idmap, &args, dir, entry, mode);
883 if (err)
884 goto out_free_ff;
885
886 err = fuse_simple_idmap_request(idmap, fm, &args);
887 free_ext_value(&args);
888 if (err)
889 goto out_free_ff;
890
891 err = -EIO;
892 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid) ||
893 fuse_invalid_attr(&outentry.attr))
894 goto out_free_ff;
895
896 ff->fh = outopenp->fh;
897 ff->nodeid = outentry.nodeid;
898 ff->open_flags = outopenp->open_flags;
899 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
900 &outentry.attr, ATTR_TIMEOUT(&outentry), 0, 0);
901 if (!inode) {
902 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
903 fuse_sync_release(NULL, ff, flags);
904 fuse_chan_queue_forget(fm->fc->chan, forget, outentry.nodeid, 1);
905 err = -ENOMEM;
906 goto out_err;
907 }
908 kfree(forget);
909 d_instantiate(entry, inode);
910 fuse_dentry_set_epoch(entry, epoch);
911 fuse_change_entry_timeout(entry, &outentry);
912 fuse_dir_changed(dir);
913 err = generic_file_open(inode, file);
914 if (!err) {
915 file->private_data = ff;
916 err = finish_open(file, entry, fuse_finish_open);
917 }
918 if (err) {
919 fi = get_fuse_inode(inode);
920 fuse_sync_release(fi, ff, flags);
921 } else {
922 if (fm->fc->atomic_o_trunc && trunc)
923 truncate_pagecache(inode, 0);
924 else if (!(ff->open_flags & FOPEN_KEEP_CACHE))
925 invalidate_inode_pages2(inode->i_mapping);
926 }
927 return err;
928
929 out_free_ff:
930 fuse_file_free(ff);
931 out_put_forget_req:
932 kfree(forget);
933 out_err:
934 return err;
935 }
936
937 static int fuse_mknod(const struct mnt_idmap *, struct inode *, struct dentry *,
938 umode_t, dev_t);
fuse_atomic_open(struct inode * dir,struct dentry * entry,struct file * file,unsigned flags,umode_t mode)939 static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
940 struct file *file, unsigned flags,
941 umode_t mode)
942 {
943 int err;
944 const struct mnt_idmap *idmap = file_mnt_idmap(file);
945 struct fuse_conn *fc = get_fuse_conn(dir);
946
947 if (fuse_is_bad(dir))
948 return -EIO;
949
950 if (d_in_lookup(entry)) {
951 struct dentry *res = fuse_lookup(dir, entry, 0);
952 if (res || d_really_is_positive(entry))
953 return finish_no_open(file, res);
954 }
955
956 if (!(flags & O_CREAT))
957 return finish_no_open(file, NULL);
958
959 /* Only creates */
960 file->f_mode |= FMODE_CREATED;
961
962 if (fc->no_create)
963 goto mknod;
964
965 err = fuse_create_open(idmap, dir, entry, file, flags, mode, FUSE_CREATE);
966 if (err == -ENOSYS) {
967 fc->no_create = 1;
968 goto mknod;
969 } else if (err == -EEXIST)
970 fuse_invalidate_entry(entry);
971 return err;
972
973 mknod:
974 err = fuse_mknod(idmap, dir, entry, mode, 0);
975 if (err)
976 return err;
977 return finish_no_open(file, NULL);
978 }
979
980 /*
981 * Code shared between mknod, mkdir, symlink and link
982 */
create_new_entry(const struct mnt_idmap * idmap,struct fuse_mount * fm,struct fuse_args * args,struct inode * dir,struct dentry * entry,umode_t mode)983 static struct dentry *create_new_entry(const struct mnt_idmap *idmap, struct fuse_mount *fm,
984 struct fuse_args *args, struct inode *dir,
985 struct dentry *entry, umode_t mode)
986 {
987 struct fuse_entry_out outarg;
988 struct inode *inode;
989 struct dentry *d;
990 struct fuse_forget_link *forget;
991 int epoch, err;
992
993 if (fuse_is_bad(dir))
994 return ERR_PTR(-EIO);
995
996 epoch = atomic_read(&fm->fc->epoch);
997
998 forget = fuse_alloc_forget();
999 if (!forget)
1000 return ERR_PTR(-ENOMEM);
1001
1002 memset(&outarg, 0, sizeof(outarg));
1003 args->nodeid = get_node_id(dir);
1004 args->out_numargs = 1;
1005 args->out_args[0].size = sizeof(outarg);
1006 args->out_args[0].value = &outarg;
1007
1008 if (args->opcode != FUSE_LINK) {
1009 err = get_create_ext(idmap, args, dir, entry, mode);
1010 if (err)
1011 goto out_put_forget_req;
1012 }
1013
1014 err = fuse_simple_idmap_request(idmap, fm, args);
1015 free_ext_value(args);
1016 if (err)
1017 goto out_put_forget_req;
1018
1019 err = -EIO;
1020 if (invalid_nodeid(outarg.nodeid) || fuse_invalid_attr(&outarg.attr))
1021 goto out_put_forget_req;
1022
1023 if ((outarg.attr.mode ^ mode) & S_IFMT)
1024 goto out_put_forget_req;
1025
1026 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
1027 &outarg.attr, ATTR_TIMEOUT(&outarg), 0, 0);
1028 if (!inode) {
1029 fuse_chan_queue_forget(fm->fc->chan, forget, outarg.nodeid, 1);
1030 return ERR_PTR(-ENOMEM);
1031 }
1032 kfree(forget);
1033
1034 d_drop(entry);
1035 d = d_splice_alias(inode, entry);
1036 if (IS_ERR(d))
1037 return d;
1038
1039 if (d) {
1040 fuse_dentry_set_epoch(d, epoch);
1041 fuse_change_entry_timeout(d, &outarg);
1042 } else {
1043 fuse_dentry_set_epoch(entry, epoch);
1044 fuse_change_entry_timeout(entry, &outarg);
1045 }
1046 fuse_dir_changed(dir);
1047 return d;
1048
1049 out_put_forget_req:
1050 if (err == -EEXIST)
1051 fuse_invalidate_entry(entry);
1052 kfree(forget);
1053 return ERR_PTR(err);
1054 }
1055
create_new_nondir(const struct mnt_idmap * idmap,struct fuse_mount * fm,struct fuse_args * args,struct inode * dir,struct dentry * entry,umode_t mode)1056 static int create_new_nondir(const struct mnt_idmap *idmap, struct fuse_mount *fm,
1057 struct fuse_args *args, struct inode *dir,
1058 struct dentry *entry, umode_t mode)
1059 {
1060 /*
1061 * Note that when creating anything other than a directory we
1062 * can be sure create_new_entry() will NOT return an alternate
1063 * dentry as d_splice_alias() only returns an alternate dentry
1064 * for directories. So we don't need to check for that case
1065 * when passing back the result.
1066 */
1067 WARN_ON_ONCE(S_ISDIR(mode));
1068
1069 return PTR_ERR(create_new_entry(idmap, fm, args, dir, entry, mode));
1070 }
1071
fuse_mknod(const struct mnt_idmap * idmap,struct inode * dir,struct dentry * entry,umode_t mode,dev_t rdev)1072 static int fuse_mknod(const struct mnt_idmap *idmap, struct inode *dir,
1073 struct dentry *entry, umode_t mode, dev_t rdev)
1074 {
1075 struct fuse_mknod_in inarg;
1076 struct fuse_mount *fm = get_fuse_mount(dir);
1077 FUSE_ARGS(args);
1078
1079 if (!fm->fc->dont_mask)
1080 mode &= ~current_umask();
1081
1082 memset(&inarg, 0, sizeof(inarg));
1083 inarg.mode = mode;
1084 inarg.rdev = new_encode_dev(rdev);
1085 inarg.umask = current_umask();
1086 args.opcode = FUSE_MKNOD;
1087 args.in_numargs = 2;
1088 args.in_args[0].size = sizeof(inarg);
1089 args.in_args[0].value = &inarg;
1090 args.in_args[1].size = entry->d_name.len + 1;
1091 args.in_args[1].value = entry->d_name.name;
1092 return create_new_nondir(idmap, fm, &args, dir, entry, mode);
1093 }
1094
fuse_create(const struct mnt_idmap * idmap,struct inode * dir,struct dentry * entry,umode_t mode)1095 static int fuse_create(const struct mnt_idmap *idmap, struct inode *dir,
1096 struct dentry *entry, umode_t mode)
1097 {
1098 return fuse_mknod(idmap, dir, entry, mode, 0);
1099 }
1100
fuse_tmpfile(const struct mnt_idmap * idmap,struct inode * dir,struct file * file,umode_t mode)1101 static int fuse_tmpfile(const struct mnt_idmap *idmap, struct inode *dir,
1102 struct file *file, umode_t mode)
1103 {
1104 struct fuse_conn *fc = get_fuse_conn(dir);
1105 int err;
1106
1107 if (fc->no_tmpfile)
1108 return -EOPNOTSUPP;
1109
1110 err = fuse_create_open(idmap, dir, file->f_path.dentry, file,
1111 file->f_flags, mode, FUSE_TMPFILE);
1112 if (err == -ENOSYS) {
1113 fc->no_tmpfile = 1;
1114 err = -EOPNOTSUPP;
1115 }
1116 return err;
1117 }
1118
fuse_mkdir(const struct mnt_idmap * idmap,struct inode * dir,struct dentry * entry,umode_t mode)1119 static struct dentry *fuse_mkdir(const struct mnt_idmap *idmap, struct inode *dir,
1120 struct dentry *entry, umode_t mode)
1121 {
1122 struct fuse_mkdir_in inarg;
1123 struct fuse_mount *fm = get_fuse_mount(dir);
1124 FUSE_ARGS(args);
1125
1126 if (!fm->fc->dont_mask)
1127 mode &= ~current_umask();
1128
1129 /*
1130 * vfs_mkdir() now passes S_IFDIR in @mode, but @mode is forwarded
1131 * verbatim to the userspace server which has only ever been given the
1132 * permission bits. Strip the type bit until the protocol is known to
1133 * cope with it.
1134 */
1135 mode &= ~S_IFDIR;
1136
1137 memset(&inarg, 0, sizeof(inarg));
1138 inarg.mode = mode;
1139 inarg.umask = current_umask();
1140 args.opcode = FUSE_MKDIR;
1141 args.in_numargs = 2;
1142 args.in_args[0].size = sizeof(inarg);
1143 args.in_args[0].value = &inarg;
1144 args.in_args[1].size = entry->d_name.len + 1;
1145 args.in_args[1].value = entry->d_name.name;
1146 return create_new_entry(idmap, fm, &args, dir, entry, S_IFDIR);
1147 }
1148
fuse_symlink(const struct mnt_idmap * idmap,struct inode * dir,struct dentry * entry,const char * link)1149 static int fuse_symlink(const struct mnt_idmap *idmap, struct inode *dir,
1150 struct dentry *entry, const char *link)
1151 {
1152 struct fuse_mount *fm = get_fuse_mount(dir);
1153 unsigned len = strlen(link) + 1;
1154 FUSE_ARGS(args);
1155
1156 args.opcode = FUSE_SYMLINK;
1157 args.in_numargs = 3;
1158 fuse_set_zero_arg0(&args);
1159 args.in_args[1].size = entry->d_name.len + 1;
1160 args.in_args[1].value = entry->d_name.name;
1161 args.in_args[2].size = len;
1162 args.in_args[2].value = link;
1163 return create_new_nondir(idmap, fm, &args, dir, entry, S_IFLNK);
1164 }
1165
fuse_flush_time_update(struct inode * inode)1166 void fuse_flush_time_update(struct inode *inode)
1167 {
1168 int err = sync_inode_metadata(inode, 1);
1169
1170 mapping_set_error(inode->i_mapping, err);
1171 }
1172
fuse_update_ctime_in_cache(struct inode * inode)1173 static void fuse_update_ctime_in_cache(struct inode *inode)
1174 {
1175 if (!IS_NOCMTIME(inode)) {
1176 inode_set_ctime_current(inode);
1177 mark_inode_dirty_sync(inode);
1178 fuse_flush_time_update(inode);
1179 }
1180 }
1181
fuse_update_ctime(struct inode * inode)1182 void fuse_update_ctime(struct inode *inode)
1183 {
1184 fuse_invalidate_attr_mask(inode, STATX_CTIME);
1185 fuse_update_ctime_in_cache(inode);
1186 }
1187
fuse_entry_unlinked(struct dentry * entry)1188 static void fuse_entry_unlinked(struct dentry *entry)
1189 {
1190 struct inode *inode = d_inode(entry);
1191 struct fuse_conn *fc = get_fuse_conn(inode);
1192 struct fuse_inode *fi = get_fuse_inode(inode);
1193
1194 spin_lock(&fi->lock);
1195 fi->attr_version = atomic64_inc_return(&fc->attr_version);
1196 /*
1197 * If i_nlink == 0 then unlink doesn't make sense, yet this can
1198 * happen if userspace filesystem is careless. It would be
1199 * difficult to enforce correct nlink usage so just ignore this
1200 * condition here
1201 */
1202 if (S_ISDIR(inode->i_mode))
1203 clear_nlink(inode);
1204 else if (inode->i_nlink > 0)
1205 drop_nlink(inode);
1206 spin_unlock(&fi->lock);
1207 fuse_invalidate_entry_cache(entry);
1208 fuse_update_ctime(inode);
1209 }
1210
fuse_unlink(struct inode * dir,struct dentry * entry)1211 static int fuse_unlink(struct inode *dir, struct dentry *entry)
1212 {
1213 int err;
1214 struct fuse_mount *fm = get_fuse_mount(dir);
1215 FUSE_ARGS(args);
1216
1217 if (fuse_is_bad(dir))
1218 return -EIO;
1219
1220 args.opcode = FUSE_UNLINK;
1221 args.nodeid = get_node_id(dir);
1222 args.in_numargs = 2;
1223 fuse_set_zero_arg0(&args);
1224 args.in_args[1].size = entry->d_name.len + 1;
1225 args.in_args[1].value = entry->d_name.name;
1226 err = fuse_simple_request(fm, &args);
1227 if (!err) {
1228 fuse_dir_changed(dir);
1229 fuse_entry_unlinked(entry);
1230 } else if (err == -EINTR || err == -ENOENT)
1231 fuse_invalidate_entry(entry);
1232 return err;
1233 }
1234
fuse_rmdir(struct inode * dir,struct dentry * entry)1235 static int fuse_rmdir(struct inode *dir, struct dentry *entry)
1236 {
1237 int err;
1238 struct fuse_mount *fm = get_fuse_mount(dir);
1239 FUSE_ARGS(args);
1240
1241 if (fuse_is_bad(dir))
1242 return -EIO;
1243
1244 args.opcode = FUSE_RMDIR;
1245 args.nodeid = get_node_id(dir);
1246 args.in_numargs = 2;
1247 fuse_set_zero_arg0(&args);
1248 args.in_args[1].size = entry->d_name.len + 1;
1249 args.in_args[1].value = entry->d_name.name;
1250 err = fuse_simple_request(fm, &args);
1251 if (!err) {
1252 fuse_dir_changed(dir);
1253 fuse_entry_unlinked(entry);
1254 } else if (err == -EINTR || err == -ENOENT)
1255 fuse_invalidate_entry(entry);
1256 return err;
1257 }
1258
fuse_rename_common(const struct mnt_idmap * idmap,struct inode * olddir,struct dentry * oldent,struct inode * newdir,struct dentry * newent,unsigned int flags,int opcode,size_t argsize)1259 static int fuse_rename_common(const struct mnt_idmap *idmap, struct inode *olddir,
1260 struct dentry *oldent, struct inode *newdir,
1261 struct dentry *newent, unsigned int flags,
1262 int opcode, size_t argsize)
1263 {
1264 int err;
1265 struct fuse_rename2_in inarg;
1266 struct fuse_mount *fm = get_fuse_mount(olddir);
1267 FUSE_ARGS(args);
1268
1269 memset(&inarg, 0, argsize);
1270 inarg.newdir = get_node_id(newdir);
1271 inarg.flags = flags;
1272 args.opcode = opcode;
1273 args.nodeid = get_node_id(olddir);
1274 args.in_numargs = 3;
1275 args.in_args[0].size = argsize;
1276 args.in_args[0].value = &inarg;
1277 args.in_args[1].size = oldent->d_name.len + 1;
1278 args.in_args[1].value = oldent->d_name.name;
1279 args.in_args[2].size = newent->d_name.len + 1;
1280 args.in_args[2].value = newent->d_name.name;
1281 err = fuse_simple_idmap_request(idmap, fm, &args);
1282 if (!err) {
1283 /* ctime changes */
1284 fuse_update_ctime(d_inode(oldent));
1285
1286 if (flags & RENAME_EXCHANGE)
1287 fuse_update_ctime(d_inode(newent));
1288
1289 fuse_dir_changed(olddir);
1290 if (olddir != newdir)
1291 fuse_dir_changed(newdir);
1292
1293 /* newent will end up negative */
1294 if (!(flags & RENAME_EXCHANGE) && d_really_is_positive(newent))
1295 fuse_entry_unlinked(newent);
1296 } else if (err == -EINTR || err == -ENOENT) {
1297 /* If request was interrupted, DEITY only knows if the
1298 rename actually took place. If the invalidation
1299 fails (e.g. some process has CWD under the renamed
1300 directory), then there can be inconsistency between
1301 the dcache and the real filesystem. Tough luck. */
1302 fuse_invalidate_entry(oldent);
1303 if (d_really_is_positive(newent))
1304 fuse_invalidate_entry(newent);
1305 }
1306
1307 return err;
1308 }
1309
fuse_rename2(const struct mnt_idmap * idmap,struct inode * olddir,struct dentry * oldent,struct inode * newdir,struct dentry * newent,unsigned int flags)1310 static int fuse_rename2(const struct mnt_idmap *idmap, struct inode *olddir,
1311 struct dentry *oldent, struct inode *newdir,
1312 struct dentry *newent, unsigned int flags)
1313 {
1314 struct fuse_conn *fc = get_fuse_conn(olddir);
1315 int err;
1316
1317 if (fuse_is_bad(olddir))
1318 return -EIO;
1319
1320 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
1321 return -EINVAL;
1322
1323 if (flags) {
1324 if (fc->no_rename2 || fc->minor < 23)
1325 return -EINVAL;
1326
1327 err = fuse_rename_common((flags & RENAME_WHITEOUT) ? idmap : &invalid_mnt_idmap,
1328 olddir, oldent, newdir, newent, flags,
1329 FUSE_RENAME2,
1330 sizeof(struct fuse_rename2_in));
1331 if (err == -ENOSYS) {
1332 fc->no_rename2 = 1;
1333 err = -EINVAL;
1334 }
1335 } else {
1336 err = fuse_rename_common(&invalid_mnt_idmap, olddir, oldent, newdir, newent, 0,
1337 FUSE_RENAME,
1338 sizeof(struct fuse_rename_in));
1339 }
1340
1341 return err;
1342 }
1343
fuse_link(struct dentry * entry,struct inode * newdir,struct dentry * newent)1344 static int fuse_link(struct dentry *entry, struct inode *newdir,
1345 struct dentry *newent)
1346 {
1347 int err;
1348 struct fuse_link_in inarg;
1349 struct inode *inode = d_inode(entry);
1350 struct fuse_mount *fm = get_fuse_mount(inode);
1351 FUSE_ARGS(args);
1352
1353 if (fm->fc->no_link)
1354 goto out;
1355
1356 memset(&inarg, 0, sizeof(inarg));
1357 inarg.oldnodeid = get_node_id(inode);
1358 args.opcode = FUSE_LINK;
1359 args.in_numargs = 2;
1360 args.in_args[0].size = sizeof(inarg);
1361 args.in_args[0].value = &inarg;
1362 args.in_args[1].size = newent->d_name.len + 1;
1363 args.in_args[1].value = newent->d_name.name;
1364 err = create_new_nondir(&invalid_mnt_idmap, fm, &args, newdir, newent, inode->i_mode);
1365 if (!err)
1366 fuse_update_ctime_in_cache(inode);
1367 else if (err == -EINTR)
1368 fuse_invalidate_attr(inode);
1369
1370 if (err == -ENOSYS)
1371 fm->fc->no_link = 1;
1372 out:
1373 if (fm->fc->no_link)
1374 return -EPERM;
1375
1376 return err;
1377 }
1378
fuse_fillattr(const struct mnt_idmap * idmap,struct inode * inode,struct fuse_attr * attr,struct kstat * stat)1379 static void fuse_fillattr(const struct mnt_idmap *idmap, struct inode *inode,
1380 struct fuse_attr *attr, struct kstat *stat)
1381 {
1382 unsigned int blkbits;
1383 struct fuse_conn *fc = get_fuse_conn(inode);
1384 vfsuid_t vfsuid = make_vfsuid(idmap, fc->user_ns,
1385 make_kuid(fc->user_ns, attr->uid));
1386 vfsgid_t vfsgid = make_vfsgid(idmap, fc->user_ns,
1387 make_kgid(fc->user_ns, attr->gid));
1388
1389 stat->dev = inode->i_sb->s_dev;
1390 stat->ino = attr->ino;
1391 stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
1392 stat->nlink = attr->nlink;
1393 stat->uid = vfsuid_into_kuid(vfsuid);
1394 stat->gid = vfsgid_into_kgid(vfsgid);
1395 stat->rdev = inode->i_rdev;
1396 stat->atime.tv_sec = attr->atime;
1397 stat->atime.tv_nsec = attr->atimensec;
1398 stat->mtime.tv_sec = attr->mtime;
1399 stat->mtime.tv_nsec = attr->mtimensec;
1400 stat->ctime.tv_sec = attr->ctime;
1401 stat->ctime.tv_nsec = attr->ctimensec;
1402 stat->size = attr->size;
1403 stat->blocks = attr->blocks;
1404
1405 if (attr->blksize != 0)
1406 blkbits = ilog2(attr->blksize);
1407 else
1408 blkbits = inode->i_sb->s_blocksize_bits;
1409
1410 stat->blksize = 1 << blkbits;
1411 }
1412
fuse_statx_to_attr(struct fuse_statx * sx,struct fuse_attr * attr)1413 static void fuse_statx_to_attr(struct fuse_statx *sx, struct fuse_attr *attr)
1414 {
1415 memset(attr, 0, sizeof(*attr));
1416 attr->ino = sx->ino;
1417 attr->size = sx->size;
1418 attr->blocks = sx->blocks;
1419 attr->atime = sx->atime.tv_sec;
1420 attr->mtime = sx->mtime.tv_sec;
1421 attr->ctime = sx->ctime.tv_sec;
1422 attr->atimensec = sx->atime.tv_nsec;
1423 attr->mtimensec = sx->mtime.tv_nsec;
1424 attr->ctimensec = sx->ctime.tv_nsec;
1425 attr->mode = sx->mode;
1426 attr->nlink = sx->nlink;
1427 attr->uid = sx->uid;
1428 attr->gid = sx->gid;
1429 attr->rdev = new_encode_dev(MKDEV(sx->rdev_major, sx->rdev_minor));
1430 attr->blksize = sx->blksize;
1431 }
1432
fuse_do_statx(const struct mnt_idmap * idmap,struct inode * inode,struct file * file,struct kstat * stat)1433 static int fuse_do_statx(const struct mnt_idmap *idmap, struct inode *inode,
1434 struct file *file, struct kstat *stat)
1435 {
1436 int err;
1437 struct fuse_attr attr;
1438 struct fuse_statx *sx;
1439 struct fuse_statx_in inarg;
1440 struct fuse_statx_out outarg;
1441 struct fuse_mount *fm = get_fuse_mount(inode);
1442 u64 attr_version = fuse_get_attr_version(fm->fc);
1443 FUSE_ARGS(args);
1444
1445 memset(&inarg, 0, sizeof(inarg));
1446 memset(&outarg, 0, sizeof(outarg));
1447 /* Directories have separate file-handle space */
1448 if (file && S_ISREG(inode->i_mode)) {
1449 struct fuse_file *ff = file->private_data;
1450
1451 inarg.getattr_flags |= FUSE_GETATTR_FH;
1452 inarg.fh = ff->fh;
1453 }
1454 /* For now leave sync hints as the default, request all stats. */
1455 inarg.sx_flags = 0;
1456 inarg.sx_mask = STATX_BASIC_STATS | STATX_BTIME;
1457 args.opcode = FUSE_STATX;
1458 args.nodeid = get_node_id(inode);
1459 args.in_numargs = 1;
1460 args.in_args[0].size = sizeof(inarg);
1461 args.in_args[0].value = &inarg;
1462 args.out_numargs = 1;
1463 args.out_args[0].size = sizeof(outarg);
1464 args.out_args[0].value = &outarg;
1465 err = fuse_simple_request(fm, &args);
1466 if (err)
1467 return err;
1468
1469 sx = &outarg.stat;
1470 if (((sx->mask & STATX_SIZE) && !fuse_valid_size(sx->size)) ||
1471 ((sx->mask & STATX_TYPE) && (!fuse_valid_type(sx->mode) ||
1472 inode_wrong_type(inode, sx->mode)))) {
1473 fuse_make_bad(inode);
1474 return -EIO;
1475 }
1476
1477 fuse_statx_to_attr(&outarg.stat, &attr);
1478 if ((sx->mask & STATX_BASIC_STATS) == STATX_BASIC_STATS) {
1479 fuse_change_attributes(inode, &attr, &outarg.stat,
1480 ATTR_TIMEOUT(&outarg), attr_version);
1481 }
1482
1483 if (stat) {
1484 stat->result_mask = sx->mask & (STATX_BASIC_STATS | STATX_BTIME);
1485 stat->btime.tv_sec = sx->btime.tv_sec;
1486 stat->btime.tv_nsec = min_t(u32, sx->btime.tv_nsec, NSEC_PER_SEC - 1);
1487 fuse_fillattr(idmap, inode, &attr, stat);
1488 stat->result_mask |= STATX_TYPE;
1489 }
1490
1491 return 0;
1492 }
1493
fuse_do_getattr(const struct mnt_idmap * idmap,struct inode * inode,struct kstat * stat,struct file * file)1494 static int fuse_do_getattr(const struct mnt_idmap *idmap, struct inode *inode,
1495 struct kstat *stat, struct file *file)
1496 {
1497 int err;
1498 struct fuse_getattr_in inarg;
1499 struct fuse_attr_out outarg;
1500 struct fuse_mount *fm = get_fuse_mount(inode);
1501 FUSE_ARGS(args);
1502 u64 attr_version;
1503
1504 attr_version = fuse_get_attr_version(fm->fc);
1505
1506 memset(&inarg, 0, sizeof(inarg));
1507 memset(&outarg, 0, sizeof(outarg));
1508 /* Directories have separate file-handle space */
1509 if (file && S_ISREG(inode->i_mode)) {
1510 struct fuse_file *ff = file->private_data;
1511
1512 inarg.getattr_flags |= FUSE_GETATTR_FH;
1513 inarg.fh = ff->fh;
1514 }
1515 args.opcode = FUSE_GETATTR;
1516 args.nodeid = get_node_id(inode);
1517 args.in_numargs = 1;
1518 args.in_args[0].size = sizeof(inarg);
1519 args.in_args[0].value = &inarg;
1520 args.out_numargs = 1;
1521 args.out_args[0].size = sizeof(outarg);
1522 args.out_args[0].value = &outarg;
1523 err = fuse_simple_request(fm, &args);
1524 if (!err) {
1525 if (fuse_invalid_attr(&outarg.attr) ||
1526 inode_wrong_type(inode, outarg.attr.mode)) {
1527 fuse_make_bad(inode);
1528 err = -EIO;
1529 } else {
1530 fuse_change_attributes(inode, &outarg.attr, NULL,
1531 ATTR_TIMEOUT(&outarg),
1532 attr_version);
1533 if (stat)
1534 fuse_fillattr(idmap, inode, &outarg.attr, stat);
1535 }
1536 }
1537 return err;
1538 }
1539
fuse_update_get_attr(const struct mnt_idmap * idmap,struct inode * inode,struct file * file,struct kstat * stat,u32 request_mask,unsigned int flags)1540 static int fuse_update_get_attr(const struct mnt_idmap *idmap, struct inode *inode,
1541 struct file *file, struct kstat *stat,
1542 u32 request_mask, unsigned int flags)
1543 {
1544 struct fuse_inode *fi = get_fuse_inode(inode);
1545 struct fuse_conn *fc = get_fuse_conn(inode);
1546 int err = 0;
1547 bool sync;
1548 u32 inval_mask = READ_ONCE(fi->inval_mask);
1549 u32 cache_mask = fuse_get_cache_mask(inode);
1550
1551
1552 /* FUSE only supports basic stats and possibly btime */
1553 request_mask &= STATX_BASIC_STATS | STATX_BTIME;
1554 retry:
1555 if (fc->no_statx)
1556 request_mask &= STATX_BASIC_STATS;
1557
1558 if (!request_mask)
1559 sync = false;
1560 else if (flags & AT_STATX_FORCE_SYNC)
1561 sync = true;
1562 else if (flags & AT_STATX_DONT_SYNC)
1563 sync = false;
1564 else if (request_mask & inval_mask & ~cache_mask)
1565 sync = true;
1566 else
1567 sync = time_before64(fi->i_time, get_jiffies_64());
1568
1569 if (sync) {
1570 forget_all_cached_acls(inode);
1571 /* Try statx if BTIME is requested */
1572 if (!fc->no_statx && (request_mask & ~STATX_BASIC_STATS)) {
1573 err = fuse_do_statx(idmap, inode, file, stat);
1574 if (err == -ENOSYS) {
1575 fc->no_statx = 1;
1576 err = 0;
1577 goto retry;
1578 }
1579 } else {
1580 err = fuse_do_getattr(idmap, inode, stat, file);
1581 }
1582 } else if (stat) {
1583 generic_fillattr(idmap, request_mask, inode, stat);
1584 stat->mode = fi->orig_i_mode;
1585 stat->ino = fi->orig_ino;
1586 stat->blksize = 1 << fi->cached_i_blkbits;
1587 if (test_bit(FUSE_I_BTIME, &fi->state)) {
1588 stat->btime = fi->i_btime;
1589 stat->result_mask |= STATX_BTIME;
1590 }
1591 }
1592
1593 return err;
1594 }
1595
fuse_update_attributes(struct inode * inode,struct file * file,u32 mask)1596 int fuse_update_attributes(struct inode *inode, struct file *file, u32 mask)
1597 {
1598 return fuse_update_get_attr(&nop_mnt_idmap, inode, file, NULL, mask, 0);
1599 }
1600
fuse_reverse_inval_entry(struct fuse_conn * fc,u64 parent_nodeid,u64 child_nodeid,struct qstr * name,u32 flags)1601 int fuse_reverse_inval_entry(struct fuse_conn *fc, u64 parent_nodeid,
1602 u64 child_nodeid, struct qstr *name, u32 flags)
1603 {
1604 int err = -ENOTDIR;
1605 struct inode *parent;
1606 struct dentry *dir;
1607 struct dentry *entry;
1608
1609 parent = fuse_ilookup(fc, parent_nodeid, NULL);
1610 if (!parent)
1611 return -ENOENT;
1612
1613 inode_lock_nested(parent, I_MUTEX_PARENT);
1614 if (!S_ISDIR(parent->i_mode))
1615 goto unlock;
1616
1617 err = -ENOENT;
1618 dir = d_find_alias(parent);
1619 if (!dir)
1620 goto unlock;
1621
1622 name->hash = full_name_hash(dir, name->name, name->len);
1623 entry = d_lookup(dir, name);
1624 dput(dir);
1625 if (!entry)
1626 goto unlock;
1627
1628 fuse_dir_changed(parent);
1629 if (!(flags & FUSE_EXPIRE_ONLY))
1630 d_invalidate(entry);
1631 fuse_invalidate_entry_cache(entry);
1632
1633 if (child_nodeid != 0 && d_really_is_positive(entry)) {
1634 inode_lock(d_inode(entry));
1635 if (get_node_id(d_inode(entry)) != child_nodeid) {
1636 err = -ENOENT;
1637 goto badentry;
1638 }
1639 if (d_mountpoint(entry)) {
1640 err = -EBUSY;
1641 goto badentry;
1642 }
1643 if (d_is_dir(entry)) {
1644 shrink_dcache_parent(entry);
1645 if (!simple_empty(entry)) {
1646 err = -ENOTEMPTY;
1647 goto badentry;
1648 }
1649 d_inode(entry)->i_flags |= S_DEAD;
1650 }
1651 dont_mount(entry);
1652 clear_nlink(d_inode(entry));
1653 err = 0;
1654 badentry:
1655 inode_unlock(d_inode(entry));
1656 if (!err)
1657 d_delete(entry);
1658 } else {
1659 err = 0;
1660 }
1661 dput(entry);
1662
1663 unlock:
1664 inode_unlock(parent);
1665 iput(parent);
1666 return err;
1667 }
1668
fuse_permissible_uidgid(struct fuse_conn * fc)1669 static inline bool fuse_permissible_uidgid(struct fuse_conn *fc)
1670 {
1671 const struct cred *cred = current_cred();
1672
1673 return (uid_eq(cred->euid, fc->user_id) &&
1674 uid_eq(cred->suid, fc->user_id) &&
1675 uid_eq(cred->uid, fc->user_id) &&
1676 gid_eq(cred->egid, fc->group_id) &&
1677 gid_eq(cred->sgid, fc->group_id) &&
1678 gid_eq(cred->gid, fc->group_id));
1679 }
1680
1681 /*
1682 * Calling into a user-controlled filesystem gives the filesystem
1683 * daemon ptrace-like capabilities over the current process. This
1684 * means, that the filesystem daemon is able to record the exact
1685 * filesystem operations performed, and can also control the behavior
1686 * of the requester process in otherwise impossible ways. For example
1687 * it can delay the operation for arbitrary length of time allowing
1688 * DoS against the requester.
1689 *
1690 * For this reason only those processes can call into the filesystem,
1691 * for which the owner of the mount has ptrace privilege. This
1692 * excludes processes started by other users, suid or sgid processes.
1693 */
fuse_allow_current_process(struct fuse_conn * fc)1694 bool fuse_allow_current_process(struct fuse_conn *fc)
1695 {
1696 bool allow;
1697
1698 if (fc->allow_other)
1699 allow = current_in_userns(fc->user_ns);
1700 else
1701 allow = fuse_permissible_uidgid(fc);
1702
1703 if (!allow && allow_sys_admin_access && capable(CAP_SYS_ADMIN))
1704 allow = true;
1705
1706 return allow;
1707 }
1708
fuse_access(struct inode * inode,int mask)1709 static int fuse_access(struct inode *inode, int mask)
1710 {
1711 struct fuse_mount *fm = get_fuse_mount(inode);
1712 FUSE_ARGS(args);
1713 struct fuse_access_in inarg;
1714 int err;
1715
1716 BUG_ON(mask & MAY_NOT_BLOCK);
1717
1718 /*
1719 * We should not send FUSE_ACCESS to the userspace
1720 * when idmapped mounts are enabled as for this case
1721 * we have fc->default_permissions = 1 and access
1722 * permission checks are done on the kernel side.
1723 */
1724 WARN_ON_ONCE(!(fm->sb->s_iflags & SB_I_NOIDMAP));
1725
1726 if (fm->fc->no_access)
1727 return 0;
1728
1729 memset(&inarg, 0, sizeof(inarg));
1730 inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
1731 args.opcode = FUSE_ACCESS;
1732 args.nodeid = get_node_id(inode);
1733 args.in_numargs = 1;
1734 args.in_args[0].size = sizeof(inarg);
1735 args.in_args[0].value = &inarg;
1736 err = fuse_simple_request(fm, &args);
1737 if (err == -ENOSYS) {
1738 fm->fc->no_access = 1;
1739 err = 0;
1740 }
1741 return err;
1742 }
1743
fuse_perm_getattr(struct inode * inode,int mask)1744 static int fuse_perm_getattr(struct inode *inode, int mask)
1745 {
1746 if (mask & MAY_NOT_BLOCK)
1747 return -ECHILD;
1748
1749 forget_all_cached_acls(inode);
1750 return fuse_do_getattr(&nop_mnt_idmap, inode, NULL, NULL);
1751 }
1752
1753 /*
1754 * Check permission. The two basic access models of FUSE are:
1755 *
1756 * 1) Local access checking ('default_permissions' mount option) based
1757 * on file mode. This is the plain old disk filesystem permission
1758 * model.
1759 *
1760 * 2) "Remote" access checking, where server is responsible for
1761 * checking permission in each inode operation. An exception to this
1762 * is if ->permission() was invoked from sys_access() in which case an
1763 * access request is sent. Execute permission is still checked
1764 * locally based on file mode.
1765 */
fuse_permission(const struct mnt_idmap * idmap,struct inode * inode,int mask)1766 static int fuse_permission(const struct mnt_idmap *idmap,
1767 struct inode *inode, int mask)
1768 {
1769 struct fuse_conn *fc = get_fuse_conn(inode);
1770 bool refreshed = false;
1771 int err = 0;
1772
1773 if (fuse_is_bad(inode))
1774 return -EIO;
1775
1776 if (!fuse_allow_current_process(fc))
1777 return -EACCES;
1778
1779 /*
1780 * If attributes are needed, refresh them before proceeding
1781 */
1782 if (fc->default_permissions ||
1783 ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
1784 struct fuse_inode *fi = get_fuse_inode(inode);
1785 u32 perm_mask = STATX_MODE | STATX_UID | STATX_GID;
1786
1787 if (perm_mask & READ_ONCE(fi->inval_mask) ||
1788 time_before64(fi->i_time, get_jiffies_64())) {
1789 refreshed = true;
1790
1791 err = fuse_perm_getattr(inode, mask);
1792 if (err)
1793 return err;
1794 }
1795 }
1796
1797 if (fc->default_permissions) {
1798 err = generic_permission(idmap, inode, mask);
1799
1800 /* If permission is denied, try to refresh file
1801 attributes. This is also needed, because the root
1802 node will at first have no permissions */
1803 if (err == -EACCES && !refreshed) {
1804 err = fuse_perm_getattr(inode, mask);
1805 if (!err)
1806 err = generic_permission(idmap,
1807 inode, mask);
1808 }
1809
1810 /* Note: the opposite of the above test does not
1811 exist. So if permissions are revoked this won't be
1812 noticed immediately, only after the attribute
1813 timeout has expired */
1814 } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
1815 err = fuse_access(inode, mask);
1816 } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1817 if (!(inode->i_mode & S_IXUGO)) {
1818 if (refreshed)
1819 return -EACCES;
1820
1821 err = fuse_perm_getattr(inode, mask);
1822 if (!err && !(inode->i_mode & S_IXUGO))
1823 return -EACCES;
1824 }
1825 }
1826 return err;
1827 }
1828
fuse_readlink_folio(struct inode * inode,struct folio * folio)1829 static int fuse_readlink_folio(struct inode *inode, struct folio *folio)
1830 {
1831 struct fuse_mount *fm = get_fuse_mount(inode);
1832 struct fuse_folio_desc desc = { .length = folio_size(folio) - 1 };
1833 struct fuse_args_pages ap = {
1834 .num_folios = 1,
1835 .folios = &folio,
1836 .descs = &desc,
1837 };
1838 char *link;
1839 ssize_t res;
1840
1841 ap.args.opcode = FUSE_READLINK;
1842 ap.args.nodeid = get_node_id(inode);
1843 ap.args.out_pages = true;
1844 ap.args.out_argvar = true;
1845 ap.args.page_zeroing = true;
1846 ap.args.out_numargs = 1;
1847 ap.args.out_args[0].size = desc.length;
1848 res = fuse_simple_request(fm, &ap.args);
1849
1850 fuse_invalidate_atime(inode);
1851
1852 if (res < 0)
1853 return res;
1854
1855 if (WARN_ON(res >= PAGE_SIZE))
1856 return -EIO;
1857
1858 link = folio_address(folio);
1859 link[res] = '\0';
1860
1861 return 0;
1862 }
1863
fuse_get_link(struct dentry * dentry,struct inode * inode,struct delayed_call * callback)1864 static const char *fuse_get_link(struct dentry *dentry, struct inode *inode,
1865 struct delayed_call *callback)
1866 {
1867 struct fuse_conn *fc = get_fuse_conn(inode);
1868 struct folio *folio;
1869 int err;
1870
1871 err = -EIO;
1872 if (fuse_is_bad(inode))
1873 goto out_err;
1874
1875 if (fc->cache_symlinks)
1876 return page_get_link_raw(dentry, inode, callback);
1877
1878 err = -ECHILD;
1879 if (!dentry)
1880 goto out_err;
1881
1882 folio = folio_alloc(GFP_KERNEL, 0);
1883 err = -ENOMEM;
1884 if (!folio)
1885 goto out_err;
1886
1887 err = fuse_readlink_folio(inode, folio);
1888 if (err) {
1889 folio_put(folio);
1890 goto out_err;
1891 }
1892
1893 set_delayed_call(callback, page_put_link, folio);
1894
1895 return folio_address(folio);
1896
1897 out_err:
1898 return ERR_PTR(err);
1899 }
1900
fuse_dir_open(struct inode * inode,struct file * file)1901 static int fuse_dir_open(struct inode *inode, struct file *file)
1902 {
1903 struct fuse_mount *fm = get_fuse_mount(inode);
1904 int err;
1905
1906 if (fuse_is_bad(inode))
1907 return -EIO;
1908
1909 err = generic_file_open(inode, file);
1910 if (err)
1911 return err;
1912
1913 err = fuse_do_open(fm, get_node_id(inode), file, true);
1914 if (!err) {
1915 struct fuse_file *ff = file->private_data;
1916
1917 /*
1918 * Keep handling FOPEN_STREAM and FOPEN_NONSEEKABLE for
1919 * directories for backward compatibility, though it's unlikely
1920 * to be useful.
1921 */
1922 if (ff->open_flags & (FOPEN_STREAM | FOPEN_NONSEEKABLE))
1923 nonseekable_open(inode, file);
1924 if (!(ff->open_flags & FOPEN_KEEP_CACHE))
1925 invalidate_inode_pages2(inode->i_mapping);
1926 }
1927
1928 return err;
1929 }
1930
fuse_dir_release(struct inode * inode,struct file * file)1931 static int fuse_dir_release(struct inode *inode, struct file *file)
1932 {
1933 fuse_release_common(file, true);
1934
1935 return 0;
1936 }
1937
fuse_dir_fsync(struct file * file,loff_t start,loff_t end,int datasync)1938 static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1939 int datasync)
1940 {
1941 struct inode *inode = file->f_mapping->host;
1942 struct fuse_conn *fc = get_fuse_conn(inode);
1943 int err;
1944
1945 if (fuse_is_bad(inode))
1946 return -EIO;
1947
1948 if (fc->no_fsyncdir)
1949 return 0;
1950
1951 inode_lock(inode);
1952 err = fuse_fsync_common(file, start, end, datasync, FUSE_FSYNCDIR);
1953 if (err == -ENOSYS) {
1954 fc->no_fsyncdir = 1;
1955 err = 0;
1956 }
1957 inode_unlock(inode);
1958
1959 return err;
1960 }
1961
fuse_dir_ioctl(struct file * file,unsigned int cmd,unsigned long arg)1962 static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1963 unsigned long arg)
1964 {
1965 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1966
1967 /* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1968 if (fc->minor < 18)
1969 return -ENOTTY;
1970
1971 return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1972 }
1973
fuse_dir_compat_ioctl(struct file * file,unsigned int cmd,unsigned long arg)1974 static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1975 unsigned long arg)
1976 {
1977 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1978
1979 if (fc->minor < 18)
1980 return -ENOTTY;
1981
1982 return fuse_ioctl_common(file, cmd, arg,
1983 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1984 }
1985
update_mtime(unsigned ivalid,bool trust_local_mtime)1986 static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
1987 {
1988 /* Always update if mtime is explicitly set */
1989 if (ivalid & ATTR_MTIME_SET)
1990 return true;
1991
1992 /* Or if kernel i_mtime is the official one */
1993 if (trust_local_mtime)
1994 return true;
1995
1996 /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1997 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1998 return false;
1999
2000 /* In all other cases update */
2001 return true;
2002 }
2003
iattr_to_fattr(const struct mnt_idmap * idmap,struct fuse_conn * fc,struct iattr * iattr,struct fuse_setattr_in * arg,bool trust_local_cmtime)2004 static void iattr_to_fattr(const struct mnt_idmap *idmap, struct fuse_conn *fc,
2005 struct iattr *iattr, struct fuse_setattr_in *arg,
2006 bool trust_local_cmtime)
2007 {
2008 unsigned ivalid = iattr->ia_valid;
2009
2010 if (ivalid & ATTR_MODE)
2011 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
2012
2013 if (ivalid & ATTR_UID) {
2014 kuid_t fsuid = from_vfsuid(idmap, fc->user_ns, iattr->ia_vfsuid);
2015
2016 arg->valid |= FATTR_UID;
2017 arg->uid = from_kuid(fc->user_ns, fsuid);
2018 }
2019
2020 if (ivalid & ATTR_GID) {
2021 kgid_t fsgid = from_vfsgid(idmap, fc->user_ns, iattr->ia_vfsgid);
2022
2023 arg->valid |= FATTR_GID;
2024 arg->gid = from_kgid(fc->user_ns, fsgid);
2025 }
2026
2027 if (ivalid & ATTR_SIZE)
2028 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
2029 if (ivalid & ATTR_ATIME) {
2030 arg->valid |= FATTR_ATIME;
2031 arg->atime = iattr->ia_atime.tv_sec;
2032 arg->atimensec = iattr->ia_atime.tv_nsec;
2033 if (!(ivalid & ATTR_ATIME_SET))
2034 arg->valid |= FATTR_ATIME_NOW;
2035 }
2036 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
2037 arg->valid |= FATTR_MTIME;
2038 arg->mtime = iattr->ia_mtime.tv_sec;
2039 arg->mtimensec = iattr->ia_mtime.tv_nsec;
2040 if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
2041 arg->valid |= FATTR_MTIME_NOW;
2042 }
2043 if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
2044 arg->valid |= FATTR_CTIME;
2045 arg->ctime = iattr->ia_ctime.tv_sec;
2046 arg->ctimensec = iattr->ia_ctime.tv_nsec;
2047 }
2048 }
2049
2050 /*
2051 * Prevent concurrent writepages on inode
2052 *
2053 * This is done by adding a negative bias to the inode write counter
2054 * and waiting for all pending writes to finish.
2055 */
fuse_set_nowrite(struct inode * inode)2056 void fuse_set_nowrite(struct inode *inode)
2057 {
2058 struct fuse_inode *fi = get_fuse_inode(inode);
2059
2060 BUG_ON(!inode_is_locked(inode));
2061
2062 spin_lock(&fi->lock);
2063 BUG_ON(fi->writectr < 0);
2064 fi->writectr += FUSE_NOWRITE;
2065 spin_unlock(&fi->lock);
2066 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
2067 }
2068
2069 /*
2070 * Allow writepages on inode
2071 *
2072 * Remove the bias from the writecounter and send any queued
2073 * writepages.
2074 */
__fuse_release_nowrite(struct inode * inode)2075 static void __fuse_release_nowrite(struct inode *inode)
2076 {
2077 struct fuse_inode *fi = get_fuse_inode(inode);
2078
2079 BUG_ON(fi->writectr != FUSE_NOWRITE);
2080 fi->writectr = 0;
2081 fuse_flush_writepages(inode);
2082 }
2083
fuse_release_nowrite(struct inode * inode)2084 void fuse_release_nowrite(struct inode *inode)
2085 {
2086 struct fuse_inode *fi = get_fuse_inode(inode);
2087
2088 spin_lock(&fi->lock);
2089 __fuse_release_nowrite(inode);
2090 spin_unlock(&fi->lock);
2091 }
2092
fuse_setattr_fill(struct fuse_conn * fc,struct fuse_args * args,struct inode * inode,struct fuse_setattr_in * inarg_p,struct fuse_attr_out * outarg_p)2093 static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
2094 struct inode *inode,
2095 struct fuse_setattr_in *inarg_p,
2096 struct fuse_attr_out *outarg_p)
2097 {
2098 args->opcode = FUSE_SETATTR;
2099 args->nodeid = get_node_id(inode);
2100 args->in_numargs = 1;
2101 args->in_args[0].size = sizeof(*inarg_p);
2102 args->in_args[0].value = inarg_p;
2103 args->out_numargs = 1;
2104 args->out_args[0].size = sizeof(*outarg_p);
2105 args->out_args[0].value = outarg_p;
2106 }
2107
2108 /*
2109 * Flush inode->i_mtime to the server
2110 */
fuse_flush_times(struct inode * inode,struct fuse_file * ff)2111 int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
2112 {
2113 struct fuse_mount *fm = get_fuse_mount(inode);
2114 FUSE_ARGS(args);
2115 struct fuse_setattr_in inarg;
2116 struct fuse_attr_out outarg;
2117
2118 memset(&inarg, 0, sizeof(inarg));
2119 memset(&outarg, 0, sizeof(outarg));
2120
2121 inarg.valid = FATTR_MTIME;
2122 inarg.mtime = inode_get_mtime_sec(inode);
2123 inarg.mtimensec = inode_get_mtime_nsec(inode);
2124 if (fm->fc->minor >= 23) {
2125 inarg.valid |= FATTR_CTIME;
2126 inarg.ctime = inode_get_ctime_sec(inode);
2127 inarg.ctimensec = inode_get_ctime_nsec(inode);
2128 }
2129 if (ff) {
2130 inarg.valid |= FATTR_FH;
2131 inarg.fh = ff->fh;
2132 }
2133 fuse_setattr_fill(fm->fc, &args, inode, &inarg, &outarg);
2134
2135 return fuse_simple_request(fm, &args);
2136 }
2137
2138 /*
2139 * Set attributes, and at the same time refresh them.
2140 *
2141 * Truncation is slightly complicated, because the 'truncate' request
2142 * may fail, in which case we don't want to touch the mapping.
2143 * vmtruncate() doesn't allow for this case, so do the rlimit checking
2144 * and the actual truncation by hand.
2145 */
fuse_do_setattr(const struct mnt_idmap * idmap,struct dentry * dentry,struct iattr * attr,struct file * file)2146 int fuse_do_setattr(const struct mnt_idmap *idmap, struct dentry *dentry,
2147 struct iattr *attr, struct file *file)
2148 {
2149 struct inode *inode = d_inode(dentry);
2150 struct fuse_mount *fm = get_fuse_mount(inode);
2151 struct fuse_conn *fc = fm->fc;
2152 struct fuse_inode *fi = get_fuse_inode(inode);
2153 struct address_space *mapping = inode->i_mapping;
2154 FUSE_ARGS(args);
2155 struct fuse_setattr_in inarg;
2156 struct fuse_attr_out outarg;
2157 bool is_truncate = false;
2158 bool is_wb = fc->writeback_cache && S_ISREG(inode->i_mode);
2159 loff_t oldsize;
2160 int err;
2161 bool trust_local_cmtime = is_wb;
2162 bool fault_blocked = false;
2163 u64 attr_version;
2164
2165 if (!fc->default_permissions)
2166 attr->ia_valid |= ATTR_FORCE;
2167
2168 err = setattr_prepare(idmap, dentry, attr);
2169 if (err)
2170 return err;
2171
2172 if (attr->ia_valid & ATTR_SIZE) {
2173 if (WARN_ON(!S_ISREG(inode->i_mode)))
2174 return -EIO;
2175 is_truncate = true;
2176 }
2177
2178 if (FUSE_IS_DAX(inode) && is_truncate) {
2179 filemap_invalidate_lock(mapping);
2180 fault_blocked = true;
2181 err = fuse_dax_break_layouts(inode, 0, -1);
2182 if (err)
2183 goto unlock;
2184 }
2185
2186 if (attr->ia_valid & ATTR_OPEN) {
2187 /* This is coming from open(..., ... | O_TRUNC); */
2188 WARN_ON(!(attr->ia_valid & ATTR_SIZE));
2189 WARN_ON(attr->ia_size != 0);
2190 if (fc->atomic_o_trunc) {
2191 /*
2192 * No need to send request to userspace, since actual
2193 * truncation has already been done by OPEN. But still
2194 * need to truncate page cache.
2195 */
2196 i_size_write(inode, 0);
2197 truncate_pagecache(inode, 0);
2198 goto out;
2199 }
2200 file = NULL;
2201 }
2202
2203 /* Flush dirty data/metadata before non-truncate SETATTR */
2204 if (is_wb &&
2205 attr->ia_valid &
2206 (ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_MTIME_SET |
2207 ATTR_TIMES_SET)) {
2208 err = write_inode_now(inode, true);
2209 if (err)
2210 goto unlock;
2211
2212 fuse_set_nowrite(inode);
2213 fuse_release_nowrite(inode);
2214 }
2215
2216 if (is_truncate) {
2217 fuse_set_nowrite(inode);
2218 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
2219 if (trust_local_cmtime && attr->ia_size != inode->i_size)
2220 attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
2221 }
2222
2223 memset(&inarg, 0, sizeof(inarg));
2224 memset(&outarg, 0, sizeof(outarg));
2225 iattr_to_fattr(idmap, fc, attr, &inarg, trust_local_cmtime);
2226 if (file) {
2227 struct fuse_file *ff = file->private_data;
2228 inarg.valid |= FATTR_FH;
2229 inarg.fh = ff->fh;
2230 }
2231
2232 /* Kill suid/sgid for non-directory chown unconditionally */
2233 if (fc->handle_killpriv_v2 && !S_ISDIR(inode->i_mode) &&
2234 attr->ia_valid & (ATTR_UID | ATTR_GID))
2235 inarg.valid |= FATTR_KILL_SUIDGID;
2236
2237 if (attr->ia_valid & ATTR_SIZE) {
2238 /* For mandatory locking in truncate */
2239 inarg.valid |= FATTR_LOCKOWNER;
2240 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
2241
2242 /* Kill suid/sgid for truncate only if no CAP_FSETID */
2243 if (fc->handle_killpriv_v2 && !capable(CAP_FSETID))
2244 inarg.valid |= FATTR_KILL_SUIDGID;
2245 }
2246
2247 attr_version = fuse_get_attr_version(fm->fc);
2248 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
2249 err = fuse_simple_request(fm, &args);
2250 if (err) {
2251 if (err == -EINTR)
2252 fuse_invalidate_attr(inode);
2253 goto error;
2254 }
2255
2256 if (fuse_invalid_attr(&outarg.attr) ||
2257 inode_wrong_type(inode, outarg.attr.mode)) {
2258 fuse_make_bad(inode);
2259 err = -EIO;
2260 goto error;
2261 }
2262
2263 spin_lock(&fi->lock);
2264 /* the kernel maintains i_mtime locally */
2265 if (trust_local_cmtime) {
2266 if (attr->ia_valid & ATTR_MTIME)
2267 inode_set_mtime_to_ts(inode, attr->ia_mtime);
2268 if (attr->ia_valid & ATTR_CTIME)
2269 inode_set_ctime_to_ts(inode, attr->ia_ctime);
2270 /* FIXME: clear I_DIRTY_SYNC? */
2271 }
2272
2273 if (fi->attr_version > attr_version) {
2274 /*
2275 * Apply attributes, for example for fsnotify_change(), but set
2276 * attribute timeout to zero.
2277 */
2278 outarg.attr_valid = outarg.attr_valid_nsec = 0;
2279 }
2280
2281 fuse_change_attributes_common(inode, &outarg.attr, NULL,
2282 ATTR_TIMEOUT(&outarg),
2283 fuse_get_cache_mask(inode), 0);
2284 oldsize = inode->i_size;
2285 /* see the comment in fuse_change_attributes() */
2286 if (!is_wb || is_truncate)
2287 i_size_write(inode, outarg.attr.size);
2288
2289 if (is_truncate) {
2290 /* NOTE: this may release/reacquire fi->lock */
2291 __fuse_release_nowrite(inode);
2292 }
2293 spin_unlock(&fi->lock);
2294
2295 /*
2296 * Only call invalidate_inode_pages2() after removing
2297 * FUSE_NOWRITE, otherwise fuse_launder_folio() would deadlock.
2298 */
2299 if ((is_truncate || !is_wb) &&
2300 S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
2301 if (outarg.attr.size > oldsize)
2302 truncate_pagecache_range(inode, oldsize,
2303 outarg.attr.size - 1);
2304 truncate_pagecache(inode, outarg.attr.size);
2305 invalidate_inode_pages2(mapping);
2306 }
2307
2308 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
2309 out:
2310 if (fault_blocked)
2311 filemap_invalidate_unlock(mapping);
2312
2313 return 0;
2314
2315 error:
2316 if (is_truncate)
2317 fuse_release_nowrite(inode);
2318
2319 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
2320
2321 unlock:
2322 if (fault_blocked)
2323 filemap_invalidate_unlock(mapping);
2324 return err;
2325 }
2326
fuse_setattr(const struct mnt_idmap * idmap,struct dentry * entry,struct iattr * attr)2327 static int fuse_setattr(const struct mnt_idmap *idmap, struct dentry *entry,
2328 struct iattr *attr)
2329 {
2330 struct inode *inode = d_inode(entry);
2331 struct fuse_conn *fc = get_fuse_conn(inode);
2332 struct file *file = (attr->ia_valid & ATTR_FILE) ? attr->ia_file : NULL;
2333 int ret;
2334
2335 if (fuse_is_bad(inode))
2336 return -EIO;
2337
2338 if (!fuse_allow_current_process(get_fuse_conn(inode)))
2339 return -EACCES;
2340
2341 if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
2342 attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
2343 ATTR_MODE);
2344
2345 /*
2346 * The only sane way to reliably kill suid/sgid is to do it in
2347 * the userspace filesystem
2348 *
2349 * This should be done on write(), truncate() and chown().
2350 */
2351 if (!fc->handle_killpriv && !fc->handle_killpriv_v2) {
2352 /*
2353 * ia_mode calculation may have used stale i_mode.
2354 * Refresh and recalculate.
2355 */
2356 ret = fuse_do_getattr(idmap, inode, NULL, file);
2357 if (ret)
2358 return ret;
2359
2360 attr->ia_mode = inode->i_mode;
2361 if (inode->i_mode & S_ISUID) {
2362 attr->ia_valid |= ATTR_MODE;
2363 attr->ia_mode &= ~S_ISUID;
2364 }
2365 if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
2366 attr->ia_valid |= ATTR_MODE;
2367 attr->ia_mode &= ~S_ISGID;
2368 }
2369 }
2370 }
2371 if (!attr->ia_valid)
2372 return 0;
2373
2374 ret = fuse_do_setattr(idmap, entry, attr, file);
2375 if (!ret) {
2376 /*
2377 * If filesystem supports acls it may have updated acl xattrs in
2378 * the filesystem, so forget cached acls for the inode.
2379 */
2380 if (fc->posix_acl)
2381 forget_all_cached_acls(inode);
2382
2383 /* Directory mode changed, may need to revalidate access */
2384 if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE))
2385 fuse_invalidate_entry_cache(entry);
2386 }
2387 return ret;
2388 }
2389
fuse_getattr(const struct mnt_idmap * idmap,const struct path * path,struct kstat * stat,u32 request_mask,unsigned int flags)2390 static int fuse_getattr(const struct mnt_idmap *idmap,
2391 const struct path *path, struct kstat *stat,
2392 u32 request_mask, unsigned int flags)
2393 {
2394 struct inode *inode = d_inode(path->dentry);
2395 struct fuse_conn *fc = get_fuse_conn(inode);
2396
2397 if (fuse_is_bad(inode))
2398 return -EIO;
2399
2400 if (!fuse_allow_current_process(fc)) {
2401 if (!request_mask) {
2402 /*
2403 * If user explicitly requested *nothing* then don't
2404 * error out, but return st_dev only.
2405 */
2406 stat->result_mask = 0;
2407 stat->dev = inode->i_sb->s_dev;
2408 return 0;
2409 }
2410 return -EACCES;
2411 }
2412
2413 return fuse_update_get_attr(idmap, inode, NULL, stat, request_mask, flags);
2414 }
2415
2416 static const struct inode_operations fuse_dir_inode_operations = {
2417 .lookup = fuse_lookup,
2418 .mkdir = fuse_mkdir,
2419 .symlink = fuse_symlink,
2420 .unlink = fuse_unlink,
2421 .rmdir = fuse_rmdir,
2422 .rename = fuse_rename2,
2423 .link = fuse_link,
2424 .setattr = fuse_setattr,
2425 .create = fuse_create,
2426 .atomic_open = fuse_atomic_open,
2427 .tmpfile = fuse_tmpfile,
2428 .mknod = fuse_mknod,
2429 .permission = fuse_permission,
2430 .getattr = fuse_getattr,
2431 .listxattr = fuse_listxattr,
2432 .get_inode_acl = fuse_get_inode_acl,
2433 .get_acl = fuse_get_acl,
2434 .set_acl = fuse_set_acl,
2435 .fileattr_get = fuse_fileattr_get,
2436 .fileattr_set = fuse_fileattr_set,
2437 };
2438
2439 static const struct file_operations fuse_dir_operations = {
2440 .llseek = generic_file_llseek,
2441 .read = generic_read_dir,
2442 .iterate_shared = fuse_readdir,
2443 .open = fuse_dir_open,
2444 .release = fuse_dir_release,
2445 .fsync = fuse_dir_fsync,
2446 .unlocked_ioctl = fuse_dir_ioctl,
2447 .compat_ioctl = fuse_dir_compat_ioctl,
2448 };
2449
2450 static const struct inode_operations fuse_common_inode_operations = {
2451 .setattr = fuse_setattr,
2452 .permission = fuse_permission,
2453 .getattr = fuse_getattr,
2454 .listxattr = fuse_listxattr,
2455 .get_inode_acl = fuse_get_inode_acl,
2456 .get_acl = fuse_get_acl,
2457 .set_acl = fuse_set_acl,
2458 .fileattr_get = fuse_fileattr_get,
2459 .fileattr_set = fuse_fileattr_set,
2460 };
2461
2462 static const struct inode_operations fuse_symlink_inode_operations = {
2463 .setattr = fuse_setattr,
2464 .get_link = fuse_get_link,
2465 .getattr = fuse_getattr,
2466 .listxattr = fuse_listxattr,
2467 };
2468
fuse_init_common(struct inode * inode)2469 void fuse_init_common(struct inode *inode)
2470 {
2471 inode->i_op = &fuse_common_inode_operations;
2472 }
2473
fuse_init_dir(struct inode * inode)2474 void fuse_init_dir(struct inode *inode)
2475 {
2476 struct fuse_inode *fi = get_fuse_inode(inode);
2477
2478 inode->i_op = &fuse_dir_inode_operations;
2479 inode->i_fop = &fuse_dir_operations;
2480
2481 spin_lock_init(&fi->rdc.lock);
2482 fi->rdc.cached = false;
2483 fi->rdc.size = 0;
2484 fi->rdc.pos = 0;
2485 fi->rdc.version = 0;
2486 }
2487
fuse_symlink_read_folio(struct file * null,struct folio * folio)2488 static int fuse_symlink_read_folio(struct file *null, struct folio *folio)
2489 {
2490 int err = fuse_readlink_folio(folio->mapping->host, folio);
2491
2492 if (!err)
2493 folio_mark_uptodate(folio);
2494
2495 folio_unlock(folio);
2496
2497 return err;
2498 }
2499
2500 static const struct address_space_operations fuse_symlink_aops = {
2501 .read_folio = fuse_symlink_read_folio,
2502 };
2503
fuse_init_symlink(struct inode * inode)2504 void fuse_init_symlink(struct inode *inode)
2505 {
2506 inode->i_op = &fuse_symlink_inode_operations;
2507 inode->i_data.a_ops = &fuse_symlink_aops;
2508 inode_nohighmem(inode);
2509 }
2510