blob: d572c900bb0f208c6a49a43b97ece1cb882687f7 [file] [log] [blame]
Miklos Szeredie5e55582005-09-09 13:10:28 -07001/*
2 FUSE: Filesystem in Userspace
Miklos Szeredi1729a162008-11-26 12:03:54 +01003 Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu>
Miklos Szeredie5e55582005-09-09 13:10:28 -07004
5 This program can be distributed under the terms of the GNU GPL.
6 See the file COPYING.
7*/
8
9#include "fuse_i.h"
10
11#include <linux/pagemap.h>
12#include <linux/file.h>
Miklos Szeredie5e55582005-09-09 13:10:28 -070013#include <linux/sched.h>
14#include <linux/namei.h>
Miklos Szeredi07e77dc2010-12-07 20:16:56 +010015#include <linux/slab.h>
Seth Forshee703c7362016-08-29 08:46:36 -050016#include <linux/xattr.h>
Miklos Szeredi261aaba72018-10-01 10:07:05 +020017#include <linux/iversion.h>
Seth Forshee60bcc882016-08-29 08:46:37 -050018#include <linux/posix_acl.h>
Miklos Szeredie5e55582005-09-09 13:10:28 -070019
Feng Shuo4582a4a2013-01-15 11:23:28 +080020static void fuse_advise_use_readdirplus(struct inode *dir)
21{
22 struct fuse_inode *fi = get_fuse_inode(dir);
23
24 set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state);
25}
26
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -070027#if BITS_PER_LONG >= 64
28static inline void __fuse_dentry_settime(struct dentry *entry, u64 time)
29{
30 entry->d_fsdata = (void *) time;
31}
32
33static inline u64 fuse_dentry_time(const struct dentry *entry)
34{
35 return (u64)entry->d_fsdata;
36}
37
38#else
Miklos Szeredif75fdf22016-10-01 07:32:32 +020039union fuse_dentry {
40 u64 time;
41 struct rcu_head rcu;
42};
43
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -070044static inline void __fuse_dentry_settime(struct dentry *dentry, u64 time)
45{
46 ((union fuse_dentry *) dentry->d_fsdata)->time = time;
47}
48
49static inline u64 fuse_dentry_time(const struct dentry *entry)
50{
51 return ((union fuse_dentry *) entry->d_fsdata)->time;
52}
53#endif
54
Miklos Szeredi8fab0102018-08-15 17:42:34 +020055static void fuse_dentry_settime(struct dentry *dentry, u64 time)
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070056{
Miklos Szeredi8fab0102018-08-15 17:42:34 +020057 struct fuse_conn *fc = get_fuse_conn_super(dentry->d_sb);
58 bool delete = !time && fc->delete_stale;
59 /*
60 * Mess with DCACHE_OP_DELETE because dput() will be faster without it.
61 * Don't care about races, either way it's just an optimization
62 */
63 if ((!delete && (dentry->d_flags & DCACHE_OP_DELETE)) ||
64 (delete && !(dentry->d_flags & DCACHE_OP_DELETE))) {
65 spin_lock(&dentry->d_lock);
66 if (!delete)
67 dentry->d_flags &= ~DCACHE_OP_DELETE;
68 else
69 dentry->d_flags |= DCACHE_OP_DELETE;
70 spin_unlock(&dentry->d_lock);
71 }
72
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -070073 __fuse_dentry_settime(dentry, time);
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070074}
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070075
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080076/*
77 * FUSE caches dentries and attributes with separate timeout. The
78 * time in jiffies until the dentry/attributes are valid is stored in
Miklos Szeredif75fdf22016-10-01 07:32:32 +020079 * dentry->d_fsdata and fuse_inode->i_time respectively.
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080080 */
81
82/*
83 * Calculate the time in jiffies until a dentry/attributes are valid
84 */
Miklos Szeredibcb6f6d2016-10-01 07:32:32 +020085static u64 time_to_jiffies(u64 sec, u32 nsec)
Miklos Szeredie5e55582005-09-09 13:10:28 -070086{
Miklos Szeredi685d16d2006-07-30 03:04:08 -070087 if (sec || nsec) {
Miklos Szeredibcb6f6d2016-10-01 07:32:32 +020088 struct timespec64 ts = {
89 sec,
David Sheets21067522017-01-13 15:58:30 +000090 min_t(u32, nsec, NSEC_PER_SEC - 1)
Miklos Szeredibcb6f6d2016-10-01 07:32:32 +020091 };
92
93 return get_jiffies_64() + timespec64_to_jiffies(&ts);
Miklos Szeredi685d16d2006-07-30 03:04:08 -070094 } else
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070095 return 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -070096}
97
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080098/*
99 * Set dentry and possibly attribute timeouts from the lookup/mk*
100 * replies
101 */
Miklos Szeredid123d8e2018-09-28 16:43:23 +0200102void fuse_change_entry_timeout(struct dentry *entry, struct fuse_entry_out *o)
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800103{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -0700104 fuse_dentry_settime(entry,
105 time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700106}
107
108static u64 attr_timeout(struct fuse_attr_out *o)
109{
110 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
111}
112
Miklos Szeredid123d8e2018-09-28 16:43:23 +0200113u64 entry_attr_timeout(struct fuse_entry_out *o)
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700114{
115 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800116}
117
Miklos Szeredi2f1e8192018-10-15 15:43:06 +0200118static void fuse_invalidate_attr_mask(struct inode *inode, u32 mask)
119{
120 set_mask_bits(&get_fuse_inode(inode)->inval_mask, 0, mask);
121}
122
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800123/*
124 * Mark the attributes as stale, so that at the next call to
125 * ->getattr() they will be fetched from userspace
126 */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800127void fuse_invalidate_attr(struct inode *inode)
128{
Miklos Szeredi2f1e8192018-10-15 15:43:06 +0200129 fuse_invalidate_attr_mask(inode, STATX_BASIC_STATS);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800130}
131
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200132static void fuse_dir_changed(struct inode *dir)
133{
134 fuse_invalidate_attr(dir);
135 inode_maybe_inc_iversion(dir, false);
136}
137
Andrew Gallagher451418f2013-11-05 03:55:43 -0800138/**
139 * Mark the attributes as stale due to an atime change. Avoid the invalidate if
140 * atime is not used.
141 */
142void fuse_invalidate_atime(struct inode *inode)
143{
144 if (!IS_RDONLY(inode))
Miklos Szeredi2f1e8192018-10-15 15:43:06 +0200145 fuse_invalidate_attr_mask(inode, STATX_ATIME);
Andrew Gallagher451418f2013-11-05 03:55:43 -0800146}
147
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800148/*
149 * Just mark the entry as stale, so that a next attempt to look it up
150 * will result in a new lookup call to userspace
151 *
152 * This is called when a dentry is about to become negative and the
153 * timeout is unknown (unlink, rmdir, rename and in some cases
154 * lookup)
155 */
Miklos Szeredidbd561d2008-07-25 01:49:00 -0700156void fuse_invalidate_entry_cache(struct dentry *entry)
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800157{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -0700158 fuse_dentry_settime(entry, 0);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800159}
160
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800161/*
162 * Same as fuse_invalidate_entry_cache(), but also try to remove the
163 * dentry from the hash
164 */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800165static void fuse_invalidate_entry(struct dentry *entry)
166{
167 d_invalidate(entry);
168 fuse_invalidate_entry_cache(entry);
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800169}
170
Miklos Szeredi70781872014-12-12 09:49:05 +0100171static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_args *args,
Al Viro13983d02016-07-20 22:34:44 -0400172 u64 nodeid, const struct qstr *name,
Miklos Szeredie5e55582005-09-09 13:10:28 -0700173 struct fuse_entry_out *outarg)
174{
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700175 memset(outarg, 0, sizeof(struct fuse_entry_out));
Miklos Szeredid5b48542019-09-10 15:04:08 +0200176 args->opcode = FUSE_LOOKUP;
177 args->nodeid = nodeid;
178 args->in_numargs = 1;
179 args->in_args[0].size = name->len + 1;
180 args->in_args[0].value = name->name;
181 args->out_numargs = 1;
182 args->out_args[0].size = sizeof(struct fuse_entry_out);
183 args->out_args[0].value = outarg;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700184}
185
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800186/*
187 * Check whether the dentry is still valid
188 *
189 * If the entry validity timeout has expired and the dentry is
190 * positive, try to redo the lookup. If the lookup results in a
191 * different inode, then let the VFS invalidate the dentry and redo
192 * the lookup once more. If the lookup results in the same inode,
193 * then refresh the attributes, timeouts and mark the dentry valid.
194 */
Al Viro0b728e12012-06-10 16:03:43 -0400195static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700196{
Nick Piggin34286d62011-01-07 17:49:57 +1100197 struct inode *inode;
Miklos Szeredi28420da2013-06-03 14:40:22 +0200198 struct dentry *parent;
199 struct fuse_conn *fc;
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200200 struct fuse_inode *fi;
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200201 int ret;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800202
David Howells2b0143b2015-03-17 22:25:59 +0000203 inode = d_inode_rcu(entry);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800204 if (inode && is_bad_inode(inode))
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200205 goto invalid;
Anand Avati154210c2014-06-26 20:21:57 -0400206 else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
207 (flags & LOOKUP_REVAL)) {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700208 struct fuse_entry_out outarg;
Miklos Szeredi70781872014-12-12 09:49:05 +0100209 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100210 struct fuse_forget_link *forget;
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700211 u64 attr_version;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800212
Miklos Szeredi50322fe2006-02-28 16:59:03 -0800213 /* For negative dentries, always do a fresh lookup */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800214 if (!inode)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200215 goto invalid;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800216
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200217 ret = -ECHILD;
Al Viro0b728e12012-06-10 16:03:43 -0400218 if (flags & LOOKUP_RCU)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200219 goto out;
Miklos Szeredie7c0a162011-03-21 13:58:06 +0100220
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800221 fc = get_fuse_conn(inode);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700222
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100223 forget = fuse_alloc_forget();
Miklos Szeredi70781872014-12-12 09:49:05 +0100224 ret = -ENOMEM;
225 if (!forget)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200226 goto out;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800227
Miklos Szeredi7dca9fd2007-11-28 16:21:59 -0800228 attr_version = fuse_get_attr_version(fc);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700229
Miklos Szeredie956edd2006-10-17 00:10:12 -0700230 parent = dget_parent(entry);
David Howells2b0143b2015-03-17 22:25:59 +0000231 fuse_lookup_init(fc, &args, get_node_id(d_inode(parent)),
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700232 &entry->d_name, &outarg);
Miklos Szeredi70781872014-12-12 09:49:05 +0100233 ret = fuse_simple_request(fc, &args);
Miklos Szeredie956edd2006-10-17 00:10:12 -0700234 dput(parent);
Miklos Szeredi50322fe2006-02-28 16:59:03 -0800235 /* Zero nodeid is same as -ENOENT */
Miklos Szeredi70781872014-12-12 09:49:05 +0100236 if (!ret && !outarg.nodeid)
237 ret = -ENOENT;
238 if (!ret) {
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200239 fi = get_fuse_inode(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700240 if (outarg.nodeid != get_node_id(inode)) {
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100241 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200242 goto invalid;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700243 }
Kirill Tkhaic9d8f5f2018-11-09 13:33:27 +0300244 spin_lock(&fi->lock);
Miklos Szeredi1729a162008-11-26 12:03:54 +0100245 fi->nlookup++;
Kirill Tkhaic9d8f5f2018-11-09 13:33:27 +0300246 spin_unlock(&fi->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700247 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100248 kfree(forget);
Miklos Szeredi70781872014-12-12 09:49:05 +0100249 if (ret == -ENOMEM)
250 goto out;
251 if (ret || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200252 goto invalid;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700253
Seth Forshee60bcc882016-08-29 08:46:37 -0500254 forget_all_cached_acls(inode);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700255 fuse_change_attributes(inode, &outarg.attr,
256 entry_attr_timeout(&outarg),
257 attr_version);
258 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi28420da2013-06-03 14:40:22 +0200259 } else if (inode) {
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200260 fi = get_fuse_inode(inode);
261 if (flags & LOOKUP_RCU) {
262 if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state))
263 return -ECHILD;
264 } else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) {
Miklos Szeredi28420da2013-06-03 14:40:22 +0200265 parent = dget_parent(entry);
David Howells2b0143b2015-03-17 22:25:59 +0000266 fuse_advise_use_readdirplus(d_inode(parent));
Miklos Szeredi28420da2013-06-03 14:40:22 +0200267 dput(parent);
268 }
Miklos Szeredie5e55582005-09-09 13:10:28 -0700269 }
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200270 ret = 1;
271out:
272 return ret;
273
274invalid:
275 ret = 0;
276 goto out;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700277}
278
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700279#if BITS_PER_LONG < 64
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200280static int fuse_dentry_init(struct dentry *dentry)
281{
Khazhismel Kumykovdc69e982019-09-17 12:35:33 -0700282 dentry->d_fsdata = kzalloc(sizeof(union fuse_dentry),
283 GFP_KERNEL_ACCOUNT | __GFP_RECLAIMABLE);
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200284
285 return dentry->d_fsdata ? 0 : -ENOMEM;
286}
287static void fuse_dentry_release(struct dentry *dentry)
288{
289 union fuse_dentry *fd = dentry->d_fsdata;
290
291 kfree_rcu(fd, rcu);
292}
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700293#endif
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200294
Miklos Szeredi8fab0102018-08-15 17:42:34 +0200295static int fuse_dentry_delete(const struct dentry *dentry)
296{
297 return time_before64(fuse_dentry_time(dentry), get_jiffies_64());
298}
299
Al Viro42695902009-02-20 05:59:13 +0000300const struct dentry_operations fuse_dentry_operations = {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700301 .d_revalidate = fuse_dentry_revalidate,
Miklos Szeredi8fab0102018-08-15 17:42:34 +0200302 .d_delete = fuse_dentry_delete,
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700303#if BITS_PER_LONG < 64
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200304 .d_init = fuse_dentry_init,
305 .d_release = fuse_dentry_release,
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700306#endif
Miklos Szeredie5e55582005-09-09 13:10:28 -0700307};
308
Miklos Szeredi0ce267f2016-10-18 15:36:48 +0200309const struct dentry_operations fuse_root_dentry_operations = {
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700310#if BITS_PER_LONG < 64
Miklos Szeredi0ce267f2016-10-18 15:36:48 +0200311 .d_init = fuse_dentry_init,
312 .d_release = fuse_dentry_release,
Khazhismel Kumykov30c6a232019-09-16 16:56:41 -0700313#endif
Miklos Szeredi0ce267f2016-10-18 15:36:48 +0200314};
315
Timo Savolaa5bfffac2007-04-08 16:04:00 -0700316int fuse_valid_type(int m)
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800317{
318 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
319 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
320}
321
Al Viro13983d02016-07-20 22:34:44 -0400322int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name,
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700323 struct fuse_entry_out *outarg, struct inode **inode)
324{
325 struct fuse_conn *fc = get_fuse_conn_super(sb);
Miklos Szeredi70781872014-12-12 09:49:05 +0100326 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100327 struct fuse_forget_link *forget;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700328 u64 attr_version;
329 int err;
330
331 *inode = NULL;
332 err = -ENAMETOOLONG;
333 if (name->len > FUSE_NAME_MAX)
334 goto out;
335
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700336
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100337 forget = fuse_alloc_forget();
338 err = -ENOMEM;
Miklos Szeredi70781872014-12-12 09:49:05 +0100339 if (!forget)
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700340 goto out;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700341
342 attr_version = fuse_get_attr_version(fc);
343
Miklos Szeredi70781872014-12-12 09:49:05 +0100344 fuse_lookup_init(fc, &args, nodeid, name, outarg);
345 err = fuse_simple_request(fc, &args);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700346 /* Zero nodeid is same as -ENOENT, but with valid timeout */
347 if (err || !outarg->nodeid)
348 goto out_put_forget;
349
350 err = -EIO;
351 if (!outarg->nodeid)
352 goto out_put_forget;
353 if (!fuse_valid_type(outarg->attr.mode))
354 goto out_put_forget;
355
356 *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
357 &outarg->attr, entry_attr_timeout(outarg),
358 attr_version);
359 err = -ENOMEM;
360 if (!*inode) {
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100361 fuse_queue_forget(fc, forget, outarg->nodeid, 1);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700362 goto out;
363 }
364 err = 0;
365
366 out_put_forget:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100367 kfree(forget);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700368 out:
369 return err;
370}
371
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800372static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
Al Viro00cd8dd2012-06-10 17:13:09 -0400373 unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700374{
375 int err;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700376 struct fuse_entry_out outarg;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700377 struct inode *inode;
Miklos Szeredi0de62562008-07-25 01:48:59 -0700378 struct dentry *newent;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700379 bool outarg_valid = true;
Miklos Szeredi63576c12018-07-26 16:13:11 +0200380 bool locked;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700381
Miklos Szeredi63576c12018-07-26 16:13:11 +0200382 locked = fuse_lock_inode(dir);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700383 err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
384 &outarg, &inode);
Miklos Szeredi63576c12018-07-26 16:13:11 +0200385 fuse_unlock_inode(dir, locked);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700386 if (err == -ENOENT) {
387 outarg_valid = false;
388 err = 0;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800389 }
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700390 if (err)
391 goto out_err;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800392
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700393 err = -EIO;
394 if (inode && get_node_id(inode) == FUSE_ROOT_ID)
395 goto out_iput;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700396
Al Viro41d28bc2014-10-12 22:24:21 -0400397 newent = d_splice_alias(inode, entry);
Miklos Szeredi5835f332013-09-05 11:44:42 +0200398 err = PTR_ERR(newent);
399 if (IS_ERR(newent))
400 goto out_err;
Miklos Szeredid2a85162006-10-17 00:10:11 -0700401
Miklos Szeredi0de62562008-07-25 01:48:59 -0700402 entry = newent ? newent : entry;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700403 if (outarg_valid)
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700404 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800405 else
406 fuse_invalidate_entry_cache(entry);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700407
Feng Shuo4582a4a2013-01-15 11:23:28 +0800408 fuse_advise_use_readdirplus(dir);
Miklos Szeredi0de62562008-07-25 01:48:59 -0700409 return newent;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700410
411 out_iput:
412 iput(inode);
413 out_err:
414 return ERR_PTR(err);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700415}
416
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800417/*
418 * Atomic create+open operation
419 *
420 * If the filesystem doesn't support this, then fall back to separate
421 * 'mknod' + 'open' requests.
422 */
Al Virod9585272012-06-22 12:39:14 +0400423static int fuse_create_open(struct inode *dir, struct dentry *entry,
Al Viro30d90492012-06-22 12:40:19 +0400424 struct file *file, unsigned flags,
Al Virob452a452018-06-08 13:06:28 -0400425 umode_t mode)
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800426{
427 int err;
428 struct inode *inode;
429 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100430 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100431 struct fuse_forget_link *forget;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200432 struct fuse_create_in inarg;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800433 struct fuse_open_out outopen;
434 struct fuse_entry_out outentry;
Kirill Tkhaiebf84d02018-11-09 13:33:11 +0300435 struct fuse_inode *fi;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800436 struct fuse_file *ff;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800437
Miklos Szerediaf109bc2012-08-15 13:01:24 +0200438 /* Userspace expects S_IFREG in create mode */
439 BUG_ON((mode & S_IFMT) != S_IFREG);
440
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100441 forget = fuse_alloc_forget();
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200442 err = -ENOMEM;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100443 if (!forget)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200444 goto out_err;
Miklos Szeredi51eb01e2006-06-25 05:48:50 -0700445
Miklos Szeredice1d5a42006-04-10 22:54:58 -0700446 err = -ENOMEM;
Tejun Heoacf99432008-11-26 12:03:55 +0100447 ff = fuse_file_alloc(fc);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800448 if (!ff)
Miklos Szeredi70781872014-12-12 09:49:05 +0100449 goto out_put_forget_req;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800450
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200451 if (!fc->dont_mask)
452 mode &= ~current_umask();
453
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800454 flags &= ~O_NOCTTY;
455 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700456 memset(&outentry, 0, sizeof(outentry));
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800457 inarg.flags = flags;
458 inarg.mode = mode;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200459 inarg.umask = current_umask();
Miklos Szeredid5b48542019-09-10 15:04:08 +0200460 args.opcode = FUSE_CREATE;
461 args.nodeid = get_node_id(dir);
462 args.in_numargs = 2;
463 args.in_args[0].size = sizeof(inarg);
464 args.in_args[0].value = &inarg;
465 args.in_args[1].size = entry->d_name.len + 1;
466 args.in_args[1].value = entry->d_name.name;
467 args.out_numargs = 2;
468 args.out_args[0].size = sizeof(outentry);
469 args.out_args[0].value = &outentry;
470 args.out_args[1].size = sizeof(outopen);
471 args.out_args[1].value = &outopen;
Miklos Szeredi70781872014-12-12 09:49:05 +0100472 err = fuse_simple_request(fc, &args);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200473 if (err)
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800474 goto out_free_ff;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800475
476 err = -EIO;
Miklos Szeredi2827d0b22005-11-28 13:44:16 -0800477 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800478 goto out_free_ff;
479
Miklos Szeredic7b71432009-04-28 16:56:37 +0200480 ff->fh = outopen.fh;
481 ff->nodeid = outentry.nodeid;
482 ff->open_flags = outopen.open_flags;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800483 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700484 &outentry.attr, entry_attr_timeout(&outentry), 0);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800485 if (!inode) {
486 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
Kirill Tkhaiebf84d02018-11-09 13:33:11 +0300487 fuse_sync_release(NULL, ff, flags);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100488 fuse_queue_forget(fc, forget, outentry.nodeid, 1);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200489 err = -ENOMEM;
490 goto out_err;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800491 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100492 kfree(forget);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800493 d_instantiate(entry, inode);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700494 fuse_change_entry_timeout(entry, &outentry);
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200495 fuse_dir_changed(dir);
Al Virobe12af32018-06-08 11:44:56 -0400496 err = finish_open(file, entry, generic_file_open);
Al Viro30d90492012-06-22 12:40:19 +0400497 if (err) {
Kirill Tkhaiebf84d02018-11-09 13:33:11 +0300498 fi = get_fuse_inode(inode);
499 fuse_sync_release(fi, ff, flags);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200500 } else {
Miklos Szeredi267d8442017-02-22 20:08:25 +0100501 file->private_data = ff;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200502 fuse_finish_open(inode, file);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800503 }
Al Virod9585272012-06-22 12:39:14 +0400504 return err;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800505
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200506out_free_ff:
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800507 fuse_file_free(ff);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200508out_put_forget_req:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100509 kfree(forget);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200510out_err:
Al Virod9585272012-06-22 12:39:14 +0400511 return err;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200512}
513
514static int fuse_mknod(struct inode *, struct dentry *, umode_t, dev_t);
Al Virod9585272012-06-22 12:39:14 +0400515static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
Al Viro30d90492012-06-22 12:40:19 +0400516 struct file *file, unsigned flags,
Al Viro44907d72018-06-08 13:32:02 -0400517 umode_t mode)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200518{
519 int err;
520 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200521 struct dentry *res = NULL;
522
Al Viro00699ad2016-07-05 09:44:53 -0400523 if (d_in_lookup(entry)) {
Al Viro00cd8dd2012-06-10 17:13:09 -0400524 res = fuse_lookup(dir, entry, 0);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200525 if (IS_ERR(res))
Al Virod9585272012-06-22 12:39:14 +0400526 return PTR_ERR(res);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200527
528 if (res)
529 entry = res;
530 }
531
David Howells2b0143b2015-03-17 22:25:59 +0000532 if (!(flags & O_CREAT) || d_really_is_positive(entry))
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200533 goto no_open;
534
535 /* Only creates */
Al Viro73a09dd2018-06-08 13:22:02 -0400536 file->f_mode |= FMODE_CREATED;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200537
538 if (fc->no_create)
539 goto mknod;
540
Al Virob452a452018-06-08 13:06:28 -0400541 err = fuse_create_open(dir, entry, file, flags, mode);
Al Virod9585272012-06-22 12:39:14 +0400542 if (err == -ENOSYS) {
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200543 fc->no_create = 1;
544 goto mknod;
545 }
546out_dput:
547 dput(res);
Al Virod9585272012-06-22 12:39:14 +0400548 return err;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200549
550mknod:
551 err = fuse_mknod(dir, entry, mode, 0);
Al Virod9585272012-06-22 12:39:14 +0400552 if (err)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200553 goto out_dput;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200554no_open:
Al Viroe45198a2012-06-10 06:48:09 -0400555 return finish_no_open(file, res);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800556}
557
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800558/*
559 * Code shared between mknod, mkdir, symlink and link
560 */
Miklos Szeredi70781872014-12-12 09:49:05 +0100561static int create_new_entry(struct fuse_conn *fc, struct fuse_args *args,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700562 struct inode *dir, struct dentry *entry,
Al Viro541af6a2011-07-26 03:17:33 -0400563 umode_t mode)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700564{
565 struct fuse_entry_out outarg;
566 struct inode *inode;
Al Viroc971e6a2018-05-28 18:27:19 -0400567 struct dentry *d;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700568 int err;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100569 struct fuse_forget_link *forget;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800570
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100571 forget = fuse_alloc_forget();
Miklos Szeredi70781872014-12-12 09:49:05 +0100572 if (!forget)
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100573 return -ENOMEM;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700574
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700575 memset(&outarg, 0, sizeof(outarg));
Miklos Szeredid5b48542019-09-10 15:04:08 +0200576 args->nodeid = get_node_id(dir);
577 args->out_numargs = 1;
578 args->out_args[0].size = sizeof(outarg);
579 args->out_args[0].value = &outarg;
Miklos Szeredi70781872014-12-12 09:49:05 +0100580 err = fuse_simple_request(fc, args);
Miklos Szeredi2d510132006-11-25 11:09:20 -0800581 if (err)
582 goto out_put_forget_req;
583
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800584 err = -EIO;
585 if (invalid_nodeid(outarg.nodeid))
Miklos Szeredi2d510132006-11-25 11:09:20 -0800586 goto out_put_forget_req;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800587
588 if ((outarg.attr.mode ^ mode) & S_IFMT)
Miklos Szeredi2d510132006-11-25 11:09:20 -0800589 goto out_put_forget_req;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800590
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700591 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700592 &outarg.attr, entry_attr_timeout(&outarg), 0);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700593 if (!inode) {
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100594 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700595 return -ENOMEM;
596 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100597 kfree(forget);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700598
Al Viroc971e6a2018-05-28 18:27:19 -0400599 d_drop(entry);
600 d = d_splice_alias(inode, entry);
601 if (IS_ERR(d))
602 return PTR_ERR(d);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700603
Al Viroc971e6a2018-05-28 18:27:19 -0400604 if (d) {
605 fuse_change_entry_timeout(d, &outarg);
606 dput(d);
607 } else {
608 fuse_change_entry_timeout(entry, &outarg);
609 }
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200610 fuse_dir_changed(dir);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700611 return 0;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800612
Miklos Szeredi2d510132006-11-25 11:09:20 -0800613 out_put_forget_req:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100614 kfree(forget);
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800615 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700616}
617
Al Viro1a67aaf2011-07-26 01:52:52 -0400618static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700619 dev_t rdev)
620{
621 struct fuse_mknod_in inarg;
622 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100623 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700624
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200625 if (!fc->dont_mask)
626 mode &= ~current_umask();
627
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700628 memset(&inarg, 0, sizeof(inarg));
629 inarg.mode = mode;
630 inarg.rdev = new_encode_dev(rdev);
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200631 inarg.umask = current_umask();
Miklos Szeredid5b48542019-09-10 15:04:08 +0200632 args.opcode = FUSE_MKNOD;
633 args.in_numargs = 2;
634 args.in_args[0].size = sizeof(inarg);
635 args.in_args[0].value = &inarg;
636 args.in_args[1].size = entry->d_name.len + 1;
637 args.in_args[1].value = entry->d_name.name;
Miklos Szeredi70781872014-12-12 09:49:05 +0100638 return create_new_entry(fc, &args, dir, entry, mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700639}
640
Al Viro4acdaf22011-07-26 01:42:34 -0400641static int fuse_create(struct inode *dir, struct dentry *entry, umode_t mode,
Al Viroebfc3b42012-06-10 18:05:36 -0400642 bool excl)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700643{
644 return fuse_mknod(dir, entry, mode, 0);
645}
646
Al Viro18bb1db2011-07-26 01:41:39 -0400647static int fuse_mkdir(struct inode *dir, struct dentry *entry, umode_t mode)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700648{
649 struct fuse_mkdir_in inarg;
650 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100651 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700652
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200653 if (!fc->dont_mask)
654 mode &= ~current_umask();
655
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700656 memset(&inarg, 0, sizeof(inarg));
657 inarg.mode = mode;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200658 inarg.umask = current_umask();
Miklos Szeredid5b48542019-09-10 15:04:08 +0200659 args.opcode = FUSE_MKDIR;
660 args.in_numargs = 2;
661 args.in_args[0].size = sizeof(inarg);
662 args.in_args[0].value = &inarg;
663 args.in_args[1].size = entry->d_name.len + 1;
664 args.in_args[1].value = entry->d_name.name;
Miklos Szeredi70781872014-12-12 09:49:05 +0100665 return create_new_entry(fc, &args, dir, entry, S_IFDIR);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700666}
667
668static int fuse_symlink(struct inode *dir, struct dentry *entry,
669 const char *link)
670{
671 struct fuse_conn *fc = get_fuse_conn(dir);
672 unsigned len = strlen(link) + 1;
Miklos Szeredi70781872014-12-12 09:49:05 +0100673 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700674
Miklos Szeredid5b48542019-09-10 15:04:08 +0200675 args.opcode = FUSE_SYMLINK;
676 args.in_numargs = 2;
677 args.in_args[0].size = entry->d_name.len + 1;
678 args.in_args[0].value = entry->d_name.name;
679 args.in_args[1].size = len;
680 args.in_args[1].value = link;
Miklos Szeredi70781872014-12-12 09:49:05 +0100681 return create_new_entry(fc, &args, dir, entry, S_IFLNK);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700682}
683
Seth Forshee703c7362016-08-29 08:46:36 -0500684void fuse_update_ctime(struct inode *inode)
Maxim Patlasov31f32672014-04-28 14:19:24 +0200685{
686 if (!IS_NOCMTIME(inode)) {
Deepa Dinamanic2050a42016-09-14 07:48:06 -0700687 inode->i_ctime = current_time(inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200688 mark_inode_dirty_sync(inode);
689 }
690}
691
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700692static int fuse_unlink(struct inode *dir, struct dentry *entry)
693{
694 int err;
695 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100696 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700697
Miklos Szeredid5b48542019-09-10 15:04:08 +0200698 args.opcode = FUSE_UNLINK;
699 args.nodeid = get_node_id(dir);
700 args.in_numargs = 1;
701 args.in_args[0].size = entry->d_name.len + 1;
702 args.in_args[0].value = entry->d_name.name;
Miklos Szeredi70781872014-12-12 09:49:05 +0100703 err = fuse_simple_request(fc, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700704 if (!err) {
David Howells2b0143b2015-03-17 22:25:59 +0000705 struct inode *inode = d_inode(entry);
Miklos Szerediac45d612012-03-05 15:48:11 +0100706 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700707
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +0300708 spin_lock(&fi->lock);
Kirill Tkhai4510d862018-11-09 13:33:17 +0300709 fi->attr_version = atomic64_inc_return(&fc->attr_version);
Miklos Szeredidfca7ce2013-02-04 15:57:42 +0100710 /*
711 * If i_nlink == 0 then unlink doesn't make sense, yet this can
712 * happen if userspace filesystem is careless. It would be
713 * difficult to enforce correct nlink usage so just ignore this
714 * condition here
715 */
716 if (inode->i_nlink > 0)
717 drop_nlink(inode);
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +0300718 spin_unlock(&fi->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700719 fuse_invalidate_attr(inode);
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200720 fuse_dir_changed(dir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800721 fuse_invalidate_entry_cache(entry);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200722 fuse_update_ctime(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700723 } else if (err == -EINTR)
724 fuse_invalidate_entry(entry);
725 return err;
726}
727
728static int fuse_rmdir(struct inode *dir, struct dentry *entry)
729{
730 int err;
731 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100732 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700733
Miklos Szeredid5b48542019-09-10 15:04:08 +0200734 args.opcode = FUSE_RMDIR;
735 args.nodeid = get_node_id(dir);
736 args.in_numargs = 1;
737 args.in_args[0].size = entry->d_name.len + 1;
738 args.in_args[0].value = entry->d_name.name;
Miklos Szeredi70781872014-12-12 09:49:05 +0100739 err = fuse_simple_request(fc, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700740 if (!err) {
David Howells2b0143b2015-03-17 22:25:59 +0000741 clear_nlink(d_inode(entry));
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200742 fuse_dir_changed(dir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800743 fuse_invalidate_entry_cache(entry);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700744 } else if (err == -EINTR)
745 fuse_invalidate_entry(entry);
746 return err;
747}
748
Miklos Szeredi1560c972014-04-28 16:43:44 +0200749static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
750 struct inode *newdir, struct dentry *newent,
751 unsigned int flags, int opcode, size_t argsize)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700752{
753 int err;
Miklos Szeredi1560c972014-04-28 16:43:44 +0200754 struct fuse_rename2_in inarg;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700755 struct fuse_conn *fc = get_fuse_conn(olddir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100756 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700757
Miklos Szeredi1560c972014-04-28 16:43:44 +0200758 memset(&inarg, 0, argsize);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700759 inarg.newdir = get_node_id(newdir);
Miklos Szeredi1560c972014-04-28 16:43:44 +0200760 inarg.flags = flags;
Miklos Szeredid5b48542019-09-10 15:04:08 +0200761 args.opcode = opcode;
762 args.nodeid = get_node_id(olddir);
763 args.in_numargs = 3;
764 args.in_args[0].size = argsize;
765 args.in_args[0].value = &inarg;
766 args.in_args[1].size = oldent->d_name.len + 1;
767 args.in_args[1].value = oldent->d_name.name;
768 args.in_args[2].size = newent->d_name.len + 1;
769 args.in_args[2].value = newent->d_name.name;
Miklos Szeredi70781872014-12-12 09:49:05 +0100770 err = fuse_simple_request(fc, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700771 if (!err) {
Miklos Szeredi08b63302007-11-28 16:22:03 -0800772 /* ctime changes */
David Howells2b0143b2015-03-17 22:25:59 +0000773 fuse_invalidate_attr(d_inode(oldent));
774 fuse_update_ctime(d_inode(oldent));
Miklos Szeredi08b63302007-11-28 16:22:03 -0800775
Miklos Szeredi1560c972014-04-28 16:43:44 +0200776 if (flags & RENAME_EXCHANGE) {
David Howells2b0143b2015-03-17 22:25:59 +0000777 fuse_invalidate_attr(d_inode(newent));
778 fuse_update_ctime(d_inode(newent));
Miklos Szeredi1560c972014-04-28 16:43:44 +0200779 }
780
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200781 fuse_dir_changed(olddir);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700782 if (olddir != newdir)
Miklos Szeredi261aaba72018-10-01 10:07:05 +0200783 fuse_dir_changed(newdir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800784
785 /* newent will end up negative */
David Howells2b0143b2015-03-17 22:25:59 +0000786 if (!(flags & RENAME_EXCHANGE) && d_really_is_positive(newent)) {
787 fuse_invalidate_attr(d_inode(newent));
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800788 fuse_invalidate_entry_cache(newent);
David Howells2b0143b2015-03-17 22:25:59 +0000789 fuse_update_ctime(d_inode(newent));
Miklos Szeredi5219f342009-11-04 10:24:52 +0100790 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700791 } else if (err == -EINTR) {
792 /* If request was interrupted, DEITY only knows if the
793 rename actually took place. If the invalidation
794 fails (e.g. some process has CWD under the renamed
795 directory), then there can be inconsistency between
796 the dcache and the real filesystem. Tough luck. */
797 fuse_invalidate_entry(oldent);
David Howells2b0143b2015-03-17 22:25:59 +0000798 if (d_really_is_positive(newent))
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700799 fuse_invalidate_entry(newent);
800 }
801
802 return err;
803}
804
Miklos Szeredi1560c972014-04-28 16:43:44 +0200805static int fuse_rename2(struct inode *olddir, struct dentry *oldent,
806 struct inode *newdir, struct dentry *newent,
807 unsigned int flags)
808{
809 struct fuse_conn *fc = get_fuse_conn(olddir);
810 int err;
811
812 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
813 return -EINVAL;
814
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200815 if (flags) {
816 if (fc->no_rename2 || fc->minor < 23)
817 return -EINVAL;
Miklos Szeredi1560c972014-04-28 16:43:44 +0200818
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200819 err = fuse_rename_common(olddir, oldent, newdir, newent, flags,
820 FUSE_RENAME2,
821 sizeof(struct fuse_rename2_in));
822 if (err == -ENOSYS) {
823 fc->no_rename2 = 1;
824 err = -EINVAL;
825 }
826 } else {
827 err = fuse_rename_common(olddir, oldent, newdir, newent, 0,
828 FUSE_RENAME,
829 sizeof(struct fuse_rename_in));
Miklos Szeredi1560c972014-04-28 16:43:44 +0200830 }
Miklos Szeredi1560c972014-04-28 16:43:44 +0200831
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200832 return err;
833}
834
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700835static int fuse_link(struct dentry *entry, struct inode *newdir,
836 struct dentry *newent)
837{
838 int err;
839 struct fuse_link_in inarg;
David Howells2b0143b2015-03-17 22:25:59 +0000840 struct inode *inode = d_inode(entry);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700841 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +0100842 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700843
844 memset(&inarg, 0, sizeof(inarg));
845 inarg.oldnodeid = get_node_id(inode);
Miklos Szeredid5b48542019-09-10 15:04:08 +0200846 args.opcode = FUSE_LINK;
847 args.in_numargs = 2;
848 args.in_args[0].size = sizeof(inarg);
849 args.in_args[0].value = &inarg;
850 args.in_args[1].size = newent->d_name.len + 1;
851 args.in_args[1].value = newent->d_name.name;
Miklos Szeredi70781872014-12-12 09:49:05 +0100852 err = create_new_entry(fc, &args, newdir, newent, inode->i_mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700853 /* Contrary to "normal" filesystems it can happen that link
854 makes two "logical" inodes point to the same "physical"
855 inode. We invalidate the attributes of the old one, so it
856 will reflect changes in the backing inode (link count,
857 etc.)
858 */
Miklos Szerediac45d612012-03-05 15:48:11 +0100859 if (!err) {
860 struct fuse_inode *fi = get_fuse_inode(inode);
861
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +0300862 spin_lock(&fi->lock);
Kirill Tkhai4510d862018-11-09 13:33:17 +0300863 fi->attr_version = atomic64_inc_return(&fc->attr_version);
Miklos Szerediac45d612012-03-05 15:48:11 +0100864 inc_nlink(inode);
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +0300865 spin_unlock(&fi->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700866 fuse_invalidate_attr(inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200867 fuse_update_ctime(inode);
Miklos Szerediac45d612012-03-05 15:48:11 +0100868 } else if (err == -EINTR) {
869 fuse_invalidate_attr(inode);
870 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700871 return err;
872}
873
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700874static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
875 struct kstat *stat)
876{
Miklos Szeredi203627b2012-05-10 19:49:38 +0400877 unsigned int blkbits;
Pavel Emelyanov83732002013-10-10 17:10:46 +0400878 struct fuse_conn *fc = get_fuse_conn(inode);
879
880 /* see the comment in fuse_change_attributes() */
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400881 if (fc->writeback_cache && S_ISREG(inode->i_mode)) {
Pavel Emelyanov83732002013-10-10 17:10:46 +0400882 attr->size = i_size_read(inode);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400883 attr->mtime = inode->i_mtime.tv_sec;
884 attr->mtimensec = inode->i_mtime.tv_nsec;
Maxim Patlasov31f32672014-04-28 14:19:24 +0200885 attr->ctime = inode->i_ctime.tv_sec;
886 attr->ctimensec = inode->i_ctime.tv_nsec;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400887 }
Miklos Szeredi203627b2012-05-10 19:49:38 +0400888
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700889 stat->dev = inode->i_sb->s_dev;
890 stat->ino = attr->ino;
891 stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
892 stat->nlink = attr->nlink;
Eric W. Biederman8cb08322018-02-21 11:18:07 -0600893 stat->uid = make_kuid(fc->user_ns, attr->uid);
894 stat->gid = make_kgid(fc->user_ns, attr->gid);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700895 stat->rdev = inode->i_rdev;
896 stat->atime.tv_sec = attr->atime;
897 stat->atime.tv_nsec = attr->atimensec;
898 stat->mtime.tv_sec = attr->mtime;
899 stat->mtime.tv_nsec = attr->mtimensec;
900 stat->ctime.tv_sec = attr->ctime;
901 stat->ctime.tv_nsec = attr->ctimensec;
902 stat->size = attr->size;
903 stat->blocks = attr->blocks;
Miklos Szeredi203627b2012-05-10 19:49:38 +0400904
905 if (attr->blksize != 0)
906 blkbits = ilog2(attr->blksize);
907 else
908 blkbits = inode->i_sb->s_blocksize_bits;
909
910 stat->blksize = 1 << blkbits;
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700911}
912
Miklos Szeredic79e3222007-10-18 03:06:59 -0700913static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
914 struct file *file)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700915{
916 int err;
Miklos Szeredic79e3222007-10-18 03:06:59 -0700917 struct fuse_getattr_in inarg;
918 struct fuse_attr_out outarg;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700919 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +0100920 FUSE_ARGS(args);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700921 u64 attr_version;
922
Miklos Szeredi7dca9fd2007-11-28 16:21:59 -0800923 attr_version = fuse_get_attr_version(fc);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700924
Miklos Szeredic79e3222007-10-18 03:06:59 -0700925 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700926 memset(&outarg, 0, sizeof(outarg));
Miklos Szeredic79e3222007-10-18 03:06:59 -0700927 /* Directories have separate file-handle space */
928 if (file && S_ISREG(inode->i_mode)) {
929 struct fuse_file *ff = file->private_data;
930
931 inarg.getattr_flags |= FUSE_GETATTR_FH;
932 inarg.fh = ff->fh;
933 }
Miklos Szeredid5b48542019-09-10 15:04:08 +0200934 args.opcode = FUSE_GETATTR;
935 args.nodeid = get_node_id(inode);
936 args.in_numargs = 1;
937 args.in_args[0].size = sizeof(inarg);
938 args.in_args[0].value = &inarg;
939 args.out_numargs = 1;
940 args.out_args[0].size = sizeof(outarg);
941 args.out_args[0].value = &outarg;
Miklos Szeredi70781872014-12-12 09:49:05 +0100942 err = fuse_simple_request(fc, &args);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700943 if (!err) {
Miklos Szeredic79e3222007-10-18 03:06:59 -0700944 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700945 make_bad_inode(inode);
946 err = -EIO;
947 } else {
Miklos Szeredic79e3222007-10-18 03:06:59 -0700948 fuse_change_attributes(inode, &outarg.attr,
949 attr_timeout(&outarg),
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700950 attr_version);
951 if (stat)
Miklos Szeredic79e3222007-10-18 03:06:59 -0700952 fuse_fillattr(inode, &outarg.attr, stat);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700953 }
954 }
955 return err;
956}
957
Miklos Szeredi5b97eea2017-09-12 16:57:54 +0200958static int fuse_update_get_attr(struct inode *inode, struct file *file,
Miklos Szeredi2f1e8192018-10-15 15:43:06 +0200959 struct kstat *stat, u32 request_mask,
960 unsigned int flags)
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800961{
962 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi5b97eea2017-09-12 16:57:54 +0200963 int err = 0;
Miklos Szeredibf5c1892018-03-20 17:11:44 +0100964 bool sync;
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800965
Miklos Szeredibf5c1892018-03-20 17:11:44 +0100966 if (flags & AT_STATX_FORCE_SYNC)
967 sync = true;
968 else if (flags & AT_STATX_DONT_SYNC)
969 sync = false;
Miklos Szeredi2f1e8192018-10-15 15:43:06 +0200970 else if (request_mask & READ_ONCE(fi->inval_mask))
971 sync = true;
Miklos Szeredibf5c1892018-03-20 17:11:44 +0100972 else
973 sync = time_before64(fi->i_time, get_jiffies_64());
974
975 if (sync) {
Seth Forshee60bcc882016-08-29 08:46:37 -0500976 forget_all_cached_acls(inode);
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800977 err = fuse_do_getattr(inode, stat, file);
Miklos Szeredi5b97eea2017-09-12 16:57:54 +0200978 } else if (stat) {
979 generic_fillattr(inode, stat);
980 stat->mode = fi->orig_i_mode;
981 stat->ino = fi->orig_ino;
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800982 }
983
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800984 return err;
985}
986
Miklos Szeredi5b97eea2017-09-12 16:57:54 +0200987int fuse_update_attributes(struct inode *inode, struct file *file)
988{
Miklos Szeredi802dc042018-10-15 15:43:06 +0200989 /* Do *not* need to get atime for internal purposes */
990 return fuse_update_get_attr(inode, file, NULL,
991 STATX_BASIC_STATS & ~STATX_ATIME, 0);
Miklos Szeredi5b97eea2017-09-12 16:57:54 +0200992}
993
John Muir3b463ae2009-05-31 11:13:57 -0400994int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
John Muir451d0f52011-12-06 21:50:06 +0100995 u64 child_nodeid, struct qstr *name)
John Muir3b463ae2009-05-31 11:13:57 -0400996{
997 int err = -ENOTDIR;
998 struct inode *parent;
999 struct dentry *dir;
1000 struct dentry *entry;
1001
1002 parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
1003 if (!parent)
1004 return -ENOENT;
1005
Al Viro59551022016-01-22 15:40:57 -05001006 inode_lock(parent);
John Muir3b463ae2009-05-31 11:13:57 -04001007 if (!S_ISDIR(parent->i_mode))
1008 goto unlock;
1009
1010 err = -ENOENT;
1011 dir = d_find_alias(parent);
1012 if (!dir)
1013 goto unlock;
1014
Linus Torvalds8387ff22016-06-10 07:51:30 -07001015 name->hash = full_name_hash(dir, name->name, name->len);
John Muir3b463ae2009-05-31 11:13:57 -04001016 entry = d_lookup(dir, name);
1017 dput(dir);
1018 if (!entry)
1019 goto unlock;
1020
Miklos Szeredi261aaba72018-10-01 10:07:05 +02001021 fuse_dir_changed(parent);
John Muir3b463ae2009-05-31 11:13:57 -04001022 fuse_invalidate_entry(entry);
John Muir451d0f52011-12-06 21:50:06 +01001023
David Howells2b0143b2015-03-17 22:25:59 +00001024 if (child_nodeid != 0 && d_really_is_positive(entry)) {
Al Viro59551022016-01-22 15:40:57 -05001025 inode_lock(d_inode(entry));
David Howells2b0143b2015-03-17 22:25:59 +00001026 if (get_node_id(d_inode(entry)) != child_nodeid) {
John Muir451d0f52011-12-06 21:50:06 +01001027 err = -ENOENT;
1028 goto badentry;
1029 }
1030 if (d_mountpoint(entry)) {
1031 err = -EBUSY;
1032 goto badentry;
1033 }
David Howellse36cb0b2015-01-29 12:02:35 +00001034 if (d_is_dir(entry)) {
John Muir451d0f52011-12-06 21:50:06 +01001035 shrink_dcache_parent(entry);
1036 if (!simple_empty(entry)) {
1037 err = -ENOTEMPTY;
1038 goto badentry;
1039 }
David Howells2b0143b2015-03-17 22:25:59 +00001040 d_inode(entry)->i_flags |= S_DEAD;
John Muir451d0f52011-12-06 21:50:06 +01001041 }
1042 dont_mount(entry);
David Howells2b0143b2015-03-17 22:25:59 +00001043 clear_nlink(d_inode(entry));
John Muir451d0f52011-12-06 21:50:06 +01001044 err = 0;
1045 badentry:
Al Viro59551022016-01-22 15:40:57 -05001046 inode_unlock(d_inode(entry));
John Muir451d0f52011-12-06 21:50:06 +01001047 if (!err)
1048 d_delete(entry);
1049 } else {
1050 err = 0;
1051 }
John Muir3b463ae2009-05-31 11:13:57 -04001052 dput(entry);
John Muir3b463ae2009-05-31 11:13:57 -04001053
1054 unlock:
Al Viro59551022016-01-22 15:40:57 -05001055 inode_unlock(parent);
John Muir3b463ae2009-05-31 11:13:57 -04001056 iput(parent);
1057 return err;
1058}
1059
Miklos Szeredi87729a52005-09-09 13:10:34 -07001060/*
1061 * Calling into a user-controlled filesystem gives the filesystem
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001062 * daemon ptrace-like capabilities over the current process. This
Miklos Szeredi87729a52005-09-09 13:10:34 -07001063 * means, that the filesystem daemon is able to record the exact
1064 * filesystem operations performed, and can also control the behavior
1065 * of the requester process in otherwise impossible ways. For example
1066 * it can delay the operation for arbitrary length of time allowing
1067 * DoS against the requester.
1068 *
1069 * For this reason only those processes can call into the filesystem,
1070 * for which the owner of the mount has ptrace privilege. This
1071 * excludes processes started by other users, suid or sgid processes.
1072 */
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001073int fuse_allow_current_process(struct fuse_conn *fc)
Miklos Szeredi87729a52005-09-09 13:10:34 -07001074{
David Howellsc69e8d92008-11-14 10:39:19 +11001075 const struct cred *cred;
David Howellsc69e8d92008-11-14 10:39:19 +11001076
Miklos Szeredi29433a22016-10-01 07:32:32 +02001077 if (fc->allow_other)
Seth Forshee73f03c22017-12-22 15:32:33 +01001078 return current_in_userns(fc->user_ns);
Miklos Szeredi87729a52005-09-09 13:10:34 -07001079
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001080 cred = current_cred();
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001081 if (uid_eq(cred->euid, fc->user_id) &&
1082 uid_eq(cred->suid, fc->user_id) &&
1083 uid_eq(cred->uid, fc->user_id) &&
1084 gid_eq(cred->egid, fc->group_id) &&
1085 gid_eq(cred->sgid, fc->group_id) &&
1086 gid_eq(cred->gid, fc->group_id))
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001087 return 1;
Miklos Szeredi87729a52005-09-09 13:10:34 -07001088
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001089 return 0;
Miklos Szeredi87729a52005-09-09 13:10:34 -07001090}
1091
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001092static int fuse_access(struct inode *inode, int mask)
1093{
1094 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001095 FUSE_ARGS(args);
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001096 struct fuse_access_in inarg;
1097 int err;
1098
Miklos Szeredi698fa1d2013-10-01 16:41:23 +02001099 BUG_ON(mask & MAY_NOT_BLOCK);
1100
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001101 if (fc->no_access)
1102 return 0;
1103
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001104 memset(&inarg, 0, sizeof(inarg));
Al Viroe6305c42008-07-15 21:03:57 -04001105 inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
Miklos Szeredid5b48542019-09-10 15:04:08 +02001106 args.opcode = FUSE_ACCESS;
1107 args.nodeid = get_node_id(inode);
1108 args.in_numargs = 1;
1109 args.in_args[0].size = sizeof(inarg);
1110 args.in_args[0].value = &inarg;
Miklos Szeredi70781872014-12-12 09:49:05 +01001111 err = fuse_simple_request(fc, &args);
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001112 if (err == -ENOSYS) {
1113 fc->no_access = 1;
1114 err = 0;
1115 }
1116 return err;
1117}
1118
Al Viro10556cb2011-06-20 19:28:19 -04001119static int fuse_perm_getattr(struct inode *inode, int mask)
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001120{
Al Viro10556cb2011-06-20 19:28:19 -04001121 if (mask & MAY_NOT_BLOCK)
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001122 return -ECHILD;
1123
Seth Forshee60bcc882016-08-29 08:46:37 -05001124 forget_all_cached_acls(inode);
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001125 return fuse_do_getattr(inode, NULL, NULL);
1126}
1127
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001128/*
1129 * Check permission. The two basic access models of FUSE are:
1130 *
1131 * 1) Local access checking ('default_permissions' mount option) based
1132 * on file mode. This is the plain old disk filesystem permission
1133 * modell.
1134 *
1135 * 2) "Remote" access checking, where server is responsible for
1136 * checking permission in each inode operation. An exception to this
1137 * is if ->permission() was invoked from sys_access() in which case an
1138 * access request is sent. Execute permission is still checked
1139 * locally based on file mode.
1140 */
Al Viro10556cb2011-06-20 19:28:19 -04001141static int fuse_permission(struct inode *inode, int mask)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001142{
1143 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001144 bool refreshed = false;
1145 int err = 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001146
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001147 if (!fuse_allow_current_process(fc))
Miklos Szeredie5e55582005-09-09 13:10:28 -07001148 return -EACCES;
Miklos Szeredi244f6382007-10-16 23:31:02 -07001149
1150 /*
Miklos Szeredie8e96152007-10-16 23:31:06 -07001151 * If attributes are needed, refresh them before proceeding
Miklos Szeredi244f6382007-10-16 23:31:02 -07001152 */
Miklos Szeredi29433a22016-10-01 07:32:32 +02001153 if (fc->default_permissions ||
Miklos Szeredie8e96152007-10-16 23:31:06 -07001154 ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001155 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredid233c7d2018-12-03 10:14:43 +01001156 u32 perm_mask = STATX_MODE | STATX_UID | STATX_GID;
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001157
Miklos Szeredid233c7d2018-12-03 10:14:43 +01001158 if (perm_mask & READ_ONCE(fi->inval_mask) ||
1159 time_before64(fi->i_time, get_jiffies_64())) {
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001160 refreshed = true;
1161
Al Viro10556cb2011-06-20 19:28:19 -04001162 err = fuse_perm_getattr(inode, mask);
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001163 if (err)
1164 return err;
1165 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001166 }
1167
Miklos Szeredi29433a22016-10-01 07:32:32 +02001168 if (fc->default_permissions) {
Al Viro2830ba72011-06-20 19:16:29 -04001169 err = generic_permission(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001170
1171 /* If permission is denied, try to refresh file
1172 attributes. This is also needed, because the root
1173 node will at first have no permissions */
Miklos Szeredi244f6382007-10-16 23:31:02 -07001174 if (err == -EACCES && !refreshed) {
Al Viro10556cb2011-06-20 19:28:19 -04001175 err = fuse_perm_getattr(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001176 if (!err)
Al Viro2830ba72011-06-20 19:16:29 -04001177 err = generic_permission(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001178 }
1179
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001180 /* Note: the opposite of the above test does not
1181 exist. So if permissions are revoked this won't be
1182 noticed immediately, only after the attribute
1183 timeout has expired */
Eric Paris9cfcac82010-07-23 11:43:51 -04001184 } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
Miklos Szeredie8e96152007-10-16 23:31:06 -07001185 err = fuse_access(inode, mask);
1186 } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1187 if (!(inode->i_mode & S_IXUGO)) {
1188 if (refreshed)
1189 return -EACCES;
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001190
Al Viro10556cb2011-06-20 19:28:19 -04001191 err = fuse_perm_getattr(inode, mask);
Miklos Szeredie8e96152007-10-16 23:31:06 -07001192 if (!err && !(inode->i_mode & S_IXUGO))
1193 return -EACCES;
1194 }
Miklos Szeredie5e55582005-09-09 13:10:28 -07001195 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001196 return err;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001197}
1198
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001199static int fuse_readlink_page(struct inode *inode, struct page *page)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001200{
Miklos Szeredie5e55582005-09-09 13:10:28 -07001201 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi4c29afe2019-09-10 15:04:09 +02001202 struct fuse_page_desc desc = { .length = PAGE_SIZE - 1 };
1203 struct fuse_args_pages ap = {
1204 .num_pages = 1,
1205 .pages = &page,
1206 .descs = &desc,
1207 };
1208 char *link;
1209 ssize_t res;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001210
Miklos Szeredi4c29afe2019-09-10 15:04:09 +02001211 ap.args.opcode = FUSE_READLINK;
1212 ap.args.nodeid = get_node_id(inode);
1213 ap.args.out_pages = true;
1214 ap.args.out_argvar = true;
1215 ap.args.page_zeroing = true;
1216 ap.args.out_numargs = 1;
1217 ap.args.out_args[0].size = desc.length;
1218 res = fuse_simple_request(fc, &ap.args);
Al Viro6b255392015-11-17 10:20:54 -05001219
Andrew Gallagher451418f2013-11-05 03:55:43 -08001220 fuse_invalidate_atime(inode);
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001221
Miklos Szeredi4c29afe2019-09-10 15:04:09 +02001222 if (res < 0)
1223 return res;
1224
1225 if (WARN_ON(res >= PAGE_SIZE))
1226 return -EIO;
1227
1228 link = page_address(page);
1229 link[res] = '\0';
1230
1231 return 0;
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001232}
1233
1234static const char *fuse_get_link(struct dentry *dentry, struct inode *inode,
1235 struct delayed_call *callback)
1236{
1237 struct fuse_conn *fc = get_fuse_conn(inode);
1238 struct page *page;
1239 int err;
1240
1241 err = -EIO;
1242 if (is_bad_inode(inode))
1243 goto out_err;
1244
1245 if (fc->cache_symlinks)
1246 return page_get_link(dentry, inode, callback);
1247
1248 err = -ECHILD;
1249 if (!dentry)
1250 goto out_err;
1251
1252 page = alloc_page(GFP_KERNEL);
1253 err = -ENOMEM;
1254 if (!page)
1255 goto out_err;
1256
1257 err = fuse_readlink_page(inode, page);
1258 if (err) {
1259 __free_page(page);
1260 goto out_err;
1261 }
1262
1263 set_delayed_call(callback, page_put_link, page);
1264
1265 return page_address(page);
1266
1267out_err:
1268 return ERR_PTR(err);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001269}
1270
Miklos Szeredie5e55582005-09-09 13:10:28 -07001271static int fuse_dir_open(struct inode *inode, struct file *file)
1272{
Miklos Szeredi91fe96b2009-04-28 16:56:37 +02001273 return fuse_open_common(inode, file, true);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001274}
1275
1276static int fuse_dir_release(struct inode *inode, struct file *file)
1277{
Chad Austin2e64ff12018-12-10 10:54:52 -08001278 fuse_release_common(file, true);
Miklos Szeredi8b0797a2009-04-28 16:56:39 +02001279
1280 return 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001281}
1282
Josef Bacik02c24a82011-07-16 20:44:56 -04001283static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1284 int datasync)
Miklos Szeredi82547982005-09-09 13:10:38 -07001285{
Miklos Szeredia9c2d1e2018-12-03 10:14:43 +01001286 struct inode *inode = file->f_mapping->host;
1287 struct fuse_conn *fc = get_fuse_conn(inode);
1288 int err;
1289
1290 if (is_bad_inode(inode))
1291 return -EIO;
1292
1293 if (fc->no_fsyncdir)
1294 return 0;
1295
1296 inode_lock(inode);
1297 err = fuse_fsync_common(file, start, end, datasync, FUSE_FSYNCDIR);
1298 if (err == -ENOSYS) {
1299 fc->no_fsyncdir = 1;
1300 err = 0;
1301 }
1302 inode_unlock(inode);
1303
1304 return err;
Miklos Szeredi82547982005-09-09 13:10:38 -07001305}
1306
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001307static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1308 unsigned long arg)
1309{
1310 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1311
1312 /* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1313 if (fc->minor < 18)
1314 return -ENOTTY;
1315
1316 return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1317}
1318
1319static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1320 unsigned long arg)
1321{
1322 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1323
1324 if (fc->minor < 18)
1325 return -ENOTTY;
1326
1327 return fuse_ioctl_common(file, cmd, arg,
1328 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1329}
1330
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001331static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001332{
1333 /* Always update if mtime is explicitly set */
1334 if (ivalid & ATTR_MTIME_SET)
1335 return true;
1336
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001337 /* Or if kernel i_mtime is the official one */
1338 if (trust_local_mtime)
1339 return true;
1340
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001341 /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1342 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1343 return false;
1344
1345 /* In all other cases update */
1346 return true;
1347}
1348
Eric W. Biederman8cb08322018-02-21 11:18:07 -06001349static void iattr_to_fattr(struct fuse_conn *fc, struct iattr *iattr,
1350 struct fuse_setattr_in *arg, bool trust_local_cmtime)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001351{
1352 unsigned ivalid = iattr->ia_valid;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001353
1354 if (ivalid & ATTR_MODE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001355 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001356 if (ivalid & ATTR_UID)
Eric W. Biederman8cb08322018-02-21 11:18:07 -06001357 arg->valid |= FATTR_UID, arg->uid = from_kuid(fc->user_ns, iattr->ia_uid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001358 if (ivalid & ATTR_GID)
Eric W. Biederman8cb08322018-02-21 11:18:07 -06001359 arg->valid |= FATTR_GID, arg->gid = from_kgid(fc->user_ns, iattr->ia_gid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001360 if (ivalid & ATTR_SIZE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001361 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001362 if (ivalid & ATTR_ATIME) {
1363 arg->valid |= FATTR_ATIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001364 arg->atime = iattr->ia_atime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001365 arg->atimensec = iattr->ia_atime.tv_nsec;
1366 if (!(ivalid & ATTR_ATIME_SET))
1367 arg->valid |= FATTR_ATIME_NOW;
1368 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001369 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001370 arg->valid |= FATTR_MTIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001371 arg->mtime = iattr->ia_mtime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001372 arg->mtimensec = iattr->ia_mtime.tv_nsec;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001373 if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001374 arg->valid |= FATTR_MTIME_NOW;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001375 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001376 if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
1377 arg->valid |= FATTR_CTIME;
1378 arg->ctime = iattr->ia_ctime.tv_sec;
1379 arg->ctimensec = iattr->ia_ctime.tv_nsec;
1380 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001381}
1382
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001383/*
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001384 * Prevent concurrent writepages on inode
1385 *
1386 * This is done by adding a negative bias to the inode write counter
1387 * and waiting for all pending writes to finish.
1388 */
1389void fuse_set_nowrite(struct inode *inode)
1390{
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001391 struct fuse_inode *fi = get_fuse_inode(inode);
1392
Al Viro59551022016-01-22 15:40:57 -05001393 BUG_ON(!inode_is_locked(inode));
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001394
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001395 spin_lock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001396 BUG_ON(fi->writectr < 0);
1397 fi->writectr += FUSE_NOWRITE;
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001398 spin_unlock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001399 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1400}
1401
1402/*
1403 * Allow writepages on inode
1404 *
1405 * Remove the bias from the writecounter and send any queued
1406 * writepages.
1407 */
1408static void __fuse_release_nowrite(struct inode *inode)
1409{
1410 struct fuse_inode *fi = get_fuse_inode(inode);
1411
1412 BUG_ON(fi->writectr != FUSE_NOWRITE);
1413 fi->writectr = 0;
1414 fuse_flush_writepages(inode);
1415}
1416
1417void fuse_release_nowrite(struct inode *inode)
1418{
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001419 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001420
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001421 spin_lock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001422 __fuse_release_nowrite(inode);
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001423 spin_unlock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001424}
1425
Miklos Szeredi70781872014-12-12 09:49:05 +01001426static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001427 struct inode *inode,
1428 struct fuse_setattr_in *inarg_p,
1429 struct fuse_attr_out *outarg_p)
1430{
Miklos Szeredid5b48542019-09-10 15:04:08 +02001431 args->opcode = FUSE_SETATTR;
1432 args->nodeid = get_node_id(inode);
1433 args->in_numargs = 1;
1434 args->in_args[0].size = sizeof(*inarg_p);
1435 args->in_args[0].value = inarg_p;
1436 args->out_numargs = 1;
1437 args->out_args[0].size = sizeof(*outarg_p);
1438 args->out_args[0].value = outarg_p;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001439}
1440
1441/*
1442 * Flush inode->i_mtime to the server
1443 */
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001444int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001445{
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001446 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001447 FUSE_ARGS(args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001448 struct fuse_setattr_in inarg;
1449 struct fuse_attr_out outarg;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001450
1451 memset(&inarg, 0, sizeof(inarg));
1452 memset(&outarg, 0, sizeof(outarg));
1453
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001454 inarg.valid = FATTR_MTIME;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001455 inarg.mtime = inode->i_mtime.tv_sec;
1456 inarg.mtimensec = inode->i_mtime.tv_nsec;
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001457 if (fc->minor >= 23) {
1458 inarg.valid |= FATTR_CTIME;
1459 inarg.ctime = inode->i_ctime.tv_sec;
1460 inarg.ctimensec = inode->i_ctime.tv_nsec;
1461 }
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001462 if (ff) {
1463 inarg.valid |= FATTR_FH;
1464 inarg.fh = ff->fh;
1465 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001466 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001467
Miklos Szeredi70781872014-12-12 09:49:05 +01001468 return fuse_simple_request(fc, &args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001469}
1470
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001471/*
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001472 * Set attributes, and at the same time refresh them.
1473 *
1474 * Truncation is slightly complicated, because the 'truncate' request
1475 * may fail, in which case we don't want to touch the mapping.
Miklos Szeredi9ffbb912006-10-17 00:10:06 -07001476 * vmtruncate() doesn't allow for this case, so do the rlimit checking
1477 * and the actual truncation by hand.
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001478 */
Jan Kara62490332016-05-26 17:12:41 +02001479int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001480 struct file *file)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001481{
Jan Kara62490332016-05-26 17:12:41 +02001482 struct inode *inode = d_inode(dentry);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001483 struct fuse_conn *fc = get_fuse_conn(inode);
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001484 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001485 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001486 struct fuse_setattr_in inarg;
1487 struct fuse_attr_out outarg;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001488 bool is_truncate = false;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001489 bool is_wb = fc->writeback_cache;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001490 loff_t oldsize;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001491 int err;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001492 bool trust_local_cmtime = is_wb && S_ISREG(inode->i_mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001493
Miklos Szeredi29433a22016-10-01 07:32:32 +02001494 if (!fc->default_permissions)
Christoph Hellwigdb78b872010-06-04 11:30:03 +02001495 attr->ia_valid |= ATTR_FORCE;
1496
Jan Kara31051c82016-05-26 16:55:18 +02001497 err = setattr_prepare(dentry, attr);
Christoph Hellwigdb78b872010-06-04 11:30:03 +02001498 if (err)
1499 return err;
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001500
Miklos Szeredi8d56add2011-02-25 14:44:58 +01001501 if (attr->ia_valid & ATTR_OPEN) {
Miklos Szeredidf0e91d2018-02-08 15:17:38 +01001502 /* This is coming from open(..., ... | O_TRUNC); */
1503 WARN_ON(!(attr->ia_valid & ATTR_SIZE));
1504 WARN_ON(attr->ia_size != 0);
1505 if (fc->atomic_o_trunc) {
1506 /*
1507 * No need to send request to userspace, since actual
1508 * truncation has already been done by OPEN. But still
1509 * need to truncate page cache.
1510 */
1511 i_size_write(inode, 0);
1512 truncate_pagecache(inode, 0);
Miklos Szeredi8d56add2011-02-25 14:44:58 +01001513 return 0;
Miklos Szeredidf0e91d2018-02-08 15:17:38 +01001514 }
Miklos Szeredi8d56add2011-02-25 14:44:58 +01001515 file = NULL;
1516 }
Miklos Szeredi6ff958e2007-10-18 03:07:02 -07001517
Miklos Szerediab2257e2018-10-01 10:07:05 +02001518 if (attr->ia_valid & ATTR_SIZE) {
1519 if (WARN_ON(!S_ISREG(inode->i_mode)))
1520 return -EIO;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001521 is_truncate = true;
Miklos Szerediab2257e2018-10-01 10:07:05 +02001522 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001523
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001524 if (is_truncate) {
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001525 fuse_set_nowrite(inode);
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001526 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001527 if (trust_local_cmtime && attr->ia_size != inode->i_size)
1528 attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001529 }
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001530
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001531 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -07001532 memset(&outarg, 0, sizeof(outarg));
Eric W. Biederman8cb08322018-02-21 11:18:07 -06001533 iattr_to_fattr(fc, attr, &inarg, trust_local_cmtime);
Miklos Szeredi49d49142007-10-18 03:07:00 -07001534 if (file) {
1535 struct fuse_file *ff = file->private_data;
1536 inarg.valid |= FATTR_FH;
1537 inarg.fh = ff->fh;
1538 }
Miklos Szeredif3332112007-10-18 03:07:04 -07001539 if (attr->ia_valid & ATTR_SIZE) {
1540 /* For mandatory locking in truncate */
1541 inarg.valid |= FATTR_LOCKOWNER;
1542 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1543 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001544 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
1545 err = fuse_simple_request(fc, &args);
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001546 if (err) {
1547 if (err == -EINTR)
1548 fuse_invalidate_attr(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001549 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001550 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001551
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001552 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1553 make_bad_inode(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001554 err = -EIO;
1555 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001556 }
1557
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001558 spin_lock(&fi->lock);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001559 /* the kernel maintains i_mtime locally */
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001560 if (trust_local_cmtime) {
1561 if (attr->ia_valid & ATTR_MTIME)
1562 inode->i_mtime = attr->ia_mtime;
1563 if (attr->ia_valid & ATTR_CTIME)
1564 inode->i_ctime = attr->ia_ctime;
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001565 /* FIXME: clear I_DIRTY_SYNC? */
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001566 }
1567
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001568 fuse_change_attributes_common(inode, &outarg.attr,
1569 attr_timeout(&outarg));
1570 oldsize = inode->i_size;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001571 /* see the comment in fuse_change_attributes() */
1572 if (!is_wb || is_truncate || !S_ISREG(inode->i_mode))
1573 i_size_write(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001574
1575 if (is_truncate) {
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001576 /* NOTE: this may release/reacquire fi->lock */
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001577 __fuse_release_nowrite(inode);
1578 }
Kirill Tkhaif15ecfe2018-11-09 13:33:22 +03001579 spin_unlock(&fi->lock);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001580
1581 /*
1582 * Only call invalidate_inode_pages2() after removing
1583 * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1584 */
Pavel Emelyanov83732002013-10-10 17:10:46 +04001585 if ((is_truncate || !is_wb) &&
1586 S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
Kirill A. Shutemov7caef262013-09-12 15:13:56 -07001587 truncate_pagecache(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001588 invalidate_inode_pages2(inode->i_mapping);
1589 }
1590
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001591 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001592 return 0;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001593
1594error:
1595 if (is_truncate)
1596 fuse_release_nowrite(inode);
1597
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001598 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001599 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001600}
1601
Miklos Szeredi49d49142007-10-18 03:07:00 -07001602static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1603{
David Howells2b0143b2015-03-17 22:25:59 +00001604 struct inode *inode = d_inode(entry);
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001605 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001606 struct file *file = (attr->ia_valid & ATTR_FILE) ? attr->ia_file : NULL;
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001607 int ret;
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001608
1609 if (!fuse_allow_current_process(get_fuse_conn(inode)))
1610 return -EACCES;
1611
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001612 if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001613 attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
1614 ATTR_MODE);
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001615
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001616 /*
1617 * The only sane way to reliably kill suid/sgid is to do it in
1618 * the userspace filesystem
1619 *
1620 * This should be done on write(), truncate() and chown().
1621 */
1622 if (!fc->handle_killpriv) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001623 /*
1624 * ia_mode calculation may have used stale i_mode.
1625 * Refresh and recalculate.
1626 */
1627 ret = fuse_do_getattr(inode, NULL, file);
1628 if (ret)
1629 return ret;
1630
1631 attr->ia_mode = inode->i_mode;
Miklos Szeredic01638f2016-12-06 16:18:45 +01001632 if (inode->i_mode & S_ISUID) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001633 attr->ia_valid |= ATTR_MODE;
1634 attr->ia_mode &= ~S_ISUID;
1635 }
Miklos Szeredic01638f2016-12-06 16:18:45 +01001636 if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001637 attr->ia_valid |= ATTR_MODE;
1638 attr->ia_mode &= ~S_ISGID;
1639 }
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001640 }
1641 }
1642 if (!attr->ia_valid)
1643 return 0;
1644
Linus Torvaldsabb5a142016-10-10 13:04:49 -07001645 ret = fuse_do_setattr(entry, attr, file);
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001646 if (!ret) {
Seth Forshee60bcc882016-08-29 08:46:37 -05001647 /*
1648 * If filesystem supports acls it may have updated acl xattrs in
1649 * the filesystem, so forget cached acls for the inode.
1650 */
1651 if (fc->posix_acl)
1652 forget_all_cached_acls(inode);
1653
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001654 /* Directory mode changed, may need to revalidate access */
1655 if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE))
1656 fuse_invalidate_entry_cache(entry);
1657 }
1658 return ret;
Miklos Szeredi49d49142007-10-18 03:07:00 -07001659}
1660
David Howellsa528d352017-01-31 16:46:22 +00001661static int fuse_getattr(const struct path *path, struct kstat *stat,
1662 u32 request_mask, unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001663{
David Howellsa528d352017-01-31 16:46:22 +00001664 struct inode *inode = d_inode(path->dentry);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001665 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001666
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001667 if (!fuse_allow_current_process(fc))
Miklos Szeredi244f6382007-10-16 23:31:02 -07001668 return -EACCES;
1669
Miklos Szeredi2f1e8192018-10-15 15:43:06 +02001670 return fuse_update_get_attr(inode, NULL, stat, request_mask, flags);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001671}
1672
Arjan van de Ven754661f2007-02-12 00:55:38 -08001673static const struct inode_operations fuse_dir_inode_operations = {
Miklos Szeredie5e55582005-09-09 13:10:28 -07001674 .lookup = fuse_lookup,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001675 .mkdir = fuse_mkdir,
1676 .symlink = fuse_symlink,
1677 .unlink = fuse_unlink,
1678 .rmdir = fuse_rmdir,
Miklos Szeredi2773bf02016-09-27 11:03:58 +02001679 .rename = fuse_rename2,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001680 .link = fuse_link,
1681 .setattr = fuse_setattr,
1682 .create = fuse_create,
Miklos Szeredic8ccbe02012-06-05 15:10:22 +02001683 .atomic_open = fuse_atomic_open,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001684 .mknod = fuse_mknod,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001685 .permission = fuse_permission,
1686 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001687 .listxattr = fuse_listxattr,
Seth Forshee60bcc882016-08-29 08:46:37 -05001688 .get_acl = fuse_get_acl,
1689 .set_acl = fuse_set_acl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001690};
1691
Arjan van de Ven4b6f5d22006-03-28 01:56:42 -08001692static const struct file_operations fuse_dir_operations = {
Miklos Szeredib6aeade2005-09-09 13:10:30 -07001693 .llseek = generic_file_llseek,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001694 .read = generic_read_dir,
Al Virod9b3dbd2016-04-20 17:30:32 -04001695 .iterate_shared = fuse_readdir,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001696 .open = fuse_dir_open,
1697 .release = fuse_dir_release,
Miklos Szeredi82547982005-09-09 13:10:38 -07001698 .fsync = fuse_dir_fsync,
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001699 .unlocked_ioctl = fuse_dir_ioctl,
1700 .compat_ioctl = fuse_dir_compat_ioctl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001701};
1702
Arjan van de Ven754661f2007-02-12 00:55:38 -08001703static const struct inode_operations fuse_common_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001704 .setattr = fuse_setattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001705 .permission = fuse_permission,
1706 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001707 .listxattr = fuse_listxattr,
Seth Forshee60bcc882016-08-29 08:46:37 -05001708 .get_acl = fuse_get_acl,
1709 .set_acl = fuse_set_acl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001710};
1711
Arjan van de Ven754661f2007-02-12 00:55:38 -08001712static const struct inode_operations fuse_symlink_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001713 .setattr = fuse_setattr,
Al Viro6b255392015-11-17 10:20:54 -05001714 .get_link = fuse_get_link,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001715 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001716 .listxattr = fuse_listxattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001717};
1718
1719void fuse_init_common(struct inode *inode)
1720{
1721 inode->i_op = &fuse_common_inode_operations;
1722}
1723
1724void fuse_init_dir(struct inode *inode)
1725{
Miklos Szerediab2257e2018-10-01 10:07:05 +02001726 struct fuse_inode *fi = get_fuse_inode(inode);
1727
Miklos Szeredie5e55582005-09-09 13:10:28 -07001728 inode->i_op = &fuse_dir_inode_operations;
1729 inode->i_fop = &fuse_dir_operations;
Miklos Szerediab2257e2018-10-01 10:07:05 +02001730
1731 spin_lock_init(&fi->rdc.lock);
1732 fi->rdc.cached = false;
1733 fi->rdc.size = 0;
1734 fi->rdc.pos = 0;
1735 fi->rdc.version = 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001736}
1737
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001738static int fuse_symlink_readpage(struct file *null, struct page *page)
1739{
1740 int err = fuse_readlink_page(page->mapping->host, page);
1741
1742 if (!err)
1743 SetPageUptodate(page);
1744
1745 unlock_page(page);
1746
1747 return err;
1748}
1749
1750static const struct address_space_operations fuse_symlink_aops = {
1751 .readpage = fuse_symlink_readpage,
1752};
1753
Miklos Szeredie5e55582005-09-09 13:10:28 -07001754void fuse_init_symlink(struct inode *inode)
1755{
1756 inode->i_op = &fuse_symlink_inode_operations;
Dan Schatzberg5571f1e2018-10-11 08:17:00 -07001757 inode->i_data.a_ops = &fuse_symlink_aops;
1758 inode_nohighmem(inode);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001759}