xref: /openbmc/linux/fs/fuse/dir.c (revision b74d24f7)
1e5e5558eSMiklos Szeredi /*
2e5e5558eSMiklos Szeredi   FUSE: Filesystem in Userspace
31729a16cSMiklos Szeredi   Copyright (C) 2001-2008  Miklos Szeredi <miklos@szeredi.hu>
4e5e5558eSMiklos Szeredi 
5e5e5558eSMiklos Szeredi   This program can be distributed under the terms of the GNU GPL.
6e5e5558eSMiklos Szeredi   See the file COPYING.
7e5e5558eSMiklos Szeredi */
8e5e5558eSMiklos Szeredi 
9e5e5558eSMiklos Szeredi #include "fuse_i.h"
10e5e5558eSMiklos Szeredi 
11e5e5558eSMiklos Szeredi #include <linux/pagemap.h>
12e5e5558eSMiklos Szeredi #include <linux/file.h>
13bf109c64SMax Reitz #include <linux/fs_context.h>
149ccf47b2SDave Marchevsky #include <linux/moduleparam.h>
15e5e5558eSMiklos Szeredi #include <linux/sched.h>
16e5e5558eSMiklos Szeredi #include <linux/namei.h>
1707e77dcaSMiklos Szeredi #include <linux/slab.h>
18703c7362SSeth Forshee #include <linux/xattr.h>
19261aaba7SMiklos Szeredi #include <linux/iversion.h>
2060bcc88aSSeth Forshee #include <linux/posix_acl.h>
213e2b6fdbSVivek Goyal #include <linux/security.h>
223e2b6fdbSVivek Goyal #include <linux/types.h>
233e2b6fdbSVivek Goyal #include <linux/kernel.h>
24e5e5558eSMiklos Szeredi 
259ccf47b2SDave Marchevsky static bool __read_mostly allow_sys_admin_access;
269ccf47b2SDave Marchevsky module_param(allow_sys_admin_access, bool, 0644);
279ccf47b2SDave Marchevsky MODULE_PARM_DESC(allow_sys_admin_access,
289ccf47b2SDave Marchevsky 		 "Allow users with CAP_SYS_ADMIN in initial userns to bypass allow_other access check");
299ccf47b2SDave Marchevsky 
304582a4abSFeng Shuo static void fuse_advise_use_readdirplus(struct inode *dir)
314582a4abSFeng Shuo {
324582a4abSFeng Shuo 	struct fuse_inode *fi = get_fuse_inode(dir);
334582a4abSFeng Shuo 
344582a4abSFeng Shuo 	set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state);
354582a4abSFeng Shuo }
364582a4abSFeng Shuo 
3730c6a23dSKhazhismel Kumykov #if BITS_PER_LONG >= 64
3830c6a23dSKhazhismel Kumykov static inline void __fuse_dentry_settime(struct dentry *entry, u64 time)
3930c6a23dSKhazhismel Kumykov {
4030c6a23dSKhazhismel Kumykov 	entry->d_fsdata = (void *) time;
4130c6a23dSKhazhismel Kumykov }
4230c6a23dSKhazhismel Kumykov 
4330c6a23dSKhazhismel Kumykov static inline u64 fuse_dentry_time(const struct dentry *entry)
4430c6a23dSKhazhismel Kumykov {
4530c6a23dSKhazhismel Kumykov 	return (u64)entry->d_fsdata;
4630c6a23dSKhazhismel Kumykov }
4730c6a23dSKhazhismel Kumykov 
4830c6a23dSKhazhismel Kumykov #else
49f75fdf22SMiklos Szeredi union fuse_dentry {
50f75fdf22SMiklos Szeredi 	u64 time;
51f75fdf22SMiklos Szeredi 	struct rcu_head rcu;
52f75fdf22SMiklos Szeredi };
53f75fdf22SMiklos Szeredi 
5430c6a23dSKhazhismel Kumykov static inline void __fuse_dentry_settime(struct dentry *dentry, u64 time)
5530c6a23dSKhazhismel Kumykov {
5630c6a23dSKhazhismel Kumykov 	((union fuse_dentry *) dentry->d_fsdata)->time = time;
5730c6a23dSKhazhismel Kumykov }
5830c6a23dSKhazhismel Kumykov 
5930c6a23dSKhazhismel Kumykov static inline u64 fuse_dentry_time(const struct dentry *entry)
6030c6a23dSKhazhismel Kumykov {
6130c6a23dSKhazhismel Kumykov 	return ((union fuse_dentry *) entry->d_fsdata)->time;
6230c6a23dSKhazhismel Kumykov }
6330c6a23dSKhazhismel Kumykov #endif
6430c6a23dSKhazhismel Kumykov 
658fab0106SMiklos Szeredi static void fuse_dentry_settime(struct dentry *dentry, u64 time)
660a0898cfSMiklos Szeredi {
678fab0106SMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn_super(dentry->d_sb);
688fab0106SMiklos Szeredi 	bool delete = !time && fc->delete_stale;
698fab0106SMiklos Szeredi 	/*
708fab0106SMiklos Szeredi 	 * Mess with DCACHE_OP_DELETE because dput() will be faster without it.
718fab0106SMiklos Szeredi 	 * Don't care about races, either way it's just an optimization
728fab0106SMiklos Szeredi 	 */
738fab0106SMiklos Szeredi 	if ((!delete && (dentry->d_flags & DCACHE_OP_DELETE)) ||
748fab0106SMiklos Szeredi 	    (delete && !(dentry->d_flags & DCACHE_OP_DELETE))) {
758fab0106SMiklos Szeredi 		spin_lock(&dentry->d_lock);
768fab0106SMiklos Szeredi 		if (!delete)
778fab0106SMiklos Szeredi 			dentry->d_flags &= ~DCACHE_OP_DELETE;
788fab0106SMiklos Szeredi 		else
798fab0106SMiklos Szeredi 			dentry->d_flags |= DCACHE_OP_DELETE;
808fab0106SMiklos Szeredi 		spin_unlock(&dentry->d_lock);
810a0898cfSMiklos Szeredi 	}
820a0898cfSMiklos Szeredi 
8330c6a23dSKhazhismel Kumykov 	__fuse_dentry_settime(dentry, time);
840a0898cfSMiklos Szeredi }
850a0898cfSMiklos Szeredi 
866f9f1180SMiklos Szeredi /*
876f9f1180SMiklos Szeredi  * FUSE caches dentries and attributes with separate timeout.  The
886f9f1180SMiklos Szeredi  * time in jiffies until the dentry/attributes are valid is stored in
89f75fdf22SMiklos Szeredi  * dentry->d_fsdata and fuse_inode->i_time respectively.
906f9f1180SMiklos Szeredi  */
916f9f1180SMiklos Szeredi 
926f9f1180SMiklos Szeredi /*
936f9f1180SMiklos Szeredi  * Calculate the time in jiffies until a dentry/attributes are valid
946f9f1180SMiklos Szeredi  */
95bcb6f6d2SMiklos Szeredi static u64 time_to_jiffies(u64 sec, u32 nsec)
96e5e5558eSMiklos Szeredi {
97685d16ddSMiklos Szeredi 	if (sec || nsec) {
98bcb6f6d2SMiklos Szeredi 		struct timespec64 ts = {
99bcb6f6d2SMiklos Szeredi 			sec,
10021067527SDavid Sheets 			min_t(u32, nsec, NSEC_PER_SEC - 1)
101bcb6f6d2SMiklos Szeredi 		};
102bcb6f6d2SMiklos Szeredi 
103bcb6f6d2SMiklos Szeredi 		return get_jiffies_64() + timespec64_to_jiffies(&ts);
104685d16ddSMiklos Szeredi 	} else
1050a0898cfSMiklos Szeredi 		return 0;
106e5e5558eSMiklos Szeredi }
107e5e5558eSMiklos Szeredi 
1086f9f1180SMiklos Szeredi /*
1096f9f1180SMiklos Szeredi  * Set dentry and possibly attribute timeouts from the lookup/mk*
1106f9f1180SMiklos Szeredi  * replies
1116f9f1180SMiklos Szeredi  */
112d123d8e1SMiklos Szeredi void fuse_change_entry_timeout(struct dentry *entry, struct fuse_entry_out *o)
1130aa7c699SMiklos Szeredi {
1140a0898cfSMiklos Szeredi 	fuse_dentry_settime(entry,
1150a0898cfSMiklos Szeredi 		time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
1161fb69e78SMiklos Szeredi }
1171fb69e78SMiklos Szeredi 
1181fb69e78SMiklos Szeredi static u64 attr_timeout(struct fuse_attr_out *o)
1191fb69e78SMiklos Szeredi {
1201fb69e78SMiklos Szeredi 	return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
1211fb69e78SMiklos Szeredi }
1221fb69e78SMiklos Szeredi 
123d123d8e1SMiklos Szeredi u64 entry_attr_timeout(struct fuse_entry_out *o)
1241fb69e78SMiklos Szeredi {
1251fb69e78SMiklos Szeredi 	return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
1268cbdf1e6SMiklos Szeredi }
1278cbdf1e6SMiklos Szeredi 
128fa5eee57SMiklos Szeredi void fuse_invalidate_attr_mask(struct inode *inode, u32 mask)
1292f1e8196SMiklos Szeredi {
1302f1e8196SMiklos Szeredi 	set_mask_bits(&get_fuse_inode(inode)->inval_mask, 0, mask);
1312f1e8196SMiklos Szeredi }
1322f1e8196SMiklos Szeredi 
1336f9f1180SMiklos Szeredi /*
1346f9f1180SMiklos Szeredi  * Mark the attributes as stale, so that at the next call to
1356f9f1180SMiklos Szeredi  * ->getattr() they will be fetched from userspace
1366f9f1180SMiklos Szeredi  */
1378cbdf1e6SMiklos Szeredi void fuse_invalidate_attr(struct inode *inode)
1388cbdf1e6SMiklos Szeredi {
1392f1e8196SMiklos Szeredi 	fuse_invalidate_attr_mask(inode, STATX_BASIC_STATS);
1408cbdf1e6SMiklos Szeredi }
1418cbdf1e6SMiklos Szeredi 
142261aaba7SMiklos Szeredi static void fuse_dir_changed(struct inode *dir)
143261aaba7SMiklos Szeredi {
144261aaba7SMiklos Szeredi 	fuse_invalidate_attr(dir);
145261aaba7SMiklos Szeredi 	inode_maybe_inc_iversion(dir, false);
146261aaba7SMiklos Szeredi }
147261aaba7SMiklos Szeredi 
148451418fcSAndrew Gallagher /**
149451418fcSAndrew Gallagher  * Mark the attributes as stale due to an atime change.  Avoid the invalidate if
150451418fcSAndrew Gallagher  * atime is not used.
151451418fcSAndrew Gallagher  */
152451418fcSAndrew Gallagher void fuse_invalidate_atime(struct inode *inode)
153451418fcSAndrew Gallagher {
154451418fcSAndrew Gallagher 	if (!IS_RDONLY(inode))
1552f1e8196SMiklos Szeredi 		fuse_invalidate_attr_mask(inode, STATX_ATIME);
156451418fcSAndrew Gallagher }
157451418fcSAndrew Gallagher 
1586f9f1180SMiklos Szeredi /*
1596f9f1180SMiklos Szeredi  * Just mark the entry as stale, so that a next attempt to look it up
1606f9f1180SMiklos Szeredi  * will result in a new lookup call to userspace
1616f9f1180SMiklos Szeredi  *
1626f9f1180SMiklos Szeredi  * This is called when a dentry is about to become negative and the
1636f9f1180SMiklos Szeredi  * timeout is unknown (unlink, rmdir, rename and in some cases
1646f9f1180SMiklos Szeredi  * lookup)
1656f9f1180SMiklos Szeredi  */
166dbd561d2SMiklos Szeredi void fuse_invalidate_entry_cache(struct dentry *entry)
1678cbdf1e6SMiklos Szeredi {
1680a0898cfSMiklos Szeredi 	fuse_dentry_settime(entry, 0);
1698cbdf1e6SMiklos Szeredi }
1708cbdf1e6SMiklos Szeredi 
1716f9f1180SMiklos Szeredi /*
1726f9f1180SMiklos Szeredi  * Same as fuse_invalidate_entry_cache(), but also try to remove the
1736f9f1180SMiklos Szeredi  * dentry from the hash
1746f9f1180SMiklos Szeredi  */
1758cbdf1e6SMiklos Szeredi static void fuse_invalidate_entry(struct dentry *entry)
1768cbdf1e6SMiklos Szeredi {
1778cbdf1e6SMiklos Szeredi 	d_invalidate(entry);
1788cbdf1e6SMiklos Szeredi 	fuse_invalidate_entry_cache(entry);
1790aa7c699SMiklos Szeredi }
1800aa7c699SMiklos Szeredi 
1817078187aSMiklos Szeredi static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_args *args,
18213983d06SAl Viro 			     u64 nodeid, const struct qstr *name,
183e5e5558eSMiklos Szeredi 			     struct fuse_entry_out *outarg)
184e5e5558eSMiklos Szeredi {
1850e9663eeSMiklos Szeredi 	memset(outarg, 0, sizeof(struct fuse_entry_out));
186d5b48543SMiklos Szeredi 	args->opcode = FUSE_LOOKUP;
187d5b48543SMiklos Szeredi 	args->nodeid = nodeid;
188d5b48543SMiklos Szeredi 	args->in_numargs = 1;
189d5b48543SMiklos Szeredi 	args->in_args[0].size = name->len + 1;
190d5b48543SMiklos Szeredi 	args->in_args[0].value = name->name;
191d5b48543SMiklos Szeredi 	args->out_numargs = 1;
192d5b48543SMiklos Szeredi 	args->out_args[0].size = sizeof(struct fuse_entry_out);
193d5b48543SMiklos Szeredi 	args->out_args[0].value = outarg;
194e5e5558eSMiklos Szeredi }
195e5e5558eSMiklos Szeredi 
1966f9f1180SMiklos Szeredi /*
1976f9f1180SMiklos Szeredi  * Check whether the dentry is still valid
1986f9f1180SMiklos Szeredi  *
1996f9f1180SMiklos Szeredi  * If the entry validity timeout has expired and the dentry is
2006f9f1180SMiklos Szeredi  * positive, try to redo the lookup.  If the lookup results in a
2016f9f1180SMiklos Szeredi  * different inode, then let the VFS invalidate the dentry and redo
2026f9f1180SMiklos Szeredi  * the lookup once more.  If the lookup results in the same inode,
2036f9f1180SMiklos Szeredi  * then refresh the attributes, timeouts and mark the dentry valid.
2046f9f1180SMiklos Szeredi  */
2050b728e19SAl Viro static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
206e5e5558eSMiklos Szeredi {
20734286d66SNick Piggin 	struct inode *inode;
20828420dadSMiklos Szeredi 	struct dentry *parent;
209fcee216bSMax Reitz 	struct fuse_mount *fm;
2106314efeeSMiklos Szeredi 	struct fuse_inode *fi;
211e2a6b952SMiklos Szeredi 	int ret;
2128cbdf1e6SMiklos Szeredi 
2132b0143b5SDavid Howells 	inode = d_inode_rcu(entry);
2145d069dbeSMiklos Szeredi 	if (inode && fuse_is_bad(inode))
215e2a6b952SMiklos Szeredi 		goto invalid;
216154210ccSAnand Avati 	else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
217ccc031e2SJiachen Zhang 		 (flags & (LOOKUP_EXCL | LOOKUP_REVAL | LOOKUP_RENAME_TARGET))) {
218e5e5558eSMiklos Szeredi 		struct fuse_entry_out outarg;
2197078187aSMiklos Szeredi 		FUSE_ARGS(args);
22007e77dcaSMiklos Szeredi 		struct fuse_forget_link *forget;
2211fb69e78SMiklos Szeredi 		u64 attr_version;
2228cbdf1e6SMiklos Szeredi 
22350322fe7SMiklos Szeredi 		/* For negative dentries, always do a fresh lookup */
2248cbdf1e6SMiklos Szeredi 		if (!inode)
225e2a6b952SMiklos Szeredi 			goto invalid;
2268cbdf1e6SMiklos Szeredi 
227e2a6b952SMiklos Szeredi 		ret = -ECHILD;
2280b728e19SAl Viro 		if (flags & LOOKUP_RCU)
229e2a6b952SMiklos Szeredi 			goto out;
230e7c0a167SMiklos Szeredi 
231fcee216bSMax Reitz 		fm = get_fuse_mount(inode);
232e5e5558eSMiklos Szeredi 
23307e77dcaSMiklos Szeredi 		forget = fuse_alloc_forget();
234e2a6b952SMiklos Szeredi 		ret = -ENOMEM;
2357078187aSMiklos Szeredi 		if (!forget)
236e2a6b952SMiklos Szeredi 			goto out;
2372d51013eSMiklos Szeredi 
238fcee216bSMax Reitz 		attr_version = fuse_get_attr_version(fm->fc);
2391fb69e78SMiklos Szeredi 
240e956edd0SMiklos Szeredi 		parent = dget_parent(entry);
241fcee216bSMax Reitz 		fuse_lookup_init(fm->fc, &args, get_node_id(d_inode(parent)),
242c180eebeSMiklos Szeredi 				 &entry->d_name, &outarg);
243fcee216bSMax Reitz 		ret = fuse_simple_request(fm, &args);
244e956edd0SMiklos Szeredi 		dput(parent);
24550322fe7SMiklos Szeredi 		/* Zero nodeid is same as -ENOENT */
2467078187aSMiklos Szeredi 		if (!ret && !outarg.nodeid)
2477078187aSMiklos Szeredi 			ret = -ENOENT;
2487078187aSMiklos Szeredi 		if (!ret) {
2496314efeeSMiklos Szeredi 			fi = get_fuse_inode(inode);
250bf109c64SMax Reitz 			if (outarg.nodeid != get_node_id(inode) ||
251bf109c64SMax Reitz 			    (bool) IS_AUTOMOUNT(inode) != (bool) (outarg.attr.flags & FUSE_ATTR_SUBMOUNT)) {
252fcee216bSMax Reitz 				fuse_queue_forget(fm->fc, forget,
253fcee216bSMax Reitz 						  outarg.nodeid, 1);
254e2a6b952SMiklos Szeredi 				goto invalid;
2559e6268dbSMiklos Szeredi 			}
256c9d8f5f0SKirill Tkhai 			spin_lock(&fi->lock);
2579e6268dbSMiklos Szeredi 			fi->nlookup++;
258c9d8f5f0SKirill Tkhai 			spin_unlock(&fi->lock);
2599e6268dbSMiklos Szeredi 		}
26007e77dcaSMiklos Szeredi 		kfree(forget);
2617078187aSMiklos Szeredi 		if (ret == -ENOMEM)
2627078187aSMiklos Szeredi 			goto out;
263eb59bd17SMiklos Szeredi 		if (ret || fuse_invalid_attr(&outarg.attr) ||
26415db1683SAmir Goldstein 		    fuse_stale_inode(inode, outarg.generation, &outarg.attr))
265e2a6b952SMiklos Szeredi 			goto invalid;
266e5e5558eSMiklos Szeredi 
26760bcc88aSSeth Forshee 		forget_all_cached_acls(inode);
2681fb69e78SMiklos Szeredi 		fuse_change_attributes(inode, &outarg.attr,
2691fb69e78SMiklos Szeredi 				       entry_attr_timeout(&outarg),
2701fb69e78SMiklos Szeredi 				       attr_version);
2711fb69e78SMiklos Szeredi 		fuse_change_entry_timeout(entry, &outarg);
27228420dadSMiklos Szeredi 	} else if (inode) {
2736314efeeSMiklos Szeredi 		fi = get_fuse_inode(inode);
2746314efeeSMiklos Szeredi 		if (flags & LOOKUP_RCU) {
2756314efeeSMiklos Szeredi 			if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state))
2766314efeeSMiklos Szeredi 				return -ECHILD;
2776314efeeSMiklos Szeredi 		} else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) {
27828420dadSMiklos Szeredi 			parent = dget_parent(entry);
2792b0143b5SDavid Howells 			fuse_advise_use_readdirplus(d_inode(parent));
28028420dadSMiklos Szeredi 			dput(parent);
281e5e5558eSMiklos Szeredi 		}
28228420dadSMiklos Szeredi 	}
283e2a6b952SMiklos Szeredi 	ret = 1;
284e2a6b952SMiklos Szeredi out:
285e2a6b952SMiklos Szeredi 	return ret;
286e2a6b952SMiklos Szeredi 
287e2a6b952SMiklos Szeredi invalid:
288e2a6b952SMiklos Szeredi 	ret = 0;
289e2a6b952SMiklos Szeredi 	goto out;
290e5e5558eSMiklos Szeredi }
291e5e5558eSMiklos Szeredi 
29230c6a23dSKhazhismel Kumykov #if BITS_PER_LONG < 64
293f75fdf22SMiklos Szeredi static int fuse_dentry_init(struct dentry *dentry)
294f75fdf22SMiklos Szeredi {
295dc69e98cSKhazhismel Kumykov 	dentry->d_fsdata = kzalloc(sizeof(union fuse_dentry),
296dc69e98cSKhazhismel Kumykov 				   GFP_KERNEL_ACCOUNT | __GFP_RECLAIMABLE);
297f75fdf22SMiklos Szeredi 
298f75fdf22SMiklos Szeredi 	return dentry->d_fsdata ? 0 : -ENOMEM;
299f75fdf22SMiklos Szeredi }
300f75fdf22SMiklos Szeredi static void fuse_dentry_release(struct dentry *dentry)
301f75fdf22SMiklos Szeredi {
302f75fdf22SMiklos Szeredi 	union fuse_dentry *fd = dentry->d_fsdata;
303f75fdf22SMiklos Szeredi 
304f75fdf22SMiklos Szeredi 	kfree_rcu(fd, rcu);
305f75fdf22SMiklos Szeredi }
30630c6a23dSKhazhismel Kumykov #endif
307f75fdf22SMiklos Szeredi 
3088fab0106SMiklos Szeredi static int fuse_dentry_delete(const struct dentry *dentry)
3098fab0106SMiklos Szeredi {
3108fab0106SMiklos Szeredi 	return time_before64(fuse_dentry_time(dentry), get_jiffies_64());
3118fab0106SMiklos Szeredi }
3128fab0106SMiklos Szeredi 
313bf109c64SMax Reitz /*
314bf109c64SMax Reitz  * Create a fuse_mount object with a new superblock (with path->dentry
315bf109c64SMax Reitz  * as the root), and return that mount so it can be auto-mounted on
316bf109c64SMax Reitz  * @path.
317bf109c64SMax Reitz  */
318bf109c64SMax Reitz static struct vfsmount *fuse_dentry_automount(struct path *path)
319bf109c64SMax Reitz {
320bf109c64SMax Reitz 	struct fs_context *fsc;
321bf109c64SMax Reitz 	struct vfsmount *mnt;
322bf109c64SMax Reitz 	struct fuse_inode *mp_fi = get_fuse_inode(d_inode(path->dentry));
323bf109c64SMax Reitz 
324bf109c64SMax Reitz 	fsc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry);
32529e0e4dfSGreg Kurz 	if (IS_ERR(fsc))
32629e0e4dfSGreg Kurz 		return ERR_CAST(fsc);
327bf109c64SMax Reitz 
328266eb3f2SGreg Kurz 	/* Pass the FUSE inode of the mount for fuse_get_tree_submount() */
329266eb3f2SGreg Kurz 	fsc->fs_private = mp_fi;
330266eb3f2SGreg Kurz 
331bf109c64SMax Reitz 	/* Create the submount */
33229e0e4dfSGreg Kurz 	mnt = fc_mount(fsc);
33329e0e4dfSGreg Kurz 	if (!IS_ERR(mnt))
334bf109c64SMax Reitz 		mntget(mnt);
33529e0e4dfSGreg Kurz 
336bf109c64SMax Reitz 	put_fs_context(fsc);
337bf109c64SMax Reitz 	return mnt;
338bf109c64SMax Reitz }
339bf109c64SMax Reitz 
3404269590aSAl Viro const struct dentry_operations fuse_dentry_operations = {
341e5e5558eSMiklos Szeredi 	.d_revalidate	= fuse_dentry_revalidate,
3428fab0106SMiklos Szeredi 	.d_delete	= fuse_dentry_delete,
34330c6a23dSKhazhismel Kumykov #if BITS_PER_LONG < 64
344f75fdf22SMiklos Szeredi 	.d_init		= fuse_dentry_init,
345f75fdf22SMiklos Szeredi 	.d_release	= fuse_dentry_release,
34630c6a23dSKhazhismel Kumykov #endif
347bf109c64SMax Reitz 	.d_automount	= fuse_dentry_automount,
348e5e5558eSMiklos Szeredi };
349e5e5558eSMiklos Szeredi 
3500ce267ffSMiklos Szeredi const struct dentry_operations fuse_root_dentry_operations = {
35130c6a23dSKhazhismel Kumykov #if BITS_PER_LONG < 64
3520ce267ffSMiklos Szeredi 	.d_init		= fuse_dentry_init,
3530ce267ffSMiklos Szeredi 	.d_release	= fuse_dentry_release,
35430c6a23dSKhazhismel Kumykov #endif
3550ce267ffSMiklos Szeredi };
3560ce267ffSMiklos Szeredi 
357a5bfffacSTimo Savola int fuse_valid_type(int m)
35839ee059aSMiklos Szeredi {
35939ee059aSMiklos Szeredi 	return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
36039ee059aSMiklos Szeredi 		S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
36139ee059aSMiklos Szeredi }
36239ee059aSMiklos Szeredi 
363eb59bd17SMiklos Szeredi bool fuse_invalid_attr(struct fuse_attr *attr)
364eb59bd17SMiklos Szeredi {
365eb59bd17SMiklos Szeredi 	return !fuse_valid_type(attr->mode) ||
366eb59bd17SMiklos Szeredi 		attr->size > LLONG_MAX;
367eb59bd17SMiklos Szeredi }
368eb59bd17SMiklos Szeredi 
36913983d06SAl Viro int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name,
370c180eebeSMiklos Szeredi 		     struct fuse_entry_out *outarg, struct inode **inode)
371c180eebeSMiklos Szeredi {
372fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount_super(sb);
3737078187aSMiklos Szeredi 	FUSE_ARGS(args);
37407e77dcaSMiklos Szeredi 	struct fuse_forget_link *forget;
375c180eebeSMiklos Szeredi 	u64 attr_version;
376c180eebeSMiklos Szeredi 	int err;
377c180eebeSMiklos Szeredi 
378c180eebeSMiklos Szeredi 	*inode = NULL;
379c180eebeSMiklos Szeredi 	err = -ENAMETOOLONG;
380c180eebeSMiklos Szeredi 	if (name->len > FUSE_NAME_MAX)
381c180eebeSMiklos Szeredi 		goto out;
382c180eebeSMiklos Szeredi 
383c180eebeSMiklos Szeredi 
38407e77dcaSMiklos Szeredi 	forget = fuse_alloc_forget();
38507e77dcaSMiklos Szeredi 	err = -ENOMEM;
3867078187aSMiklos Szeredi 	if (!forget)
387c180eebeSMiklos Szeredi 		goto out;
388c180eebeSMiklos Szeredi 
389fcee216bSMax Reitz 	attr_version = fuse_get_attr_version(fm->fc);
390c180eebeSMiklos Szeredi 
391fcee216bSMax Reitz 	fuse_lookup_init(fm->fc, &args, nodeid, name, outarg);
392fcee216bSMax Reitz 	err = fuse_simple_request(fm, &args);
393c180eebeSMiklos Szeredi 	/* Zero nodeid is same as -ENOENT, but with valid timeout */
394c180eebeSMiklos Szeredi 	if (err || !outarg->nodeid)
395c180eebeSMiklos Szeredi 		goto out_put_forget;
396c180eebeSMiklos Szeredi 
397c180eebeSMiklos Szeredi 	err = -EIO;
398c180eebeSMiklos Szeredi 	if (!outarg->nodeid)
399c180eebeSMiklos Szeredi 		goto out_put_forget;
400eb59bd17SMiklos Szeredi 	if (fuse_invalid_attr(&outarg->attr))
401c180eebeSMiklos Szeredi 		goto out_put_forget;
402c180eebeSMiklos Szeredi 
403c180eebeSMiklos Szeredi 	*inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
404c180eebeSMiklos Szeredi 			   &outarg->attr, entry_attr_timeout(outarg),
405c180eebeSMiklos Szeredi 			   attr_version);
406c180eebeSMiklos Szeredi 	err = -ENOMEM;
407c180eebeSMiklos Szeredi 	if (!*inode) {
408fcee216bSMax Reitz 		fuse_queue_forget(fm->fc, forget, outarg->nodeid, 1);
409c180eebeSMiklos Szeredi 		goto out;
410c180eebeSMiklos Szeredi 	}
411c180eebeSMiklos Szeredi 	err = 0;
412c180eebeSMiklos Szeredi 
413c180eebeSMiklos Szeredi  out_put_forget:
41407e77dcaSMiklos Szeredi 	kfree(forget);
415c180eebeSMiklos Szeredi  out:
416c180eebeSMiklos Szeredi 	return err;
417c180eebeSMiklos Szeredi }
418c180eebeSMiklos Szeredi 
4190aa7c699SMiklos Szeredi static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
42000cd8dd3SAl Viro 				  unsigned int flags)
421e5e5558eSMiklos Szeredi {
422e5e5558eSMiklos Szeredi 	int err;
423e5e5558eSMiklos Szeredi 	struct fuse_entry_out outarg;
424c180eebeSMiklos Szeredi 	struct inode *inode;
4250de6256dSMiklos Szeredi 	struct dentry *newent;
426c180eebeSMiklos Szeredi 	bool outarg_valid = true;
42763576c13SMiklos Szeredi 	bool locked;
428e5e5558eSMiklos Szeredi 
4295d069dbeSMiklos Szeredi 	if (fuse_is_bad(dir))
4305d069dbeSMiklos Szeredi 		return ERR_PTR(-EIO);
4315d069dbeSMiklos Szeredi 
43263576c13SMiklos Szeredi 	locked = fuse_lock_inode(dir);
433c180eebeSMiklos Szeredi 	err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
434c180eebeSMiklos Szeredi 			       &outarg, &inode);
43563576c13SMiklos Szeredi 	fuse_unlock_inode(dir, locked);
436c180eebeSMiklos Szeredi 	if (err == -ENOENT) {
437c180eebeSMiklos Szeredi 		outarg_valid = false;
438c180eebeSMiklos Szeredi 		err = 0;
4392d51013eSMiklos Szeredi 	}
440c180eebeSMiklos Szeredi 	if (err)
441c180eebeSMiklos Szeredi 		goto out_err;
4422d51013eSMiklos Szeredi 
443ee4e5271SMiklos Szeredi 	err = -EIO;
444c180eebeSMiklos Szeredi 	if (inode && get_node_id(inode) == FUSE_ROOT_ID)
445c180eebeSMiklos Szeredi 		goto out_iput;
446e5e5558eSMiklos Szeredi 
44741d28bcaSAl Viro 	newent = d_splice_alias(inode, entry);
448c180eebeSMiklos Szeredi 	err = PTR_ERR(newent);
449c180eebeSMiklos Szeredi 	if (IS_ERR(newent))
4505835f339SMiklos Szeredi 		goto out_err;
451d2a85164SMiklos Szeredi 
4520de6256dSMiklos Szeredi 	entry = newent ? newent : entry;
453c180eebeSMiklos Szeredi 	if (outarg_valid)
4541fb69e78SMiklos Szeredi 		fuse_change_entry_timeout(entry, &outarg);
4558cbdf1e6SMiklos Szeredi 	else
4568cbdf1e6SMiklos Szeredi 		fuse_invalidate_entry_cache(entry);
457c180eebeSMiklos Szeredi 
4586c26f717SMiklos Szeredi 	if (inode)
4594582a4abSFeng Shuo 		fuse_advise_use_readdirplus(dir);
4600de6256dSMiklos Szeredi 	return newent;
461c180eebeSMiklos Szeredi 
462c180eebeSMiklos Szeredi  out_iput:
463c180eebeSMiklos Szeredi 	iput(inode);
464c180eebeSMiklos Szeredi  out_err:
465c180eebeSMiklos Szeredi 	return ERR_PTR(err);
466e5e5558eSMiklos Szeredi }
467e5e5558eSMiklos Szeredi 
4683e2b6fdbSVivek Goyal static int get_security_context(struct dentry *entry, umode_t mode,
4693e2b6fdbSVivek Goyal 				void **security_ctx, u32 *security_ctxlen)
4703e2b6fdbSVivek Goyal {
4713e2b6fdbSVivek Goyal 	struct fuse_secctx *fctx;
4723e2b6fdbSVivek Goyal 	struct fuse_secctx_header *header;
4733e2b6fdbSVivek Goyal 	void *ctx = NULL, *ptr;
4743e2b6fdbSVivek Goyal 	u32 ctxlen, total_len = sizeof(*header);
4753e2b6fdbSVivek Goyal 	int err, nr_ctx = 0;
4763e2b6fdbSVivek Goyal 	const char *name;
4773e2b6fdbSVivek Goyal 	size_t namelen;
4783e2b6fdbSVivek Goyal 
4793e2b6fdbSVivek Goyal 	err = security_dentry_init_security(entry, mode, &entry->d_name,
4803e2b6fdbSVivek Goyal 					    &name, &ctx, &ctxlen);
4813e2b6fdbSVivek Goyal 	if (err) {
4823e2b6fdbSVivek Goyal 		if (err != -EOPNOTSUPP)
4833e2b6fdbSVivek Goyal 			goto out_err;
4843e2b6fdbSVivek Goyal 		/* No LSM is supporting this security hook. Ignore error */
4853e2b6fdbSVivek Goyal 		ctxlen = 0;
4863e2b6fdbSVivek Goyal 		ctx = NULL;
4873e2b6fdbSVivek Goyal 	}
4883e2b6fdbSVivek Goyal 
4893e2b6fdbSVivek Goyal 	if (ctxlen) {
4903e2b6fdbSVivek Goyal 		nr_ctx = 1;
4913e2b6fdbSVivek Goyal 		namelen = strlen(name) + 1;
4923e2b6fdbSVivek Goyal 		err = -EIO;
4933e2b6fdbSVivek Goyal 		if (WARN_ON(namelen > XATTR_NAME_MAX + 1 || ctxlen > S32_MAX))
4943e2b6fdbSVivek Goyal 			goto out_err;
4953e2b6fdbSVivek Goyal 		total_len += FUSE_REC_ALIGN(sizeof(*fctx) + namelen + ctxlen);
4963e2b6fdbSVivek Goyal 	}
4973e2b6fdbSVivek Goyal 
4983e2b6fdbSVivek Goyal 	err = -ENOMEM;
4993e2b6fdbSVivek Goyal 	header = ptr = kzalloc(total_len, GFP_KERNEL);
5003e2b6fdbSVivek Goyal 	if (!ptr)
5013e2b6fdbSVivek Goyal 		goto out_err;
5023e2b6fdbSVivek Goyal 
5033e2b6fdbSVivek Goyal 	header->nr_secctx = nr_ctx;
5043e2b6fdbSVivek Goyal 	header->size = total_len;
5053e2b6fdbSVivek Goyal 	ptr += sizeof(*header);
5063e2b6fdbSVivek Goyal 	if (nr_ctx) {
5073e2b6fdbSVivek Goyal 		fctx = ptr;
5083e2b6fdbSVivek Goyal 		fctx->size = ctxlen;
5093e2b6fdbSVivek Goyal 		ptr += sizeof(*fctx);
5103e2b6fdbSVivek Goyal 
5113e2b6fdbSVivek Goyal 		strcpy(ptr, name);
5123e2b6fdbSVivek Goyal 		ptr += namelen;
5133e2b6fdbSVivek Goyal 
5143e2b6fdbSVivek Goyal 		memcpy(ptr, ctx, ctxlen);
5153e2b6fdbSVivek Goyal 	}
5163e2b6fdbSVivek Goyal 	*security_ctxlen = total_len;
5173e2b6fdbSVivek Goyal 	*security_ctx = header;
5183e2b6fdbSVivek Goyal 	err = 0;
5193e2b6fdbSVivek Goyal out_err:
5203e2b6fdbSVivek Goyal 	kfree(ctx);
5213e2b6fdbSVivek Goyal 	return err;
5223e2b6fdbSVivek Goyal }
5233e2b6fdbSVivek Goyal 
5246f9f1180SMiklos Szeredi /*
5256f9f1180SMiklos Szeredi  * Atomic create+open operation
5266f9f1180SMiklos Szeredi  *
5276f9f1180SMiklos Szeredi  * If the filesystem doesn't support this, then fall back to separate
5286f9f1180SMiklos Szeredi  * 'mknod' + 'open' requests.
5296f9f1180SMiklos Szeredi  */
530d9585277SAl Viro static int fuse_create_open(struct inode *dir, struct dentry *entry,
53154d601cbSMiklos Szeredi 			    struct file *file, unsigned int flags,
5327d375390SMiklos Szeredi 			    umode_t mode, u32 opcode)
533fd72faacSMiklos Szeredi {
534fd72faacSMiklos Szeredi 	int err;
535fd72faacSMiklos Szeredi 	struct inode *inode;
536fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(dir);
5377078187aSMiklos Szeredi 	FUSE_ARGS(args);
53807e77dcaSMiklos Szeredi 	struct fuse_forget_link *forget;
539e0a43ddcSMiklos Szeredi 	struct fuse_create_in inarg;
540fd72faacSMiklos Szeredi 	struct fuse_open_out outopen;
541fd72faacSMiklos Szeredi 	struct fuse_entry_out outentry;
542ebf84d0cSKirill Tkhai 	struct fuse_inode *fi;
543fd72faacSMiklos Szeredi 	struct fuse_file *ff;
5443e2b6fdbSVivek Goyal 	void *security_ctx = NULL;
5453e2b6fdbSVivek Goyal 	u32 security_ctxlen;
5462fdbb8ddSMiklos Szeredi 	bool trunc = flags & O_TRUNC;
547fd72faacSMiklos Szeredi 
548af109bcaSMiklos Szeredi 	/* Userspace expects S_IFREG in create mode */
549af109bcaSMiklos Szeredi 	BUG_ON((mode & S_IFMT) != S_IFREG);
550af109bcaSMiklos Szeredi 
55107e77dcaSMiklos Szeredi 	forget = fuse_alloc_forget();
552c8ccbe03SMiklos Szeredi 	err = -ENOMEM;
55307e77dcaSMiklos Szeredi 	if (!forget)
554c8ccbe03SMiklos Szeredi 		goto out_err;
55551eb01e7SMiklos Szeredi 
556ce1d5a49SMiklos Szeredi 	err = -ENOMEM;
557fcee216bSMax Reitz 	ff = fuse_file_alloc(fm);
558fd72faacSMiklos Szeredi 	if (!ff)
5597078187aSMiklos Szeredi 		goto out_put_forget_req;
560fd72faacSMiklos Szeredi 
561fcee216bSMax Reitz 	if (!fm->fc->dont_mask)
562e0a43ddcSMiklos Szeredi 		mode &= ~current_umask();
563e0a43ddcSMiklos Szeredi 
564fd72faacSMiklos Szeredi 	flags &= ~O_NOCTTY;
565fd72faacSMiklos Szeredi 	memset(&inarg, 0, sizeof(inarg));
5660e9663eeSMiklos Szeredi 	memset(&outentry, 0, sizeof(outentry));
567fd72faacSMiklos Szeredi 	inarg.flags = flags;
568fd72faacSMiklos Szeredi 	inarg.mode = mode;
569e0a43ddcSMiklos Szeredi 	inarg.umask = current_umask();
570643a666aSVivek Goyal 
5712fdbb8ddSMiklos Szeredi 	if (fm->fc->handle_killpriv_v2 && trunc &&
572643a666aSVivek Goyal 	    !(flags & O_EXCL) && !capable(CAP_FSETID)) {
573643a666aSVivek Goyal 		inarg.open_flags |= FUSE_OPEN_KILL_SUIDGID;
574643a666aSVivek Goyal 	}
575643a666aSVivek Goyal 
5767d375390SMiklos Szeredi 	args.opcode = opcode;
577d5b48543SMiklos Szeredi 	args.nodeid = get_node_id(dir);
578d5b48543SMiklos Szeredi 	args.in_numargs = 2;
579d5b48543SMiklos Szeredi 	args.in_args[0].size = sizeof(inarg);
580d5b48543SMiklos Szeredi 	args.in_args[0].value = &inarg;
581d5b48543SMiklos Szeredi 	args.in_args[1].size = entry->d_name.len + 1;
582d5b48543SMiklos Szeredi 	args.in_args[1].value = entry->d_name.name;
583d5b48543SMiklos Szeredi 	args.out_numargs = 2;
584d5b48543SMiklos Szeredi 	args.out_args[0].size = sizeof(outentry);
585d5b48543SMiklos Szeredi 	args.out_args[0].value = &outentry;
586d5b48543SMiklos Szeredi 	args.out_args[1].size = sizeof(outopen);
587d5b48543SMiklos Szeredi 	args.out_args[1].value = &outopen;
5883e2b6fdbSVivek Goyal 
5893e2b6fdbSVivek Goyal 	if (fm->fc->init_security) {
5903e2b6fdbSVivek Goyal 		err = get_security_context(entry, mode, &security_ctx,
5913e2b6fdbSVivek Goyal 					   &security_ctxlen);
5923e2b6fdbSVivek Goyal 		if (err)
5933e2b6fdbSVivek Goyal 			goto out_put_forget_req;
5943e2b6fdbSVivek Goyal 
5953e2b6fdbSVivek Goyal 		args.in_numargs = 3;
5963e2b6fdbSVivek Goyal 		args.in_args[2].size = security_ctxlen;
5973e2b6fdbSVivek Goyal 		args.in_args[2].value = security_ctx;
5983e2b6fdbSVivek Goyal 	}
5993e2b6fdbSVivek Goyal 
600fcee216bSMax Reitz 	err = fuse_simple_request(fm, &args);
6013e2b6fdbSVivek Goyal 	kfree(security_ctx);
602c8ccbe03SMiklos Szeredi 	if (err)
603fd72faacSMiklos Szeredi 		goto out_free_ff;
604fd72faacSMiklos Szeredi 
605fd72faacSMiklos Szeredi 	err = -EIO;
606eb59bd17SMiklos Szeredi 	if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid) ||
607eb59bd17SMiklos Szeredi 	    fuse_invalid_attr(&outentry.attr))
608fd72faacSMiklos Szeredi 		goto out_free_ff;
609fd72faacSMiklos Szeredi 
610c7b7143cSMiklos Szeredi 	ff->fh = outopen.fh;
611c7b7143cSMiklos Szeredi 	ff->nodeid = outentry.nodeid;
612c7b7143cSMiklos Szeredi 	ff->open_flags = outopen.open_flags;
613fd72faacSMiklos Szeredi 	inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
6141fb69e78SMiklos Szeredi 			  &outentry.attr, entry_attr_timeout(&outentry), 0);
615fd72faacSMiklos Szeredi 	if (!inode) {
616fd72faacSMiklos Szeredi 		flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
617ebf84d0cSKirill Tkhai 		fuse_sync_release(NULL, ff, flags);
618fcee216bSMax Reitz 		fuse_queue_forget(fm->fc, forget, outentry.nodeid, 1);
619c8ccbe03SMiklos Szeredi 		err = -ENOMEM;
620c8ccbe03SMiklos Szeredi 		goto out_err;
621fd72faacSMiklos Szeredi 	}
62207e77dcaSMiklos Szeredi 	kfree(forget);
623fd72faacSMiklos Szeredi 	d_instantiate(entry, inode);
6241fb69e78SMiklos Szeredi 	fuse_change_entry_timeout(entry, &outentry);
625261aaba7SMiklos Szeredi 	fuse_dir_changed(dir);
626be12af3eSAl Viro 	err = finish_open(file, entry, generic_file_open);
62730d90494SAl Viro 	if (err) {
628ebf84d0cSKirill Tkhai 		fi = get_fuse_inode(inode);
629ebf84d0cSKirill Tkhai 		fuse_sync_release(fi, ff, flags);
630c8ccbe03SMiklos Szeredi 	} else {
631267d8444SMiklos Szeredi 		file->private_data = ff;
632c7b7143cSMiklos Szeredi 		fuse_finish_open(inode, file);
6332fdbb8ddSMiklos Szeredi 		if (fm->fc->atomic_o_trunc && trunc)
6342fdbb8ddSMiklos Szeredi 			truncate_pagecache(inode, 0);
6352fdbb8ddSMiklos Szeredi 		else if (!(ff->open_flags & FOPEN_KEEP_CACHE))
6362fdbb8ddSMiklos Szeredi 			invalidate_inode_pages2(inode->i_mapping);
637c8ccbe03SMiklos Szeredi 	}
638d9585277SAl Viro 	return err;
639fd72faacSMiklos Szeredi 
640fd72faacSMiklos Szeredi out_free_ff:
641fd72faacSMiklos Szeredi 	fuse_file_free(ff);
64251eb01e7SMiklos Szeredi out_put_forget_req:
64307e77dcaSMiklos Szeredi 	kfree(forget);
644c8ccbe03SMiklos Szeredi out_err:
645d9585277SAl Viro 	return err;
646c8ccbe03SMiklos Szeredi }
647c8ccbe03SMiklos Szeredi 
648549c7297SChristian Brauner static int fuse_mknod(struct user_namespace *, struct inode *, struct dentry *,
649549c7297SChristian Brauner 		      umode_t, dev_t);
650d9585277SAl Viro static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
65130d90494SAl Viro 			    struct file *file, unsigned flags,
65244907d79SAl Viro 			    umode_t mode)
653c8ccbe03SMiklos Szeredi {
654c8ccbe03SMiklos Szeredi 	int err;
655c8ccbe03SMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(dir);
656c8ccbe03SMiklos Szeredi 	struct dentry *res = NULL;
657c8ccbe03SMiklos Szeredi 
6585d069dbeSMiklos Szeredi 	if (fuse_is_bad(dir))
6595d069dbeSMiklos Szeredi 		return -EIO;
6605d069dbeSMiklos Szeredi 
66100699ad8SAl Viro 	if (d_in_lookup(entry)) {
66200cd8dd3SAl Viro 		res = fuse_lookup(dir, entry, 0);
663c8ccbe03SMiklos Szeredi 		if (IS_ERR(res))
664d9585277SAl Viro 			return PTR_ERR(res);
665c8ccbe03SMiklos Szeredi 
666c8ccbe03SMiklos Szeredi 		if (res)
667c8ccbe03SMiklos Szeredi 			entry = res;
668c8ccbe03SMiklos Szeredi 	}
669c8ccbe03SMiklos Szeredi 
6702b0143b5SDavid Howells 	if (!(flags & O_CREAT) || d_really_is_positive(entry))
671c8ccbe03SMiklos Szeredi 		goto no_open;
672c8ccbe03SMiklos Szeredi 
673c8ccbe03SMiklos Szeredi 	/* Only creates */
67473a09dd9SAl Viro 	file->f_mode |= FMODE_CREATED;
675c8ccbe03SMiklos Szeredi 
676c8ccbe03SMiklos Szeredi 	if (fc->no_create)
677c8ccbe03SMiklos Szeredi 		goto mknod;
678c8ccbe03SMiklos Szeredi 
6797d375390SMiklos Szeredi 	err = fuse_create_open(dir, entry, file, flags, mode, FUSE_CREATE);
680d9585277SAl Viro 	if (err == -ENOSYS) {
681c8ccbe03SMiklos Szeredi 		fc->no_create = 1;
682c8ccbe03SMiklos Szeredi 		goto mknod;
683c8ccbe03SMiklos Szeredi 	}
684c8ccbe03SMiklos Szeredi out_dput:
685c8ccbe03SMiklos Szeredi 	dput(res);
686d9585277SAl Viro 	return err;
687c8ccbe03SMiklos Szeredi 
688c8ccbe03SMiklos Szeredi mknod:
689549c7297SChristian Brauner 	err = fuse_mknod(&init_user_ns, dir, entry, mode, 0);
690d9585277SAl Viro 	if (err)
691c8ccbe03SMiklos Szeredi 		goto out_dput;
692c8ccbe03SMiklos Szeredi no_open:
693e45198a6SAl Viro 	return finish_no_open(file, res);
694fd72faacSMiklos Szeredi }
695fd72faacSMiklos Szeredi 
6966f9f1180SMiklos Szeredi /*
6976f9f1180SMiklos Szeredi  * Code shared between mknod, mkdir, symlink and link
6986f9f1180SMiklos Szeredi  */
699fcee216bSMax Reitz static int create_new_entry(struct fuse_mount *fm, struct fuse_args *args,
7009e6268dbSMiklos Szeredi 			    struct inode *dir, struct dentry *entry,
701541af6a0SAl Viro 			    umode_t mode)
7029e6268dbSMiklos Szeredi {
7039e6268dbSMiklos Szeredi 	struct fuse_entry_out outarg;
7049e6268dbSMiklos Szeredi 	struct inode *inode;
705c971e6a0SAl Viro 	struct dentry *d;
7069e6268dbSMiklos Szeredi 	int err;
70707e77dcaSMiklos Szeredi 	struct fuse_forget_link *forget;
7083e2b6fdbSVivek Goyal 	void *security_ctx = NULL;
7093e2b6fdbSVivek Goyal 	u32 security_ctxlen;
7102d51013eSMiklos Szeredi 
7115d069dbeSMiklos Szeredi 	if (fuse_is_bad(dir))
7125d069dbeSMiklos Szeredi 		return -EIO;
7135d069dbeSMiklos Szeredi 
71407e77dcaSMiklos Szeredi 	forget = fuse_alloc_forget();
7157078187aSMiklos Szeredi 	if (!forget)
71607e77dcaSMiklos Szeredi 		return -ENOMEM;
7179e6268dbSMiklos Szeredi 
7180e9663eeSMiklos Szeredi 	memset(&outarg, 0, sizeof(outarg));
719d5b48543SMiklos Szeredi 	args->nodeid = get_node_id(dir);
720d5b48543SMiklos Szeredi 	args->out_numargs = 1;
721d5b48543SMiklos Szeredi 	args->out_args[0].size = sizeof(outarg);
722d5b48543SMiklos Szeredi 	args->out_args[0].value = &outarg;
7233e2b6fdbSVivek Goyal 
7243e2b6fdbSVivek Goyal 	if (fm->fc->init_security && args->opcode != FUSE_LINK) {
7253e2b6fdbSVivek Goyal 		err = get_security_context(entry, mode, &security_ctx,
7263e2b6fdbSVivek Goyal 					   &security_ctxlen);
7273e2b6fdbSVivek Goyal 		if (err)
7283e2b6fdbSVivek Goyal 			goto out_put_forget_req;
7293e2b6fdbSVivek Goyal 
7303e2b6fdbSVivek Goyal 		BUG_ON(args->in_numargs != 2);
7313e2b6fdbSVivek Goyal 
7323e2b6fdbSVivek Goyal 		args->in_numargs = 3;
7333e2b6fdbSVivek Goyal 		args->in_args[2].size = security_ctxlen;
7343e2b6fdbSVivek Goyal 		args->in_args[2].value = security_ctx;
7353e2b6fdbSVivek Goyal 	}
7363e2b6fdbSVivek Goyal 
737fcee216bSMax Reitz 	err = fuse_simple_request(fm, args);
7383e2b6fdbSVivek Goyal 	kfree(security_ctx);
7392d51013eSMiklos Szeredi 	if (err)
7402d51013eSMiklos Szeredi 		goto out_put_forget_req;
7412d51013eSMiklos Szeredi 
74239ee059aSMiklos Szeredi 	err = -EIO;
743eb59bd17SMiklos Szeredi 	if (invalid_nodeid(outarg.nodeid) || fuse_invalid_attr(&outarg.attr))
7442d51013eSMiklos Szeredi 		goto out_put_forget_req;
74539ee059aSMiklos Szeredi 
74639ee059aSMiklos Szeredi 	if ((outarg.attr.mode ^ mode) & S_IFMT)
7472d51013eSMiklos Szeredi 		goto out_put_forget_req;
74839ee059aSMiklos Szeredi 
7499e6268dbSMiklos Szeredi 	inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
7501fb69e78SMiklos Szeredi 			  &outarg.attr, entry_attr_timeout(&outarg), 0);
7519e6268dbSMiklos Szeredi 	if (!inode) {
752fcee216bSMax Reitz 		fuse_queue_forget(fm->fc, forget, outarg.nodeid, 1);
7539e6268dbSMiklos Szeredi 		return -ENOMEM;
7549e6268dbSMiklos Szeredi 	}
75507e77dcaSMiklos Szeredi 	kfree(forget);
7569e6268dbSMiklos Szeredi 
757c971e6a0SAl Viro 	d_drop(entry);
758c971e6a0SAl Viro 	d = d_splice_alias(inode, entry);
759c971e6a0SAl Viro 	if (IS_ERR(d))
760c971e6a0SAl Viro 		return PTR_ERR(d);
761d2a85164SMiklos Szeredi 
762c971e6a0SAl Viro 	if (d) {
763c971e6a0SAl Viro 		fuse_change_entry_timeout(d, &outarg);
764c971e6a0SAl Viro 		dput(d);
765c971e6a0SAl Viro 	} else {
7661fb69e78SMiklos Szeredi 		fuse_change_entry_timeout(entry, &outarg);
767c971e6a0SAl Viro 	}
768261aaba7SMiklos Szeredi 	fuse_dir_changed(dir);
7699e6268dbSMiklos Szeredi 	return 0;
77039ee059aSMiklos Szeredi 
7712d51013eSMiklos Szeredi  out_put_forget_req:
77207e77dcaSMiklos Szeredi 	kfree(forget);
77339ee059aSMiklos Szeredi 	return err;
7749e6268dbSMiklos Szeredi }
7759e6268dbSMiklos Szeredi 
776549c7297SChristian Brauner static int fuse_mknod(struct user_namespace *mnt_userns, struct inode *dir,
777549c7297SChristian Brauner 		      struct dentry *entry, umode_t mode, dev_t rdev)
7789e6268dbSMiklos Szeredi {
7799e6268dbSMiklos Szeredi 	struct fuse_mknod_in inarg;
780fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(dir);
7817078187aSMiklos Szeredi 	FUSE_ARGS(args);
7829e6268dbSMiklos Szeredi 
783fcee216bSMax Reitz 	if (!fm->fc->dont_mask)
784e0a43ddcSMiklos Szeredi 		mode &= ~current_umask();
785e0a43ddcSMiklos Szeredi 
7869e6268dbSMiklos Szeredi 	memset(&inarg, 0, sizeof(inarg));
7879e6268dbSMiklos Szeredi 	inarg.mode = mode;
7889e6268dbSMiklos Szeredi 	inarg.rdev = new_encode_dev(rdev);
789e0a43ddcSMiklos Szeredi 	inarg.umask = current_umask();
790d5b48543SMiklos Szeredi 	args.opcode = FUSE_MKNOD;
791d5b48543SMiklos Szeredi 	args.in_numargs = 2;
792d5b48543SMiklos Szeredi 	args.in_args[0].size = sizeof(inarg);
793d5b48543SMiklos Szeredi 	args.in_args[0].value = &inarg;
794d5b48543SMiklos Szeredi 	args.in_args[1].size = entry->d_name.len + 1;
795d5b48543SMiklos Szeredi 	args.in_args[1].value = entry->d_name.name;
796fcee216bSMax Reitz 	return create_new_entry(fm, &args, dir, entry, mode);
7979e6268dbSMiklos Szeredi }
7989e6268dbSMiklos Szeredi 
799549c7297SChristian Brauner static int fuse_create(struct user_namespace *mnt_userns, struct inode *dir,
800549c7297SChristian Brauner 		       struct dentry *entry, umode_t mode, bool excl)
8019e6268dbSMiklos Szeredi {
802549c7297SChristian Brauner 	return fuse_mknod(&init_user_ns, dir, entry, mode, 0);
8039e6268dbSMiklos Szeredi }
8049e6268dbSMiklos Szeredi 
8057d375390SMiklos Szeredi static int fuse_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
8067d375390SMiklos Szeredi 			struct file *file, umode_t mode)
8077d375390SMiklos Szeredi {
8087d375390SMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(dir);
8097d375390SMiklos Szeredi 	int err;
8107d375390SMiklos Szeredi 
8117d375390SMiklos Szeredi 	if (fc->no_tmpfile)
8127d375390SMiklos Szeredi 		return -EOPNOTSUPP;
8137d375390SMiklos Szeredi 
8147d375390SMiklos Szeredi 	err = fuse_create_open(dir, file->f_path.dentry, file, file->f_flags, mode, FUSE_TMPFILE);
8157d375390SMiklos Szeredi 	if (err == -ENOSYS) {
8167d375390SMiklos Szeredi 		fc->no_tmpfile = 1;
8177d375390SMiklos Szeredi 		err = -EOPNOTSUPP;
8187d375390SMiklos Szeredi 	}
8197d375390SMiklos Szeredi 	return err;
8207d375390SMiklos Szeredi }
8217d375390SMiklos Szeredi 
822549c7297SChristian Brauner static int fuse_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
823549c7297SChristian Brauner 		      struct dentry *entry, umode_t mode)
8249e6268dbSMiklos Szeredi {
8259e6268dbSMiklos Szeredi 	struct fuse_mkdir_in inarg;
826fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(dir);
8277078187aSMiklos Szeredi 	FUSE_ARGS(args);
8289e6268dbSMiklos Szeredi 
829fcee216bSMax Reitz 	if (!fm->fc->dont_mask)
830e0a43ddcSMiklos Szeredi 		mode &= ~current_umask();
831e0a43ddcSMiklos Szeredi 
8329e6268dbSMiklos Szeredi 	memset(&inarg, 0, sizeof(inarg));
8339e6268dbSMiklos Szeredi 	inarg.mode = mode;
834e0a43ddcSMiklos Szeredi 	inarg.umask = current_umask();
835d5b48543SMiklos Szeredi 	args.opcode = FUSE_MKDIR;
836d5b48543SMiklos Szeredi 	args.in_numargs = 2;
837d5b48543SMiklos Szeredi 	args.in_args[0].size = sizeof(inarg);
838d5b48543SMiklos Szeredi 	args.in_args[0].value = &inarg;
839d5b48543SMiklos Szeredi 	args.in_args[1].size = entry->d_name.len + 1;
840d5b48543SMiklos Szeredi 	args.in_args[1].value = entry->d_name.name;
841fcee216bSMax Reitz 	return create_new_entry(fm, &args, dir, entry, S_IFDIR);
8429e6268dbSMiklos Szeredi }
8439e6268dbSMiklos Szeredi 
844549c7297SChristian Brauner static int fuse_symlink(struct user_namespace *mnt_userns, struct inode *dir,
845549c7297SChristian Brauner 			struct dentry *entry, const char *link)
8469e6268dbSMiklos Szeredi {
847fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(dir);
8489e6268dbSMiklos Szeredi 	unsigned len = strlen(link) + 1;
8497078187aSMiklos Szeredi 	FUSE_ARGS(args);
8509e6268dbSMiklos Szeredi 
851d5b48543SMiklos Szeredi 	args.opcode = FUSE_SYMLINK;
852d5b48543SMiklos Szeredi 	args.in_numargs = 2;
853d5b48543SMiklos Szeredi 	args.in_args[0].size = entry->d_name.len + 1;
854d5b48543SMiklos Szeredi 	args.in_args[0].value = entry->d_name.name;
855d5b48543SMiklos Szeredi 	args.in_args[1].size = len;
856d5b48543SMiklos Szeredi 	args.in_args[1].value = link;
857fcee216bSMax Reitz 	return create_new_entry(fm, &args, dir, entry, S_IFLNK);
8589e6268dbSMiklos Szeredi }
8599e6268dbSMiklos Szeredi 
8605c791fe1SMiklos Szeredi void fuse_flush_time_update(struct inode *inode)
8615c791fe1SMiklos Szeredi {
8625c791fe1SMiklos Szeredi 	int err = sync_inode_metadata(inode, 1);
8635c791fe1SMiklos Szeredi 
8645c791fe1SMiklos Szeredi 	mapping_set_error(inode->i_mapping, err);
8655c791fe1SMiklos Szeredi }
8665c791fe1SMiklos Szeredi 
86797f044f6SMiklos Szeredi static void fuse_update_ctime_in_cache(struct inode *inode)
86831f3267bSMaxim Patlasov {
86931f3267bSMaxim Patlasov 	if (!IS_NOCMTIME(inode)) {
870c2050a45SDeepa Dinamani 		inode->i_ctime = current_time(inode);
87131f3267bSMaxim Patlasov 		mark_inode_dirty_sync(inode);
8725c791fe1SMiklos Szeredi 		fuse_flush_time_update(inode);
87331f3267bSMaxim Patlasov 	}
87431f3267bSMaxim Patlasov }
87531f3267bSMaxim Patlasov 
87697f044f6SMiklos Szeredi void fuse_update_ctime(struct inode *inode)
87797f044f6SMiklos Szeredi {
878fa5eee57SMiklos Szeredi 	fuse_invalidate_attr_mask(inode, STATX_CTIME);
87997f044f6SMiklos Szeredi 	fuse_update_ctime_in_cache(inode);
88097f044f6SMiklos Szeredi }
88197f044f6SMiklos Szeredi 
882cefd1b83SMiklos Szeredi static void fuse_entry_unlinked(struct dentry *entry)
883cefd1b83SMiklos Szeredi {
884cefd1b83SMiklos Szeredi 	struct inode *inode = d_inode(entry);
885cefd1b83SMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(inode);
886cefd1b83SMiklos Szeredi 	struct fuse_inode *fi = get_fuse_inode(inode);
887cefd1b83SMiklos Szeredi 
888cefd1b83SMiklos Szeredi 	spin_lock(&fi->lock);
889cefd1b83SMiklos Szeredi 	fi->attr_version = atomic64_inc_return(&fc->attr_version);
890cefd1b83SMiklos Szeredi 	/*
891cefd1b83SMiklos Szeredi 	 * If i_nlink == 0 then unlink doesn't make sense, yet this can
892cefd1b83SMiklos Szeredi 	 * happen if userspace filesystem is careless.  It would be
893cefd1b83SMiklos Szeredi 	 * difficult to enforce correct nlink usage so just ignore this
894cefd1b83SMiklos Szeredi 	 * condition here
895cefd1b83SMiklos Szeredi 	 */
896cefd1b83SMiklos Szeredi 	if (S_ISDIR(inode->i_mode))
897cefd1b83SMiklos Szeredi 		clear_nlink(inode);
898cefd1b83SMiklos Szeredi 	else if (inode->i_nlink > 0)
899cefd1b83SMiklos Szeredi 		drop_nlink(inode);
900cefd1b83SMiklos Szeredi 	spin_unlock(&fi->lock);
901cefd1b83SMiklos Szeredi 	fuse_invalidate_entry_cache(entry);
902cefd1b83SMiklos Szeredi 	fuse_update_ctime(inode);
903cefd1b83SMiklos Szeredi }
904cefd1b83SMiklos Szeredi 
9059e6268dbSMiklos Szeredi static int fuse_unlink(struct inode *dir, struct dentry *entry)
9069e6268dbSMiklos Szeredi {
9079e6268dbSMiklos Szeredi 	int err;
908fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(dir);
9097078187aSMiklos Szeredi 	FUSE_ARGS(args);
9109e6268dbSMiklos Szeredi 
9115d069dbeSMiklos Szeredi 	if (fuse_is_bad(dir))
9125d069dbeSMiklos Szeredi 		return -EIO;
9135d069dbeSMiklos Szeredi 
914d5b48543SMiklos Szeredi 	args.opcode = FUSE_UNLINK;
915d5b48543SMiklos Szeredi 	args.nodeid = get_node_id(dir);
916d5b48543SMiklos Szeredi 	args.in_numargs = 1;
917d5b48543SMiklos Szeredi 	args.in_args[0].size = entry->d_name.len + 1;
918d5b48543SMiklos Szeredi 	args.in_args[0].value = entry->d_name.name;
919fcee216bSMax Reitz 	err = fuse_simple_request(fm, &args);
9209e6268dbSMiklos Szeredi 	if (!err) {
921261aaba7SMiklos Szeredi 		fuse_dir_changed(dir);
922cefd1b83SMiklos Szeredi 		fuse_entry_unlinked(entry);
9239e6268dbSMiklos Szeredi 	} else if (err == -EINTR)
9249e6268dbSMiklos Szeredi 		fuse_invalidate_entry(entry);
9259e6268dbSMiklos Szeredi 	return err;
9269e6268dbSMiklos Szeredi }
9279e6268dbSMiklos Szeredi 
9289e6268dbSMiklos Szeredi static int fuse_rmdir(struct inode *dir, struct dentry *entry)
9299e6268dbSMiklos Szeredi {
9309e6268dbSMiklos Szeredi 	int err;
931fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(dir);
9327078187aSMiklos Szeredi 	FUSE_ARGS(args);
9339e6268dbSMiklos Szeredi 
9345d069dbeSMiklos Szeredi 	if (fuse_is_bad(dir))
9355d069dbeSMiklos Szeredi 		return -EIO;
9365d069dbeSMiklos Szeredi 
937d5b48543SMiklos Szeredi 	args.opcode = FUSE_RMDIR;
938d5b48543SMiklos Szeredi 	args.nodeid = get_node_id(dir);
939d5b48543SMiklos Szeredi 	args.in_numargs = 1;
940d5b48543SMiklos Szeredi 	args.in_args[0].size = entry->d_name.len + 1;
941d5b48543SMiklos Szeredi 	args.in_args[0].value = entry->d_name.name;
942fcee216bSMax Reitz 	err = fuse_simple_request(fm, &args);
9439e6268dbSMiklos Szeredi 	if (!err) {
944261aaba7SMiklos Szeredi 		fuse_dir_changed(dir);
945cefd1b83SMiklos Szeredi 		fuse_entry_unlinked(entry);
9469e6268dbSMiklos Szeredi 	} else if (err == -EINTR)
9479e6268dbSMiklos Szeredi 		fuse_invalidate_entry(entry);
9489e6268dbSMiklos Szeredi 	return err;
9499e6268dbSMiklos Szeredi }
9509e6268dbSMiklos Szeredi 
9511560c974SMiklos Szeredi static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
9521560c974SMiklos Szeredi 			      struct inode *newdir, struct dentry *newent,
9531560c974SMiklos Szeredi 			      unsigned int flags, int opcode, size_t argsize)
9549e6268dbSMiklos Szeredi {
9559e6268dbSMiklos Szeredi 	int err;
9561560c974SMiklos Szeredi 	struct fuse_rename2_in inarg;
957fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(olddir);
9587078187aSMiklos Szeredi 	FUSE_ARGS(args);
9599e6268dbSMiklos Szeredi 
9601560c974SMiklos Szeredi 	memset(&inarg, 0, argsize);
9619e6268dbSMiklos Szeredi 	inarg.newdir = get_node_id(newdir);
9621560c974SMiklos Szeredi 	inarg.flags = flags;
963d5b48543SMiklos Szeredi 	args.opcode = opcode;
964d5b48543SMiklos Szeredi 	args.nodeid = get_node_id(olddir);
965d5b48543SMiklos Szeredi 	args.in_numargs = 3;
966d5b48543SMiklos Szeredi 	args.in_args[0].size = argsize;
967d5b48543SMiklos Szeredi 	args.in_args[0].value = &inarg;
968d5b48543SMiklos Szeredi 	args.in_args[1].size = oldent->d_name.len + 1;
969d5b48543SMiklos Szeredi 	args.in_args[1].value = oldent->d_name.name;
970d5b48543SMiklos Szeredi 	args.in_args[2].size = newent->d_name.len + 1;
971d5b48543SMiklos Szeredi 	args.in_args[2].value = newent->d_name.name;
972fcee216bSMax Reitz 	err = fuse_simple_request(fm, &args);
9739e6268dbSMiklos Szeredi 	if (!err) {
97408b63307SMiklos Szeredi 		/* ctime changes */
9752b0143b5SDavid Howells 		fuse_update_ctime(d_inode(oldent));
97608b63307SMiklos Szeredi 
977371e8fd0SMiklos Szeredi 		if (flags & RENAME_EXCHANGE)
9782b0143b5SDavid Howells 			fuse_update_ctime(d_inode(newent));
9791560c974SMiklos Szeredi 
980261aaba7SMiklos Szeredi 		fuse_dir_changed(olddir);
9819e6268dbSMiklos Szeredi 		if (olddir != newdir)
982261aaba7SMiklos Szeredi 			fuse_dir_changed(newdir);
9838cbdf1e6SMiklos Szeredi 
9848cbdf1e6SMiklos Szeredi 		/* newent will end up negative */
985cefd1b83SMiklos Szeredi 		if (!(flags & RENAME_EXCHANGE) && d_really_is_positive(newent))
986cefd1b83SMiklos Szeredi 			fuse_entry_unlinked(newent);
9879e6268dbSMiklos Szeredi 	} else if (err == -EINTR) {
9889e6268dbSMiklos Szeredi 		/* If request was interrupted, DEITY only knows if the
9899e6268dbSMiklos Szeredi 		   rename actually took place.  If the invalidation
9909e6268dbSMiklos Szeredi 		   fails (e.g. some process has CWD under the renamed
9919e6268dbSMiklos Szeredi 		   directory), then there can be inconsistency between
9929e6268dbSMiklos Szeredi 		   the dcache and the real filesystem.  Tough luck. */
9939e6268dbSMiklos Szeredi 		fuse_invalidate_entry(oldent);
9942b0143b5SDavid Howells 		if (d_really_is_positive(newent))
9959e6268dbSMiklos Szeredi 			fuse_invalidate_entry(newent);
9969e6268dbSMiklos Szeredi 	}
9979e6268dbSMiklos Szeredi 
9989e6268dbSMiklos Szeredi 	return err;
9999e6268dbSMiklos Szeredi }
10009e6268dbSMiklos Szeredi 
1001549c7297SChristian Brauner static int fuse_rename2(struct user_namespace *mnt_userns, struct inode *olddir,
1002549c7297SChristian Brauner 			struct dentry *oldent, struct inode *newdir,
1003549c7297SChristian Brauner 			struct dentry *newent, unsigned int flags)
10041560c974SMiklos Szeredi {
10051560c974SMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(olddir);
10061560c974SMiklos Szeredi 	int err;
10071560c974SMiklos Szeredi 
10085d069dbeSMiklos Szeredi 	if (fuse_is_bad(olddir))
10095d069dbeSMiklos Szeredi 		return -EIO;
10105d069dbeSMiklos Szeredi 
1011519525faSVivek Goyal 	if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
10121560c974SMiklos Szeredi 		return -EINVAL;
10131560c974SMiklos Szeredi 
10144237ba43SMiklos Szeredi 	if (flags) {
10151560c974SMiklos Szeredi 		if (fc->no_rename2 || fc->minor < 23)
10161560c974SMiklos Szeredi 			return -EINVAL;
10171560c974SMiklos Szeredi 
10181560c974SMiklos Szeredi 		err = fuse_rename_common(olddir, oldent, newdir, newent, flags,
10194237ba43SMiklos Szeredi 					 FUSE_RENAME2,
10204237ba43SMiklos Szeredi 					 sizeof(struct fuse_rename2_in));
10211560c974SMiklos Szeredi 		if (err == -ENOSYS) {
10221560c974SMiklos Szeredi 			fc->no_rename2 = 1;
10231560c974SMiklos Szeredi 			err = -EINVAL;
10241560c974SMiklos Szeredi 		}
10254237ba43SMiklos Szeredi 	} else {
10264237ba43SMiklos Szeredi 		err = fuse_rename_common(olddir, oldent, newdir, newent, 0,
10274237ba43SMiklos Szeredi 					 FUSE_RENAME,
10284237ba43SMiklos Szeredi 					 sizeof(struct fuse_rename_in));
10294237ba43SMiklos Szeredi 	}
10301560c974SMiklos Szeredi 
10314237ba43SMiklos Szeredi 	return err;
10324237ba43SMiklos Szeredi }
10334237ba43SMiklos Szeredi 
10349e6268dbSMiklos Szeredi static int fuse_link(struct dentry *entry, struct inode *newdir,
10359e6268dbSMiklos Szeredi 		     struct dentry *newent)
10369e6268dbSMiklos Szeredi {
10379e6268dbSMiklos Szeredi 	int err;
10389e6268dbSMiklos Szeredi 	struct fuse_link_in inarg;
10392b0143b5SDavid Howells 	struct inode *inode = d_inode(entry);
1040fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(inode);
10417078187aSMiklos Szeredi 	FUSE_ARGS(args);
10429e6268dbSMiklos Szeredi 
10439e6268dbSMiklos Szeredi 	memset(&inarg, 0, sizeof(inarg));
10449e6268dbSMiklos Szeredi 	inarg.oldnodeid = get_node_id(inode);
1045d5b48543SMiklos Szeredi 	args.opcode = FUSE_LINK;
1046d5b48543SMiklos Szeredi 	args.in_numargs = 2;
1047d5b48543SMiklos Szeredi 	args.in_args[0].size = sizeof(inarg);
1048d5b48543SMiklos Szeredi 	args.in_args[0].value = &inarg;
1049d5b48543SMiklos Szeredi 	args.in_args[1].size = newent->d_name.len + 1;
1050d5b48543SMiklos Szeredi 	args.in_args[1].value = newent->d_name.name;
1051fcee216bSMax Reitz 	err = create_new_entry(fm, &args, newdir, newent, inode->i_mode);
105297f044f6SMiklos Szeredi 	if (!err)
105397f044f6SMiklos Szeredi 		fuse_update_ctime_in_cache(inode);
105497f044f6SMiklos Szeredi 	else if (err == -EINTR)
1055ac45d613SMiklos Szeredi 		fuse_invalidate_attr(inode);
105697f044f6SMiklos Szeredi 
10579e6268dbSMiklos Szeredi 	return err;
10589e6268dbSMiklos Szeredi }
10599e6268dbSMiklos Szeredi 
10601fb69e78SMiklos Szeredi static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
10611fb69e78SMiklos Szeredi 			  struct kstat *stat)
10621fb69e78SMiklos Szeredi {
1063203627bbSMiklos Szeredi 	unsigned int blkbits;
10648373200bSPavel Emelyanov 	struct fuse_conn *fc = get_fuse_conn(inode);
10658373200bSPavel Emelyanov 
10661fb69e78SMiklos Szeredi 	stat->dev = inode->i_sb->s_dev;
10671fb69e78SMiklos Szeredi 	stat->ino = attr->ino;
10681fb69e78SMiklos Szeredi 	stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
10691fb69e78SMiklos Szeredi 	stat->nlink = attr->nlink;
10708cb08329SEric W. Biederman 	stat->uid = make_kuid(fc->user_ns, attr->uid);
10718cb08329SEric W. Biederman 	stat->gid = make_kgid(fc->user_ns, attr->gid);
10721fb69e78SMiklos Szeredi 	stat->rdev = inode->i_rdev;
10731fb69e78SMiklos Szeredi 	stat->atime.tv_sec = attr->atime;
10741fb69e78SMiklos Szeredi 	stat->atime.tv_nsec = attr->atimensec;
10751fb69e78SMiklos Szeredi 	stat->mtime.tv_sec = attr->mtime;
10761fb69e78SMiklos Szeredi 	stat->mtime.tv_nsec = attr->mtimensec;
10771fb69e78SMiklos Szeredi 	stat->ctime.tv_sec = attr->ctime;
10781fb69e78SMiklos Szeredi 	stat->ctime.tv_nsec = attr->ctimensec;
10791fb69e78SMiklos Szeredi 	stat->size = attr->size;
10801fb69e78SMiklos Szeredi 	stat->blocks = attr->blocks;
1081203627bbSMiklos Szeredi 
1082203627bbSMiklos Szeredi 	if (attr->blksize != 0)
1083203627bbSMiklos Szeredi 		blkbits = ilog2(attr->blksize);
1084203627bbSMiklos Szeredi 	else
1085203627bbSMiklos Szeredi 		blkbits = inode->i_sb->s_blocksize_bits;
1086203627bbSMiklos Szeredi 
1087203627bbSMiklos Szeredi 	stat->blksize = 1 << blkbits;
10881fb69e78SMiklos Szeredi }
10891fb69e78SMiklos Szeredi 
1090c79e322fSMiklos Szeredi static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
1091c79e322fSMiklos Szeredi 			   struct file *file)
1092e5e5558eSMiklos Szeredi {
1093e5e5558eSMiklos Szeredi 	int err;
1094c79e322fSMiklos Szeredi 	struct fuse_getattr_in inarg;
1095c79e322fSMiklos Szeredi 	struct fuse_attr_out outarg;
1096fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(inode);
10977078187aSMiklos Szeredi 	FUSE_ARGS(args);
10981fb69e78SMiklos Szeredi 	u64 attr_version;
10991fb69e78SMiklos Szeredi 
1100fcee216bSMax Reitz 	attr_version = fuse_get_attr_version(fm->fc);
11011fb69e78SMiklos Szeredi 
1102c79e322fSMiklos Szeredi 	memset(&inarg, 0, sizeof(inarg));
11030e9663eeSMiklos Szeredi 	memset(&outarg, 0, sizeof(outarg));
1104c79e322fSMiklos Szeredi 	/* Directories have separate file-handle space */
1105c79e322fSMiklos Szeredi 	if (file && S_ISREG(inode->i_mode)) {
1106c79e322fSMiklos Szeredi 		struct fuse_file *ff = file->private_data;
1107c79e322fSMiklos Szeredi 
1108c79e322fSMiklos Szeredi 		inarg.getattr_flags |= FUSE_GETATTR_FH;
1109c79e322fSMiklos Szeredi 		inarg.fh = ff->fh;
1110c79e322fSMiklos Szeredi 	}
1111d5b48543SMiklos Szeredi 	args.opcode = FUSE_GETATTR;
1112d5b48543SMiklos Szeredi 	args.nodeid = get_node_id(inode);
1113d5b48543SMiklos Szeredi 	args.in_numargs = 1;
1114d5b48543SMiklos Szeredi 	args.in_args[0].size = sizeof(inarg);
1115d5b48543SMiklos Szeredi 	args.in_args[0].value = &inarg;
1116d5b48543SMiklos Szeredi 	args.out_numargs = 1;
1117d5b48543SMiklos Szeredi 	args.out_args[0].size = sizeof(outarg);
1118d5b48543SMiklos Szeredi 	args.out_args[0].value = &outarg;
1119fcee216bSMax Reitz 	err = fuse_simple_request(fm, &args);
1120e5e5558eSMiklos Szeredi 	if (!err) {
1121eb59bd17SMiklos Szeredi 		if (fuse_invalid_attr(&outarg.attr) ||
11226e3e2c43SAl Viro 		    inode_wrong_type(inode, outarg.attr.mode)) {
11235d069dbeSMiklos Szeredi 			fuse_make_bad(inode);
1124e5e5558eSMiklos Szeredi 			err = -EIO;
1125e5e5558eSMiklos Szeredi 		} else {
1126c79e322fSMiklos Szeredi 			fuse_change_attributes(inode, &outarg.attr,
1127c79e322fSMiklos Szeredi 					       attr_timeout(&outarg),
11281fb69e78SMiklos Szeredi 					       attr_version);
11291fb69e78SMiklos Szeredi 			if (stat)
1130c79e322fSMiklos Szeredi 				fuse_fillattr(inode, &outarg.attr, stat);
1131e5e5558eSMiklos Szeredi 		}
1132e5e5558eSMiklos Szeredi 	}
1133e5e5558eSMiklos Szeredi 	return err;
1134e5e5558eSMiklos Szeredi }
1135e5e5558eSMiklos Szeredi 
11365b97eeacSMiklos Szeredi static int fuse_update_get_attr(struct inode *inode, struct file *file,
11372f1e8196SMiklos Szeredi 				struct kstat *stat, u32 request_mask,
11382f1e8196SMiklos Szeredi 				unsigned int flags)
1139bcb4be80SMiklos Szeredi {
1140bcb4be80SMiklos Szeredi 	struct fuse_inode *fi = get_fuse_inode(inode);
11415b97eeacSMiklos Szeredi 	int err = 0;
1142bf5c1898SMiklos Szeredi 	bool sync;
1143ec855375SMiklos Szeredi 	u32 inval_mask = READ_ONCE(fi->inval_mask);
1144ec855375SMiklos Szeredi 	u32 cache_mask = fuse_get_cache_mask(inode);
1145bcb4be80SMiklos Szeredi 
1146bf5c1898SMiklos Szeredi 	if (flags & AT_STATX_FORCE_SYNC)
1147bf5c1898SMiklos Szeredi 		sync = true;
1148bf5c1898SMiklos Szeredi 	else if (flags & AT_STATX_DONT_SYNC)
1149bf5c1898SMiklos Szeredi 		sync = false;
1150ec855375SMiklos Szeredi 	else if (request_mask & inval_mask & ~cache_mask)
11512f1e8196SMiklos Szeredi 		sync = true;
1152bf5c1898SMiklos Szeredi 	else
1153bf5c1898SMiklos Szeredi 		sync = time_before64(fi->i_time, get_jiffies_64());
1154bf5c1898SMiklos Szeredi 
1155bf5c1898SMiklos Szeredi 	if (sync) {
115660bcc88aSSeth Forshee 		forget_all_cached_acls(inode);
1157bcb4be80SMiklos Szeredi 		err = fuse_do_getattr(inode, stat, file);
11585b97eeacSMiklos Szeredi 	} else if (stat) {
1159*b74d24f7SChristian Brauner 		generic_fillattr(&nop_mnt_idmap, inode, stat);
1160bcb4be80SMiklos Szeredi 		stat->mode = fi->orig_i_mode;
116145c72cd7SPavel Shilovsky 		stat->ino = fi->orig_ino;
1162bcb4be80SMiklos Szeredi 	}
1163bcb4be80SMiklos Szeredi 
1164bcb4be80SMiklos Szeredi 	return err;
1165bcb4be80SMiklos Szeredi }
1166bcb4be80SMiklos Szeredi 
1167c6c745b8SMiklos Szeredi int fuse_update_attributes(struct inode *inode, struct file *file, u32 mask)
11685b97eeacSMiklos Szeredi {
1169c6c745b8SMiklos Szeredi 	return fuse_update_get_attr(inode, file, NULL, mask, 0);
11705b97eeacSMiklos Szeredi }
11715b97eeacSMiklos Szeredi 
1172fcee216bSMax Reitz int fuse_reverse_inval_entry(struct fuse_conn *fc, u64 parent_nodeid,
11734f8d3702SMiklos Szeredi 			     u64 child_nodeid, struct qstr *name, u32 flags)
11743b463ae0SJohn Muir {
11753b463ae0SJohn Muir 	int err = -ENOTDIR;
11763b463ae0SJohn Muir 	struct inode *parent;
11773b463ae0SJohn Muir 	struct dentry *dir;
11783b463ae0SJohn Muir 	struct dentry *entry;
11793b463ae0SJohn Muir 
1180fcee216bSMax Reitz 	parent = fuse_ilookup(fc, parent_nodeid, NULL);
11813b463ae0SJohn Muir 	if (!parent)
11823b463ae0SJohn Muir 		return -ENOENT;
11833b463ae0SJohn Muir 
1184bda9a719SMiklos Szeredi 	inode_lock_nested(parent, I_MUTEX_PARENT);
11853b463ae0SJohn Muir 	if (!S_ISDIR(parent->i_mode))
11863b463ae0SJohn Muir 		goto unlock;
11873b463ae0SJohn Muir 
11883b463ae0SJohn Muir 	err = -ENOENT;
11893b463ae0SJohn Muir 	dir = d_find_alias(parent);
11903b463ae0SJohn Muir 	if (!dir)
11913b463ae0SJohn Muir 		goto unlock;
11923b463ae0SJohn Muir 
11938387ff25SLinus Torvalds 	name->hash = full_name_hash(dir, name->name, name->len);
11943b463ae0SJohn Muir 	entry = d_lookup(dir, name);
11953b463ae0SJohn Muir 	dput(dir);
11963b463ae0SJohn Muir 	if (!entry)
11973b463ae0SJohn Muir 		goto unlock;
11983b463ae0SJohn Muir 
1199261aaba7SMiklos Szeredi 	fuse_dir_changed(parent);
12004f8d3702SMiklos Szeredi 	if (!(flags & FUSE_EXPIRE_ONLY))
12014f8d3702SMiklos Szeredi 		d_invalidate(entry);
12024f8d3702SMiklos Szeredi 	fuse_invalidate_entry_cache(entry);
1203451d0f59SJohn Muir 
12042b0143b5SDavid Howells 	if (child_nodeid != 0 && d_really_is_positive(entry)) {
12055955102cSAl Viro 		inode_lock(d_inode(entry));
12062b0143b5SDavid Howells 		if (get_node_id(d_inode(entry)) != child_nodeid) {
1207451d0f59SJohn Muir 			err = -ENOENT;
1208451d0f59SJohn Muir 			goto badentry;
1209451d0f59SJohn Muir 		}
1210451d0f59SJohn Muir 		if (d_mountpoint(entry)) {
1211451d0f59SJohn Muir 			err = -EBUSY;
1212451d0f59SJohn Muir 			goto badentry;
1213451d0f59SJohn Muir 		}
1214e36cb0b8SDavid Howells 		if (d_is_dir(entry)) {
1215451d0f59SJohn Muir 			shrink_dcache_parent(entry);
1216451d0f59SJohn Muir 			if (!simple_empty(entry)) {
1217451d0f59SJohn Muir 				err = -ENOTEMPTY;
1218451d0f59SJohn Muir 				goto badentry;
1219451d0f59SJohn Muir 			}
12202b0143b5SDavid Howells 			d_inode(entry)->i_flags |= S_DEAD;
1221451d0f59SJohn Muir 		}
1222451d0f59SJohn Muir 		dont_mount(entry);
12232b0143b5SDavid Howells 		clear_nlink(d_inode(entry));
12243b463ae0SJohn Muir 		err = 0;
1225451d0f59SJohn Muir  badentry:
12265955102cSAl Viro 		inode_unlock(d_inode(entry));
1227451d0f59SJohn Muir 		if (!err)
1228451d0f59SJohn Muir 			d_delete(entry);
1229451d0f59SJohn Muir 	} else {
1230451d0f59SJohn Muir 		err = 0;
1231451d0f59SJohn Muir 	}
1232451d0f59SJohn Muir 	dput(entry);
12333b463ae0SJohn Muir 
12343b463ae0SJohn Muir  unlock:
12355955102cSAl Viro 	inode_unlock(parent);
12363b463ae0SJohn Muir 	iput(parent);
12373b463ae0SJohn Muir 	return err;
12383b463ae0SJohn Muir }
12393b463ae0SJohn Muir 
1240b1387777SDave Marchevsky static inline bool fuse_permissible_uidgid(struct fuse_conn *fc)
1241b1387777SDave Marchevsky {
1242b1387777SDave Marchevsky 	const struct cred *cred = current_cred();
1243b1387777SDave Marchevsky 
1244b1387777SDave Marchevsky 	return (uid_eq(cred->euid, fc->user_id) &&
1245b1387777SDave Marchevsky 		uid_eq(cred->suid, fc->user_id) &&
1246b1387777SDave Marchevsky 		uid_eq(cred->uid,  fc->user_id) &&
1247b1387777SDave Marchevsky 		gid_eq(cred->egid, fc->group_id) &&
1248b1387777SDave Marchevsky 		gid_eq(cred->sgid, fc->group_id) &&
1249b1387777SDave Marchevsky 		gid_eq(cred->gid,  fc->group_id));
1250b1387777SDave Marchevsky }
1251b1387777SDave Marchevsky 
125287729a55SMiklos Szeredi /*
125387729a55SMiklos Szeredi  * Calling into a user-controlled filesystem gives the filesystem
1254c2132c1bSAnatol Pomozov  * daemon ptrace-like capabilities over the current process.  This
125587729a55SMiklos Szeredi  * means, that the filesystem daemon is able to record the exact
125687729a55SMiklos Szeredi  * filesystem operations performed, and can also control the behavior
125787729a55SMiklos Szeredi  * of the requester process in otherwise impossible ways.  For example
125887729a55SMiklos Szeredi  * it can delay the operation for arbitrary length of time allowing
125987729a55SMiklos Szeredi  * DoS against the requester.
126087729a55SMiklos Szeredi  *
126187729a55SMiklos Szeredi  * For this reason only those processes can call into the filesystem,
126287729a55SMiklos Szeredi  * for which the owner of the mount has ptrace privilege.  This
126387729a55SMiklos Szeredi  * excludes processes started by other users, suid or sgid processes.
126487729a55SMiklos Szeredi  */
1265b1387777SDave Marchevsky bool fuse_allow_current_process(struct fuse_conn *fc)
126687729a55SMiklos Szeredi {
1267b1387777SDave Marchevsky 	bool allow;
12689ccf47b2SDave Marchevsky 
126929433a29SMiklos Szeredi 	if (fc->allow_other)
1270b1387777SDave Marchevsky 		allow = current_in_userns(fc->user_ns);
1271b1387777SDave Marchevsky 	else
1272b1387777SDave Marchevsky 		allow = fuse_permissible_uidgid(fc);
127387729a55SMiklos Szeredi 
1274b1387777SDave Marchevsky 	if (!allow && allow_sys_admin_access && capable(CAP_SYS_ADMIN))
1275b1387777SDave Marchevsky 		allow = true;
127687729a55SMiklos Szeredi 
1277b1387777SDave Marchevsky 	return allow;
127887729a55SMiklos Szeredi }
127987729a55SMiklos Szeredi 
128031d40d74SMiklos Szeredi static int fuse_access(struct inode *inode, int mask)
128131d40d74SMiklos Szeredi {
1282fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(inode);
12837078187aSMiklos Szeredi 	FUSE_ARGS(args);
128431d40d74SMiklos Szeredi 	struct fuse_access_in inarg;
128531d40d74SMiklos Szeredi 	int err;
128631d40d74SMiklos Szeredi 
1287698fa1d1SMiklos Szeredi 	BUG_ON(mask & MAY_NOT_BLOCK);
1288698fa1d1SMiklos Szeredi 
1289fcee216bSMax Reitz 	if (fm->fc->no_access)
129031d40d74SMiklos Szeredi 		return 0;
129131d40d74SMiklos Szeredi 
129231d40d74SMiklos Szeredi 	memset(&inarg, 0, sizeof(inarg));
1293e6305c43SAl Viro 	inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
1294d5b48543SMiklos Szeredi 	args.opcode = FUSE_ACCESS;
1295d5b48543SMiklos Szeredi 	args.nodeid = get_node_id(inode);
1296d5b48543SMiklos Szeredi 	args.in_numargs = 1;
1297d5b48543SMiklos Szeredi 	args.in_args[0].size = sizeof(inarg);
1298d5b48543SMiklos Szeredi 	args.in_args[0].value = &inarg;
1299fcee216bSMax Reitz 	err = fuse_simple_request(fm, &args);
130031d40d74SMiklos Szeredi 	if (err == -ENOSYS) {
1301fcee216bSMax Reitz 		fm->fc->no_access = 1;
130231d40d74SMiklos Szeredi 		err = 0;
130331d40d74SMiklos Szeredi 	}
130431d40d74SMiklos Szeredi 	return err;
130531d40d74SMiklos Szeredi }
130631d40d74SMiklos Szeredi 
130710556cb2SAl Viro static int fuse_perm_getattr(struct inode *inode, int mask)
130819690ddbSMiklos Szeredi {
130910556cb2SAl Viro 	if (mask & MAY_NOT_BLOCK)
131019690ddbSMiklos Szeredi 		return -ECHILD;
131119690ddbSMiklos Szeredi 
131260bcc88aSSeth Forshee 	forget_all_cached_acls(inode);
131319690ddbSMiklos Szeredi 	return fuse_do_getattr(inode, NULL, NULL);
131419690ddbSMiklos Szeredi }
131519690ddbSMiklos Szeredi 
13166f9f1180SMiklos Szeredi /*
13176f9f1180SMiklos Szeredi  * Check permission.  The two basic access models of FUSE are:
13186f9f1180SMiklos Szeredi  *
13196f9f1180SMiklos Szeredi  * 1) Local access checking ('default_permissions' mount option) based
13206f9f1180SMiklos Szeredi  * on file mode.  This is the plain old disk filesystem permission
13216f9f1180SMiklos Szeredi  * modell.
13226f9f1180SMiklos Szeredi  *
13236f9f1180SMiklos Szeredi  * 2) "Remote" access checking, where server is responsible for
13246f9f1180SMiklos Szeredi  * checking permission in each inode operation.  An exception to this
13256f9f1180SMiklos Szeredi  * is if ->permission() was invoked from sys_access() in which case an
13266f9f1180SMiklos Szeredi  * access request is sent.  Execute permission is still checked
13276f9f1180SMiklos Szeredi  * locally based on file mode.
13286f9f1180SMiklos Szeredi  */
1329549c7297SChristian Brauner static int fuse_permission(struct user_namespace *mnt_userns,
1330549c7297SChristian Brauner 			   struct inode *inode, int mask)
1331e5e5558eSMiklos Szeredi {
1332e5e5558eSMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(inode);
1333244f6385SMiklos Szeredi 	bool refreshed = false;
1334244f6385SMiklos Szeredi 	int err = 0;
1335e5e5558eSMiklos Szeredi 
13365d069dbeSMiklos Szeredi 	if (fuse_is_bad(inode))
13375d069dbeSMiklos Szeredi 		return -EIO;
13385d069dbeSMiklos Szeredi 
1339c2132c1bSAnatol Pomozov 	if (!fuse_allow_current_process(fc))
1340e5e5558eSMiklos Szeredi 		return -EACCES;
1341244f6385SMiklos Szeredi 
1342244f6385SMiklos Szeredi 	/*
1343e8e96157SMiklos Szeredi 	 * If attributes are needed, refresh them before proceeding
1344244f6385SMiklos Szeredi 	 */
134529433a29SMiklos Szeredi 	if (fc->default_permissions ||
1346e8e96157SMiklos Szeredi 	    ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
134719690ddbSMiklos Szeredi 		struct fuse_inode *fi = get_fuse_inode(inode);
1348d233c7ddSMiklos Szeredi 		u32 perm_mask = STATX_MODE | STATX_UID | STATX_GID;
134919690ddbSMiklos Szeredi 
1350d233c7ddSMiklos Szeredi 		if (perm_mask & READ_ONCE(fi->inval_mask) ||
1351d233c7ddSMiklos Szeredi 		    time_before64(fi->i_time, get_jiffies_64())) {
135219690ddbSMiklos Szeredi 			refreshed = true;
135319690ddbSMiklos Szeredi 
135410556cb2SAl Viro 			err = fuse_perm_getattr(inode, mask);
1355244f6385SMiklos Szeredi 			if (err)
1356244f6385SMiklos Szeredi 				return err;
13571fb69e78SMiklos Szeredi 		}
135819690ddbSMiklos Szeredi 	}
1359244f6385SMiklos Szeredi 
136029433a29SMiklos Szeredi 	if (fc->default_permissions) {
136147291baaSChristian Brauner 		err = generic_permission(&init_user_ns, inode, mask);
13621e9a4ed9SMiklos Szeredi 
13631e9a4ed9SMiklos Szeredi 		/* If permission is denied, try to refresh file
13641e9a4ed9SMiklos Szeredi 		   attributes.  This is also needed, because the root
13651e9a4ed9SMiklos Szeredi 		   node will at first have no permissions */
1366244f6385SMiklos Szeredi 		if (err == -EACCES && !refreshed) {
136710556cb2SAl Viro 			err = fuse_perm_getattr(inode, mask);
13681e9a4ed9SMiklos Szeredi 			if (!err)
136947291baaSChristian Brauner 				err = generic_permission(&init_user_ns,
137047291baaSChristian Brauner 							 inode, mask);
13711e9a4ed9SMiklos Szeredi 		}
13721e9a4ed9SMiklos Szeredi 
13736f9f1180SMiklos Szeredi 		/* Note: the opposite of the above test does not
13746f9f1180SMiklos Szeredi 		   exist.  So if permissions are revoked this won't be
13756f9f1180SMiklos Szeredi 		   noticed immediately, only after the attribute
13766f9f1180SMiklos Szeredi 		   timeout has expired */
13779cfcac81SEric Paris 	} else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
1378e8e96157SMiklos Szeredi 		err = fuse_access(inode, mask);
1379e8e96157SMiklos Szeredi 	} else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1380e8e96157SMiklos Szeredi 		if (!(inode->i_mode & S_IXUGO)) {
1381e8e96157SMiklos Szeredi 			if (refreshed)
1382e5e5558eSMiklos Szeredi 				return -EACCES;
138331d40d74SMiklos Szeredi 
138410556cb2SAl Viro 			err = fuse_perm_getattr(inode, mask);
1385e8e96157SMiklos Szeredi 			if (!err && !(inode->i_mode & S_IXUGO))
1386e8e96157SMiklos Szeredi 				return -EACCES;
1387e8e96157SMiklos Szeredi 		}
1388e5e5558eSMiklos Szeredi 	}
1389244f6385SMiklos Szeredi 	return err;
1390e5e5558eSMiklos Szeredi }
1391e5e5558eSMiklos Szeredi 
13925571f1e6SDan Schatzberg static int fuse_readlink_page(struct inode *inode, struct page *page)
1393e5e5558eSMiklos Szeredi {
1394fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(inode);
13954c29afecSMiklos Szeredi 	struct fuse_page_desc desc = { .length = PAGE_SIZE - 1 };
13964c29afecSMiklos Szeredi 	struct fuse_args_pages ap = {
13974c29afecSMiklos Szeredi 		.num_pages = 1,
13984c29afecSMiklos Szeredi 		.pages = &page,
13994c29afecSMiklos Szeredi 		.descs = &desc,
14004c29afecSMiklos Szeredi 	};
14014c29afecSMiklos Szeredi 	char *link;
14024c29afecSMiklos Szeredi 	ssize_t res;
1403e5e5558eSMiklos Szeredi 
14044c29afecSMiklos Szeredi 	ap.args.opcode = FUSE_READLINK;
14054c29afecSMiklos Szeredi 	ap.args.nodeid = get_node_id(inode);
14064c29afecSMiklos Szeredi 	ap.args.out_pages = true;
14074c29afecSMiklos Szeredi 	ap.args.out_argvar = true;
14084c29afecSMiklos Szeredi 	ap.args.page_zeroing = true;
14094c29afecSMiklos Szeredi 	ap.args.out_numargs = 1;
14104c29afecSMiklos Szeredi 	ap.args.out_args[0].size = desc.length;
1411fcee216bSMax Reitz 	res = fuse_simple_request(fm, &ap.args);
14126b255391SAl Viro 
1413451418fcSAndrew Gallagher 	fuse_invalidate_atime(inode);
14145571f1e6SDan Schatzberg 
14154c29afecSMiklos Szeredi 	if (res < 0)
14164c29afecSMiklos Szeredi 		return res;
14174c29afecSMiklos Szeredi 
14184c29afecSMiklos Szeredi 	if (WARN_ON(res >= PAGE_SIZE))
14194c29afecSMiklos Szeredi 		return -EIO;
14204c29afecSMiklos Szeredi 
14214c29afecSMiklos Szeredi 	link = page_address(page);
14224c29afecSMiklos Szeredi 	link[res] = '\0';
14234c29afecSMiklos Szeredi 
14244c29afecSMiklos Szeredi 	return 0;
14255571f1e6SDan Schatzberg }
14265571f1e6SDan Schatzberg 
14275571f1e6SDan Schatzberg static const char *fuse_get_link(struct dentry *dentry, struct inode *inode,
14285571f1e6SDan Schatzberg 				 struct delayed_call *callback)
14295571f1e6SDan Schatzberg {
14305571f1e6SDan Schatzberg 	struct fuse_conn *fc = get_fuse_conn(inode);
14315571f1e6SDan Schatzberg 	struct page *page;
14325571f1e6SDan Schatzberg 	int err;
14335571f1e6SDan Schatzberg 
14345571f1e6SDan Schatzberg 	err = -EIO;
14355d069dbeSMiklos Szeredi 	if (fuse_is_bad(inode))
14365571f1e6SDan Schatzberg 		goto out_err;
14375571f1e6SDan Schatzberg 
14385571f1e6SDan Schatzberg 	if (fc->cache_symlinks)
14395571f1e6SDan Schatzberg 		return page_get_link(dentry, inode, callback);
14405571f1e6SDan Schatzberg 
14415571f1e6SDan Schatzberg 	err = -ECHILD;
14425571f1e6SDan Schatzberg 	if (!dentry)
14435571f1e6SDan Schatzberg 		goto out_err;
14445571f1e6SDan Schatzberg 
14455571f1e6SDan Schatzberg 	page = alloc_page(GFP_KERNEL);
14465571f1e6SDan Schatzberg 	err = -ENOMEM;
14475571f1e6SDan Schatzberg 	if (!page)
14485571f1e6SDan Schatzberg 		goto out_err;
14495571f1e6SDan Schatzberg 
14505571f1e6SDan Schatzberg 	err = fuse_readlink_page(inode, page);
14515571f1e6SDan Schatzberg 	if (err) {
14525571f1e6SDan Schatzberg 		__free_page(page);
14535571f1e6SDan Schatzberg 		goto out_err;
14545571f1e6SDan Schatzberg 	}
14555571f1e6SDan Schatzberg 
14565571f1e6SDan Schatzberg 	set_delayed_call(callback, page_put_link, page);
14575571f1e6SDan Schatzberg 
14585571f1e6SDan Schatzberg 	return page_address(page);
14595571f1e6SDan Schatzberg 
14605571f1e6SDan Schatzberg out_err:
14615571f1e6SDan Schatzberg 	return ERR_PTR(err);
1462e5e5558eSMiklos Szeredi }
1463e5e5558eSMiklos Szeredi 
1464e5e5558eSMiklos Szeredi static int fuse_dir_open(struct inode *inode, struct file *file)
1465e5e5558eSMiklos Szeredi {
146691fe96b4SMiklos Szeredi 	return fuse_open_common(inode, file, true);
1467e5e5558eSMiklos Szeredi }
1468e5e5558eSMiklos Szeredi 
1469e5e5558eSMiklos Szeredi static int fuse_dir_release(struct inode *inode, struct file *file)
1470e5e5558eSMiklos Szeredi {
14712e64ff15SChad Austin 	fuse_release_common(file, true);
14728b0797a4SMiklos Szeredi 
14738b0797a4SMiklos Szeredi 	return 0;
1474e5e5558eSMiklos Szeredi }
1475e5e5558eSMiklos Szeredi 
147602c24a82SJosef Bacik static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
147702c24a82SJosef Bacik 			  int datasync)
147882547981SMiklos Szeredi {
1479a9c2d1e8SMiklos Szeredi 	struct inode *inode = file->f_mapping->host;
1480a9c2d1e8SMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(inode);
1481a9c2d1e8SMiklos Szeredi 	int err;
1482a9c2d1e8SMiklos Szeredi 
14835d069dbeSMiklos Szeredi 	if (fuse_is_bad(inode))
1484a9c2d1e8SMiklos Szeredi 		return -EIO;
1485a9c2d1e8SMiklos Szeredi 
1486a9c2d1e8SMiklos Szeredi 	if (fc->no_fsyncdir)
1487a9c2d1e8SMiklos Szeredi 		return 0;
1488a9c2d1e8SMiklos Szeredi 
1489a9c2d1e8SMiklos Szeredi 	inode_lock(inode);
1490a9c2d1e8SMiklos Szeredi 	err = fuse_fsync_common(file, start, end, datasync, FUSE_FSYNCDIR);
1491a9c2d1e8SMiklos Szeredi 	if (err == -ENOSYS) {
1492a9c2d1e8SMiklos Szeredi 		fc->no_fsyncdir = 1;
1493a9c2d1e8SMiklos Szeredi 		err = 0;
1494a9c2d1e8SMiklos Szeredi 	}
1495a9c2d1e8SMiklos Szeredi 	inode_unlock(inode);
1496a9c2d1e8SMiklos Szeredi 
1497a9c2d1e8SMiklos Szeredi 	return err;
149882547981SMiklos Szeredi }
149982547981SMiklos Szeredi 
1500b18da0c5SMiklos Szeredi static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1501b18da0c5SMiklos Szeredi 			    unsigned long arg)
1502b18da0c5SMiklos Szeredi {
1503b18da0c5SMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1504b18da0c5SMiklos Szeredi 
1505b18da0c5SMiklos Szeredi 	/* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1506b18da0c5SMiklos Szeredi 	if (fc->minor < 18)
1507b18da0c5SMiklos Szeredi 		return -ENOTTY;
1508b18da0c5SMiklos Szeredi 
1509b18da0c5SMiklos Szeredi 	return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1510b18da0c5SMiklos Szeredi }
1511b18da0c5SMiklos Szeredi 
1512b18da0c5SMiklos Szeredi static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1513b18da0c5SMiklos Szeredi 				   unsigned long arg)
1514b18da0c5SMiklos Szeredi {
1515b18da0c5SMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1516b18da0c5SMiklos Szeredi 
1517b18da0c5SMiklos Szeredi 	if (fc->minor < 18)
1518b18da0c5SMiklos Szeredi 		return -ENOTTY;
1519b18da0c5SMiklos Szeredi 
1520b18da0c5SMiklos Szeredi 	return fuse_ioctl_common(file, cmd, arg,
1521b18da0c5SMiklos Szeredi 				 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1522b18da0c5SMiklos Szeredi }
1523b18da0c5SMiklos Szeredi 
1524b0aa7606SMaxim Patlasov static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
152517637cbaSMiklos Szeredi {
152617637cbaSMiklos Szeredi 	/* Always update if mtime is explicitly set  */
152717637cbaSMiklos Szeredi 	if (ivalid & ATTR_MTIME_SET)
152817637cbaSMiklos Szeredi 		return true;
152917637cbaSMiklos Szeredi 
1530b0aa7606SMaxim Patlasov 	/* Or if kernel i_mtime is the official one */
1531b0aa7606SMaxim Patlasov 	if (trust_local_mtime)
1532b0aa7606SMaxim Patlasov 		return true;
1533b0aa7606SMaxim Patlasov 
153417637cbaSMiklos Szeredi 	/* If it's an open(O_TRUNC) or an ftruncate(), don't update */
153517637cbaSMiklos Szeredi 	if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
153617637cbaSMiklos Szeredi 		return false;
153717637cbaSMiklos Szeredi 
153817637cbaSMiklos Szeredi 	/* In all other cases update */
153917637cbaSMiklos Szeredi 	return true;
154017637cbaSMiklos Szeredi }
154117637cbaSMiklos Szeredi 
15428cb08329SEric W. Biederman static void iattr_to_fattr(struct fuse_conn *fc, struct iattr *iattr,
15438cb08329SEric W. Biederman 			   struct fuse_setattr_in *arg, bool trust_local_cmtime)
15449e6268dbSMiklos Szeredi {
15459e6268dbSMiklos Szeredi 	unsigned ivalid = iattr->ia_valid;
15469e6268dbSMiklos Szeredi 
15479e6268dbSMiklos Szeredi 	if (ivalid & ATTR_MODE)
1548befc649cSMiklos Szeredi 		arg->valid |= FATTR_MODE,   arg->mode = iattr->ia_mode;
15499e6268dbSMiklos Szeredi 	if (ivalid & ATTR_UID)
15508cb08329SEric W. Biederman 		arg->valid |= FATTR_UID,    arg->uid = from_kuid(fc->user_ns, iattr->ia_uid);
15519e6268dbSMiklos Szeredi 	if (ivalid & ATTR_GID)
15528cb08329SEric W. Biederman 		arg->valid |= FATTR_GID,    arg->gid = from_kgid(fc->user_ns, iattr->ia_gid);
15539e6268dbSMiklos Szeredi 	if (ivalid & ATTR_SIZE)
1554befc649cSMiklos Szeredi 		arg->valid |= FATTR_SIZE,   arg->size = iattr->ia_size;
155517637cbaSMiklos Szeredi 	if (ivalid & ATTR_ATIME) {
155617637cbaSMiklos Szeredi 		arg->valid |= FATTR_ATIME;
1557befc649cSMiklos Szeredi 		arg->atime = iattr->ia_atime.tv_sec;
155817637cbaSMiklos Szeredi 		arg->atimensec = iattr->ia_atime.tv_nsec;
155917637cbaSMiklos Szeredi 		if (!(ivalid & ATTR_ATIME_SET))
156017637cbaSMiklos Szeredi 			arg->valid |= FATTR_ATIME_NOW;
156117637cbaSMiklos Szeredi 	}
15623ad22c62SMaxim Patlasov 	if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
156317637cbaSMiklos Szeredi 		arg->valid |= FATTR_MTIME;
1564befc649cSMiklos Szeredi 		arg->mtime = iattr->ia_mtime.tv_sec;
156517637cbaSMiklos Szeredi 		arg->mtimensec = iattr->ia_mtime.tv_nsec;
15663ad22c62SMaxim Patlasov 		if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
156717637cbaSMiklos Szeredi 			arg->valid |= FATTR_MTIME_NOW;
15689e6268dbSMiklos Szeredi 	}
15693ad22c62SMaxim Patlasov 	if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
15703ad22c62SMaxim Patlasov 		arg->valid |= FATTR_CTIME;
15713ad22c62SMaxim Patlasov 		arg->ctime = iattr->ia_ctime.tv_sec;
15723ad22c62SMaxim Patlasov 		arg->ctimensec = iattr->ia_ctime.tv_nsec;
15733ad22c62SMaxim Patlasov 	}
15749e6268dbSMiklos Szeredi }
15759e6268dbSMiklos Szeredi 
15766f9f1180SMiklos Szeredi /*
15773be5a52bSMiklos Szeredi  * Prevent concurrent writepages on inode
15783be5a52bSMiklos Szeredi  *
15793be5a52bSMiklos Szeredi  * This is done by adding a negative bias to the inode write counter
15803be5a52bSMiklos Szeredi  * and waiting for all pending writes to finish.
15813be5a52bSMiklos Szeredi  */
15823be5a52bSMiklos Szeredi void fuse_set_nowrite(struct inode *inode)
15833be5a52bSMiklos Szeredi {
15843be5a52bSMiklos Szeredi 	struct fuse_inode *fi = get_fuse_inode(inode);
15853be5a52bSMiklos Szeredi 
15865955102cSAl Viro 	BUG_ON(!inode_is_locked(inode));
15873be5a52bSMiklos Szeredi 
1588f15ecfefSKirill Tkhai 	spin_lock(&fi->lock);
15893be5a52bSMiklos Szeredi 	BUG_ON(fi->writectr < 0);
15903be5a52bSMiklos Szeredi 	fi->writectr += FUSE_NOWRITE;
1591f15ecfefSKirill Tkhai 	spin_unlock(&fi->lock);
15923be5a52bSMiklos Szeredi 	wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
15933be5a52bSMiklos Szeredi }
15943be5a52bSMiklos Szeredi 
15953be5a52bSMiklos Szeredi /*
15963be5a52bSMiklos Szeredi  * Allow writepages on inode
15973be5a52bSMiklos Szeredi  *
15983be5a52bSMiklos Szeredi  * Remove the bias from the writecounter and send any queued
15993be5a52bSMiklos Szeredi  * writepages.
16003be5a52bSMiklos Szeredi  */
16013be5a52bSMiklos Szeredi static void __fuse_release_nowrite(struct inode *inode)
16023be5a52bSMiklos Szeredi {
16033be5a52bSMiklos Szeredi 	struct fuse_inode *fi = get_fuse_inode(inode);
16043be5a52bSMiklos Szeredi 
16053be5a52bSMiklos Szeredi 	BUG_ON(fi->writectr != FUSE_NOWRITE);
16063be5a52bSMiklos Szeredi 	fi->writectr = 0;
16073be5a52bSMiklos Szeredi 	fuse_flush_writepages(inode);
16083be5a52bSMiklos Szeredi }
16093be5a52bSMiklos Szeredi 
16103be5a52bSMiklos Szeredi void fuse_release_nowrite(struct inode *inode)
16113be5a52bSMiklos Szeredi {
1612f15ecfefSKirill Tkhai 	struct fuse_inode *fi = get_fuse_inode(inode);
16133be5a52bSMiklos Szeredi 
1614f15ecfefSKirill Tkhai 	spin_lock(&fi->lock);
16153be5a52bSMiklos Szeredi 	__fuse_release_nowrite(inode);
1616f15ecfefSKirill Tkhai 	spin_unlock(&fi->lock);
16173be5a52bSMiklos Szeredi }
16183be5a52bSMiklos Szeredi 
16197078187aSMiklos Szeredi static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
1620b0aa7606SMaxim Patlasov 			      struct inode *inode,
1621b0aa7606SMaxim Patlasov 			      struct fuse_setattr_in *inarg_p,
1622b0aa7606SMaxim Patlasov 			      struct fuse_attr_out *outarg_p)
1623b0aa7606SMaxim Patlasov {
1624d5b48543SMiklos Szeredi 	args->opcode = FUSE_SETATTR;
1625d5b48543SMiklos Szeredi 	args->nodeid = get_node_id(inode);
1626d5b48543SMiklos Szeredi 	args->in_numargs = 1;
1627d5b48543SMiklos Szeredi 	args->in_args[0].size = sizeof(*inarg_p);
1628d5b48543SMiklos Szeredi 	args->in_args[0].value = inarg_p;
1629d5b48543SMiklos Szeredi 	args->out_numargs = 1;
1630d5b48543SMiklos Szeredi 	args->out_args[0].size = sizeof(*outarg_p);
1631d5b48543SMiklos Szeredi 	args->out_args[0].value = outarg_p;
1632b0aa7606SMaxim Patlasov }
1633b0aa7606SMaxim Patlasov 
1634b0aa7606SMaxim Patlasov /*
1635b0aa7606SMaxim Patlasov  * Flush inode->i_mtime to the server
1636b0aa7606SMaxim Patlasov  */
1637ab9e13f7SMaxim Patlasov int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
1638b0aa7606SMaxim Patlasov {
1639fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(inode);
16407078187aSMiklos Szeredi 	FUSE_ARGS(args);
1641b0aa7606SMaxim Patlasov 	struct fuse_setattr_in inarg;
1642b0aa7606SMaxim Patlasov 	struct fuse_attr_out outarg;
1643b0aa7606SMaxim Patlasov 
1644b0aa7606SMaxim Patlasov 	memset(&inarg, 0, sizeof(inarg));
1645b0aa7606SMaxim Patlasov 	memset(&outarg, 0, sizeof(outarg));
1646b0aa7606SMaxim Patlasov 
1647ab9e13f7SMaxim Patlasov 	inarg.valid = FATTR_MTIME;
1648b0aa7606SMaxim Patlasov 	inarg.mtime = inode->i_mtime.tv_sec;
1649b0aa7606SMaxim Patlasov 	inarg.mtimensec = inode->i_mtime.tv_nsec;
1650fcee216bSMax Reitz 	if (fm->fc->minor >= 23) {
1651ab9e13f7SMaxim Patlasov 		inarg.valid |= FATTR_CTIME;
1652ab9e13f7SMaxim Patlasov 		inarg.ctime = inode->i_ctime.tv_sec;
1653ab9e13f7SMaxim Patlasov 		inarg.ctimensec = inode->i_ctime.tv_nsec;
1654ab9e13f7SMaxim Patlasov 	}
16551e18bda8SMiklos Szeredi 	if (ff) {
16561e18bda8SMiklos Szeredi 		inarg.valid |= FATTR_FH;
16571e18bda8SMiklos Szeredi 		inarg.fh = ff->fh;
16581e18bda8SMiklos Szeredi 	}
1659fcee216bSMax Reitz 	fuse_setattr_fill(fm->fc, &args, inode, &inarg, &outarg);
1660b0aa7606SMaxim Patlasov 
1661fcee216bSMax Reitz 	return fuse_simple_request(fm, &args);
1662b0aa7606SMaxim Patlasov }
1663b0aa7606SMaxim Patlasov 
16643be5a52bSMiklos Szeredi /*
16656f9f1180SMiklos Szeredi  * Set attributes, and at the same time refresh them.
16666f9f1180SMiklos Szeredi  *
16676f9f1180SMiklos Szeredi  * Truncation is slightly complicated, because the 'truncate' request
16686f9f1180SMiklos Szeredi  * may fail, in which case we don't want to touch the mapping.
16699ffbb916SMiklos Szeredi  * vmtruncate() doesn't allow for this case, so do the rlimit checking
16709ffbb916SMiklos Szeredi  * and the actual truncation by hand.
16716f9f1180SMiklos Szeredi  */
167262490330SJan Kara int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
167349d4914fSMiklos Szeredi 		    struct file *file)
16749e6268dbSMiklos Szeredi {
167562490330SJan Kara 	struct inode *inode = d_inode(dentry);
1676fcee216bSMax Reitz 	struct fuse_mount *fm = get_fuse_mount(inode);
1677fcee216bSMax Reitz 	struct fuse_conn *fc = fm->fc;
167806a7c3c2SMaxim Patlasov 	struct fuse_inode *fi = get_fuse_inode(inode);
16798bcbbe9cSJan Kara 	struct address_space *mapping = inode->i_mapping;
16807078187aSMiklos Szeredi 	FUSE_ARGS(args);
16819e6268dbSMiklos Szeredi 	struct fuse_setattr_in inarg;
16829e6268dbSMiklos Szeredi 	struct fuse_attr_out outarg;
16833be5a52bSMiklos Szeredi 	bool is_truncate = false;
1684c15016b7SMiklos Szeredi 	bool is_wb = fc->writeback_cache && S_ISREG(inode->i_mode);
16853be5a52bSMiklos Szeredi 	loff_t oldsize;
16869e6268dbSMiklos Szeredi 	int err;
1687c15016b7SMiklos Szeredi 	bool trust_local_cmtime = is_wb;
16886ae330caSVivek Goyal 	bool fault_blocked = false;
16899e6268dbSMiklos Szeredi 
169029433a29SMiklos Szeredi 	if (!fc->default_permissions)
1691db78b877SChristoph Hellwig 		attr->ia_valid |= ATTR_FORCE;
1692db78b877SChristoph Hellwig 
1693c1632a0fSChristian Brauner 	err = setattr_prepare(&nop_mnt_idmap, dentry, attr);
16941e9a4ed9SMiklos Szeredi 	if (err)
16951e9a4ed9SMiklos Szeredi 		return err;
16961e9a4ed9SMiklos Szeredi 
16976ae330caSVivek Goyal 	if (attr->ia_valid & ATTR_SIZE) {
16986ae330caSVivek Goyal 		if (WARN_ON(!S_ISREG(inode->i_mode)))
16996ae330caSVivek Goyal 			return -EIO;
17006ae330caSVivek Goyal 		is_truncate = true;
17016ae330caSVivek Goyal 	}
17026ae330caSVivek Goyal 
17036ae330caSVivek Goyal 	if (FUSE_IS_DAX(inode) && is_truncate) {
17048bcbbe9cSJan Kara 		filemap_invalidate_lock(mapping);
17056ae330caSVivek Goyal 		fault_blocked = true;
17066ae330caSVivek Goyal 		err = fuse_dax_break_layouts(inode, 0, 0);
17076ae330caSVivek Goyal 		if (err) {
17088bcbbe9cSJan Kara 			filemap_invalidate_unlock(mapping);
17096ae330caSVivek Goyal 			return err;
17106ae330caSVivek Goyal 		}
17116ae330caSVivek Goyal 	}
17126ae330caSVivek Goyal 
17138d56adddSMiklos Szeredi 	if (attr->ia_valid & ATTR_OPEN) {
1714df0e91d4SMiklos Szeredi 		/* This is coming from open(..., ... | O_TRUNC); */
1715df0e91d4SMiklos Szeredi 		WARN_ON(!(attr->ia_valid & ATTR_SIZE));
1716df0e91d4SMiklos Szeredi 		WARN_ON(attr->ia_size != 0);
1717df0e91d4SMiklos Szeredi 		if (fc->atomic_o_trunc) {
1718df0e91d4SMiklos Szeredi 			/*
1719df0e91d4SMiklos Szeredi 			 * No need to send request to userspace, since actual
1720df0e91d4SMiklos Szeredi 			 * truncation has already been done by OPEN.  But still
1721df0e91d4SMiklos Szeredi 			 * need to truncate page cache.
1722df0e91d4SMiklos Szeredi 			 */
1723df0e91d4SMiklos Szeredi 			i_size_write(inode, 0);
1724df0e91d4SMiklos Szeredi 			truncate_pagecache(inode, 0);
17256ae330caSVivek Goyal 			goto out;
1726df0e91d4SMiklos Szeredi 		}
17278d56adddSMiklos Szeredi 		file = NULL;
17288d56adddSMiklos Szeredi 	}
17296ff958edSMiklos Szeredi 
1730b24e7598SMiklos Szeredi 	/* Flush dirty data/metadata before non-truncate SETATTR */
1731c15016b7SMiklos Szeredi 	if (is_wb &&
1732b24e7598SMiklos Szeredi 	    attr->ia_valid &
1733b24e7598SMiklos Szeredi 			(ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_MTIME_SET |
1734b24e7598SMiklos Szeredi 			 ATTR_TIMES_SET)) {
1735b24e7598SMiklos Szeredi 		err = write_inode_now(inode, true);
1736b24e7598SMiklos Szeredi 		if (err)
1737b24e7598SMiklos Szeredi 			return err;
1738b24e7598SMiklos Szeredi 
1739b24e7598SMiklos Szeredi 		fuse_set_nowrite(inode);
1740b24e7598SMiklos Szeredi 		fuse_release_nowrite(inode);
1741b24e7598SMiklos Szeredi 	}
1742b24e7598SMiklos Szeredi 
174306a7c3c2SMaxim Patlasov 	if (is_truncate) {
17443be5a52bSMiklos Szeredi 		fuse_set_nowrite(inode);
174506a7c3c2SMaxim Patlasov 		set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
17463ad22c62SMaxim Patlasov 		if (trust_local_cmtime && attr->ia_size != inode->i_size)
17473ad22c62SMaxim Patlasov 			attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
174806a7c3c2SMaxim Patlasov 	}
17493be5a52bSMiklos Szeredi 
17509e6268dbSMiklos Szeredi 	memset(&inarg, 0, sizeof(inarg));
17510e9663eeSMiklos Szeredi 	memset(&outarg, 0, sizeof(outarg));
17528cb08329SEric W. Biederman 	iattr_to_fattr(fc, attr, &inarg, trust_local_cmtime);
175349d4914fSMiklos Szeredi 	if (file) {
175449d4914fSMiklos Szeredi 		struct fuse_file *ff = file->private_data;
175549d4914fSMiklos Szeredi 		inarg.valid |= FATTR_FH;
175649d4914fSMiklos Szeredi 		inarg.fh = ff->fh;
175749d4914fSMiklos Szeredi 	}
175831792161SVivek Goyal 
175931792161SVivek Goyal 	/* Kill suid/sgid for non-directory chown unconditionally */
176031792161SVivek Goyal 	if (fc->handle_killpriv_v2 && !S_ISDIR(inode->i_mode) &&
176131792161SVivek Goyal 	    attr->ia_valid & (ATTR_UID | ATTR_GID))
176231792161SVivek Goyal 		inarg.valid |= FATTR_KILL_SUIDGID;
176331792161SVivek Goyal 
1764f3332114SMiklos Szeredi 	if (attr->ia_valid & ATTR_SIZE) {
1765f3332114SMiklos Szeredi 		/* For mandatory locking in truncate */
1766f3332114SMiklos Szeredi 		inarg.valid |= FATTR_LOCKOWNER;
1767f3332114SMiklos Szeredi 		inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
176831792161SVivek Goyal 
176931792161SVivek Goyal 		/* Kill suid/sgid for truncate only if no CAP_FSETID */
177031792161SVivek Goyal 		if (fc->handle_killpriv_v2 && !capable(CAP_FSETID))
177131792161SVivek Goyal 			inarg.valid |= FATTR_KILL_SUIDGID;
1772f3332114SMiklos Szeredi 	}
17737078187aSMiklos Szeredi 	fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
1774fcee216bSMax Reitz 	err = fuse_simple_request(fm, &args);
1775e00d2c2dSMiklos Szeredi 	if (err) {
1776e00d2c2dSMiklos Szeredi 		if (err == -EINTR)
1777e00d2c2dSMiklos Szeredi 			fuse_invalidate_attr(inode);
17783be5a52bSMiklos Szeredi 		goto error;
1779e00d2c2dSMiklos Szeredi 	}
1780e00d2c2dSMiklos Szeredi 
1781eb59bd17SMiklos Szeredi 	if (fuse_invalid_attr(&outarg.attr) ||
17826e3e2c43SAl Viro 	    inode_wrong_type(inode, outarg.attr.mode)) {
17835d069dbeSMiklos Szeredi 		fuse_make_bad(inode);
17843be5a52bSMiklos Szeredi 		err = -EIO;
17853be5a52bSMiklos Szeredi 		goto error;
17869e6268dbSMiklos Szeredi 	}
17879e6268dbSMiklos Szeredi 
1788f15ecfefSKirill Tkhai 	spin_lock(&fi->lock);
1789b0aa7606SMaxim Patlasov 	/* the kernel maintains i_mtime locally */
17903ad22c62SMaxim Patlasov 	if (trust_local_cmtime) {
17913ad22c62SMaxim Patlasov 		if (attr->ia_valid & ATTR_MTIME)
1792b0aa7606SMaxim Patlasov 			inode->i_mtime = attr->ia_mtime;
17933ad22c62SMaxim Patlasov 		if (attr->ia_valid & ATTR_CTIME)
17943ad22c62SMaxim Patlasov 			inode->i_ctime = attr->ia_ctime;
17951e18bda8SMiklos Szeredi 		/* FIXME: clear I_DIRTY_SYNC? */
1796b0aa7606SMaxim Patlasov 	}
1797b0aa7606SMaxim Patlasov 
17983be5a52bSMiklos Szeredi 	fuse_change_attributes_common(inode, &outarg.attr,
17994b52f059SMiklos Szeredi 				      attr_timeout(&outarg),
18004b52f059SMiklos Szeredi 				      fuse_get_cache_mask(inode));
18013be5a52bSMiklos Szeredi 	oldsize = inode->i_size;
18028373200bSPavel Emelyanov 	/* see the comment in fuse_change_attributes() */
1803c15016b7SMiklos Szeredi 	if (!is_wb || is_truncate)
18043be5a52bSMiklos Szeredi 		i_size_write(inode, outarg.attr.size);
18053be5a52bSMiklos Szeredi 
18063be5a52bSMiklos Szeredi 	if (is_truncate) {
1807f15ecfefSKirill Tkhai 		/* NOTE: this may release/reacquire fi->lock */
18083be5a52bSMiklos Szeredi 		__fuse_release_nowrite(inode);
18093be5a52bSMiklos Szeredi 	}
1810f15ecfefSKirill Tkhai 	spin_unlock(&fi->lock);
18113be5a52bSMiklos Szeredi 
18123be5a52bSMiklos Szeredi 	/*
18133be5a52bSMiklos Szeredi 	 * Only call invalidate_inode_pages2() after removing
18142bf06b8eSMatthew Wilcox (Oracle) 	 * FUSE_NOWRITE, otherwise fuse_launder_folio() would deadlock.
18153be5a52bSMiklos Szeredi 	 */
18168373200bSPavel Emelyanov 	if ((is_truncate || !is_wb) &&
18178373200bSPavel Emelyanov 	    S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
18187caef267SKirill A. Shutemov 		truncate_pagecache(inode, outarg.attr.size);
18198bcbbe9cSJan Kara 		invalidate_inode_pages2(mapping);
18203be5a52bSMiklos Szeredi 	}
18213be5a52bSMiklos Szeredi 
182206a7c3c2SMaxim Patlasov 	clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
18236ae330caSVivek Goyal out:
18246ae330caSVivek Goyal 	if (fault_blocked)
18258bcbbe9cSJan Kara 		filemap_invalidate_unlock(mapping);
18266ae330caSVivek Goyal 
1827e00d2c2dSMiklos Szeredi 	return 0;
18283be5a52bSMiklos Szeredi 
18293be5a52bSMiklos Szeredi error:
18303be5a52bSMiklos Szeredi 	if (is_truncate)
18313be5a52bSMiklos Szeredi 		fuse_release_nowrite(inode);
18323be5a52bSMiklos Szeredi 
183306a7c3c2SMaxim Patlasov 	clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
18346ae330caSVivek Goyal 
18356ae330caSVivek Goyal 	if (fault_blocked)
18368bcbbe9cSJan Kara 		filemap_invalidate_unlock(mapping);
18373be5a52bSMiklos Szeredi 	return err;
18389e6268dbSMiklos Szeredi }
18399e6268dbSMiklos Szeredi 
1840c1632a0fSChristian Brauner static int fuse_setattr(struct mnt_idmap *idmap, struct dentry *entry,
1841549c7297SChristian Brauner 			struct iattr *attr)
184249d4914fSMiklos Szeredi {
18432b0143b5SDavid Howells 	struct inode *inode = d_inode(entry);
18445e940c1dSMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(inode);
1845a09f99edSMiklos Szeredi 	struct file *file = (attr->ia_valid & ATTR_FILE) ? attr->ia_file : NULL;
18465e2b8828SMiklos Szeredi 	int ret;
1847efb9fa9eSMaxim Patlasov 
18485d069dbeSMiklos Szeredi 	if (fuse_is_bad(inode))
18495d069dbeSMiklos Szeredi 		return -EIO;
18505d069dbeSMiklos Szeredi 
1851efb9fa9eSMaxim Patlasov 	if (!fuse_allow_current_process(get_fuse_conn(inode)))
1852efb9fa9eSMaxim Patlasov 		return -EACCES;
1853efb9fa9eSMaxim Patlasov 
1854a09f99edSMiklos Szeredi 	if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
1855a09f99edSMiklos Szeredi 		attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
1856a09f99edSMiklos Szeredi 				    ATTR_MODE);
18575e940c1dSMiklos Szeredi 
1858a09f99edSMiklos Szeredi 		/*
18595e940c1dSMiklos Szeredi 		 * The only sane way to reliably kill suid/sgid is to do it in
18605e940c1dSMiklos Szeredi 		 * the userspace filesystem
18615e940c1dSMiklos Szeredi 		 *
18625e940c1dSMiklos Szeredi 		 * This should be done on write(), truncate() and chown().
18635e940c1dSMiklos Szeredi 		 */
18648981bdfdSVivek Goyal 		if (!fc->handle_killpriv && !fc->handle_killpriv_v2) {
18655e940c1dSMiklos Szeredi 			/*
18665e940c1dSMiklos Szeredi 			 * ia_mode calculation may have used stale i_mode.
18675e940c1dSMiklos Szeredi 			 * Refresh and recalculate.
1868a09f99edSMiklos Szeredi 			 */
1869a09f99edSMiklos Szeredi 			ret = fuse_do_getattr(inode, NULL, file);
1870a09f99edSMiklos Szeredi 			if (ret)
1871a09f99edSMiklos Szeredi 				return ret;
1872a09f99edSMiklos Szeredi 
1873a09f99edSMiklos Szeredi 			attr->ia_mode = inode->i_mode;
1874c01638f5SMiklos Szeredi 			if (inode->i_mode & S_ISUID) {
1875a09f99edSMiklos Szeredi 				attr->ia_valid |= ATTR_MODE;
1876a09f99edSMiklos Szeredi 				attr->ia_mode &= ~S_ISUID;
1877a09f99edSMiklos Szeredi 			}
1878c01638f5SMiklos Szeredi 			if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
1879a09f99edSMiklos Szeredi 				attr->ia_valid |= ATTR_MODE;
1880a09f99edSMiklos Szeredi 				attr->ia_mode &= ~S_ISGID;
1881a09f99edSMiklos Szeredi 			}
1882a09f99edSMiklos Szeredi 		}
18835e940c1dSMiklos Szeredi 	}
1884a09f99edSMiklos Szeredi 	if (!attr->ia_valid)
1885a09f99edSMiklos Szeredi 		return 0;
1886a09f99edSMiklos Szeredi 
1887abb5a14fSLinus Torvalds 	ret = fuse_do_setattr(entry, attr, file);
18885e2b8828SMiklos Szeredi 	if (!ret) {
188960bcc88aSSeth Forshee 		/*
189060bcc88aSSeth Forshee 		 * If filesystem supports acls it may have updated acl xattrs in
189160bcc88aSSeth Forshee 		 * the filesystem, so forget cached acls for the inode.
189260bcc88aSSeth Forshee 		 */
189360bcc88aSSeth Forshee 		if (fc->posix_acl)
189460bcc88aSSeth Forshee 			forget_all_cached_acls(inode);
189560bcc88aSSeth Forshee 
18965e2b8828SMiklos Szeredi 		/* Directory mode changed, may need to revalidate access */
18975e2b8828SMiklos Szeredi 		if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE))
18985e2b8828SMiklos Szeredi 			fuse_invalidate_entry_cache(entry);
18995e2b8828SMiklos Szeredi 	}
19005e2b8828SMiklos Szeredi 	return ret;
190149d4914fSMiklos Szeredi }
190249d4914fSMiklos Szeredi 
1903*b74d24f7SChristian Brauner static int fuse_getattr(struct mnt_idmap *idmap,
1904549c7297SChristian Brauner 			const struct path *path, struct kstat *stat,
1905a528d35eSDavid Howells 			u32 request_mask, unsigned int flags)
1906e5e5558eSMiklos Szeredi {
1907a528d35eSDavid Howells 	struct inode *inode = d_inode(path->dentry);
1908244f6385SMiklos Szeredi 	struct fuse_conn *fc = get_fuse_conn(inode);
1909244f6385SMiklos Szeredi 
19105d069dbeSMiklos Szeredi 	if (fuse_is_bad(inode))
19115d069dbeSMiklos Szeredi 		return -EIO;
19125d069dbeSMiklos Szeredi 
19135157da2cSMiklos Szeredi 	if (!fuse_allow_current_process(fc)) {
19145157da2cSMiklos Szeredi 		if (!request_mask) {
19155157da2cSMiklos Szeredi 			/*
19165157da2cSMiklos Szeredi 			 * If user explicitly requested *nothing* then don't
19175157da2cSMiklos Szeredi 			 * error out, but return st_dev only.
19185157da2cSMiklos Szeredi 			 */
19195157da2cSMiklos Szeredi 			stat->result_mask = 0;
19205157da2cSMiklos Szeredi 			stat->dev = inode->i_sb->s_dev;
19215157da2cSMiklos Szeredi 			return 0;
19225157da2cSMiklos Szeredi 		}
1923244f6385SMiklos Szeredi 		return -EACCES;
19245157da2cSMiklos Szeredi 	}
1925244f6385SMiklos Szeredi 
19262f1e8196SMiklos Szeredi 	return fuse_update_get_attr(inode, NULL, stat, request_mask, flags);
1927e5e5558eSMiklos Szeredi }
1928e5e5558eSMiklos Szeredi 
1929754661f1SArjan van de Ven static const struct inode_operations fuse_dir_inode_operations = {
1930e5e5558eSMiklos Szeredi 	.lookup		= fuse_lookup,
19319e6268dbSMiklos Szeredi 	.mkdir		= fuse_mkdir,
19329e6268dbSMiklos Szeredi 	.symlink	= fuse_symlink,
19339e6268dbSMiklos Szeredi 	.unlink		= fuse_unlink,
19349e6268dbSMiklos Szeredi 	.rmdir		= fuse_rmdir,
19352773bf00SMiklos Szeredi 	.rename		= fuse_rename2,
19369e6268dbSMiklos Szeredi 	.link		= fuse_link,
19379e6268dbSMiklos Szeredi 	.setattr	= fuse_setattr,
19389e6268dbSMiklos Szeredi 	.create		= fuse_create,
1939c8ccbe03SMiklos Szeredi 	.atomic_open	= fuse_atomic_open,
19407d375390SMiklos Szeredi 	.tmpfile	= fuse_tmpfile,
19419e6268dbSMiklos Szeredi 	.mknod		= fuse_mknod,
1942e5e5558eSMiklos Szeredi 	.permission	= fuse_permission,
1943e5e5558eSMiklos Szeredi 	.getattr	= fuse_getattr,
194492a8780eSMiklos Szeredi 	.listxattr	= fuse_listxattr,
1945cac2f8b8SChristian Brauner 	.get_inode_acl	= fuse_get_acl,
194660bcc88aSSeth Forshee 	.set_acl	= fuse_set_acl,
194772227eacSMiklos Szeredi 	.fileattr_get	= fuse_fileattr_get,
194872227eacSMiklos Szeredi 	.fileattr_set	= fuse_fileattr_set,
1949e5e5558eSMiklos Szeredi };
1950e5e5558eSMiklos Szeredi 
19514b6f5d20SArjan van de Ven static const struct file_operations fuse_dir_operations = {
1952b6aeadedSMiklos Szeredi 	.llseek		= generic_file_llseek,
1953e5e5558eSMiklos Szeredi 	.read		= generic_read_dir,
1954d9b3dbdcSAl Viro 	.iterate_shared	= fuse_readdir,
1955e5e5558eSMiklos Szeredi 	.open		= fuse_dir_open,
1956e5e5558eSMiklos Szeredi 	.release	= fuse_dir_release,
195782547981SMiklos Szeredi 	.fsync		= fuse_dir_fsync,
1958b18da0c5SMiklos Szeredi 	.unlocked_ioctl	= fuse_dir_ioctl,
1959b18da0c5SMiklos Szeredi 	.compat_ioctl	= fuse_dir_compat_ioctl,
1960e5e5558eSMiklos Szeredi };
1961e5e5558eSMiklos Szeredi 
1962754661f1SArjan van de Ven static const struct inode_operations fuse_common_inode_operations = {
19639e6268dbSMiklos Szeredi 	.setattr	= fuse_setattr,
1964e5e5558eSMiklos Szeredi 	.permission	= fuse_permission,
1965e5e5558eSMiklos Szeredi 	.getattr	= fuse_getattr,
196692a8780eSMiklos Szeredi 	.listxattr	= fuse_listxattr,
1967cac2f8b8SChristian Brauner 	.get_inode_acl	= fuse_get_acl,
196860bcc88aSSeth Forshee 	.set_acl	= fuse_set_acl,
196972227eacSMiklos Szeredi 	.fileattr_get	= fuse_fileattr_get,
197072227eacSMiklos Szeredi 	.fileattr_set	= fuse_fileattr_set,
1971e5e5558eSMiklos Szeredi };
1972e5e5558eSMiklos Szeredi 
1973754661f1SArjan van de Ven static const struct inode_operations fuse_symlink_inode_operations = {
19749e6268dbSMiklos Szeredi 	.setattr	= fuse_setattr,
19756b255391SAl Viro 	.get_link	= fuse_get_link,
1976e5e5558eSMiklos Szeredi 	.getattr	= fuse_getattr,
197792a8780eSMiklos Szeredi 	.listxattr	= fuse_listxattr,
1978e5e5558eSMiklos Szeredi };
1979e5e5558eSMiklos Szeredi 
1980e5e5558eSMiklos Szeredi void fuse_init_common(struct inode *inode)
1981e5e5558eSMiklos Szeredi {
1982e5e5558eSMiklos Szeredi 	inode->i_op = &fuse_common_inode_operations;
1983e5e5558eSMiklos Szeredi }
1984e5e5558eSMiklos Szeredi 
1985e5e5558eSMiklos Szeredi void fuse_init_dir(struct inode *inode)
1986e5e5558eSMiklos Szeredi {
1987ab2257e9SMiklos Szeredi 	struct fuse_inode *fi = get_fuse_inode(inode);
1988ab2257e9SMiklos Szeredi 
1989e5e5558eSMiklos Szeredi 	inode->i_op = &fuse_dir_inode_operations;
1990e5e5558eSMiklos Szeredi 	inode->i_fop = &fuse_dir_operations;
1991ab2257e9SMiklos Szeredi 
1992ab2257e9SMiklos Szeredi 	spin_lock_init(&fi->rdc.lock);
1993ab2257e9SMiklos Szeredi 	fi->rdc.cached = false;
1994ab2257e9SMiklos Szeredi 	fi->rdc.size = 0;
1995ab2257e9SMiklos Szeredi 	fi->rdc.pos = 0;
1996ab2257e9SMiklos Szeredi 	fi->rdc.version = 0;
1997e5e5558eSMiklos Szeredi }
1998e5e5558eSMiklos Szeredi 
19995efd00e4SMatthew Wilcox (Oracle) static int fuse_symlink_read_folio(struct file *null, struct folio *folio)
20005571f1e6SDan Schatzberg {
20015efd00e4SMatthew Wilcox (Oracle) 	int err = fuse_readlink_page(folio->mapping->host, &folio->page);
20025571f1e6SDan Schatzberg 
20035571f1e6SDan Schatzberg 	if (!err)
20045efd00e4SMatthew Wilcox (Oracle) 		folio_mark_uptodate(folio);
20055571f1e6SDan Schatzberg 
20065efd00e4SMatthew Wilcox (Oracle) 	folio_unlock(folio);
20075571f1e6SDan Schatzberg 
20085571f1e6SDan Schatzberg 	return err;
20095571f1e6SDan Schatzberg }
20105571f1e6SDan Schatzberg 
20115571f1e6SDan Schatzberg static const struct address_space_operations fuse_symlink_aops = {
20125efd00e4SMatthew Wilcox (Oracle) 	.read_folio	= fuse_symlink_read_folio,
20135571f1e6SDan Schatzberg };
20145571f1e6SDan Schatzberg 
2015e5e5558eSMiklos Szeredi void fuse_init_symlink(struct inode *inode)
2016e5e5558eSMiklos Szeredi {
2017e5e5558eSMiklos Szeredi 	inode->i_op = &fuse_symlink_inode_operations;
20185571f1e6SDan Schatzberg 	inode->i_data.a_ops = &fuse_symlink_aops;
20195571f1e6SDan Schatzberg 	inode_nohighmem(inode);
2020e5e5558eSMiklos Szeredi }
2021