blob: e9c24452498570722d5999ef92b3244aa2d71dec [file] [log] [blame]
Miklos Szeredie5e55582005-09-09 13:10:28 -07001/*
2 FUSE: Filesystem in Userspace
Miklos Szeredi1729a162008-11-26 12:03:54 +01003 Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu>
Miklos Szeredie5e55582005-09-09 13:10:28 -07004
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>
Max Reitzbf109c62020-04-21 14:47:15 +020013#include <linux/fs_context.h>
Miklos Szeredie5e55582005-09-09 13:10:28 -070014#include <linux/sched.h>
15#include <linux/namei.h>
Miklos Szeredi07e77dc2010-12-07 20:16:56 +010016#include <linux/slab.h>
Seth Forshee703c7362016-08-29 08:46:36 -050017#include <linux/xattr.h>
Miklos Szeredi261aaba72018-10-01 10:07:05 +020018#include <linux/iversion.h>
Seth Forshee60bcc882016-08-29 08:46:37 -050019#include <linux/posix_acl.h>
Miklos Szeredie5e55582005-09-09 13:10:28 -070020
Feng Shuo4582a4a2013-01-15 11:23:28 +080021static void fuse_advise_use_readdirplus(struct inode *dir)
22{
23 struct fuse_inode *fi = get_fuse_inode(dir);
24
25 set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state);
26}
27
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -070028#if BITS_PER_LONG >= 64
29static inline void __fuse_dentry_settime(struct dentry *entry, u64 time)
30{
31 entry->d_fsdata = (void *) time;
32}
33
34static inline u64 fuse_dentry_time(const struct dentry *entry)
35{
36 return (u64)entry->d_fsdata;
37}
38
39#else
Miklos Szeredif75fdf22016-10-01 07:32:32 +020040union fuse_dentry {
41 u64 time;
42 struct rcu_head rcu;
43};
44
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -070045static inline void __fuse_dentry_settime(struct dentry *dentry, u64 time)
46{
47 ((union fuse_dentry *) dentry->d_fsdata)->time = time;
48}
49
50static inline u64 fuse_dentry_time(const struct dentry *entry)
51{
52 return ((union fuse_dentry *) entry->d_fsdata)->time;
53}
54#endif
55
Miklos Szeredi8fab0102018-08-15 17:42:34 +020056static void fuse_dentry_settime(struct dentry *dentry, u64 time)
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070057{
Miklos Szeredi8fab0102018-08-15 17:42:34 +020058 struct fuse_conn *fc = get_fuse_conn_super(dentry->d_sb);
59 bool delete = !time && fc->delete_stale;
60 /*
61 * Mess with DCACHE_OP_DELETE because dput() will be faster without it.
62 * Don't care about races, either way it's just an optimization
63 */
64 if ((!delete && (dentry->d_flags & DCACHE_OP_DELETE)) ||
65 (delete && !(dentry->d_flags & DCACHE_OP_DELETE))) {
66 spin_lock(&dentry->d_lock);
67 if (!delete)
68 dentry->d_flags &= ~DCACHE_OP_DELETE;
69 else
70 dentry->d_flags |= DCACHE_OP_DELETE;
71 spin_unlock(&dentry->d_lock);
72 }
73
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -070074 __fuse_dentry_settime(dentry, time);
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070075}
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070076
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080077/*
78 * FUSE caches dentries and attributes with separate timeout. The
79 * time in jiffies until the dentry/attributes are valid is stored in
Miklos Szeredif75fdf22016-10-01 07:32:32 +020080 * dentry->d_fsdata and fuse_inode->i_time respectively.
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080081 */
82
83/*
84 * Calculate the time in jiffies until a dentry/attributes are valid
85 */
Miklos Szeredibcb6f6d2016-10-01 07:32:32 +020086static u64 time_to_jiffies(u64 sec, u32 nsec)
Miklos Szeredie5e55582005-09-09 13:10:28 -070087{
Miklos Szeredi685d16d2006-07-30 03:04:08 -070088 if (sec || nsec) {
Miklos Szeredibcb6f6d2016-10-01 07:32:32 +020089 struct timespec64 ts = {
90 sec,
David Sheets21067522017-01-13 15:58:30 +000091 min_t(u32, nsec, NSEC_PER_SEC - 1)
Miklos Szeredibcb6f6d2016-10-01 07:32:32 +020092 };
93
94 return get_jiffies_64() + timespec64_to_jiffies(&ts);
Miklos Szeredi685d16d2006-07-30 03:04:08 -070095 } else
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070096 return 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -070097}
98
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080099/*
100 * Set dentry and possibly attribute timeouts from the lookup/mk*
101 * replies
102 */
Miklos Szeredid123d8e2018-09-28 16:43:23 +0200103void fuse_change_entry_timeout(struct dentry *entry, struct fuse_entry_out *o)
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800104{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -0700105 fuse_dentry_settime(entry,
106 time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700107}
108
109static u64 attr_timeout(struct fuse_attr_out *o)
110{
111 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
112}
113
Miklos Szeredid123d8e2018-09-28 16:43:23 +0200114u64 entry_attr_timeout(struct fuse_entry_out *o)
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700115{
116 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800117}
118
Miklos Szeredi2f1e8192018-10-15 15:43:06 +0200119static void fuse_invalidate_attr_mask(struct inode *inode, u32 mask)
120{
121 set_mask_bits(&get_fuse_inode(inode)->inval_mask, 0, mask);
122}
123
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800124/*
125 * Mark the attributes as stale, so that at the next call to
126 * ->getattr() they will be fetched from userspace
127 */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800128void fuse_invalidate_attr(struct inode *inode)
129{
Miklos Szeredi2f1e8192018-10-15 15:43:06 +0200130 fuse_invalidate_attr_mask(inode, STATX_BASIC_STATS);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800131}
132
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200133static void fuse_dir_changed(struct inode *dir)
134{
135 fuse_invalidate_attr(dir);
136 inode_maybe_inc_iversion(dir, false);
137}
138
Andrew Gallagher451418f2013-11-05 03:55:43 -0800139/**
140 * Mark the attributes as stale due to an atime change. Avoid the invalidate if
141 * atime is not used.
142 */
143void fuse_invalidate_atime(struct inode *inode)
144{
145 if (!IS_RDONLY(inode))
Miklos Szeredi2f1e8192018-10-15 15:43:06 +0200146 fuse_invalidate_attr_mask(inode, STATX_ATIME);
Andrew Gallagher451418f2013-11-05 03:55:43 -0800147}
148
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800149/*
150 * Just mark the entry as stale, so that a next attempt to look it up
151 * will result in a new lookup call to userspace
152 *
153 * This is called when a dentry is about to become negative and the
154 * timeout is unknown (unlink, rmdir, rename and in some cases
155 * lookup)
156 */
Miklos Szeredidbd561d2008-07-25 01:49:00 -0700157void fuse_invalidate_entry_cache(struct dentry *entry)
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800158{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -0700159 fuse_dentry_settime(entry, 0);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800160}
161
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800162/*
163 * Same as fuse_invalidate_entry_cache(), but also try to remove the
164 * dentry from the hash
165 */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800166static void fuse_invalidate_entry(struct dentry *entry)
167{
168 d_invalidate(entry);
169 fuse_invalidate_entry_cache(entry);
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800170}
171
Miklos Szeredi70781872014-12-12 09:49:05 +0100172static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_args *args,
Al Viro13983d02016-07-20 22:34:44 -0400173 u64 nodeid, const struct qstr *name,
Miklos Szeredie5e55582005-09-09 13:10:28 -0700174 struct fuse_entry_out *outarg)
175{
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700176 memset(outarg, 0, sizeof(struct fuse_entry_out));
Miklos Szeredid5b48542019-09-10 15:04:08 +0200177 args->opcode = FUSE_LOOKUP;
178 args->nodeid = nodeid;
179 args->in_numargs = 1;
180 args->in_args[0].size = name->len + 1;
181 args->in_args[0].value = name->name;
182 args->out_numargs = 1;
183 args->out_args[0].size = sizeof(struct fuse_entry_out);
184 args->out_args[0].value = outarg;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700185}
186
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800187/*
188 * Check whether the dentry is still valid
189 *
190 * If the entry validity timeout has expired and the dentry is
191 * positive, try to redo the lookup. If the lookup results in a
192 * different inode, then let the VFS invalidate the dentry and redo
193 * the lookup once more. If the lookup results in the same inode,
194 * then refresh the attributes, timeouts and mark the dentry valid.
195 */
Al Viro0b728e12012-06-10 16:03:43 -0400196static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700197{
Nick Piggin34286d62011-01-07 17:49:57 +1100198 struct inode *inode;
Miklos Szeredi28420da2013-06-03 14:40:22 +0200199 struct dentry *parent;
Max Reitzfcee2162020-05-06 17:44:12 +0200200 struct fuse_mount *fm;
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200201 struct fuse_inode *fi;
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200202 int ret;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800203
David Howells2b0143b2015-03-17 22:25:59 +0000204 inode = d_inode_rcu(entry);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800205 if (inode && is_bad_inode(inode))
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200206 goto invalid;
Anand Avati154210c2014-06-26 20:21:57 -0400207 else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
208 (flags & LOOKUP_REVAL)) {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700209 struct fuse_entry_out outarg;
Miklos Szeredi70781872014-12-12 09:49:05 +0100210 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100211 struct fuse_forget_link *forget;
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700212 u64 attr_version;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800213
Miklos Szeredi50322fe2006-02-28 16:59:03 -0800214 /* For negative dentries, always do a fresh lookup */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800215 if (!inode)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200216 goto invalid;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800217
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200218 ret = -ECHILD;
Al Viro0b728e12012-06-10 16:03:43 -0400219 if (flags & LOOKUP_RCU)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200220 goto out;
Miklos Szeredie7c0a162011-03-21 13:58:06 +0100221
Max Reitzfcee2162020-05-06 17:44:12 +0200222 fm = get_fuse_mount(inode);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700223
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100224 forget = fuse_alloc_forget();
Miklos Szeredi70781872014-12-12 09:49:05 +0100225 ret = -ENOMEM;
226 if (!forget)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200227 goto out;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800228
Max Reitzfcee2162020-05-06 17:44:12 +0200229 attr_version = fuse_get_attr_version(fm->fc);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700230
Miklos Szeredie956edd2006-10-17 00:10:12 -0700231 parent = dget_parent(entry);
Max Reitzfcee2162020-05-06 17:44:12 +0200232 fuse_lookup_init(fm->fc, &args, get_node_id(d_inode(parent)),
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700233 &entry->d_name, &outarg);
Max Reitzfcee2162020-05-06 17:44:12 +0200234 ret = fuse_simple_request(fm, &args);
Miklos Szeredie956edd2006-10-17 00:10:12 -0700235 dput(parent);
Miklos Szeredi50322fe2006-02-28 16:59:03 -0800236 /* Zero nodeid is same as -ENOENT */
Miklos Szeredi70781872014-12-12 09:49:05 +0100237 if (!ret && !outarg.nodeid)
238 ret = -ENOENT;
239 if (!ret) {
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200240 fi = get_fuse_inode(inode);
Max Reitzbf109c62020-04-21 14:47:15 +0200241 if (outarg.nodeid != get_node_id(inode) ||
242 (bool) IS_AUTOMOUNT(inode) != (bool) (outarg.attr.flags & FUSE_ATTR_SUBMOUNT)) {
Max Reitzfcee2162020-05-06 17:44:12 +0200243 fuse_queue_forget(fm->fc, forget,
244 outarg.nodeid, 1);
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200245 goto invalid;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700246 }
Kirill Tkhaic9d8f5f2018-11-09 13:33:27 +0300247 spin_lock(&fi->lock);
Miklos Szeredi1729a162008-11-26 12:03:54 +0100248 fi->nlookup++;
Kirill Tkhaic9d8f5f2018-11-09 13:33:27 +0300249 spin_unlock(&fi->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700250 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100251 kfree(forget);
Miklos Szeredi70781872014-12-12 09:49:05 +0100252 if (ret == -ENOMEM)
253 goto out;
Miklos Szeredieb59bd12019-11-12 11:49:04 +0100254 if (ret || fuse_invalid_attr(&outarg.attr) ||
255 (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200256 goto invalid;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700257
Seth Forshee60bcc882016-08-29 08:46:37 -0500258 forget_all_cached_acls(inode);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700259 fuse_change_attributes(inode, &outarg.attr,
260 entry_attr_timeout(&outarg),
261 attr_version);
262 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi28420da2013-06-03 14:40:22 +0200263 } else if (inode) {
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200264 fi = get_fuse_inode(inode);
265 if (flags & LOOKUP_RCU) {
266 if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state))
267 return -ECHILD;
268 } else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) {
Miklos Szeredi28420da2013-06-03 14:40:22 +0200269 parent = dget_parent(entry);
David Howells2b0143b2015-03-17 22:25:59 +0000270 fuse_advise_use_readdirplus(d_inode(parent));
Miklos Szeredi28420da2013-06-03 14:40:22 +0200271 dput(parent);
272 }
Miklos Szeredie5e55582005-09-09 13:10:28 -0700273 }
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200274 ret = 1;
275out:
276 return ret;
277
278invalid:
279 ret = 0;
280 goto out;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700281}
282
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700283#if BITS_PER_LONG < 64
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200284static int fuse_dentry_init(struct dentry *dentry)
285{
Khazhismel Kumykovdc69e982019-09-17 12:35:33 -0700286 dentry->d_fsdata = kzalloc(sizeof(union fuse_dentry),
287 GFP_KERNEL_ACCOUNT | __GFP_RECLAIMABLE);
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200288
289 return dentry->d_fsdata ? 0 : -ENOMEM;
290}
291static void fuse_dentry_release(struct dentry *dentry)
292{
293 union fuse_dentry *fd = dentry->d_fsdata;
294
295 kfree_rcu(fd, rcu);
296}
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700297#endif
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200298
Miklos Szeredi8fab0102018-08-15 17:42:34 +0200299static int fuse_dentry_delete(const struct dentry *dentry)
300{
301 return time_before64(fuse_dentry_time(dentry), get_jiffies_64());
302}
303
Max Reitzbf109c62020-04-21 14:47:15 +0200304/*
305 * Create a fuse_mount object with a new superblock (with path->dentry
306 * as the root), and return that mount so it can be auto-mounted on
307 * @path.
308 */
309static struct vfsmount *fuse_dentry_automount(struct path *path)
310{
311 struct fs_context *fsc;
312 struct fuse_mount *parent_fm = get_fuse_mount_super(path->mnt->mnt_sb);
313 struct fuse_conn *fc = parent_fm->fc;
314 struct fuse_mount *fm;
315 struct vfsmount *mnt;
316 struct fuse_inode *mp_fi = get_fuse_inode(d_inode(path->dentry));
317 struct super_block *sb;
318 int err;
319
320 fsc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry);
321 if (IS_ERR(fsc)) {
322 err = PTR_ERR(fsc);
323 goto out;
324 }
325
326 err = -ENOMEM;
327 fm = kzalloc(sizeof(struct fuse_mount), GFP_KERNEL);
328 if (!fm)
329 goto out_put_fsc;
330
Max Reitzbf109c62020-04-21 14:47:15 +0200331 fsc->s_fs_info = fm;
332 sb = sget_fc(fsc, NULL, set_anon_super_fc);
333 if (IS_ERR(sb)) {
334 err = PTR_ERR(sb);
Miklos Szeredi514b5e32020-11-11 17:22:32 +0100335 kfree(fm);
Max Reitzbf109c62020-04-21 14:47:15 +0200336 goto out_put_fsc;
337 }
338 fm->fc = fuse_conn_get(fc);
339
340 /* Initialize superblock, making @mp_fi its root */
341 err = fuse_fill_super_submount(sb, mp_fi);
342 if (err)
343 goto out_put_sb;
344
345 sb->s_flags |= SB_ACTIVE;
346 fsc->root = dget(sb->s_root);
347 /* We are done configuring the superblock, so unlock it */
348 up_write(&sb->s_umount);
349
350 down_write(&fc->killsb);
351 list_add_tail(&fm->fc_entry, &fc->mounts);
352 up_write(&fc->killsb);
353
354 /* Create the submount */
355 mnt = vfs_create_mount(fsc);
356 if (IS_ERR(mnt)) {
357 err = PTR_ERR(mnt);
358 goto out_put_fsc;
359 }
360 mntget(mnt);
361 put_fs_context(fsc);
362 return mnt;
363
364out_put_sb:
365 /*
366 * Only jump here when fsc->root is NULL and sb is still locked
367 * (otherwise put_fs_context() will put the superblock)
368 */
369 deactivate_locked_super(sb);
370out_put_fsc:
371 put_fs_context(fsc);
372out:
373 return ERR_PTR(err);
374}
375
Al Viro42695902009-02-20 05:59:13 +0000376const struct dentry_operations fuse_dentry_operations = {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700377 .d_revalidate = fuse_dentry_revalidate,
Miklos Szeredi8fab0102018-08-15 17:42:34 +0200378 .d_delete = fuse_dentry_delete,
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700379#if BITS_PER_LONG < 64
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200380 .d_init = fuse_dentry_init,
381 .d_release = fuse_dentry_release,
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700382#endif
Max Reitzbf109c62020-04-21 14:47:15 +0200383 .d_automount = fuse_dentry_automount,
Miklos Szeredie5e55582005-09-09 13:10:28 -0700384};
385
Miklos Szeredi0ce267f2016-10-18 15:36:48 +0200386const struct dentry_operations fuse_root_dentry_operations = {
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700387#if BITS_PER_LONG < 64
Miklos Szeredi0ce267f2016-10-18 15:36:48 +0200388 .d_init = fuse_dentry_init,
389 .d_release = fuse_dentry_release,
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700390#endif
Miklos Szeredi0ce267f2016-10-18 15:36:48 +0200391};
392
Timo Savolaa5bfffac2007-04-08 16:04:00 -0700393int fuse_valid_type(int m)
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800394{
395 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
396 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
397}
398
Miklos Szeredieb59bd12019-11-12 11:49:04 +0100399bool fuse_invalid_attr(struct fuse_attr *attr)
400{
401 return !fuse_valid_type(attr->mode) ||
402 attr->size > LLONG_MAX;
403}
404
Al Viro13983d02016-07-20 22:34:44 -0400405int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name,
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700406 struct fuse_entry_out *outarg, struct inode **inode)
407{
Max Reitzfcee2162020-05-06 17:44:12 +0200408 struct fuse_mount *fm = get_fuse_mount_super(sb);
Miklos Szeredi70781872014-12-12 09:49:05 +0100409 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100410 struct fuse_forget_link *forget;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700411 u64 attr_version;
412 int err;
413
414 *inode = NULL;
415 err = -ENAMETOOLONG;
416 if (name->len > FUSE_NAME_MAX)
417 goto out;
418
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700419
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100420 forget = fuse_alloc_forget();
421 err = -ENOMEM;
Miklos Szeredi70781872014-12-12 09:49:05 +0100422 if (!forget)
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700423 goto out;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700424
Max Reitzfcee2162020-05-06 17:44:12 +0200425 attr_version = fuse_get_attr_version(fm->fc);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700426
Max Reitzfcee2162020-05-06 17:44:12 +0200427 fuse_lookup_init(fm->fc, &args, nodeid, name, outarg);
428 err = fuse_simple_request(fm, &args);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700429 /* Zero nodeid is same as -ENOENT, but with valid timeout */
430 if (err || !outarg->nodeid)
431 goto out_put_forget;
432
433 err = -EIO;
434 if (!outarg->nodeid)
435 goto out_put_forget;
Miklos Szeredieb59bd12019-11-12 11:49:04 +0100436 if (fuse_invalid_attr(&outarg->attr))
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700437 goto out_put_forget;
438
439 *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
440 &outarg->attr, entry_attr_timeout(outarg),
441 attr_version);
442 err = -ENOMEM;
443 if (!*inode) {
Max Reitzfcee2162020-05-06 17:44:12 +0200444 fuse_queue_forget(fm->fc, forget, outarg->nodeid, 1);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700445 goto out;
446 }
447 err = 0;
448
449 out_put_forget:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100450 kfree(forget);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700451 out:
452 return err;
453}
454
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800455static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
Al Viro00cd8dd2012-06-10 17:13:09 -0400456 unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700457{
458 int err;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700459 struct fuse_entry_out outarg;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700460 struct inode *inode;
Miklos Szeredi0de62562008-07-25 01:48:59 -0700461 struct dentry *newent;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700462 bool outarg_valid = true;
Miklos Szeredi63576c12018-07-26 16:13:11 +0200463 bool locked;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700464
Miklos Szeredi63576c12018-07-26 16:13:11 +0200465 locked = fuse_lock_inode(dir);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700466 err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
467 &outarg, &inode);
Miklos Szeredi63576c12018-07-26 16:13:11 +0200468 fuse_unlock_inode(dir, locked);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700469 if (err == -ENOENT) {
470 outarg_valid = false;
471 err = 0;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800472 }
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700473 if (err)
474 goto out_err;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800475
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700476 err = -EIO;
477 if (inode && get_node_id(inode) == FUSE_ROOT_ID)
478 goto out_iput;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700479
Al Viro41d28bc2014-10-12 22:24:21 -0400480 newent = d_splice_alias(inode, entry);
Miklos Szeredi5835f332013-09-05 11:44:42 +0200481 err = PTR_ERR(newent);
482 if (IS_ERR(newent))
483 goto out_err;
Miklos Szeredid2a85162006-10-17 00:10:11 -0700484
Miklos Szeredi0de62562008-07-25 01:48:59 -0700485 entry = newent ? newent : entry;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700486 if (outarg_valid)
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700487 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800488 else
489 fuse_invalidate_entry_cache(entry);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700490
Miklos Szeredi6c26f712019-10-21 15:57:07 +0200491 if (inode)
492 fuse_advise_use_readdirplus(dir);
Miklos Szeredi0de62562008-07-25 01:48:59 -0700493 return newent;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700494
495 out_iput:
496 iput(inode);
497 out_err:
498 return ERR_PTR(err);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700499}
500
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800501/*
502 * Atomic create+open operation
503 *
504 * If the filesystem doesn't support this, then fall back to separate
505 * 'mknod' + 'open' requests.
506 */
Al Virod9585272012-06-22 12:39:14 +0400507static int fuse_create_open(struct inode *dir, struct dentry *entry,
Al Viro30d90492012-06-22 12:40:19 +0400508 struct file *file, unsigned flags,
Al Virob452a452018-06-08 13:06:28 -0400509 umode_t mode)
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800510{
511 int err;
512 struct inode *inode;
Max Reitzfcee2162020-05-06 17:44:12 +0200513 struct fuse_mount *fm = get_fuse_mount(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100514 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100515 struct fuse_forget_link *forget;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200516 struct fuse_create_in inarg;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800517 struct fuse_open_out outopen;
518 struct fuse_entry_out outentry;
Kirill Tkhaiebf84d02018-11-09 13:33:11 +0300519 struct fuse_inode *fi;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800520 struct fuse_file *ff;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800521
Miklos Szerediaf109bc2012-08-15 13:01:24 +0200522 /* Userspace expects S_IFREG in create mode */
523 BUG_ON((mode & S_IFMT) != S_IFREG);
524
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100525 forget = fuse_alloc_forget();
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200526 err = -ENOMEM;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100527 if (!forget)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200528 goto out_err;
Miklos Szeredi51eb01e2006-06-25 05:48:50 -0700529
Miklos Szeredice1d5a42006-04-10 22:54:58 -0700530 err = -ENOMEM;
Max Reitzfcee2162020-05-06 17:44:12 +0200531 ff = fuse_file_alloc(fm);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800532 if (!ff)
Miklos Szeredi70781872014-12-12 09:49:05 +0100533 goto out_put_forget_req;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800534
Max Reitzfcee2162020-05-06 17:44:12 +0200535 if (!fm->fc->dont_mask)
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200536 mode &= ~current_umask();
537
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800538 flags &= ~O_NOCTTY;
539 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700540 memset(&outentry, 0, sizeof(outentry));
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800541 inarg.flags = flags;
542 inarg.mode = mode;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200543 inarg.umask = current_umask();
Miklos Szeredid5b48542019-09-10 15:04:08 +0200544 args.opcode = FUSE_CREATE;
545 args.nodeid = get_node_id(dir);
546 args.in_numargs = 2;
547 args.in_args[0].size = sizeof(inarg);
548 args.in_args[0].value = &inarg;
549 args.in_args[1].size = entry->d_name.len + 1;
550 args.in_args[1].value = entry->d_name.name;
551 args.out_numargs = 2;
552 args.out_args[0].size = sizeof(outentry);
553 args.out_args[0].value = &outentry;
554 args.out_args[1].size = sizeof(outopen);
555 args.out_args[1].value = &outopen;
Max Reitzfcee2162020-05-06 17:44:12 +0200556 err = fuse_simple_request(fm, &args);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200557 if (err)
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800558 goto out_free_ff;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800559
560 err = -EIO;
Miklos Szeredieb59bd12019-11-12 11:49:04 +0100561 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid) ||
562 fuse_invalid_attr(&outentry.attr))
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800563 goto out_free_ff;
564
Miklos Szeredic7b71432009-04-28 16:56:37 +0200565 ff->fh = outopen.fh;
566 ff->nodeid = outentry.nodeid;
567 ff->open_flags = outopen.open_flags;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800568 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700569 &outentry.attr, entry_attr_timeout(&outentry), 0);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800570 if (!inode) {
571 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
Kirill Tkhaiebf84d02018-11-09 13:33:11 +0300572 fuse_sync_release(NULL, ff, flags);
Max Reitzfcee2162020-05-06 17:44:12 +0200573 fuse_queue_forget(fm->fc, forget, outentry.nodeid, 1);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200574 err = -ENOMEM;
575 goto out_err;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800576 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100577 kfree(forget);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800578 d_instantiate(entry, inode);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700579 fuse_change_entry_timeout(entry, &outentry);
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200580 fuse_dir_changed(dir);
Al Virobe12af32018-06-08 11:44:56 -0400581 err = finish_open(file, entry, generic_file_open);
Al Viro30d90492012-06-22 12:40:19 +0400582 if (err) {
Kirill Tkhaiebf84d02018-11-09 13:33:11 +0300583 fi = get_fuse_inode(inode);
584 fuse_sync_release(fi, ff, flags);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200585 } else {
Miklos Szeredi267d8442017-02-22 20:08:25 +0100586 file->private_data = ff;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200587 fuse_finish_open(inode, file);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800588 }
Al Virod9585272012-06-22 12:39:14 +0400589 return err;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800590
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200591out_free_ff:
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800592 fuse_file_free(ff);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200593out_put_forget_req:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100594 kfree(forget);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200595out_err:
Al Virod9585272012-06-22 12:39:14 +0400596 return err;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200597}
598
599static int fuse_mknod(struct inode *, struct dentry *, umode_t, dev_t);
Al Virod9585272012-06-22 12:39:14 +0400600static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
Al Viro30d90492012-06-22 12:40:19 +0400601 struct file *file, unsigned flags,
Al Viro44907d72018-06-08 13:32:02 -0400602 umode_t mode)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200603{
604 int err;
605 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200606 struct dentry *res = NULL;
607
Al Viro00699ad2016-07-05 09:44:53 -0400608 if (d_in_lookup(entry)) {
Al Viro00cd8dd2012-06-10 17:13:09 -0400609 res = fuse_lookup(dir, entry, 0);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200610 if (IS_ERR(res))
Al Virod9585272012-06-22 12:39:14 +0400611 return PTR_ERR(res);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200612
613 if (res)
614 entry = res;
615 }
616
David Howells2b0143b2015-03-17 22:25:59 +0000617 if (!(flags & O_CREAT) || d_really_is_positive(entry))
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200618 goto no_open;
619
620 /* Only creates */
Al Viro73a09dd2018-06-08 13:22:02 -0400621 file->f_mode |= FMODE_CREATED;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200622
623 if (fc->no_create)
624 goto mknod;
625
Al Virob452a452018-06-08 13:06:28 -0400626 err = fuse_create_open(dir, entry, file, flags, mode);
Al Virod9585272012-06-22 12:39:14 +0400627 if (err == -ENOSYS) {
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200628 fc->no_create = 1;
629 goto mknod;
630 }
631out_dput:
632 dput(res);
Al Virod9585272012-06-22 12:39:14 +0400633 return err;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200634
635mknod:
636 err = fuse_mknod(dir, entry, mode, 0);
Al Virod9585272012-06-22 12:39:14 +0400637 if (err)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200638 goto out_dput;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200639no_open:
Al Viroe45198a2012-06-10 06:48:09 -0400640 return finish_no_open(file, res);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800641}
642
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800643/*
644 * Code shared between mknod, mkdir, symlink and link
645 */
Max Reitzfcee2162020-05-06 17:44:12 +0200646static int create_new_entry(struct fuse_mount *fm, struct fuse_args *args,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700647 struct inode *dir, struct dentry *entry,
Al Viro541af6a2011-07-26 03:17:33 -0400648 umode_t mode)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700649{
650 struct fuse_entry_out outarg;
651 struct inode *inode;
Al Viroc971e6a2018-05-28 18:27:19 -0400652 struct dentry *d;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700653 int err;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100654 struct fuse_forget_link *forget;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800655
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100656 forget = fuse_alloc_forget();
Miklos Szeredi70781872014-12-12 09:49:05 +0100657 if (!forget)
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100658 return -ENOMEM;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700659
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700660 memset(&outarg, 0, sizeof(outarg));
Miklos Szeredid5b48542019-09-10 15:04:08 +0200661 args->nodeid = get_node_id(dir);
662 args->out_numargs = 1;
663 args->out_args[0].size = sizeof(outarg);
664 args->out_args[0].value = &outarg;
Max Reitzfcee2162020-05-06 17:44:12 +0200665 err = fuse_simple_request(fm, args);
Miklos Szeredi2d510132006-11-25 11:09:20 -0800666 if (err)
667 goto out_put_forget_req;
668
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800669 err = -EIO;
Miklos Szeredieb59bd12019-11-12 11:49:04 +0100670 if (invalid_nodeid(outarg.nodeid) || fuse_invalid_attr(&outarg.attr))
Miklos Szeredi2d510132006-11-25 11:09:20 -0800671 goto out_put_forget_req;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800672
673 if ((outarg.attr.mode ^ mode) & S_IFMT)
Miklos Szeredi2d510132006-11-25 11:09:20 -0800674 goto out_put_forget_req;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800675
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700676 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700677 &outarg.attr, entry_attr_timeout(&outarg), 0);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700678 if (!inode) {
Max Reitzfcee2162020-05-06 17:44:12 +0200679 fuse_queue_forget(fm->fc, forget, outarg.nodeid, 1);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700680 return -ENOMEM;
681 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100682 kfree(forget);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700683
Al Viroc971e6a2018-05-28 18:27:19 -0400684 d_drop(entry);
685 d = d_splice_alias(inode, entry);
686 if (IS_ERR(d))
687 return PTR_ERR(d);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700688
Al Viroc971e6a2018-05-28 18:27:19 -0400689 if (d) {
690 fuse_change_entry_timeout(d, &outarg);
691 dput(d);
692 } else {
693 fuse_change_entry_timeout(entry, &outarg);
694 }
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200695 fuse_dir_changed(dir);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700696 return 0;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800697
Miklos Szeredi2d510132006-11-25 11:09:20 -0800698 out_put_forget_req:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100699 kfree(forget);
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800700 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700701}
702
Al Viro1a67aaf2011-07-26 01:52:52 -0400703static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700704 dev_t rdev)
705{
706 struct fuse_mknod_in inarg;
Max Reitzfcee2162020-05-06 17:44:12 +0200707 struct fuse_mount *fm = get_fuse_mount(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100708 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700709
Max Reitzfcee2162020-05-06 17:44:12 +0200710 if (!fm->fc->dont_mask)
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200711 mode &= ~current_umask();
712
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700713 memset(&inarg, 0, sizeof(inarg));
714 inarg.mode = mode;
715 inarg.rdev = new_encode_dev(rdev);
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200716 inarg.umask = current_umask();
Miklos Szeredid5b48542019-09-10 15:04:08 +0200717 args.opcode = FUSE_MKNOD;
718 args.in_numargs = 2;
719 args.in_args[0].size = sizeof(inarg);
720 args.in_args[0].value = &inarg;
721 args.in_args[1].size = entry->d_name.len + 1;
722 args.in_args[1].value = entry->d_name.name;
Max Reitzfcee2162020-05-06 17:44:12 +0200723 return create_new_entry(fm, &args, dir, entry, mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700724}
725
Al Viro4acdaf22011-07-26 01:42:34 -0400726static int fuse_create(struct inode *dir, struct dentry *entry, umode_t mode,
Al Viroebfc3b42012-06-10 18:05:36 -0400727 bool excl)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700728{
729 return fuse_mknod(dir, entry, mode, 0);
730}
731
Al Viro18bb1db2011-07-26 01:41:39 -0400732static int fuse_mkdir(struct inode *dir, struct dentry *entry, umode_t mode)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700733{
734 struct fuse_mkdir_in inarg;
Max Reitzfcee2162020-05-06 17:44:12 +0200735 struct fuse_mount *fm = get_fuse_mount(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100736 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700737
Max Reitzfcee2162020-05-06 17:44:12 +0200738 if (!fm->fc->dont_mask)
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200739 mode &= ~current_umask();
740
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700741 memset(&inarg, 0, sizeof(inarg));
742 inarg.mode = mode;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200743 inarg.umask = current_umask();
Miklos Szeredid5b48542019-09-10 15:04:08 +0200744 args.opcode = FUSE_MKDIR;
745 args.in_numargs = 2;
746 args.in_args[0].size = sizeof(inarg);
747 args.in_args[0].value = &inarg;
748 args.in_args[1].size = entry->d_name.len + 1;
749 args.in_args[1].value = entry->d_name.name;
Max Reitzfcee2162020-05-06 17:44:12 +0200750 return create_new_entry(fm, &args, dir, entry, S_IFDIR);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700751}
752
753static int fuse_symlink(struct inode *dir, struct dentry *entry,
754 const char *link)
755{
Max Reitzfcee2162020-05-06 17:44:12 +0200756 struct fuse_mount *fm = get_fuse_mount(dir);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700757 unsigned len = strlen(link) + 1;
Miklos Szeredi70781872014-12-12 09:49:05 +0100758 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700759
Miklos Szeredid5b48542019-09-10 15:04:08 +0200760 args.opcode = FUSE_SYMLINK;
761 args.in_numargs = 2;
762 args.in_args[0].size = entry->d_name.len + 1;
763 args.in_args[0].value = entry->d_name.name;
764 args.in_args[1].size = len;
765 args.in_args[1].value = link;
Max Reitzfcee2162020-05-06 17:44:12 +0200766 return create_new_entry(fm, &args, dir, entry, S_IFLNK);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700767}
768
Seth Forshee703c7362016-08-29 08:46:36 -0500769void fuse_update_ctime(struct inode *inode)
Maxim Patlasov31f32672014-04-28 14:19:24 +0200770{
771 if (!IS_NOCMTIME(inode)) {
Deepa Dinamanic2050a42016-09-14 07:48:06 -0700772 inode->i_ctime = current_time(inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200773 mark_inode_dirty_sync(inode);
774 }
775}
776
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700777static int fuse_unlink(struct inode *dir, struct dentry *entry)
778{
779 int err;
Max Reitzfcee2162020-05-06 17:44:12 +0200780 struct fuse_mount *fm = get_fuse_mount(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100781 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700782
Miklos Szeredid5b48542019-09-10 15:04:08 +0200783 args.opcode = FUSE_UNLINK;
784 args.nodeid = get_node_id(dir);
785 args.in_numargs = 1;
786 args.in_args[0].size = entry->d_name.len + 1;
787 args.in_args[0].value = entry->d_name.name;
Max Reitzfcee2162020-05-06 17:44:12 +0200788 err = fuse_simple_request(fm, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700789 if (!err) {
David Howells2b0143b2015-03-17 22:25:59 +0000790 struct inode *inode = d_inode(entry);
Miklos Szerediac45d612012-03-05 15:48:11 +0100791 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700792
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +0300793 spin_lock(&fi->lock);
Max Reitzfcee2162020-05-06 17:44:12 +0200794 fi->attr_version = atomic64_inc_return(&fm->fc->attr_version);
Miklos Szeredidfca7ce2013-02-04 15:57:42 +0100795 /*
796 * If i_nlink == 0 then unlink doesn't make sense, yet this can
797 * happen if userspace filesystem is careless. It would be
798 * difficult to enforce correct nlink usage so just ignore this
799 * condition here
800 */
801 if (inode->i_nlink > 0)
802 drop_nlink(inode);
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +0300803 spin_unlock(&fi->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700804 fuse_invalidate_attr(inode);
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200805 fuse_dir_changed(dir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800806 fuse_invalidate_entry_cache(entry);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200807 fuse_update_ctime(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700808 } else if (err == -EINTR)
809 fuse_invalidate_entry(entry);
810 return err;
811}
812
813static int fuse_rmdir(struct inode *dir, struct dentry *entry)
814{
815 int err;
Max Reitzfcee2162020-05-06 17:44:12 +0200816 struct fuse_mount *fm = get_fuse_mount(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100817 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700818
Miklos Szeredid5b48542019-09-10 15:04:08 +0200819 args.opcode = FUSE_RMDIR;
820 args.nodeid = get_node_id(dir);
821 args.in_numargs = 1;
822 args.in_args[0].size = entry->d_name.len + 1;
823 args.in_args[0].value = entry->d_name.name;
Max Reitzfcee2162020-05-06 17:44:12 +0200824 err = fuse_simple_request(fm, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700825 if (!err) {
David Howells2b0143b2015-03-17 22:25:59 +0000826 clear_nlink(d_inode(entry));
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200827 fuse_dir_changed(dir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800828 fuse_invalidate_entry_cache(entry);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700829 } else if (err == -EINTR)
830 fuse_invalidate_entry(entry);
831 return err;
832}
833
Miklos Szeredi1560c972014-04-28 16:43:44 +0200834static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
835 struct inode *newdir, struct dentry *newent,
836 unsigned int flags, int opcode, size_t argsize)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700837{
838 int err;
Miklos Szeredi1560c972014-04-28 16:43:44 +0200839 struct fuse_rename2_in inarg;
Max Reitzfcee2162020-05-06 17:44:12 +0200840 struct fuse_mount *fm = get_fuse_mount(olddir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100841 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700842
Miklos Szeredi1560c972014-04-28 16:43:44 +0200843 memset(&inarg, 0, argsize);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700844 inarg.newdir = get_node_id(newdir);
Miklos Szeredi1560c972014-04-28 16:43:44 +0200845 inarg.flags = flags;
Miklos Szeredid5b48542019-09-10 15:04:08 +0200846 args.opcode = opcode;
847 args.nodeid = get_node_id(olddir);
848 args.in_numargs = 3;
849 args.in_args[0].size = argsize;
850 args.in_args[0].value = &inarg;
851 args.in_args[1].size = oldent->d_name.len + 1;
852 args.in_args[1].value = oldent->d_name.name;
853 args.in_args[2].size = newent->d_name.len + 1;
854 args.in_args[2].value = newent->d_name.name;
Max Reitzfcee2162020-05-06 17:44:12 +0200855 err = fuse_simple_request(fm, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700856 if (!err) {
Miklos Szeredi08b63302007-11-28 16:22:03 -0800857 /* ctime changes */
David Howells2b0143b2015-03-17 22:25:59 +0000858 fuse_invalidate_attr(d_inode(oldent));
859 fuse_update_ctime(d_inode(oldent));
Miklos Szeredi08b63302007-11-28 16:22:03 -0800860
Miklos Szeredi1560c972014-04-28 16:43:44 +0200861 if (flags & RENAME_EXCHANGE) {
David Howells2b0143b2015-03-17 22:25:59 +0000862 fuse_invalidate_attr(d_inode(newent));
863 fuse_update_ctime(d_inode(newent));
Miklos Szeredi1560c972014-04-28 16:43:44 +0200864 }
865
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200866 fuse_dir_changed(olddir);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700867 if (olddir != newdir)
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200868 fuse_dir_changed(newdir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800869
870 /* newent will end up negative */
David Howells2b0143b2015-03-17 22:25:59 +0000871 if (!(flags & RENAME_EXCHANGE) && d_really_is_positive(newent)) {
872 fuse_invalidate_attr(d_inode(newent));
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800873 fuse_invalidate_entry_cache(newent);
David Howells2b0143b2015-03-17 22:25:59 +0000874 fuse_update_ctime(d_inode(newent));
Miklos Szeredi5219f342009-11-04 10:24:52 +0100875 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700876 } else if (err == -EINTR) {
877 /* If request was interrupted, DEITY only knows if the
878 rename actually took place. If the invalidation
879 fails (e.g. some process has CWD under the renamed
880 directory), then there can be inconsistency between
881 the dcache and the real filesystem. Tough luck. */
882 fuse_invalidate_entry(oldent);
David Howells2b0143b2015-03-17 22:25:59 +0000883 if (d_really_is_positive(newent))
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700884 fuse_invalidate_entry(newent);
885 }
886
887 return err;
888}
889
Miklos Szeredi1560c972014-04-28 16:43:44 +0200890static int fuse_rename2(struct inode *olddir, struct dentry *oldent,
891 struct inode *newdir, struct dentry *newent,
892 unsigned int flags)
893{
894 struct fuse_conn *fc = get_fuse_conn(olddir);
895 int err;
896
Vivek Goyal519525f2020-02-05 08:15:46 -0500897 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
Miklos Szeredi1560c972014-04-28 16:43:44 +0200898 return -EINVAL;
899
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200900 if (flags) {
901 if (fc->no_rename2 || fc->minor < 23)
902 return -EINVAL;
Miklos Szeredi1560c972014-04-28 16:43:44 +0200903
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200904 err = fuse_rename_common(olddir, oldent, newdir, newent, flags,
905 FUSE_RENAME2,
906 sizeof(struct fuse_rename2_in));
907 if (err == -ENOSYS) {
908 fc->no_rename2 = 1;
909 err = -EINVAL;
910 }
911 } else {
912 err = fuse_rename_common(olddir, oldent, newdir, newent, 0,
913 FUSE_RENAME,
914 sizeof(struct fuse_rename_in));
Miklos Szeredi1560c972014-04-28 16:43:44 +0200915 }
Miklos Szeredi1560c972014-04-28 16:43:44 +0200916
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200917 return err;
918}
919
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700920static int fuse_link(struct dentry *entry, struct inode *newdir,
921 struct dentry *newent)
922{
923 int err;
924 struct fuse_link_in inarg;
David Howells2b0143b2015-03-17 22:25:59 +0000925 struct inode *inode = d_inode(entry);
Max Reitzfcee2162020-05-06 17:44:12 +0200926 struct fuse_mount *fm = get_fuse_mount(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +0100927 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700928
929 memset(&inarg, 0, sizeof(inarg));
930 inarg.oldnodeid = get_node_id(inode);
Miklos Szeredid5b48542019-09-10 15:04:08 +0200931 args.opcode = FUSE_LINK;
932 args.in_numargs = 2;
933 args.in_args[0].size = sizeof(inarg);
934 args.in_args[0].value = &inarg;
935 args.in_args[1].size = newent->d_name.len + 1;
936 args.in_args[1].value = newent->d_name.name;
Max Reitzfcee2162020-05-06 17:44:12 +0200937 err = create_new_entry(fm, &args, newdir, newent, inode->i_mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700938 /* Contrary to "normal" filesystems it can happen that link
939 makes two "logical" inodes point to the same "physical"
940 inode. We invalidate the attributes of the old one, so it
941 will reflect changes in the backing inode (link count,
942 etc.)
943 */
Miklos Szerediac45d612012-03-05 15:48:11 +0100944 if (!err) {
945 struct fuse_inode *fi = get_fuse_inode(inode);
946
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +0300947 spin_lock(&fi->lock);
Max Reitzfcee2162020-05-06 17:44:12 +0200948 fi->attr_version = atomic64_inc_return(&fm->fc->attr_version);
Miklos Szeredic634da72019-11-12 11:49:04 +0100949 if (likely(inode->i_nlink < UINT_MAX))
950 inc_nlink(inode);
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +0300951 spin_unlock(&fi->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700952 fuse_invalidate_attr(inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200953 fuse_update_ctime(inode);
Miklos Szerediac45d612012-03-05 15:48:11 +0100954 } else if (err == -EINTR) {
955 fuse_invalidate_attr(inode);
956 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700957 return err;
958}
959
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700960static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
961 struct kstat *stat)
962{
Miklos Szeredi203627b2012-05-10 19:49:38 +0400963 unsigned int blkbits;
Pavel Emelyanov83732002013-10-10 17:10:46 +0400964 struct fuse_conn *fc = get_fuse_conn(inode);
965
966 /* see the comment in fuse_change_attributes() */
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400967 if (fc->writeback_cache && S_ISREG(inode->i_mode)) {
Pavel Emelyanov83732002013-10-10 17:10:46 +0400968 attr->size = i_size_read(inode);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400969 attr->mtime = inode->i_mtime.tv_sec;
970 attr->mtimensec = inode->i_mtime.tv_nsec;
Maxim Patlasov31f32672014-04-28 14:19:24 +0200971 attr->ctime = inode->i_ctime.tv_sec;
972 attr->ctimensec = inode->i_ctime.tv_nsec;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400973 }
Miklos Szeredi203627b2012-05-10 19:49:38 +0400974
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700975 stat->dev = inode->i_sb->s_dev;
976 stat->ino = attr->ino;
977 stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
978 stat->nlink = attr->nlink;
Eric W. Biederman8cb08322018-02-21 11:18:07 -0600979 stat->uid = make_kuid(fc->user_ns, attr->uid);
980 stat->gid = make_kgid(fc->user_ns, attr->gid);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700981 stat->rdev = inode->i_rdev;
982 stat->atime.tv_sec = attr->atime;
983 stat->atime.tv_nsec = attr->atimensec;
984 stat->mtime.tv_sec = attr->mtime;
985 stat->mtime.tv_nsec = attr->mtimensec;
986 stat->ctime.tv_sec = attr->ctime;
987 stat->ctime.tv_nsec = attr->ctimensec;
988 stat->size = attr->size;
989 stat->blocks = attr->blocks;
Miklos Szeredi203627b2012-05-10 19:49:38 +0400990
991 if (attr->blksize != 0)
992 blkbits = ilog2(attr->blksize);
993 else
994 blkbits = inode->i_sb->s_blocksize_bits;
995
996 stat->blksize = 1 << blkbits;
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700997}
998
Miklos Szeredic79e3222007-10-18 03:06:59 -0700999static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
1000 struct file *file)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001001{
1002 int err;
Miklos Szeredic79e3222007-10-18 03:06:59 -07001003 struct fuse_getattr_in inarg;
1004 struct fuse_attr_out outarg;
Max Reitzfcee2162020-05-06 17:44:12 +02001005 struct fuse_mount *fm = get_fuse_mount(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001006 FUSE_ARGS(args);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -07001007 u64 attr_version;
1008
Max Reitzfcee2162020-05-06 17:44:12 +02001009 attr_version = fuse_get_attr_version(fm->fc);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -07001010
Miklos Szeredic79e3222007-10-18 03:06:59 -07001011 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -07001012 memset(&outarg, 0, sizeof(outarg));
Miklos Szeredic79e3222007-10-18 03:06:59 -07001013 /* Directories have separate file-handle space */
1014 if (file && S_ISREG(inode->i_mode)) {
1015 struct fuse_file *ff = file->private_data;
1016
1017 inarg.getattr_flags |= FUSE_GETATTR_FH;
1018 inarg.fh = ff->fh;
1019 }
Miklos Szeredid5b48542019-09-10 15:04:08 +02001020 args.opcode = FUSE_GETATTR;
1021 args.nodeid = get_node_id(inode);
1022 args.in_numargs = 1;
1023 args.in_args[0].size = sizeof(inarg);
1024 args.in_args[0].value = &inarg;
1025 args.out_numargs = 1;
1026 args.out_args[0].size = sizeof(outarg);
1027 args.out_args[0].value = &outarg;
Max Reitzfcee2162020-05-06 17:44:12 +02001028 err = fuse_simple_request(fm, &args);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001029 if (!err) {
Miklos Szeredieb59bd12019-11-12 11:49:04 +01001030 if (fuse_invalid_attr(&outarg.attr) ||
1031 (inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
Miklos Szeredie5e55582005-09-09 13:10:28 -07001032 make_bad_inode(inode);
1033 err = -EIO;
1034 } else {
Miklos Szeredic79e3222007-10-18 03:06:59 -07001035 fuse_change_attributes(inode, &outarg.attr,
1036 attr_timeout(&outarg),
Miklos Szeredi1fb69e72007-10-18 03:06:58 -07001037 attr_version);
1038 if (stat)
Miklos Szeredic79e3222007-10-18 03:06:59 -07001039 fuse_fillattr(inode, &outarg.attr, stat);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001040 }
1041 }
1042 return err;
1043}
1044
Miklos Szeredi5b97eea2017-09-12 16:57:54 +02001045static int fuse_update_get_attr(struct inode *inode, struct file *file,
Miklos Szeredi2f1e8192018-10-15 15:43:06 +02001046 struct kstat *stat, u32 request_mask,
1047 unsigned int flags)
Miklos Szeredibcb4be82007-11-28 16:21:59 -08001048{
1049 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi5b97eea2017-09-12 16:57:54 +02001050 int err = 0;
Miklos Szeredibf5c1892018-03-20 17:11:44 +01001051 bool sync;
Miklos Szeredibcb4be82007-11-28 16:21:59 -08001052
Miklos Szeredibf5c1892018-03-20 17:11:44 +01001053 if (flags & AT_STATX_FORCE_SYNC)
1054 sync = true;
1055 else if (flags & AT_STATX_DONT_SYNC)
1056 sync = false;
Miklos Szeredi2f1e8192018-10-15 15:43:06 +02001057 else if (request_mask & READ_ONCE(fi->inval_mask))
1058 sync = true;
Miklos Szeredibf5c1892018-03-20 17:11:44 +01001059 else
1060 sync = time_before64(fi->i_time, get_jiffies_64());
1061
1062 if (sync) {
Seth Forshee60bcc882016-08-29 08:46:37 -05001063 forget_all_cached_acls(inode);
Miklos Szeredibcb4be82007-11-28 16:21:59 -08001064 err = fuse_do_getattr(inode, stat, file);
Miklos Szeredi5b97eea2017-09-12 16:57:54 +02001065 } else if (stat) {
1066 generic_fillattr(inode, stat);
1067 stat->mode = fi->orig_i_mode;
1068 stat->ino = fi->orig_ino;
Miklos Szeredibcb4be82007-11-28 16:21:59 -08001069 }
1070
Miklos Szeredibcb4be82007-11-28 16:21:59 -08001071 return err;
1072}
1073
Miklos Szeredi5b97eea2017-09-12 16:57:54 +02001074int fuse_update_attributes(struct inode *inode, struct file *file)
1075{
Miklos Szeredi802dc042018-10-15 15:43:06 +02001076 /* Do *not* need to get atime for internal purposes */
1077 return fuse_update_get_attr(inode, file, NULL,
1078 STATX_BASIC_STATS & ~STATX_ATIME, 0);
Miklos Szeredi5b97eea2017-09-12 16:57:54 +02001079}
1080
Max Reitzfcee2162020-05-06 17:44:12 +02001081int fuse_reverse_inval_entry(struct fuse_conn *fc, u64 parent_nodeid,
John Muir451d0f52011-12-06 21:50:06 +01001082 u64 child_nodeid, struct qstr *name)
John Muir3b463ae2009-05-31 11:13:57 -04001083{
1084 int err = -ENOTDIR;
1085 struct inode *parent;
1086 struct dentry *dir;
1087 struct dentry *entry;
1088
Max Reitzfcee2162020-05-06 17:44:12 +02001089 parent = fuse_ilookup(fc, parent_nodeid, NULL);
John Muir3b463ae2009-05-31 11:13:57 -04001090 if (!parent)
1091 return -ENOENT;
1092
Al Viro59551022016-01-22 15:40:57 -05001093 inode_lock(parent);
John Muir3b463ae2009-05-31 11:13:57 -04001094 if (!S_ISDIR(parent->i_mode))
1095 goto unlock;
1096
1097 err = -ENOENT;
1098 dir = d_find_alias(parent);
1099 if (!dir)
1100 goto unlock;
1101
Linus Torvalds8387ff22016-06-10 07:51:30 -07001102 name->hash = full_name_hash(dir, name->name, name->len);
John Muir3b463ae2009-05-31 11:13:57 -04001103 entry = d_lookup(dir, name);
1104 dput(dir);
1105 if (!entry)
1106 goto unlock;
1107
Miklos Szeredi261aaba72018-10-01 10:07:05 +02001108 fuse_dir_changed(parent);
John Muir3b463ae2009-05-31 11:13:57 -04001109 fuse_invalidate_entry(entry);
John Muir451d0f52011-12-06 21:50:06 +01001110
David Howells2b0143b2015-03-17 22:25:59 +00001111 if (child_nodeid != 0 && d_really_is_positive(entry)) {
Al Viro59551022016-01-22 15:40:57 -05001112 inode_lock(d_inode(entry));
David Howells2b0143b2015-03-17 22:25:59 +00001113 if (get_node_id(d_inode(entry)) != child_nodeid) {
John Muir451d0f52011-12-06 21:50:06 +01001114 err = -ENOENT;
1115 goto badentry;
1116 }
1117 if (d_mountpoint(entry)) {
1118 err = -EBUSY;
1119 goto badentry;
1120 }
David Howellse36cb0b2015-01-29 12:02:35 +00001121 if (d_is_dir(entry)) {
John Muir451d0f52011-12-06 21:50:06 +01001122 shrink_dcache_parent(entry);
1123 if (!simple_empty(entry)) {
1124 err = -ENOTEMPTY;
1125 goto badentry;
1126 }
David Howells2b0143b2015-03-17 22:25:59 +00001127 d_inode(entry)->i_flags |= S_DEAD;
John Muir451d0f52011-12-06 21:50:06 +01001128 }
1129 dont_mount(entry);
David Howells2b0143b2015-03-17 22:25:59 +00001130 clear_nlink(d_inode(entry));
John Muir451d0f52011-12-06 21:50:06 +01001131 err = 0;
1132 badentry:
Al Viro59551022016-01-22 15:40:57 -05001133 inode_unlock(d_inode(entry));
John Muir451d0f52011-12-06 21:50:06 +01001134 if (!err)
1135 d_delete(entry);
1136 } else {
1137 err = 0;
1138 }
John Muir3b463ae2009-05-31 11:13:57 -04001139 dput(entry);
John Muir3b463ae2009-05-31 11:13:57 -04001140
1141 unlock:
Al Viro59551022016-01-22 15:40:57 -05001142 inode_unlock(parent);
John Muir3b463ae2009-05-31 11:13:57 -04001143 iput(parent);
1144 return err;
1145}
1146
Miklos Szeredi87729a52005-09-09 13:10:34 -07001147/*
1148 * Calling into a user-controlled filesystem gives the filesystem
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001149 * daemon ptrace-like capabilities over the current process. This
Miklos Szeredi87729a52005-09-09 13:10:34 -07001150 * means, that the filesystem daemon is able to record the exact
1151 * filesystem operations performed, and can also control the behavior
1152 * of the requester process in otherwise impossible ways. For example
1153 * it can delay the operation for arbitrary length of time allowing
1154 * DoS against the requester.
1155 *
1156 * For this reason only those processes can call into the filesystem,
1157 * for which the owner of the mount has ptrace privilege. This
1158 * excludes processes started by other users, suid or sgid processes.
1159 */
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001160int fuse_allow_current_process(struct fuse_conn *fc)
Miklos Szeredi87729a52005-09-09 13:10:34 -07001161{
David Howellsc69e8d92008-11-14 10:39:19 +11001162 const struct cred *cred;
David Howellsc69e8d92008-11-14 10:39:19 +11001163
Miklos Szeredi29433a22016-10-01 07:32:32 +02001164 if (fc->allow_other)
Seth Forshee73f03c22017-12-22 15:32:33 +01001165 return current_in_userns(fc->user_ns);
Miklos Szeredi87729a52005-09-09 13:10:34 -07001166
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001167 cred = current_cred();
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001168 if (uid_eq(cred->euid, fc->user_id) &&
1169 uid_eq(cred->suid, fc->user_id) &&
1170 uid_eq(cred->uid, fc->user_id) &&
1171 gid_eq(cred->egid, fc->group_id) &&
1172 gid_eq(cred->sgid, fc->group_id) &&
1173 gid_eq(cred->gid, fc->group_id))
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001174 return 1;
Miklos Szeredi87729a52005-09-09 13:10:34 -07001175
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001176 return 0;
Miklos Szeredi87729a52005-09-09 13:10:34 -07001177}
1178
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001179static int fuse_access(struct inode *inode, int mask)
1180{
Max Reitzfcee2162020-05-06 17:44:12 +02001181 struct fuse_mount *fm = get_fuse_mount(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001182 FUSE_ARGS(args);
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001183 struct fuse_access_in inarg;
1184 int err;
1185
Miklos Szeredi698fa1d2013-10-01 16:41:23 +02001186 BUG_ON(mask & MAY_NOT_BLOCK);
1187
Max Reitzfcee2162020-05-06 17:44:12 +02001188 if (fm->fc->no_access)
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001189 return 0;
1190
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001191 memset(&inarg, 0, sizeof(inarg));
Al Viroe6305c42008-07-15 21:03:57 -04001192 inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
Miklos Szeredid5b48542019-09-10 15:04:08 +02001193 args.opcode = FUSE_ACCESS;
1194 args.nodeid = get_node_id(inode);
1195 args.in_numargs = 1;
1196 args.in_args[0].size = sizeof(inarg);
1197 args.in_args[0].value = &inarg;
Max Reitzfcee2162020-05-06 17:44:12 +02001198 err = fuse_simple_request(fm, &args);
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001199 if (err == -ENOSYS) {
Max Reitzfcee2162020-05-06 17:44:12 +02001200 fm->fc->no_access = 1;
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001201 err = 0;
1202 }
1203 return err;
1204}
1205
Al Viro10556cb22011-06-20 19:28:19 -04001206static int fuse_perm_getattr(struct inode *inode, int mask)
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001207{
Al Viro10556cb22011-06-20 19:28:19 -04001208 if (mask & MAY_NOT_BLOCK)
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001209 return -ECHILD;
1210
Seth Forshee60bcc882016-08-29 08:46:37 -05001211 forget_all_cached_acls(inode);
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001212 return fuse_do_getattr(inode, NULL, NULL);
1213}
1214
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001215/*
1216 * Check permission. The two basic access models of FUSE are:
1217 *
1218 * 1) Local access checking ('default_permissions' mount option) based
1219 * on file mode. This is the plain old disk filesystem permission
1220 * modell.
1221 *
1222 * 2) "Remote" access checking, where server is responsible for
1223 * checking permission in each inode operation. An exception to this
1224 * is if ->permission() was invoked from sys_access() in which case an
1225 * access request is sent. Execute permission is still checked
1226 * locally based on file mode.
1227 */
Al Viro10556cb22011-06-20 19:28:19 -04001228static int fuse_permission(struct inode *inode, int mask)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001229{
1230 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001231 bool refreshed = false;
1232 int err = 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001233
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001234 if (!fuse_allow_current_process(fc))
Miklos Szeredie5e55582005-09-09 13:10:28 -07001235 return -EACCES;
Miklos Szeredi244f6382007-10-16 23:31:02 -07001236
1237 /*
Miklos Szeredie8e96152007-10-16 23:31:06 -07001238 * If attributes are needed, refresh them before proceeding
Miklos Szeredi244f6382007-10-16 23:31:02 -07001239 */
Miklos Szeredi29433a22016-10-01 07:32:32 +02001240 if (fc->default_permissions ||
Miklos Szeredie8e96152007-10-16 23:31:06 -07001241 ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001242 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredid233c7d2018-12-03 10:14:43 +01001243 u32 perm_mask = STATX_MODE | STATX_UID | STATX_GID;
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001244
Miklos Szeredid233c7d2018-12-03 10:14:43 +01001245 if (perm_mask & READ_ONCE(fi->inval_mask) ||
1246 time_before64(fi->i_time, get_jiffies_64())) {
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001247 refreshed = true;
1248
Al Viro10556cb22011-06-20 19:28:19 -04001249 err = fuse_perm_getattr(inode, mask);
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001250 if (err)
1251 return err;
1252 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001253 }
1254
Miklos Szeredi29433a22016-10-01 07:32:32 +02001255 if (fc->default_permissions) {
Al Viro2830ba72011-06-20 19:16:29 -04001256 err = generic_permission(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001257
1258 /* If permission is denied, try to refresh file
1259 attributes. This is also needed, because the root
1260 node will at first have no permissions */
Miklos Szeredi244f6382007-10-16 23:31:02 -07001261 if (err == -EACCES && !refreshed) {
Al Viro10556cb22011-06-20 19:28:19 -04001262 err = fuse_perm_getattr(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001263 if (!err)
Al Viro2830ba72011-06-20 19:16:29 -04001264 err = generic_permission(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001265 }
1266
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001267 /* Note: the opposite of the above test does not
1268 exist. So if permissions are revoked this won't be
1269 noticed immediately, only after the attribute
1270 timeout has expired */
Eric Paris9cfcac82010-07-23 11:43:51 -04001271 } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
Miklos Szeredie8e96152007-10-16 23:31:06 -07001272 err = fuse_access(inode, mask);
1273 } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1274 if (!(inode->i_mode & S_IXUGO)) {
1275 if (refreshed)
1276 return -EACCES;
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001277
Al Viro10556cb22011-06-20 19:28:19 -04001278 err = fuse_perm_getattr(inode, mask);
Miklos Szeredie8e96152007-10-16 23:31:06 -07001279 if (!err && !(inode->i_mode & S_IXUGO))
1280 return -EACCES;
1281 }
Miklos Szeredie5e55582005-09-09 13:10:28 -07001282 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001283 return err;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001284}
1285
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001286static int fuse_readlink_page(struct inode *inode, struct page *page)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001287{
Max Reitzfcee2162020-05-06 17:44:12 +02001288 struct fuse_mount *fm = get_fuse_mount(inode);
Miklos Szeredi4c29afe2019-09-10 15:04:09 +02001289 struct fuse_page_desc desc = { .length = PAGE_SIZE - 1 };
1290 struct fuse_args_pages ap = {
1291 .num_pages = 1,
1292 .pages = &page,
1293 .descs = &desc,
1294 };
1295 char *link;
1296 ssize_t res;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001297
Miklos Szeredi4c29afe2019-09-10 15:04:09 +02001298 ap.args.opcode = FUSE_READLINK;
1299 ap.args.nodeid = get_node_id(inode);
1300 ap.args.out_pages = true;
1301 ap.args.out_argvar = true;
1302 ap.args.page_zeroing = true;
1303 ap.args.out_numargs = 1;
1304 ap.args.out_args[0].size = desc.length;
Max Reitzfcee2162020-05-06 17:44:12 +02001305 res = fuse_simple_request(fm, &ap.args);
Al Viro6b255392015-11-17 10:20:54 -05001306
Andrew Gallagher451418f2013-11-05 03:55:43 -08001307 fuse_invalidate_atime(inode);
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001308
Miklos Szeredi4c29afe2019-09-10 15:04:09 +02001309 if (res < 0)
1310 return res;
1311
1312 if (WARN_ON(res >= PAGE_SIZE))
1313 return -EIO;
1314
1315 link = page_address(page);
1316 link[res] = '\0';
1317
1318 return 0;
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001319}
1320
1321static const char *fuse_get_link(struct dentry *dentry, struct inode *inode,
1322 struct delayed_call *callback)
1323{
1324 struct fuse_conn *fc = get_fuse_conn(inode);
1325 struct page *page;
1326 int err;
1327
1328 err = -EIO;
1329 if (is_bad_inode(inode))
1330 goto out_err;
1331
1332 if (fc->cache_symlinks)
1333 return page_get_link(dentry, inode, callback);
1334
1335 err = -ECHILD;
1336 if (!dentry)
1337 goto out_err;
1338
1339 page = alloc_page(GFP_KERNEL);
1340 err = -ENOMEM;
1341 if (!page)
1342 goto out_err;
1343
1344 err = fuse_readlink_page(inode, page);
1345 if (err) {
1346 __free_page(page);
1347 goto out_err;
1348 }
1349
1350 set_delayed_call(callback, page_put_link, page);
1351
1352 return page_address(page);
1353
1354out_err:
1355 return ERR_PTR(err);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001356}
1357
Miklos Szeredie5e55582005-09-09 13:10:28 -07001358static int fuse_dir_open(struct inode *inode, struct file *file)
1359{
Miklos Szeredi91fe96b2009-04-28 16:56:37 +02001360 return fuse_open_common(inode, file, true);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001361}
1362
1363static int fuse_dir_release(struct inode *inode, struct file *file)
1364{
Chad Austin2e64ff12018-12-10 10:54:52 -08001365 fuse_release_common(file, true);
Miklos Szeredi8b0797a2009-04-28 16:56:39 +02001366
1367 return 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001368}
1369
Josef Bacik02c24a82011-07-16 20:44:56 -04001370static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1371 int datasync)
Miklos Szeredi82547982005-09-09 13:10:38 -07001372{
Miklos Szeredia9c2d1e2018-12-03 10:14:43 +01001373 struct inode *inode = file->f_mapping->host;
1374 struct fuse_conn *fc = get_fuse_conn(inode);
1375 int err;
1376
1377 if (is_bad_inode(inode))
1378 return -EIO;
1379
1380 if (fc->no_fsyncdir)
1381 return 0;
1382
1383 inode_lock(inode);
1384 err = fuse_fsync_common(file, start, end, datasync, FUSE_FSYNCDIR);
1385 if (err == -ENOSYS) {
1386 fc->no_fsyncdir = 1;
1387 err = 0;
1388 }
1389 inode_unlock(inode);
1390
1391 return err;
Miklos Szeredi82547982005-09-09 13:10:38 -07001392}
1393
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001394static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1395 unsigned long arg)
1396{
1397 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1398
1399 /* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1400 if (fc->minor < 18)
1401 return -ENOTTY;
1402
1403 return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1404}
1405
1406static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1407 unsigned long arg)
1408{
1409 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1410
1411 if (fc->minor < 18)
1412 return -ENOTTY;
1413
1414 return fuse_ioctl_common(file, cmd, arg,
1415 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1416}
1417
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001418static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001419{
1420 /* Always update if mtime is explicitly set */
1421 if (ivalid & ATTR_MTIME_SET)
1422 return true;
1423
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001424 /* Or if kernel i_mtime is the official one */
1425 if (trust_local_mtime)
1426 return true;
1427
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001428 /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1429 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1430 return false;
1431
1432 /* In all other cases update */
1433 return true;
1434}
1435
Eric W. Biederman8cb08322018-02-21 11:18:07 -06001436static void iattr_to_fattr(struct fuse_conn *fc, struct iattr *iattr,
1437 struct fuse_setattr_in *arg, bool trust_local_cmtime)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001438{
1439 unsigned ivalid = iattr->ia_valid;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001440
1441 if (ivalid & ATTR_MODE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001442 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001443 if (ivalid & ATTR_UID)
Eric W. Biederman8cb08322018-02-21 11:18:07 -06001444 arg->valid |= FATTR_UID, arg->uid = from_kuid(fc->user_ns, iattr->ia_uid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001445 if (ivalid & ATTR_GID)
Eric W. Biederman8cb08322018-02-21 11:18:07 -06001446 arg->valid |= FATTR_GID, arg->gid = from_kgid(fc->user_ns, iattr->ia_gid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001447 if (ivalid & ATTR_SIZE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001448 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001449 if (ivalid & ATTR_ATIME) {
1450 arg->valid |= FATTR_ATIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001451 arg->atime = iattr->ia_atime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001452 arg->atimensec = iattr->ia_atime.tv_nsec;
1453 if (!(ivalid & ATTR_ATIME_SET))
1454 arg->valid |= FATTR_ATIME_NOW;
1455 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001456 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001457 arg->valid |= FATTR_MTIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001458 arg->mtime = iattr->ia_mtime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001459 arg->mtimensec = iattr->ia_mtime.tv_nsec;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001460 if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001461 arg->valid |= FATTR_MTIME_NOW;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001462 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001463 if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
1464 arg->valid |= FATTR_CTIME;
1465 arg->ctime = iattr->ia_ctime.tv_sec;
1466 arg->ctimensec = iattr->ia_ctime.tv_nsec;
1467 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001468}
1469
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001470/*
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001471 * Prevent concurrent writepages on inode
1472 *
1473 * This is done by adding a negative bias to the inode write counter
1474 * and waiting for all pending writes to finish.
1475 */
1476void fuse_set_nowrite(struct inode *inode)
1477{
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001478 struct fuse_inode *fi = get_fuse_inode(inode);
1479
Al Viro59551022016-01-22 15:40:57 -05001480 BUG_ON(!inode_is_locked(inode));
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001481
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001482 spin_lock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001483 BUG_ON(fi->writectr < 0);
1484 fi->writectr += FUSE_NOWRITE;
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001485 spin_unlock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001486 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1487}
1488
1489/*
1490 * Allow writepages on inode
1491 *
1492 * Remove the bias from the writecounter and send any queued
1493 * writepages.
1494 */
1495static void __fuse_release_nowrite(struct inode *inode)
1496{
1497 struct fuse_inode *fi = get_fuse_inode(inode);
1498
1499 BUG_ON(fi->writectr != FUSE_NOWRITE);
1500 fi->writectr = 0;
1501 fuse_flush_writepages(inode);
1502}
1503
1504void fuse_release_nowrite(struct inode *inode)
1505{
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001506 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001507
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001508 spin_lock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001509 __fuse_release_nowrite(inode);
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001510 spin_unlock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001511}
1512
Miklos Szeredi70781872014-12-12 09:49:05 +01001513static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001514 struct inode *inode,
1515 struct fuse_setattr_in *inarg_p,
1516 struct fuse_attr_out *outarg_p)
1517{
Miklos Szeredid5b48542019-09-10 15:04:08 +02001518 args->opcode = FUSE_SETATTR;
1519 args->nodeid = get_node_id(inode);
1520 args->in_numargs = 1;
1521 args->in_args[0].size = sizeof(*inarg_p);
1522 args->in_args[0].value = inarg_p;
1523 args->out_numargs = 1;
1524 args->out_args[0].size = sizeof(*outarg_p);
1525 args->out_args[0].value = outarg_p;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001526}
1527
1528/*
1529 * Flush inode->i_mtime to the server
1530 */
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001531int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001532{
Max Reitzfcee2162020-05-06 17:44:12 +02001533 struct fuse_mount *fm = get_fuse_mount(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001534 FUSE_ARGS(args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001535 struct fuse_setattr_in inarg;
1536 struct fuse_attr_out outarg;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001537
1538 memset(&inarg, 0, sizeof(inarg));
1539 memset(&outarg, 0, sizeof(outarg));
1540
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001541 inarg.valid = FATTR_MTIME;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001542 inarg.mtime = inode->i_mtime.tv_sec;
1543 inarg.mtimensec = inode->i_mtime.tv_nsec;
Max Reitzfcee2162020-05-06 17:44:12 +02001544 if (fm->fc->minor >= 23) {
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001545 inarg.valid |= FATTR_CTIME;
1546 inarg.ctime = inode->i_ctime.tv_sec;
1547 inarg.ctimensec = inode->i_ctime.tv_nsec;
1548 }
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001549 if (ff) {
1550 inarg.valid |= FATTR_FH;
1551 inarg.fh = ff->fh;
1552 }
Max Reitzfcee2162020-05-06 17:44:12 +02001553 fuse_setattr_fill(fm->fc, &args, inode, &inarg, &outarg);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001554
Max Reitzfcee2162020-05-06 17:44:12 +02001555 return fuse_simple_request(fm, &args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001556}
1557
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001558/*
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001559 * Set attributes, and at the same time refresh them.
1560 *
1561 * Truncation is slightly complicated, because the 'truncate' request
1562 * may fail, in which case we don't want to touch the mapping.
Miklos Szeredi9ffbb912006-10-17 00:10:06 -07001563 * vmtruncate() doesn't allow for this case, so do the rlimit checking
1564 * and the actual truncation by hand.
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001565 */
Jan Kara62490332016-05-26 17:12:41 +02001566int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001567 struct file *file)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001568{
Jan Kara62490332016-05-26 17:12:41 +02001569 struct inode *inode = d_inode(dentry);
Max Reitzfcee2162020-05-06 17:44:12 +02001570 struct fuse_mount *fm = get_fuse_mount(inode);
1571 struct fuse_conn *fc = fm->fc;
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001572 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001573 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001574 struct fuse_setattr_in inarg;
1575 struct fuse_attr_out outarg;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001576 bool is_truncate = false;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001577 bool is_wb = fc->writeback_cache;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001578 loff_t oldsize;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001579 int err;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001580 bool trust_local_cmtime = is_wb && S_ISREG(inode->i_mode);
Vivek Goyal6ae330c2020-08-19 18:19:54 -04001581 bool fault_blocked = false;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001582
Miklos Szeredi29433a22016-10-01 07:32:32 +02001583 if (!fc->default_permissions)
Christoph Hellwigdb78b872010-06-04 11:30:03 +02001584 attr->ia_valid |= ATTR_FORCE;
1585
Jan Kara31051c82016-05-26 16:55:18 +02001586 err = setattr_prepare(dentry, attr);
Christoph Hellwigdb78b872010-06-04 11:30:03 +02001587 if (err)
1588 return err;
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001589
Vivek Goyal6ae330c2020-08-19 18:19:54 -04001590 if (attr->ia_valid & ATTR_SIZE) {
1591 if (WARN_ON(!S_ISREG(inode->i_mode)))
1592 return -EIO;
1593 is_truncate = true;
1594 }
1595
1596 if (FUSE_IS_DAX(inode) && is_truncate) {
1597 down_write(&fi->i_mmap_sem);
1598 fault_blocked = true;
1599 err = fuse_dax_break_layouts(inode, 0, 0);
1600 if (err) {
1601 up_write(&fi->i_mmap_sem);
1602 return err;
1603 }
1604 }
1605
Miklos Szeredi8d56add2011-02-25 14:44:58 +01001606 if (attr->ia_valid & ATTR_OPEN) {
Miklos Szeredidf0e91d2018-02-08 15:17:38 +01001607 /* This is coming from open(..., ... | O_TRUNC); */
1608 WARN_ON(!(attr->ia_valid & ATTR_SIZE));
1609 WARN_ON(attr->ia_size != 0);
1610 if (fc->atomic_o_trunc) {
1611 /*
1612 * No need to send request to userspace, since actual
1613 * truncation has already been done by OPEN. But still
1614 * need to truncate page cache.
1615 */
1616 i_size_write(inode, 0);
1617 truncate_pagecache(inode, 0);
Vivek Goyal6ae330c2020-08-19 18:19:54 -04001618 goto out;
Miklos Szeredidf0e91d2018-02-08 15:17:38 +01001619 }
Miklos Szeredi8d56add2011-02-25 14:44:58 +01001620 file = NULL;
1621 }
Miklos Szeredi6ff958e2007-10-18 03:07:02 -07001622
Miklos Szeredib24e7592019-10-23 14:26:37 +02001623 /* Flush dirty data/metadata before non-truncate SETATTR */
1624 if (is_wb && S_ISREG(inode->i_mode) &&
1625 attr->ia_valid &
1626 (ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_MTIME_SET |
1627 ATTR_TIMES_SET)) {
1628 err = write_inode_now(inode, true);
1629 if (err)
1630 return err;
1631
1632 fuse_set_nowrite(inode);
1633 fuse_release_nowrite(inode);
1634 }
1635
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001636 if (is_truncate) {
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001637 fuse_set_nowrite(inode);
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001638 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001639 if (trust_local_cmtime && attr->ia_size != inode->i_size)
1640 attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001641 }
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001642
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001643 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -07001644 memset(&outarg, 0, sizeof(outarg));
Eric W. Biederman8cb08322018-02-21 11:18:07 -06001645 iattr_to_fattr(fc, attr, &inarg, trust_local_cmtime);
Miklos Szeredi49d49142007-10-18 03:07:00 -07001646 if (file) {
1647 struct fuse_file *ff = file->private_data;
1648 inarg.valid |= FATTR_FH;
1649 inarg.fh = ff->fh;
1650 }
Miklos Szeredif3332112007-10-18 03:07:04 -07001651 if (attr->ia_valid & ATTR_SIZE) {
1652 /* For mandatory locking in truncate */
1653 inarg.valid |= FATTR_LOCKOWNER;
1654 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1655 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001656 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
Max Reitzfcee2162020-05-06 17:44:12 +02001657 err = fuse_simple_request(fm, &args);
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001658 if (err) {
1659 if (err == -EINTR)
1660 fuse_invalidate_attr(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001661 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001662 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001663
Miklos Szeredieb59bd12019-11-12 11:49:04 +01001664 if (fuse_invalid_attr(&outarg.attr) ||
1665 (inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001666 make_bad_inode(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001667 err = -EIO;
1668 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001669 }
1670
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001671 spin_lock(&fi->lock);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001672 /* the kernel maintains i_mtime locally */
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001673 if (trust_local_cmtime) {
1674 if (attr->ia_valid & ATTR_MTIME)
1675 inode->i_mtime = attr->ia_mtime;
1676 if (attr->ia_valid & ATTR_CTIME)
1677 inode->i_ctime = attr->ia_ctime;
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001678 /* FIXME: clear I_DIRTY_SYNC? */
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001679 }
1680
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001681 fuse_change_attributes_common(inode, &outarg.attr,
1682 attr_timeout(&outarg));
1683 oldsize = inode->i_size;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001684 /* see the comment in fuse_change_attributes() */
1685 if (!is_wb || is_truncate || !S_ISREG(inode->i_mode))
1686 i_size_write(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001687
1688 if (is_truncate) {
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001689 /* NOTE: this may release/reacquire fi->lock */
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001690 __fuse_release_nowrite(inode);
1691 }
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001692 spin_unlock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001693
1694 /*
1695 * Only call invalidate_inode_pages2() after removing
1696 * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1697 */
Pavel Emelyanov83732002013-10-10 17:10:46 +04001698 if ((is_truncate || !is_wb) &&
1699 S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
Kirill A. Shutemov7caef262013-09-12 15:13:56 -07001700 truncate_pagecache(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001701 invalidate_inode_pages2(inode->i_mapping);
1702 }
1703
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001704 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Vivek Goyal6ae330c2020-08-19 18:19:54 -04001705out:
1706 if (fault_blocked)
1707 up_write(&fi->i_mmap_sem);
1708
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001709 return 0;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001710
1711error:
1712 if (is_truncate)
1713 fuse_release_nowrite(inode);
1714
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001715 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Vivek Goyal6ae330c2020-08-19 18:19:54 -04001716
1717 if (fault_blocked)
1718 up_write(&fi->i_mmap_sem);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001719 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001720}
1721
Miklos Szeredi49d49142007-10-18 03:07:00 -07001722static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1723{
David Howells2b0143b2015-03-17 22:25:59 +00001724 struct inode *inode = d_inode(entry);
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001725 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001726 struct file *file = (attr->ia_valid & ATTR_FILE) ? attr->ia_file : NULL;
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001727 int ret;
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001728
1729 if (!fuse_allow_current_process(get_fuse_conn(inode)))
1730 return -EACCES;
1731
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001732 if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001733 attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
1734 ATTR_MODE);
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001735
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001736 /*
1737 * The only sane way to reliably kill suid/sgid is to do it in
1738 * the userspace filesystem
1739 *
1740 * This should be done on write(), truncate() and chown().
1741 */
1742 if (!fc->handle_killpriv) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001743 /*
1744 * ia_mode calculation may have used stale i_mode.
1745 * Refresh and recalculate.
1746 */
1747 ret = fuse_do_getattr(inode, NULL, file);
1748 if (ret)
1749 return ret;
1750
1751 attr->ia_mode = inode->i_mode;
Miklos Szeredic01638f2016-12-06 16:18:45 +01001752 if (inode->i_mode & S_ISUID) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001753 attr->ia_valid |= ATTR_MODE;
1754 attr->ia_mode &= ~S_ISUID;
1755 }
Miklos Szeredic01638f2016-12-06 16:18:45 +01001756 if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001757 attr->ia_valid |= ATTR_MODE;
1758 attr->ia_mode &= ~S_ISGID;
1759 }
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001760 }
1761 }
1762 if (!attr->ia_valid)
1763 return 0;
1764
Linus Torvaldsabb5a142016-10-10 13:04:49 -07001765 ret = fuse_do_setattr(entry, attr, file);
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001766 if (!ret) {
Seth Forshee60bcc882016-08-29 08:46:37 -05001767 /*
1768 * If filesystem supports acls it may have updated acl xattrs in
1769 * the filesystem, so forget cached acls for the inode.
1770 */
1771 if (fc->posix_acl)
1772 forget_all_cached_acls(inode);
1773
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001774 /* Directory mode changed, may need to revalidate access */
1775 if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE))
1776 fuse_invalidate_entry_cache(entry);
1777 }
1778 return ret;
Miklos Szeredi49d49142007-10-18 03:07:00 -07001779}
1780
David Howellsa528d352017-01-31 16:46:22 +00001781static int fuse_getattr(const struct path *path, struct kstat *stat,
1782 u32 request_mask, unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001783{
David Howellsa528d352017-01-31 16:46:22 +00001784 struct inode *inode = d_inode(path->dentry);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001785 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001786
Miklos Szeredi5157da22020-05-19 14:50:37 +02001787 if (!fuse_allow_current_process(fc)) {
1788 if (!request_mask) {
1789 /*
1790 * If user explicitly requested *nothing* then don't
1791 * error out, but return st_dev only.
1792 */
1793 stat->result_mask = 0;
1794 stat->dev = inode->i_sb->s_dev;
1795 return 0;
1796 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001797 return -EACCES;
Miklos Szeredi5157da22020-05-19 14:50:37 +02001798 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001799
Miklos Szeredi2f1e8192018-10-15 15:43:06 +02001800 return fuse_update_get_attr(inode, NULL, stat, request_mask, flags);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001801}
1802
Arjan van de Ven754661f2007-02-12 00:55:38 -08001803static const struct inode_operations fuse_dir_inode_operations = {
Miklos Szeredie5e55582005-09-09 13:10:28 -07001804 .lookup = fuse_lookup,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001805 .mkdir = fuse_mkdir,
1806 .symlink = fuse_symlink,
1807 .unlink = fuse_unlink,
1808 .rmdir = fuse_rmdir,
Miklos Szeredi2773bf02016-09-27 11:03:58 +02001809 .rename = fuse_rename2,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001810 .link = fuse_link,
1811 .setattr = fuse_setattr,
1812 .create = fuse_create,
Miklos Szeredic8ccbe02012-06-05 15:10:22 +02001813 .atomic_open = fuse_atomic_open,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001814 .mknod = fuse_mknod,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001815 .permission = fuse_permission,
1816 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001817 .listxattr = fuse_listxattr,
Seth Forshee60bcc882016-08-29 08:46:37 -05001818 .get_acl = fuse_get_acl,
1819 .set_acl = fuse_set_acl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001820};
1821
Arjan van de Ven4b6f5d22006-03-28 01:56:42 -08001822static const struct file_operations fuse_dir_operations = {
Miklos Szeredib6aeade2005-09-09 13:10:30 -07001823 .llseek = generic_file_llseek,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001824 .read = generic_read_dir,
Al Virod9b3dbd2016-04-20 17:30:32 -04001825 .iterate_shared = fuse_readdir,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001826 .open = fuse_dir_open,
1827 .release = fuse_dir_release,
Miklos Szeredi82547982005-09-09 13:10:38 -07001828 .fsync = fuse_dir_fsync,
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001829 .unlocked_ioctl = fuse_dir_ioctl,
1830 .compat_ioctl = fuse_dir_compat_ioctl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001831};
1832
Arjan van de Ven754661f2007-02-12 00:55:38 -08001833static const struct inode_operations fuse_common_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001834 .setattr = fuse_setattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001835 .permission = fuse_permission,
1836 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001837 .listxattr = fuse_listxattr,
Seth Forshee60bcc882016-08-29 08:46:37 -05001838 .get_acl = fuse_get_acl,
1839 .set_acl = fuse_set_acl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001840};
1841
Arjan van de Ven754661f2007-02-12 00:55:38 -08001842static const struct inode_operations fuse_symlink_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001843 .setattr = fuse_setattr,
Al Viro6b255392015-11-17 10:20:54 -05001844 .get_link = fuse_get_link,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001845 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001846 .listxattr = fuse_listxattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001847};
1848
1849void fuse_init_common(struct inode *inode)
1850{
1851 inode->i_op = &fuse_common_inode_operations;
1852}
1853
1854void fuse_init_dir(struct inode *inode)
1855{
Miklos Szerediab2257e2018-10-01 10:07:05 +02001856 struct fuse_inode *fi = get_fuse_inode(inode);
1857
Miklos Szeredie5e55582005-09-09 13:10:28 -07001858 inode->i_op = &fuse_dir_inode_operations;
1859 inode->i_fop = &fuse_dir_operations;
Miklos Szerediab2257e2018-10-01 10:07:05 +02001860
1861 spin_lock_init(&fi->rdc.lock);
1862 fi->rdc.cached = false;
1863 fi->rdc.size = 0;
1864 fi->rdc.pos = 0;
1865 fi->rdc.version = 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001866}
1867
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001868static int fuse_symlink_readpage(struct file *null, struct page *page)
1869{
1870 int err = fuse_readlink_page(page->mapping->host, page);
1871
1872 if (!err)
1873 SetPageUptodate(page);
1874
1875 unlock_page(page);
1876
1877 return err;
1878}
1879
1880static const struct address_space_operations fuse_symlink_aops = {
1881 .readpage = fuse_symlink_readpage,
1882};
1883
Miklos Szeredie5e55582005-09-09 13:10:28 -07001884void fuse_init_symlink(struct inode *inode)
1885{
1886 inode->i_op = &fuse_symlink_inode_operations;
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001887 inode->i_data.a_ops = &fuse_symlink_aops;
1888 inode_nohighmem(inode);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001889}