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