blob: c9889fdddebda39f845fa4e3577eb83786a896e5 [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>
Seth Forshee60bcc882016-08-29 08:46:37 -050017#include <linux/posix_acl.h>
Miklos Szeredie5e55582005-09-09 13:10:28 -070018
Al Viro8d3af7f2013-05-18 03:03:58 -040019static bool fuse_use_readdirplus(struct inode *dir, struct dir_context *ctx)
Feng Shuo4582a4a2013-01-15 11:23:28 +080020{
21 struct fuse_conn *fc = get_fuse_conn(dir);
22 struct fuse_inode *fi = get_fuse_inode(dir);
23
24 if (!fc->do_readdirplus)
25 return false;
Eric Wong634734b2013-02-06 22:29:01 +000026 if (!fc->readdirplus_auto)
27 return true;
Feng Shuo4582a4a2013-01-15 11:23:28 +080028 if (test_and_clear_bit(FUSE_I_ADVISE_RDPLUS, &fi->state))
29 return true;
Al Viro8d3af7f2013-05-18 03:03:58 -040030 if (ctx->pos == 0)
Feng Shuo4582a4a2013-01-15 11:23:28 +080031 return true;
32 return false;
33}
34
35static void fuse_advise_use_readdirplus(struct inode *dir)
36{
37 struct fuse_inode *fi = get_fuse_inode(dir);
38
39 set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state);
40}
41
Miklos Szeredif75fdf22016-10-01 07:32:32 +020042union fuse_dentry {
43 u64 time;
44 struct rcu_head rcu;
45};
46
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070047static inline void fuse_dentry_settime(struct dentry *entry, u64 time)
48{
Miklos Szeredif75fdf22016-10-01 07:32:32 +020049 ((union fuse_dentry *) entry->d_fsdata)->time = time;
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070050}
51
52static inline u64 fuse_dentry_time(struct dentry *entry)
53{
Miklos Szeredif75fdf22016-10-01 07:32:32 +020054 return ((union fuse_dentry *) entry->d_fsdata)->time;
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070055}
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070056
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080057/*
58 * FUSE caches dentries and attributes with separate timeout. The
59 * time in jiffies until the dentry/attributes are valid is stored in
Miklos Szeredif75fdf22016-10-01 07:32:32 +020060 * dentry->d_fsdata and fuse_inode->i_time respectively.
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080061 */
62
63/*
64 * Calculate the time in jiffies until a dentry/attributes are valid
65 */
Miklos Szeredibcb6f6d2016-10-01 07:32:32 +020066static u64 time_to_jiffies(u64 sec, u32 nsec)
Miklos Szeredie5e55582005-09-09 13:10:28 -070067{
Miklos Szeredi685d16d2006-07-30 03:04:08 -070068 if (sec || nsec) {
Miklos Szeredibcb6f6d2016-10-01 07:32:32 +020069 struct timespec64 ts = {
70 sec,
David Sheets07f02672017-01-13 15:58:30 +000071 min_t(u32, nsec, NSEC_PER_SEC - 1)
Miklos Szeredibcb6f6d2016-10-01 07:32:32 +020072 };
73
74 return get_jiffies_64() + timespec64_to_jiffies(&ts);
Miklos Szeredi685d16d2006-07-30 03:04:08 -070075 } else
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070076 return 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -070077}
78
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080079/*
80 * Set dentry and possibly attribute timeouts from the lookup/mk*
81 * replies
82 */
Miklos Szeredi1fb69e72007-10-18 03:06:58 -070083static void fuse_change_entry_timeout(struct dentry *entry,
84 struct fuse_entry_out *o)
Miklos Szeredi0aa7c692006-01-06 00:19:34 -080085{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070086 fuse_dentry_settime(entry,
87 time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
Miklos Szeredi1fb69e72007-10-18 03:06:58 -070088}
89
90static u64 attr_timeout(struct fuse_attr_out *o)
91{
92 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
93}
94
95static u64 entry_attr_timeout(struct fuse_entry_out *o)
96{
97 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -080098}
99
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800100/*
101 * Mark the attributes as stale, so that at the next call to
102 * ->getattr() they will be fetched from userspace
103 */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800104void fuse_invalidate_attr(struct inode *inode)
105{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -0700106 get_fuse_inode(inode)->i_time = 0;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800107}
108
Andrew Gallagher451418f2013-11-05 03:55:43 -0800109/**
110 * Mark the attributes as stale due to an atime change. Avoid the invalidate if
111 * atime is not used.
112 */
113void fuse_invalidate_atime(struct inode *inode)
114{
115 if (!IS_RDONLY(inode))
116 fuse_invalidate_attr(inode);
117}
118
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800119/*
120 * Just mark the entry as stale, so that a next attempt to look it up
121 * will result in a new lookup call to userspace
122 *
123 * This is called when a dentry is about to become negative and the
124 * timeout is unknown (unlink, rmdir, rename and in some cases
125 * lookup)
126 */
Miklos Szeredidbd561d2008-07-25 01:49:00 -0700127void fuse_invalidate_entry_cache(struct dentry *entry)
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800128{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -0700129 fuse_dentry_settime(entry, 0);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800130}
131
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800132/*
133 * Same as fuse_invalidate_entry_cache(), but also try to remove the
134 * dentry from the hash
135 */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800136static void fuse_invalidate_entry(struct dentry *entry)
137{
138 d_invalidate(entry);
139 fuse_invalidate_entry_cache(entry);
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800140}
141
Miklos Szeredi70781872014-12-12 09:49:05 +0100142static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_args *args,
Al Viro13983d02016-07-20 22:34:44 -0400143 u64 nodeid, const struct qstr *name,
Miklos Szeredie5e55582005-09-09 13:10:28 -0700144 struct fuse_entry_out *outarg)
145{
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700146 memset(outarg, 0, sizeof(struct fuse_entry_out));
Miklos Szeredi70781872014-12-12 09:49:05 +0100147 args->in.h.opcode = FUSE_LOOKUP;
148 args->in.h.nodeid = nodeid;
149 args->in.numargs = 1;
150 args->in.args[0].size = name->len + 1;
151 args->in.args[0].value = name->name;
152 args->out.numargs = 1;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100153 args->out.args[0].size = sizeof(struct fuse_entry_out);
Miklos Szeredi70781872014-12-12 09:49:05 +0100154 args->out.args[0].value = outarg;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700155}
156
Miklos Szeredi5c5c5e52008-04-30 00:54:43 -0700157u64 fuse_get_attr_version(struct fuse_conn *fc)
Miklos Szeredi7dca9fd2007-11-28 16:21:59 -0800158{
159 u64 curr_version;
160
161 /*
162 * The spin lock isn't actually needed on 64bit archs, but we
163 * don't yet care too much about such optimizations.
164 */
165 spin_lock(&fc->lock);
166 curr_version = fc->attr_version;
167 spin_unlock(&fc->lock);
168
169 return curr_version;
170}
171
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800172/*
173 * Check whether the dentry is still valid
174 *
175 * If the entry validity timeout has expired and the dentry is
176 * positive, try to redo the lookup. If the lookup results in a
177 * different inode, then let the VFS invalidate the dentry and redo
178 * the lookup once more. If the lookup results in the same inode,
179 * then refresh the attributes, timeouts and mark the dentry valid.
180 */
Al Viro0b728e12012-06-10 16:03:43 -0400181static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700182{
Nick Piggin34286d62011-01-07 17:49:57 +1100183 struct inode *inode;
Miklos Szeredi28420da2013-06-03 14:40:22 +0200184 struct dentry *parent;
185 struct fuse_conn *fc;
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200186 struct fuse_inode *fi;
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200187 int ret;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800188
David Howells2b0143b2015-03-17 22:25:59 +0000189 inode = d_inode_rcu(entry);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800190 if (inode && is_bad_inode(inode))
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200191 goto invalid;
Anand Avati154210c2014-06-26 20:21:57 -0400192 else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
193 (flags & LOOKUP_REVAL)) {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700194 struct fuse_entry_out outarg;
Miklos Szeredi70781872014-12-12 09:49:05 +0100195 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100196 struct fuse_forget_link *forget;
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700197 u64 attr_version;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800198
Miklos Szeredi50322fe2006-02-28 16:59:03 -0800199 /* For negative dentries, always do a fresh lookup */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800200 if (!inode)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200201 goto invalid;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800202
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200203 ret = -ECHILD;
Al Viro0b728e12012-06-10 16:03:43 -0400204 if (flags & LOOKUP_RCU)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200205 goto out;
Miklos Szeredie7c0a162011-03-21 13:58:06 +0100206
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800207 fc = get_fuse_conn(inode);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700208
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100209 forget = fuse_alloc_forget();
Miklos Szeredi70781872014-12-12 09:49:05 +0100210 ret = -ENOMEM;
211 if (!forget)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200212 goto out;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800213
Miklos Szeredi7dca9fd2007-11-28 16:21:59 -0800214 attr_version = fuse_get_attr_version(fc);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700215
Miklos Szeredie956edd2006-10-17 00:10:12 -0700216 parent = dget_parent(entry);
David Howells2b0143b2015-03-17 22:25:59 +0000217 fuse_lookup_init(fc, &args, get_node_id(d_inode(parent)),
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700218 &entry->d_name, &outarg);
Miklos Szeredi70781872014-12-12 09:49:05 +0100219 ret = fuse_simple_request(fc, &args);
Miklos Szeredie956edd2006-10-17 00:10:12 -0700220 dput(parent);
Miklos Szeredi50322fe2006-02-28 16:59:03 -0800221 /* Zero nodeid is same as -ENOENT */
Miklos Szeredi70781872014-12-12 09:49:05 +0100222 if (!ret && !outarg.nodeid)
223 ret = -ENOENT;
224 if (!ret) {
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200225 fi = get_fuse_inode(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700226 if (outarg.nodeid != get_node_id(inode)) {
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100227 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200228 goto invalid;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700229 }
Miklos Szeredi8da5ff22006-10-17 00:10:08 -0700230 spin_lock(&fc->lock);
Miklos Szeredi1729a162008-11-26 12:03:54 +0100231 fi->nlookup++;
Miklos Szeredi8da5ff22006-10-17 00:10:08 -0700232 spin_unlock(&fc->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700233 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100234 kfree(forget);
Miklos Szeredi70781872014-12-12 09:49:05 +0100235 if (ret == -ENOMEM)
236 goto out;
237 if (ret || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200238 goto invalid;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700239
Seth Forshee60bcc882016-08-29 08:46:37 -0500240 forget_all_cached_acls(inode);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700241 fuse_change_attributes(inode, &outarg.attr,
242 entry_attr_timeout(&outarg),
243 attr_version);
244 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi28420da2013-06-03 14:40:22 +0200245 } else if (inode) {
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200246 fi = get_fuse_inode(inode);
247 if (flags & LOOKUP_RCU) {
248 if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state))
249 return -ECHILD;
250 } else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) {
Miklos Szeredi28420da2013-06-03 14:40:22 +0200251 parent = dget_parent(entry);
David Howells2b0143b2015-03-17 22:25:59 +0000252 fuse_advise_use_readdirplus(d_inode(parent));
Miklos Szeredi28420da2013-06-03 14:40:22 +0200253 dput(parent);
254 }
Miklos Szeredie5e55582005-09-09 13:10:28 -0700255 }
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200256 ret = 1;
257out:
258 return ret;
259
260invalid:
261 ret = 0;
262 goto out;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700263}
264
Daniel Rosenbergfac99a72016-04-22 00:00:48 -0700265/*
266 * Get the canonical path. Since we must translate to a path, this must be done
267 * in the context of the userspace daemon, however, the userspace daemon cannot
268 * look up paths on its own. Instead, we handle the lookup as a special case
269 * inside of the write request.
270 */
271static void fuse_dentry_canonical_path(const struct path *path, struct path *canonical_path) {
272 struct inode *inode = path->dentry->d_inode;
273 struct fuse_conn *fc = get_fuse_conn(inode);
274 struct fuse_req *req;
275 int err;
276 char *path_name;
277
278 req = fuse_get_req(fc, 1);
279 err = PTR_ERR(req);
280 if (IS_ERR(req))
281 goto default_path;
282
283 path_name = (char*)__get_free_page(GFP_KERNEL);
284 if (!path_name) {
285 fuse_put_request(fc, req);
286 goto default_path;
287 }
288
289 req->in.h.opcode = FUSE_CANONICAL_PATH;
290 req->in.h.nodeid = get_node_id(inode);
291 req->in.numargs = 0;
292 req->out.numargs = 1;
293 req->out.args[0].size = PATH_MAX;
294 req->out.args[0].value = path_name;
295 req->canonical_path = canonical_path;
296 req->out.argvar = 1;
297 fuse_request_send(fc, req);
298 err = req->out.h.error;
299 fuse_put_request(fc, req);
300 free_page((unsigned long)path_name);
301 if (!err)
302 return;
303default_path:
304 canonical_path->dentry = path->dentry;
305 canonical_path->mnt = path->mnt;
306 path_get(canonical_path);
307}
308
Miklos Szeredi8bfc0162006-01-16 22:14:28 -0800309static int invalid_nodeid(u64 nodeid)
Miklos Szeredi2827d0b22005-11-28 13:44:16 -0800310{
311 return !nodeid || nodeid == FUSE_ROOT_ID;
312}
313
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200314static int fuse_dentry_init(struct dentry *dentry)
315{
316 dentry->d_fsdata = kzalloc(sizeof(union fuse_dentry), GFP_KERNEL);
317
318 return dentry->d_fsdata ? 0 : -ENOMEM;
319}
320static void fuse_dentry_release(struct dentry *dentry)
321{
322 union fuse_dentry *fd = dentry->d_fsdata;
323
324 kfree_rcu(fd, rcu);
325}
326
Al Viro42695902009-02-20 05:59:13 +0000327const struct dentry_operations fuse_dentry_operations = {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700328 .d_revalidate = fuse_dentry_revalidate,
Miklos Szeredif75fdf22016-10-01 07:32:32 +0200329 .d_init = fuse_dentry_init,
330 .d_release = fuse_dentry_release,
Daniel Rosenbergfac99a72016-04-22 00:00:48 -0700331 .d_canonical_path = fuse_dentry_canonical_path,
Miklos Szeredie5e55582005-09-09 13:10:28 -0700332};
333
Miklos Szeredi0ce267f2016-10-18 15:36:48 +0200334const struct dentry_operations fuse_root_dentry_operations = {
335 .d_init = fuse_dentry_init,
336 .d_release = fuse_dentry_release,
Daniel Rosenbergfac99a72016-04-22 00:00:48 -0700337 .d_canonical_path = fuse_dentry_canonical_path,
Miklos Szeredi0ce267f2016-10-18 15:36:48 +0200338};
339
Timo Savolaa5bfffac2007-04-08 16:04:00 -0700340int fuse_valid_type(int m)
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800341{
342 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
343 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
344}
345
Al Viro13983d02016-07-20 22:34:44 -0400346int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name,
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700347 struct fuse_entry_out *outarg, struct inode **inode)
348{
349 struct fuse_conn *fc = get_fuse_conn_super(sb);
Miklos Szeredi70781872014-12-12 09:49:05 +0100350 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100351 struct fuse_forget_link *forget;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700352 u64 attr_version;
353 int err;
354
355 *inode = NULL;
356 err = -ENAMETOOLONG;
357 if (name->len > FUSE_NAME_MAX)
358 goto out;
359
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700360
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100361 forget = fuse_alloc_forget();
362 err = -ENOMEM;
Miklos Szeredi70781872014-12-12 09:49:05 +0100363 if (!forget)
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700364 goto out;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700365
366 attr_version = fuse_get_attr_version(fc);
367
Miklos Szeredi70781872014-12-12 09:49:05 +0100368 fuse_lookup_init(fc, &args, nodeid, name, outarg);
369 err = fuse_simple_request(fc, &args);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700370 /* Zero nodeid is same as -ENOENT, but with valid timeout */
371 if (err || !outarg->nodeid)
372 goto out_put_forget;
373
374 err = -EIO;
375 if (!outarg->nodeid)
376 goto out_put_forget;
377 if (!fuse_valid_type(outarg->attr.mode))
378 goto out_put_forget;
379
380 *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
381 &outarg->attr, entry_attr_timeout(outarg),
382 attr_version);
383 err = -ENOMEM;
384 if (!*inode) {
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100385 fuse_queue_forget(fc, forget, outarg->nodeid, 1);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700386 goto out;
387 }
388 err = 0;
389
390 out_put_forget:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100391 kfree(forget);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700392 out:
393 return err;
394}
395
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800396static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
Al Viro00cd8dd2012-06-10 17:13:09 -0400397 unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700398{
399 int err;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700400 struct fuse_entry_out outarg;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700401 struct inode *inode;
Miklos Szeredi0de62562008-07-25 01:48:59 -0700402 struct dentry *newent;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700403 bool outarg_valid = true;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700404
Miklos Szeredi5c672ab2016-06-30 13:10:49 +0200405 fuse_lock_inode(dir);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700406 err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
407 &outarg, &inode);
Miklos Szeredi5c672ab2016-06-30 13:10:49 +0200408 fuse_unlock_inode(dir);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700409 if (err == -ENOENT) {
410 outarg_valid = false;
411 err = 0;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800412 }
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700413 if (err)
414 goto out_err;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800415
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700416 err = -EIO;
417 if (inode && get_node_id(inode) == FUSE_ROOT_ID)
418 goto out_iput;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700419
Al Viro41d28bc2014-10-12 22:24:21 -0400420 newent = d_splice_alias(inode, entry);
Miklos Szeredi5835f332013-09-05 11:44:42 +0200421 err = PTR_ERR(newent);
422 if (IS_ERR(newent))
423 goto out_err;
Miklos Szeredid2a85162006-10-17 00:10:11 -0700424
Miklos Szeredi0de62562008-07-25 01:48:59 -0700425 entry = newent ? newent : entry;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700426 if (outarg_valid)
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700427 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800428 else
429 fuse_invalidate_entry_cache(entry);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700430
Feng Shuo4582a4a2013-01-15 11:23:28 +0800431 fuse_advise_use_readdirplus(dir);
Miklos Szeredi0de62562008-07-25 01:48:59 -0700432 return newent;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700433
434 out_iput:
435 iput(inode);
436 out_err:
437 return ERR_PTR(err);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700438}
439
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800440/*
441 * Atomic create+open operation
442 *
443 * If the filesystem doesn't support this, then fall back to separate
444 * 'mknod' + 'open' requests.
445 */
Al Virod9585272012-06-22 12:39:14 +0400446static int fuse_create_open(struct inode *dir, struct dentry *entry,
Al Viro30d90492012-06-22 12:40:19 +0400447 struct file *file, unsigned flags,
Al Virod9585272012-06-22 12:39:14 +0400448 umode_t mode, int *opened)
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800449{
450 int err;
451 struct inode *inode;
452 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100453 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100454 struct fuse_forget_link *forget;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200455 struct fuse_create_in inarg;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800456 struct fuse_open_out outopen;
457 struct fuse_entry_out outentry;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800458 struct fuse_file *ff;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800459
Miklos Szerediaf109bc2012-08-15 13:01:24 +0200460 /* Userspace expects S_IFREG in create mode */
461 BUG_ON((mode & S_IFMT) != S_IFREG);
462
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100463 forget = fuse_alloc_forget();
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200464 err = -ENOMEM;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100465 if (!forget)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200466 goto out_err;
Miklos Szeredi51eb01e2006-06-25 05:48:50 -0700467
Miklos Szeredice1d5a42006-04-10 22:54:58 -0700468 err = -ENOMEM;
Tejun Heoacf99432008-11-26 12:03:55 +0100469 ff = fuse_file_alloc(fc);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800470 if (!ff)
Miklos Szeredi70781872014-12-12 09:49:05 +0100471 goto out_put_forget_req;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800472
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200473 if (!fc->dont_mask)
474 mode &= ~current_umask();
475
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800476 flags &= ~O_NOCTTY;
477 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700478 memset(&outentry, 0, sizeof(outentry));
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800479 inarg.flags = flags;
480 inarg.mode = mode;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200481 inarg.umask = current_umask();
Miklos Szeredi70781872014-12-12 09:49:05 +0100482 args.in.h.opcode = FUSE_CREATE;
483 args.in.h.nodeid = get_node_id(dir);
484 args.in.numargs = 2;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100485 args.in.args[0].size = sizeof(inarg);
Miklos Szeredi70781872014-12-12 09:49:05 +0100486 args.in.args[0].value = &inarg;
487 args.in.args[1].size = entry->d_name.len + 1;
488 args.in.args[1].value = entry->d_name.name;
489 args.out.numargs = 2;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100490 args.out.args[0].size = sizeof(outentry);
Miklos Szeredi70781872014-12-12 09:49:05 +0100491 args.out.args[0].value = &outentry;
492 args.out.args[1].size = sizeof(outopen);
493 args.out.args[1].value = &outopen;
494 err = fuse_simple_request(fc, &args);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200495 if (err)
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800496 goto out_free_ff;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800497
498 err = -EIO;
Miklos Szeredi2827d0b22005-11-28 13:44:16 -0800499 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800500 goto out_free_ff;
501
Miklos Szeredic7b71432009-04-28 16:56:37 +0200502 ff->fh = outopen.fh;
503 ff->nodeid = outentry.nodeid;
504 ff->open_flags = outopen.open_flags;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800505 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700506 &outentry.attr, entry_attr_timeout(&outentry), 0);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800507 if (!inode) {
508 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
Miklos Szeredi8b0797a2009-04-28 16:56:39 +0200509 fuse_sync_release(ff, flags);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100510 fuse_queue_forget(fc, forget, outentry.nodeid, 1);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200511 err = -ENOMEM;
512 goto out_err;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800513 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100514 kfree(forget);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800515 d_instantiate(entry, inode);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700516 fuse_change_entry_timeout(entry, &outentry);
Miklos Szeredi0952b2a2008-02-06 01:38:38 -0800517 fuse_invalidate_attr(dir);
Al Viro30d90492012-06-22 12:40:19 +0400518 err = finish_open(file, entry, generic_file_open, opened);
519 if (err) {
Miklos Szeredi8b0797a2009-04-28 16:56:39 +0200520 fuse_sync_release(ff, flags);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200521 } else {
522 file->private_data = fuse_file_get(ff);
523 fuse_finish_open(inode, file);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800524 }
Al Virod9585272012-06-22 12:39:14 +0400525 return err;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800526
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200527out_free_ff:
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800528 fuse_file_free(ff);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200529out_put_forget_req:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100530 kfree(forget);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200531out_err:
Al Virod9585272012-06-22 12:39:14 +0400532 return err;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200533}
534
535static int fuse_mknod(struct inode *, struct dentry *, umode_t, dev_t);
Al Virod9585272012-06-22 12:39:14 +0400536static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
Al Viro30d90492012-06-22 12:40:19 +0400537 struct file *file, unsigned flags,
Al Virod9585272012-06-22 12:39:14 +0400538 umode_t mode, int *opened)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200539{
540 int err;
541 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200542 struct dentry *res = NULL;
543
Al Viro00699ad2016-07-05 09:44:53 -0400544 if (d_in_lookup(entry)) {
Al Viro00cd8dd2012-06-10 17:13:09 -0400545 res = fuse_lookup(dir, entry, 0);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200546 if (IS_ERR(res))
Al Virod9585272012-06-22 12:39:14 +0400547 return PTR_ERR(res);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200548
549 if (res)
550 entry = res;
551 }
552
David Howells2b0143b2015-03-17 22:25:59 +0000553 if (!(flags & O_CREAT) || d_really_is_positive(entry))
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200554 goto no_open;
555
556 /* Only creates */
Al Viro47237682012-06-10 05:01:45 -0400557 *opened |= FILE_CREATED;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200558
559 if (fc->no_create)
560 goto mknod;
561
Al Viro30d90492012-06-22 12:40:19 +0400562 err = fuse_create_open(dir, entry, file, flags, mode, opened);
Al Virod9585272012-06-22 12:39:14 +0400563 if (err == -ENOSYS) {
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200564 fc->no_create = 1;
565 goto mknod;
566 }
567out_dput:
568 dput(res);
Al Virod9585272012-06-22 12:39:14 +0400569 return err;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200570
571mknod:
572 err = fuse_mknod(dir, entry, mode, 0);
Al Virod9585272012-06-22 12:39:14 +0400573 if (err)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200574 goto out_dput;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200575no_open:
Al Viroe45198a2012-06-10 06:48:09 -0400576 return finish_no_open(file, res);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800577}
578
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800579/*
580 * Code shared between mknod, mkdir, symlink and link
581 */
Miklos Szeredi70781872014-12-12 09:49:05 +0100582static int create_new_entry(struct fuse_conn *fc, struct fuse_args *args,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700583 struct inode *dir, struct dentry *entry,
Al Viro541af6a2011-07-26 03:17:33 -0400584 umode_t mode)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700585{
586 struct fuse_entry_out outarg;
587 struct inode *inode;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700588 int err;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100589 struct fuse_forget_link *forget;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800590
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100591 forget = fuse_alloc_forget();
Miklos Szeredi70781872014-12-12 09:49:05 +0100592 if (!forget)
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100593 return -ENOMEM;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700594
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700595 memset(&outarg, 0, sizeof(outarg));
Miklos Szeredi70781872014-12-12 09:49:05 +0100596 args->in.h.nodeid = get_node_id(dir);
597 args->out.numargs = 1;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100598 args->out.args[0].size = sizeof(outarg);
Miklos Szeredi70781872014-12-12 09:49:05 +0100599 args->out.args[0].value = &outarg;
600 err = fuse_simple_request(fc, args);
Miklos Szeredi2d510132006-11-25 11:09:20 -0800601 if (err)
602 goto out_put_forget_req;
603
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800604 err = -EIO;
605 if (invalid_nodeid(outarg.nodeid))
Miklos Szeredi2d510132006-11-25 11:09:20 -0800606 goto out_put_forget_req;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800607
608 if ((outarg.attr.mode ^ mode) & S_IFMT)
Miklos Szeredi2d510132006-11-25 11:09:20 -0800609 goto out_put_forget_req;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800610
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700611 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700612 &outarg.attr, entry_attr_timeout(&outarg), 0);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700613 if (!inode) {
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100614 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700615 return -ENOMEM;
616 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100617 kfree(forget);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700618
Miklos Szeredib70a80e2013-10-01 16:44:54 +0200619 err = d_instantiate_no_diralias(entry, inode);
620 if (err)
621 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700622
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700623 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700624 fuse_invalidate_attr(dir);
625 return 0;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800626
Miklos Szeredi2d510132006-11-25 11:09:20 -0800627 out_put_forget_req:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100628 kfree(forget);
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800629 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700630}
631
Al Viro1a67aaf2011-07-26 01:52:52 -0400632static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700633 dev_t rdev)
634{
635 struct fuse_mknod_in inarg;
636 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100637 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700638
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200639 if (!fc->dont_mask)
640 mode &= ~current_umask();
641
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700642 memset(&inarg, 0, sizeof(inarg));
643 inarg.mode = mode;
644 inarg.rdev = new_encode_dev(rdev);
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200645 inarg.umask = current_umask();
Miklos Szeredi70781872014-12-12 09:49:05 +0100646 args.in.h.opcode = FUSE_MKNOD;
647 args.in.numargs = 2;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100648 args.in.args[0].size = sizeof(inarg);
Miklos Szeredi70781872014-12-12 09:49:05 +0100649 args.in.args[0].value = &inarg;
650 args.in.args[1].size = entry->d_name.len + 1;
651 args.in.args[1].value = entry->d_name.name;
652 return create_new_entry(fc, &args, dir, entry, mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700653}
654
Al Viro4acdaf22011-07-26 01:42:34 -0400655static int fuse_create(struct inode *dir, struct dentry *entry, umode_t mode,
Al Viroebfc3b42012-06-10 18:05:36 -0400656 bool excl)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700657{
658 return fuse_mknod(dir, entry, mode, 0);
659}
660
Al Viro18bb1db2011-07-26 01:41:39 -0400661static int fuse_mkdir(struct inode *dir, struct dentry *entry, umode_t mode)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700662{
663 struct fuse_mkdir_in inarg;
664 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100665 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700666
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200667 if (!fc->dont_mask)
668 mode &= ~current_umask();
669
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700670 memset(&inarg, 0, sizeof(inarg));
671 inarg.mode = mode;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200672 inarg.umask = current_umask();
Miklos Szeredi70781872014-12-12 09:49:05 +0100673 args.in.h.opcode = FUSE_MKDIR;
674 args.in.numargs = 2;
675 args.in.args[0].size = sizeof(inarg);
676 args.in.args[0].value = &inarg;
677 args.in.args[1].size = entry->d_name.len + 1;
678 args.in.args[1].value = entry->d_name.name;
679 return create_new_entry(fc, &args, dir, entry, S_IFDIR);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700680}
681
682static int fuse_symlink(struct inode *dir, struct dentry *entry,
683 const char *link)
684{
685 struct fuse_conn *fc = get_fuse_conn(dir);
686 unsigned len = strlen(link) + 1;
Miklos Szeredi70781872014-12-12 09:49:05 +0100687 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700688
Miklos Szeredi70781872014-12-12 09:49:05 +0100689 args.in.h.opcode = FUSE_SYMLINK;
690 args.in.numargs = 2;
691 args.in.args[0].size = entry->d_name.len + 1;
692 args.in.args[0].value = entry->d_name.name;
693 args.in.args[1].size = len;
694 args.in.args[1].value = link;
695 return create_new_entry(fc, &args, dir, entry, S_IFLNK);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700696}
697
Seth Forshee703c7362016-08-29 08:46:36 -0500698void fuse_update_ctime(struct inode *inode)
Maxim Patlasov31f32672014-04-28 14:19:24 +0200699{
700 if (!IS_NOCMTIME(inode)) {
Deepa Dinamanic2050a42016-09-14 07:48:06 -0700701 inode->i_ctime = current_time(inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200702 mark_inode_dirty_sync(inode);
703 }
704}
705
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700706static int fuse_unlink(struct inode *dir, struct dentry *entry)
707{
708 int err;
709 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100710 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700711
Miklos Szeredi70781872014-12-12 09:49:05 +0100712 args.in.h.opcode = FUSE_UNLINK;
713 args.in.h.nodeid = get_node_id(dir);
714 args.in.numargs = 1;
715 args.in.args[0].size = entry->d_name.len + 1;
716 args.in.args[0].value = entry->d_name.name;
717 err = fuse_simple_request(fc, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700718 if (!err) {
David Howells2b0143b2015-03-17 22:25:59 +0000719 struct inode *inode = d_inode(entry);
Miklos Szerediac45d612012-03-05 15:48:11 +0100720 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700721
Miklos Szerediac45d612012-03-05 15:48:11 +0100722 spin_lock(&fc->lock);
723 fi->attr_version = ++fc->attr_version;
Miklos Szeredidfca7ce2013-02-04 15:57:42 +0100724 /*
725 * If i_nlink == 0 then unlink doesn't make sense, yet this can
726 * happen if userspace filesystem is careless. It would be
727 * difficult to enforce correct nlink usage so just ignore this
728 * condition here
729 */
730 if (inode->i_nlink > 0)
731 drop_nlink(inode);
Miklos Szerediac45d612012-03-05 15:48:11 +0100732 spin_unlock(&fc->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700733 fuse_invalidate_attr(inode);
734 fuse_invalidate_attr(dir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800735 fuse_invalidate_entry_cache(entry);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200736 fuse_update_ctime(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700737 } else if (err == -EINTR)
738 fuse_invalidate_entry(entry);
739 return err;
740}
741
742static int fuse_rmdir(struct inode *dir, struct dentry *entry)
743{
744 int err;
745 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100746 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700747
Miklos Szeredi70781872014-12-12 09:49:05 +0100748 args.in.h.opcode = FUSE_RMDIR;
749 args.in.h.nodeid = get_node_id(dir);
750 args.in.numargs = 1;
751 args.in.args[0].size = entry->d_name.len + 1;
752 args.in.args[0].value = entry->d_name.name;
753 err = fuse_simple_request(fc, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700754 if (!err) {
David Howells2b0143b2015-03-17 22:25:59 +0000755 clear_nlink(d_inode(entry));
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700756 fuse_invalidate_attr(dir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800757 fuse_invalidate_entry_cache(entry);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700758 } else if (err == -EINTR)
759 fuse_invalidate_entry(entry);
760 return err;
761}
762
Miklos Szeredi1560c972014-04-28 16:43:44 +0200763static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
764 struct inode *newdir, struct dentry *newent,
765 unsigned int flags, int opcode, size_t argsize)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700766{
767 int err;
Miklos Szeredi1560c972014-04-28 16:43:44 +0200768 struct fuse_rename2_in inarg;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700769 struct fuse_conn *fc = get_fuse_conn(olddir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100770 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700771
Miklos Szeredi1560c972014-04-28 16:43:44 +0200772 memset(&inarg, 0, argsize);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700773 inarg.newdir = get_node_id(newdir);
Miklos Szeredi1560c972014-04-28 16:43:44 +0200774 inarg.flags = flags;
Miklos Szeredi70781872014-12-12 09:49:05 +0100775 args.in.h.opcode = opcode;
776 args.in.h.nodeid = get_node_id(olddir);
777 args.in.numargs = 3;
778 args.in.args[0].size = argsize;
779 args.in.args[0].value = &inarg;
780 args.in.args[1].size = oldent->d_name.len + 1;
781 args.in.args[1].value = oldent->d_name.name;
782 args.in.args[2].size = newent->d_name.len + 1;
783 args.in.args[2].value = newent->d_name.name;
784 err = fuse_simple_request(fc, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700785 if (!err) {
Miklos Szeredi08b63302007-11-28 16:22:03 -0800786 /* ctime changes */
David Howells2b0143b2015-03-17 22:25:59 +0000787 fuse_invalidate_attr(d_inode(oldent));
788 fuse_update_ctime(d_inode(oldent));
Miklos Szeredi08b63302007-11-28 16:22:03 -0800789
Miklos Szeredi1560c972014-04-28 16:43:44 +0200790 if (flags & RENAME_EXCHANGE) {
David Howells2b0143b2015-03-17 22:25:59 +0000791 fuse_invalidate_attr(d_inode(newent));
792 fuse_update_ctime(d_inode(newent));
Miklos Szeredi1560c972014-04-28 16:43:44 +0200793 }
794
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700795 fuse_invalidate_attr(olddir);
796 if (olddir != newdir)
797 fuse_invalidate_attr(newdir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800798
799 /* newent will end up negative */
David Howells2b0143b2015-03-17 22:25:59 +0000800 if (!(flags & RENAME_EXCHANGE) && d_really_is_positive(newent)) {
801 fuse_invalidate_attr(d_inode(newent));
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800802 fuse_invalidate_entry_cache(newent);
David Howells2b0143b2015-03-17 22:25:59 +0000803 fuse_update_ctime(d_inode(newent));
Miklos Szeredi5219f342009-11-04 10:24:52 +0100804 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700805 } else if (err == -EINTR) {
806 /* If request was interrupted, DEITY only knows if the
807 rename actually took place. If the invalidation
808 fails (e.g. some process has CWD under the renamed
809 directory), then there can be inconsistency between
810 the dcache and the real filesystem. Tough luck. */
811 fuse_invalidate_entry(oldent);
David Howells2b0143b2015-03-17 22:25:59 +0000812 if (d_really_is_positive(newent))
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700813 fuse_invalidate_entry(newent);
814 }
815
816 return err;
817}
818
Miklos Szeredi1560c972014-04-28 16:43:44 +0200819static int fuse_rename2(struct inode *olddir, struct dentry *oldent,
820 struct inode *newdir, struct dentry *newent,
821 unsigned int flags)
822{
823 struct fuse_conn *fc = get_fuse_conn(olddir);
824 int err;
825
826 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
827 return -EINVAL;
828
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200829 if (flags) {
830 if (fc->no_rename2 || fc->minor < 23)
831 return -EINVAL;
Miklos Szeredi1560c972014-04-28 16:43:44 +0200832
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200833 err = fuse_rename_common(olddir, oldent, newdir, newent, flags,
834 FUSE_RENAME2,
835 sizeof(struct fuse_rename2_in));
836 if (err == -ENOSYS) {
837 fc->no_rename2 = 1;
838 err = -EINVAL;
839 }
840 } else {
841 err = fuse_rename_common(olddir, oldent, newdir, newent, 0,
842 FUSE_RENAME,
843 sizeof(struct fuse_rename_in));
Miklos Szeredi1560c972014-04-28 16:43:44 +0200844 }
Miklos Szeredi1560c972014-04-28 16:43:44 +0200845
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200846 return err;
847}
848
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700849static int fuse_link(struct dentry *entry, struct inode *newdir,
850 struct dentry *newent)
851{
852 int err;
853 struct fuse_link_in inarg;
David Howells2b0143b2015-03-17 22:25:59 +0000854 struct inode *inode = d_inode(entry);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700855 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +0100856 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700857
858 memset(&inarg, 0, sizeof(inarg));
859 inarg.oldnodeid = get_node_id(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +0100860 args.in.h.opcode = FUSE_LINK;
861 args.in.numargs = 2;
862 args.in.args[0].size = sizeof(inarg);
863 args.in.args[0].value = &inarg;
864 args.in.args[1].size = newent->d_name.len + 1;
865 args.in.args[1].value = newent->d_name.name;
866 err = create_new_entry(fc, &args, newdir, newent, inode->i_mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700867 /* Contrary to "normal" filesystems it can happen that link
868 makes two "logical" inodes point to the same "physical"
869 inode. We invalidate the attributes of the old one, so it
870 will reflect changes in the backing inode (link count,
871 etc.)
872 */
Miklos Szerediac45d612012-03-05 15:48:11 +0100873 if (!err) {
874 struct fuse_inode *fi = get_fuse_inode(inode);
875
876 spin_lock(&fc->lock);
877 fi->attr_version = ++fc->attr_version;
878 inc_nlink(inode);
879 spin_unlock(&fc->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700880 fuse_invalidate_attr(inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200881 fuse_update_ctime(inode);
Miklos Szerediac45d612012-03-05 15:48:11 +0100882 } else if (err == -EINTR) {
883 fuse_invalidate_attr(inode);
884 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700885 return err;
886}
887
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700888static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
889 struct kstat *stat)
890{
Miklos Szeredi203627b2012-05-10 19:49:38 +0400891 unsigned int blkbits;
Pavel Emelyanov83732002013-10-10 17:10:46 +0400892 struct fuse_conn *fc = get_fuse_conn(inode);
893
894 /* see the comment in fuse_change_attributes() */
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400895 if (fc->writeback_cache && S_ISREG(inode->i_mode)) {
Pavel Emelyanov83732002013-10-10 17:10:46 +0400896 attr->size = i_size_read(inode);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400897 attr->mtime = inode->i_mtime.tv_sec;
898 attr->mtimensec = inode->i_mtime.tv_nsec;
Maxim Patlasov31f32672014-04-28 14:19:24 +0200899 attr->ctime = inode->i_ctime.tv_sec;
900 attr->ctimensec = inode->i_ctime.tv_nsec;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400901 }
Miklos Szeredi203627b2012-05-10 19:49:38 +0400902
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700903 stat->dev = inode->i_sb->s_dev;
904 stat->ino = attr->ino;
905 stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
906 stat->nlink = attr->nlink;
Eric W. Biederman499dcf22012-02-07 16:26:03 -0800907 stat->uid = make_kuid(&init_user_ns, attr->uid);
908 stat->gid = make_kgid(&init_user_ns, attr->gid);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700909 stat->rdev = inode->i_rdev;
910 stat->atime.tv_sec = attr->atime;
911 stat->atime.tv_nsec = attr->atimensec;
912 stat->mtime.tv_sec = attr->mtime;
913 stat->mtime.tv_nsec = attr->mtimensec;
914 stat->ctime.tv_sec = attr->ctime;
915 stat->ctime.tv_nsec = attr->ctimensec;
916 stat->size = attr->size;
917 stat->blocks = attr->blocks;
Miklos Szeredi203627b2012-05-10 19:49:38 +0400918
919 if (attr->blksize != 0)
920 blkbits = ilog2(attr->blksize);
921 else
922 blkbits = inode->i_sb->s_blocksize_bits;
923
924 stat->blksize = 1 << blkbits;
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700925}
926
Miklos Szeredic79e3222007-10-18 03:06:59 -0700927static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
928 struct file *file)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700929{
930 int err;
Miklos Szeredic79e3222007-10-18 03:06:59 -0700931 struct fuse_getattr_in inarg;
932 struct fuse_attr_out outarg;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700933 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +0100934 FUSE_ARGS(args);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700935 u64 attr_version;
936
Miklos Szeredi7dca9fd2007-11-28 16:21:59 -0800937 attr_version = fuse_get_attr_version(fc);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700938
Miklos Szeredic79e3222007-10-18 03:06:59 -0700939 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700940 memset(&outarg, 0, sizeof(outarg));
Miklos Szeredic79e3222007-10-18 03:06:59 -0700941 /* Directories have separate file-handle space */
942 if (file && S_ISREG(inode->i_mode)) {
943 struct fuse_file *ff = file->private_data;
944
945 inarg.getattr_flags |= FUSE_GETATTR_FH;
946 inarg.fh = ff->fh;
947 }
Miklos Szeredi70781872014-12-12 09:49:05 +0100948 args.in.h.opcode = FUSE_GETATTR;
949 args.in.h.nodeid = get_node_id(inode);
950 args.in.numargs = 1;
951 args.in.args[0].size = sizeof(inarg);
952 args.in.args[0].value = &inarg;
953 args.out.numargs = 1;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100954 args.out.args[0].size = sizeof(outarg);
Miklos Szeredi70781872014-12-12 09:49:05 +0100955 args.out.args[0].value = &outarg;
956 err = fuse_simple_request(fc, &args);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700957 if (!err) {
Miklos Szeredic79e3222007-10-18 03:06:59 -0700958 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700959 make_bad_inode(inode);
960 err = -EIO;
961 } else {
Miklos Szeredic79e3222007-10-18 03:06:59 -0700962 fuse_change_attributes(inode, &outarg.attr,
963 attr_timeout(&outarg),
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700964 attr_version);
965 if (stat)
Miklos Szeredic79e3222007-10-18 03:06:59 -0700966 fuse_fillattr(inode, &outarg.attr, stat);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700967 }
968 }
969 return err;
970}
971
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800972int fuse_update_attributes(struct inode *inode, struct kstat *stat,
973 struct file *file, bool *refreshed)
974{
975 struct fuse_inode *fi = get_fuse_inode(inode);
976 int err;
977 bool r;
978
Miklos Szeredi126b9d42014-07-07 15:28:50 +0200979 if (time_before64(fi->i_time, get_jiffies_64())) {
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800980 r = true;
Seth Forshee60bcc882016-08-29 08:46:37 -0500981 forget_all_cached_acls(inode);
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800982 err = fuse_do_getattr(inode, stat, file);
983 } else {
984 r = false;
985 err = 0;
986 if (stat) {
987 generic_fillattr(inode, stat);
988 stat->mode = fi->orig_i_mode;
Pavel Shilovsky45c72cd2012-05-10 19:49:38 +0400989 stat->ino = fi->orig_ino;
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800990 }
991 }
992
993 if (refreshed != NULL)
994 *refreshed = r;
995
996 return err;
997}
998
John Muir3b463ae2009-05-31 11:13:57 -0400999int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
John Muir451d0f52011-12-06 21:50:06 +01001000 u64 child_nodeid, struct qstr *name)
John Muir3b463ae2009-05-31 11:13:57 -04001001{
1002 int err = -ENOTDIR;
1003 struct inode *parent;
1004 struct dentry *dir;
1005 struct dentry *entry;
1006
1007 parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
1008 if (!parent)
1009 return -ENOENT;
1010
Al Viro59551022016-01-22 15:40:57 -05001011 inode_lock(parent);
John Muir3b463ae2009-05-31 11:13:57 -04001012 if (!S_ISDIR(parent->i_mode))
1013 goto unlock;
1014
1015 err = -ENOENT;
1016 dir = d_find_alias(parent);
1017 if (!dir)
1018 goto unlock;
1019
Linus Torvalds8387ff22016-06-10 07:51:30 -07001020 name->hash = full_name_hash(dir, name->name, name->len);
John Muir3b463ae2009-05-31 11:13:57 -04001021 entry = d_lookup(dir, name);
1022 dput(dir);
1023 if (!entry)
1024 goto unlock;
1025
1026 fuse_invalidate_attr(parent);
1027 fuse_invalidate_entry(entry);
John Muir451d0f52011-12-06 21:50:06 +01001028
David Howells2b0143b2015-03-17 22:25:59 +00001029 if (child_nodeid != 0 && d_really_is_positive(entry)) {
Al Viro59551022016-01-22 15:40:57 -05001030 inode_lock(d_inode(entry));
David Howells2b0143b2015-03-17 22:25:59 +00001031 if (get_node_id(d_inode(entry)) != child_nodeid) {
John Muir451d0f52011-12-06 21:50:06 +01001032 err = -ENOENT;
1033 goto badentry;
1034 }
1035 if (d_mountpoint(entry)) {
1036 err = -EBUSY;
1037 goto badentry;
1038 }
David Howellse36cb0b2015-01-29 12:02:35 +00001039 if (d_is_dir(entry)) {
John Muir451d0f52011-12-06 21:50:06 +01001040 shrink_dcache_parent(entry);
1041 if (!simple_empty(entry)) {
1042 err = -ENOTEMPTY;
1043 goto badentry;
1044 }
David Howells2b0143b2015-03-17 22:25:59 +00001045 d_inode(entry)->i_flags |= S_DEAD;
John Muir451d0f52011-12-06 21:50:06 +01001046 }
1047 dont_mount(entry);
David Howells2b0143b2015-03-17 22:25:59 +00001048 clear_nlink(d_inode(entry));
John Muir451d0f52011-12-06 21:50:06 +01001049 err = 0;
1050 badentry:
Al Viro59551022016-01-22 15:40:57 -05001051 inode_unlock(d_inode(entry));
John Muir451d0f52011-12-06 21:50:06 +01001052 if (!err)
1053 d_delete(entry);
1054 } else {
1055 err = 0;
1056 }
John Muir3b463ae2009-05-31 11:13:57 -04001057 dput(entry);
John Muir3b463ae2009-05-31 11:13:57 -04001058
1059 unlock:
Al Viro59551022016-01-22 15:40:57 -05001060 inode_unlock(parent);
John Muir3b463ae2009-05-31 11:13:57 -04001061 iput(parent);
1062 return err;
1063}
1064
Miklos Szeredi87729a52005-09-09 13:10:34 -07001065/*
1066 * Calling into a user-controlled filesystem gives the filesystem
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001067 * daemon ptrace-like capabilities over the current process. This
Miklos Szeredi87729a52005-09-09 13:10:34 -07001068 * means, that the filesystem daemon is able to record the exact
1069 * filesystem operations performed, and can also control the behavior
1070 * of the requester process in otherwise impossible ways. For example
1071 * it can delay the operation for arbitrary length of time allowing
1072 * DoS against the requester.
1073 *
1074 * For this reason only those processes can call into the filesystem,
1075 * for which the owner of the mount has ptrace privilege. This
1076 * excludes processes started by other users, suid or sgid processes.
1077 */
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001078int fuse_allow_current_process(struct fuse_conn *fc)
Miklos Szeredi87729a52005-09-09 13:10:34 -07001079{
David Howellsc69e8d92008-11-14 10:39:19 +11001080 const struct cred *cred;
David Howellsc69e8d92008-11-14 10:39:19 +11001081
Miklos Szeredi29433a22016-10-01 07:32:32 +02001082 if (fc->allow_other)
Miklos Szeredi87729a52005-09-09 13:10:34 -07001083 return 1;
1084
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001085 cred = current_cred();
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001086 if (uid_eq(cred->euid, fc->user_id) &&
1087 uid_eq(cred->suid, fc->user_id) &&
1088 uid_eq(cred->uid, fc->user_id) &&
1089 gid_eq(cred->egid, fc->group_id) &&
1090 gid_eq(cred->sgid, fc->group_id) &&
1091 gid_eq(cred->gid, fc->group_id))
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001092 return 1;
Miklos Szeredi87729a52005-09-09 13:10:34 -07001093
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001094 return 0;
Miklos Szeredi87729a52005-09-09 13:10:34 -07001095}
1096
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001097static int fuse_access(struct inode *inode, int mask)
1098{
1099 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001100 FUSE_ARGS(args);
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001101 struct fuse_access_in inarg;
1102 int err;
1103
Miklos Szeredi698fa1d2013-10-01 16:41:23 +02001104 BUG_ON(mask & MAY_NOT_BLOCK);
1105
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001106 if (fc->no_access)
1107 return 0;
1108
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001109 memset(&inarg, 0, sizeof(inarg));
Al Viroe6305c42008-07-15 21:03:57 -04001110 inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
Miklos Szeredi70781872014-12-12 09:49:05 +01001111 args.in.h.opcode = FUSE_ACCESS;
1112 args.in.h.nodeid = get_node_id(inode);
1113 args.in.numargs = 1;
1114 args.in.args[0].size = sizeof(inarg);
1115 args.in.args[0].value = &inarg;
1116 err = fuse_simple_request(fc, &args);
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001117 if (err == -ENOSYS) {
1118 fc->no_access = 1;
1119 err = 0;
1120 }
1121 return err;
1122}
1123
Al Viro10556cb2011-06-20 19:28:19 -04001124static int fuse_perm_getattr(struct inode *inode, int mask)
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001125{
Al Viro10556cb2011-06-20 19:28:19 -04001126 if (mask & MAY_NOT_BLOCK)
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001127 return -ECHILD;
1128
Seth Forshee60bcc882016-08-29 08:46:37 -05001129 forget_all_cached_acls(inode);
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001130 return fuse_do_getattr(inode, NULL, NULL);
1131}
1132
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001133/*
1134 * Check permission. The two basic access models of FUSE are:
1135 *
1136 * 1) Local access checking ('default_permissions' mount option) based
1137 * on file mode. This is the plain old disk filesystem permission
1138 * modell.
1139 *
1140 * 2) "Remote" access checking, where server is responsible for
1141 * checking permission in each inode operation. An exception to this
1142 * is if ->permission() was invoked from sys_access() in which case an
1143 * access request is sent. Execute permission is still checked
1144 * locally based on file mode.
1145 */
Al Viro10556cb2011-06-20 19:28:19 -04001146static int fuse_permission(struct inode *inode, int mask)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001147{
1148 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001149 bool refreshed = false;
1150 int err = 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001151
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001152 if (!fuse_allow_current_process(fc))
Miklos Szeredie5e55582005-09-09 13:10:28 -07001153 return -EACCES;
Miklos Szeredi244f6382007-10-16 23:31:02 -07001154
1155 /*
Miklos Szeredie8e96152007-10-16 23:31:06 -07001156 * If attributes are needed, refresh them before proceeding
Miklos Szeredi244f6382007-10-16 23:31:02 -07001157 */
Miklos Szeredi29433a22016-10-01 07:32:32 +02001158 if (fc->default_permissions ||
Miklos Szeredie8e96152007-10-16 23:31:06 -07001159 ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001160 struct fuse_inode *fi = get_fuse_inode(inode);
1161
Miklos Szeredi126b9d42014-07-07 15:28:50 +02001162 if (time_before64(fi->i_time, get_jiffies_64())) {
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001163 refreshed = true;
1164
Al Viro10556cb2011-06-20 19:28:19 -04001165 err = fuse_perm_getattr(inode, mask);
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001166 if (err)
1167 return err;
1168 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001169 }
1170
Miklos Szeredi29433a22016-10-01 07:32:32 +02001171 if (fc->default_permissions) {
Al Viro2830ba72011-06-20 19:16:29 -04001172 err = generic_permission(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001173
1174 /* If permission is denied, try to refresh file
1175 attributes. This is also needed, because the root
1176 node will at first have no permissions */
Miklos Szeredi244f6382007-10-16 23:31:02 -07001177 if (err == -EACCES && !refreshed) {
Al Viro10556cb2011-06-20 19:28:19 -04001178 err = fuse_perm_getattr(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001179 if (!err)
Al Viro2830ba72011-06-20 19:16:29 -04001180 err = generic_permission(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001181 }
1182
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001183 /* Note: the opposite of the above test does not
1184 exist. So if permissions are revoked this won't be
1185 noticed immediately, only after the attribute
1186 timeout has expired */
Eric Paris9cfcac82010-07-23 11:43:51 -04001187 } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
Miklos Szeredie8e96152007-10-16 23:31:06 -07001188 err = fuse_access(inode, mask);
1189 } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1190 if (!(inode->i_mode & S_IXUGO)) {
1191 if (refreshed)
1192 return -EACCES;
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001193
Al Viro10556cb2011-06-20 19:28:19 -04001194 err = fuse_perm_getattr(inode, mask);
Miklos Szeredie8e96152007-10-16 23:31:06 -07001195 if (!err && !(inode->i_mode & S_IXUGO))
1196 return -EACCES;
1197 }
Miklos Szeredie5e55582005-09-09 13:10:28 -07001198 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001199 return err;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001200}
1201
1202static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
Al Viro8d3af7f2013-05-18 03:03:58 -04001203 struct dir_context *ctx)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001204{
1205 while (nbytes >= FUSE_NAME_OFFSET) {
1206 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
1207 size_t reclen = FUSE_DIRENT_SIZE(dirent);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001208 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1209 return -EIO;
1210 if (reclen > nbytes)
1211 break;
Miklos Szerediefeb9e62013-09-03 14:28:38 +02001212 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
1213 return -EIO;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001214
Al Viro8d3af7f2013-05-18 03:03:58 -04001215 if (!dir_emit(ctx, dirent->name, dirent->namelen,
1216 dirent->ino, dirent->type))
Miklos Szeredie5e55582005-09-09 13:10:28 -07001217 break;
1218
1219 buf += reclen;
1220 nbytes -= reclen;
Al Viro8d3af7f2013-05-18 03:03:58 -04001221 ctx->pos = dirent->off;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001222 }
1223
1224 return 0;
1225}
1226
Anand V. Avati0b05b182012-08-19 08:53:23 -04001227static int fuse_direntplus_link(struct file *file,
1228 struct fuse_direntplus *direntplus,
1229 u64 attr_version)
1230{
Anand V. Avati0b05b182012-08-19 08:53:23 -04001231 struct fuse_entry_out *o = &direntplus->entry_out;
1232 struct fuse_dirent *dirent = &direntplus->dirent;
1233 struct dentry *parent = file->f_path.dentry;
1234 struct qstr name = QSTR_INIT(dirent->name, dirent->namelen);
1235 struct dentry *dentry;
1236 struct dentry *alias;
David Howells2b0143b2015-03-17 22:25:59 +00001237 struct inode *dir = d_inode(parent);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001238 struct fuse_conn *fc;
1239 struct inode *inode;
Al Virod9b3dbd2016-04-20 17:30:32 -04001240 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001241
1242 if (!o->nodeid) {
1243 /*
1244 * Unlike in the case of fuse_lookup, zero nodeid does not mean
1245 * ENOENT. Instead, it only means the userspace filesystem did
1246 * not want to return attributes/handle for this entry.
1247 *
1248 * So do nothing.
1249 */
1250 return 0;
1251 }
1252
1253 if (name.name[0] == '.') {
1254 /*
1255 * We could potentially refresh the attributes of the directory
1256 * and its parent?
1257 */
1258 if (name.len == 1)
1259 return 0;
1260 if (name.name[1] == '.' && name.len == 2)
1261 return 0;
1262 }
Miklos Szeredia28ef452013-07-17 14:53:53 +02001263
1264 if (invalid_nodeid(o->nodeid))
1265 return -EIO;
1266 if (!fuse_valid_type(o->attr.mode))
1267 return -EIO;
1268
Anand V. Avati0b05b182012-08-19 08:53:23 -04001269 fc = get_fuse_conn(dir);
1270
Linus Torvalds8387ff22016-06-10 07:51:30 -07001271 name.hash = full_name_hash(parent, name.name, name.len);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001272 dentry = d_lookup(parent, &name);
Al Virod9b3dbd2016-04-20 17:30:32 -04001273 if (!dentry) {
1274retry:
1275 dentry = d_alloc_parallel(parent, &name, &wq);
1276 if (IS_ERR(dentry))
1277 return PTR_ERR(dentry);
1278 }
1279 if (!d_in_lookup(dentry)) {
1280 struct fuse_inode *fi;
David Howells2b0143b2015-03-17 22:25:59 +00001281 inode = d_inode(dentry);
Al Virod9b3dbd2016-04-20 17:30:32 -04001282 if (!inode ||
1283 get_node_id(inode) != o->nodeid ||
1284 ((o->attr.mode ^ inode->i_mode) & S_IFMT)) {
Eric W. Biederman5542aa22014-02-13 09:46:25 -08001285 d_invalidate(dentry);
Al Virod9b3dbd2016-04-20 17:30:32 -04001286 dput(dentry);
1287 goto retry;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001288 }
Al Virod9b3dbd2016-04-20 17:30:32 -04001289 if (is_bad_inode(inode)) {
1290 dput(dentry);
1291 return -EIO;
1292 }
1293
1294 fi = get_fuse_inode(inode);
1295 spin_lock(&fc->lock);
1296 fi->nlookup++;
1297 spin_unlock(&fc->lock);
1298
Seth Forshee60bcc882016-08-29 08:46:37 -05001299 forget_all_cached_acls(inode);
Al Virod9b3dbd2016-04-20 17:30:32 -04001300 fuse_change_attributes(inode, &o->attr,
1301 entry_attr_timeout(o),
1302 attr_version);
1303 /*
1304 * The other branch comes via fuse_iget()
1305 * which bumps nlookup inside
1306 */
1307 } else {
1308 inode = fuse_iget(dir->i_sb, o->nodeid, o->generation,
1309 &o->attr, entry_attr_timeout(o),
1310 attr_version);
1311 if (!inode)
1312 inode = ERR_PTR(-ENOMEM);
1313
1314 alias = d_splice_alias(inode, dentry);
1315 d_lookup_done(dentry);
1316 if (alias) {
1317 dput(dentry);
1318 dentry = alias;
1319 }
1320 if (IS_ERR(dentry))
1321 return PTR_ERR(dentry);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001322 }
Miklos Szeredi6314efe2013-10-01 16:41:22 +02001323 if (fc->readdirplus_auto)
1324 set_bit(FUSE_I_INIT_RDPLUS, &get_fuse_inode(inode)->state);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001325 fuse_change_entry_timeout(dentry, o);
1326
Miklos Szeredic7263bc2013-07-17 14:53:54 +02001327 dput(dentry);
Al Virod9b3dbd2016-04-20 17:30:32 -04001328 return 0;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001329}
1330
1331static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file,
Al Viro8d3af7f2013-05-18 03:03:58 -04001332 struct dir_context *ctx, u64 attr_version)
Anand V. Avati0b05b182012-08-19 08:53:23 -04001333{
1334 struct fuse_direntplus *direntplus;
1335 struct fuse_dirent *dirent;
1336 size_t reclen;
1337 int over = 0;
1338 int ret;
1339
1340 while (nbytes >= FUSE_NAME_OFFSET_DIRENTPLUS) {
1341 direntplus = (struct fuse_direntplus *) buf;
1342 dirent = &direntplus->dirent;
1343 reclen = FUSE_DIRENTPLUS_SIZE(direntplus);
1344
1345 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1346 return -EIO;
1347 if (reclen > nbytes)
1348 break;
Miklos Szerediefeb9e62013-09-03 14:28:38 +02001349 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
1350 return -EIO;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001351
1352 if (!over) {
1353 /* We fill entries into dstbuf only as much as
1354 it can hold. But we still continue iterating
1355 over remaining entries to link them. If not,
1356 we need to send a FORGET for each of those
1357 which we did not link.
1358 */
Al Viro8d3af7f2013-05-18 03:03:58 -04001359 over = !dir_emit(ctx, dirent->name, dirent->namelen,
1360 dirent->ino, dirent->type);
Miklos Szeredi87838852017-10-25 16:34:27 +02001361 if (!over)
1362 ctx->pos = dirent->off;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001363 }
1364
1365 buf += reclen;
1366 nbytes -= reclen;
1367
1368 ret = fuse_direntplus_link(file, direntplus, attr_version);
1369 if (ret)
1370 fuse_force_forget(file, direntplus->entry_out.nodeid);
1371 }
1372
1373 return 0;
1374}
1375
Al Viro8d3af7f2013-05-18 03:03:58 -04001376static int fuse_readdir(struct file *file, struct dir_context *ctx)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001377{
Feng Shuo4582a4a2013-01-15 11:23:28 +08001378 int plus, err;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001379 size_t nbytes;
1380 struct page *page;
Al Viro496ad9a2013-01-23 17:07:38 -05001381 struct inode *inode = file_inode(file);
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001382 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi248d86e2006-01-06 00:19:39 -08001383 struct fuse_req *req;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001384 u64 attr_version = 0;
Miklos Szeredi248d86e2006-01-06 00:19:39 -08001385
1386 if (is_bad_inode(inode))
1387 return -EIO;
1388
Maxim Patlasovb111c8c2012-10-26 19:48:30 +04001389 req = fuse_get_req(fc, 1);
Miklos Szeredice1d5a42006-04-10 22:54:58 -07001390 if (IS_ERR(req))
1391 return PTR_ERR(req);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001392
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001393 page = alloc_page(GFP_KERNEL);
1394 if (!page) {
1395 fuse_put_request(fc, req);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001396 return -ENOMEM;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001397 }
Feng Shuo4582a4a2013-01-15 11:23:28 +08001398
Al Viro8d3af7f2013-05-18 03:03:58 -04001399 plus = fuse_use_readdirplus(inode, ctx);
Miklos Szeredif4975c62009-04-02 14:25:34 +02001400 req->out.argpages = 1;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001401 req->num_pages = 1;
1402 req->pages[0] = page;
Maxim Patlasov85f40ae2012-10-26 19:49:33 +04001403 req->page_descs[0].length = PAGE_SIZE;
Feng Shuo4582a4a2013-01-15 11:23:28 +08001404 if (plus) {
Anand V. Avati0b05b182012-08-19 08:53:23 -04001405 attr_version = fuse_get_attr_version(fc);
Al Viro8d3af7f2013-05-18 03:03:58 -04001406 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
Anand V. Avati0b05b182012-08-19 08:53:23 -04001407 FUSE_READDIRPLUS);
1408 } else {
Al Viro8d3af7f2013-05-18 03:03:58 -04001409 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
Anand V. Avati0b05b182012-08-19 08:53:23 -04001410 FUSE_READDIR);
1411 }
Miklos Szeredi5c672ab2016-06-30 13:10:49 +02001412 fuse_lock_inode(inode);
Tejun Heob93f8582008-11-26 12:03:55 +01001413 fuse_request_send(fc, req);
Miklos Szeredi5c672ab2016-06-30 13:10:49 +02001414 fuse_unlock_inode(inode);
Miklos Szeredi361b1eb52006-01-16 22:14:45 -08001415 nbytes = req->out.args[0].size;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001416 err = req->out.h.error;
1417 fuse_put_request(fc, req);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001418 if (!err) {
Feng Shuo4582a4a2013-01-15 11:23:28 +08001419 if (plus) {
Anand V. Avati0b05b182012-08-19 08:53:23 -04001420 err = parse_dirplusfile(page_address(page), nbytes,
Al Viro8d3af7f2013-05-18 03:03:58 -04001421 file, ctx,
Anand V. Avati0b05b182012-08-19 08:53:23 -04001422 attr_version);
1423 } else {
1424 err = parse_dirfile(page_address(page), nbytes, file,
Al Viro8d3af7f2013-05-18 03:03:58 -04001425 ctx);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001426 }
1427 }
Miklos Szeredie5e55582005-09-09 13:10:28 -07001428
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001429 __free_page(page);
Andrew Gallagher451418f2013-11-05 03:55:43 -08001430 fuse_invalidate_atime(inode);
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001431 return err;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001432}
1433
Al Viro6b255392015-11-17 10:20:54 -05001434static const char *fuse_get_link(struct dentry *dentry,
Al Virofceef392015-12-29 15:58:39 -05001435 struct inode *inode,
1436 struct delayed_call *done)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001437{
Miklos Szeredie5e55582005-09-09 13:10:28 -07001438 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001439 FUSE_ARGS(args);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001440 char *link;
Miklos Szeredi70781872014-12-12 09:49:05 +01001441 ssize_t ret;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001442
Al Viro6b255392015-11-17 10:20:54 -05001443 if (!dentry)
1444 return ERR_PTR(-ECHILD);
1445
Al Virocd3417c2015-12-29 16:03:53 -05001446 link = kmalloc(PAGE_SIZE, GFP_KERNEL);
Miklos Szeredi70781872014-12-12 09:49:05 +01001447 if (!link)
1448 return ERR_PTR(-ENOMEM);
1449
1450 args.in.h.opcode = FUSE_READLINK;
1451 args.in.h.nodeid = get_node_id(inode);
1452 args.out.argvar = 1;
1453 args.out.numargs = 1;
1454 args.out.args[0].size = PAGE_SIZE - 1;
1455 args.out.args[0].value = link;
1456 ret = fuse_simple_request(fc, &args);
1457 if (ret < 0) {
Al Virocd3417c2015-12-29 16:03:53 -05001458 kfree(link);
Miklos Szeredi70781872014-12-12 09:49:05 +01001459 link = ERR_PTR(ret);
1460 } else {
1461 link[ret] = '\0';
Al Virofceef392015-12-29 15:58:39 -05001462 set_delayed_call(done, kfree_link, link);
Miklos Szeredi70781872014-12-12 09:49:05 +01001463 }
Andrew Gallagher451418f2013-11-05 03:55:43 -08001464 fuse_invalidate_atime(inode);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001465 return link;
1466}
1467
Miklos Szeredie5e55582005-09-09 13:10:28 -07001468static int fuse_dir_open(struct inode *inode, struct file *file)
1469{
Miklos Szeredi91fe96b2009-04-28 16:56:37 +02001470 return fuse_open_common(inode, file, true);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001471}
1472
1473static int fuse_dir_release(struct inode *inode, struct file *file)
1474{
Miklos Szeredi8b0797a2009-04-28 16:56:39 +02001475 fuse_release_common(file, FUSE_RELEASEDIR);
1476
1477 return 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001478}
1479
Josef Bacik02c24a82011-07-16 20:44:56 -04001480static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1481 int datasync)
Miklos Szeredi82547982005-09-09 13:10:38 -07001482{
Josef Bacik02c24a82011-07-16 20:44:56 -04001483 return fuse_fsync_common(file, start, end, datasync, 1);
Miklos Szeredi82547982005-09-09 13:10:38 -07001484}
1485
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001486static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1487 unsigned long arg)
1488{
1489 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1490
1491 /* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1492 if (fc->minor < 18)
1493 return -ENOTTY;
1494
1495 return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1496}
1497
1498static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1499 unsigned long arg)
1500{
1501 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1502
1503 if (fc->minor < 18)
1504 return -ENOTTY;
1505
1506 return fuse_ioctl_common(file, cmd, arg,
1507 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1508}
1509
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001510static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001511{
1512 /* Always update if mtime is explicitly set */
1513 if (ivalid & ATTR_MTIME_SET)
1514 return true;
1515
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001516 /* Or if kernel i_mtime is the official one */
1517 if (trust_local_mtime)
1518 return true;
1519
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001520 /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1521 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1522 return false;
1523
1524 /* In all other cases update */
1525 return true;
1526}
1527
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001528static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg,
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001529 bool trust_local_cmtime)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001530{
1531 unsigned ivalid = iattr->ia_valid;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001532
1533 if (ivalid & ATTR_MODE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001534 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001535 if (ivalid & ATTR_UID)
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001536 arg->valid |= FATTR_UID, arg->uid = from_kuid(&init_user_ns, iattr->ia_uid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001537 if (ivalid & ATTR_GID)
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001538 arg->valid |= FATTR_GID, arg->gid = from_kgid(&init_user_ns, iattr->ia_gid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001539 if (ivalid & ATTR_SIZE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001540 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001541 if (ivalid & ATTR_ATIME) {
1542 arg->valid |= FATTR_ATIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001543 arg->atime = iattr->ia_atime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001544 arg->atimensec = iattr->ia_atime.tv_nsec;
1545 if (!(ivalid & ATTR_ATIME_SET))
1546 arg->valid |= FATTR_ATIME_NOW;
1547 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001548 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001549 arg->valid |= FATTR_MTIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001550 arg->mtime = iattr->ia_mtime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001551 arg->mtimensec = iattr->ia_mtime.tv_nsec;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001552 if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001553 arg->valid |= FATTR_MTIME_NOW;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001554 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001555 if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
1556 arg->valid |= FATTR_CTIME;
1557 arg->ctime = iattr->ia_ctime.tv_sec;
1558 arg->ctimensec = iattr->ia_ctime.tv_nsec;
1559 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001560}
1561
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001562/*
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001563 * Prevent concurrent writepages on inode
1564 *
1565 * This is done by adding a negative bias to the inode write counter
1566 * and waiting for all pending writes to finish.
1567 */
1568void fuse_set_nowrite(struct inode *inode)
1569{
1570 struct fuse_conn *fc = get_fuse_conn(inode);
1571 struct fuse_inode *fi = get_fuse_inode(inode);
1572
Al Viro59551022016-01-22 15:40:57 -05001573 BUG_ON(!inode_is_locked(inode));
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001574
1575 spin_lock(&fc->lock);
1576 BUG_ON(fi->writectr < 0);
1577 fi->writectr += FUSE_NOWRITE;
1578 spin_unlock(&fc->lock);
1579 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1580}
1581
1582/*
1583 * Allow writepages on inode
1584 *
1585 * Remove the bias from the writecounter and send any queued
1586 * writepages.
1587 */
1588static void __fuse_release_nowrite(struct inode *inode)
1589{
1590 struct fuse_inode *fi = get_fuse_inode(inode);
1591
1592 BUG_ON(fi->writectr != FUSE_NOWRITE);
1593 fi->writectr = 0;
1594 fuse_flush_writepages(inode);
1595}
1596
1597void fuse_release_nowrite(struct inode *inode)
1598{
1599 struct fuse_conn *fc = get_fuse_conn(inode);
1600
1601 spin_lock(&fc->lock);
1602 __fuse_release_nowrite(inode);
1603 spin_unlock(&fc->lock);
1604}
1605
Miklos Szeredi70781872014-12-12 09:49:05 +01001606static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001607 struct inode *inode,
1608 struct fuse_setattr_in *inarg_p,
1609 struct fuse_attr_out *outarg_p)
1610{
Miklos Szeredi70781872014-12-12 09:49:05 +01001611 args->in.h.opcode = FUSE_SETATTR;
1612 args->in.h.nodeid = get_node_id(inode);
1613 args->in.numargs = 1;
1614 args->in.args[0].size = sizeof(*inarg_p);
1615 args->in.args[0].value = inarg_p;
1616 args->out.numargs = 1;
Miklos Szeredi21f62172015-01-06 10:45:35 +01001617 args->out.args[0].size = sizeof(*outarg_p);
Miklos Szeredi70781872014-12-12 09:49:05 +01001618 args->out.args[0].value = outarg_p;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001619}
1620
1621/*
1622 * Flush inode->i_mtime to the server
1623 */
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001624int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001625{
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001626 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001627 FUSE_ARGS(args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001628 struct fuse_setattr_in inarg;
1629 struct fuse_attr_out outarg;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001630
1631 memset(&inarg, 0, sizeof(inarg));
1632 memset(&outarg, 0, sizeof(outarg));
1633
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001634 inarg.valid = FATTR_MTIME;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001635 inarg.mtime = inode->i_mtime.tv_sec;
1636 inarg.mtimensec = inode->i_mtime.tv_nsec;
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001637 if (fc->minor >= 23) {
1638 inarg.valid |= FATTR_CTIME;
1639 inarg.ctime = inode->i_ctime.tv_sec;
1640 inarg.ctimensec = inode->i_ctime.tv_nsec;
1641 }
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001642 if (ff) {
1643 inarg.valid |= FATTR_FH;
1644 inarg.fh = ff->fh;
1645 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001646 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001647
Miklos Szeredi70781872014-12-12 09:49:05 +01001648 return fuse_simple_request(fc, &args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001649}
1650
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001651/*
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001652 * Set attributes, and at the same time refresh them.
1653 *
1654 * Truncation is slightly complicated, because the 'truncate' request
1655 * may fail, in which case we don't want to touch the mapping.
Miklos Szeredi9ffbb912006-10-17 00:10:06 -07001656 * vmtruncate() doesn't allow for this case, so do the rlimit checking
1657 * and the actual truncation by hand.
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001658 */
Jan Kara62490332016-05-26 17:12:41 +02001659int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001660 struct file *file)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001661{
Jan Kara62490332016-05-26 17:12:41 +02001662 struct inode *inode = d_inode(dentry);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001663 struct fuse_conn *fc = get_fuse_conn(inode);
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001664 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001665 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001666 struct fuse_setattr_in inarg;
1667 struct fuse_attr_out outarg;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001668 bool is_truncate = false;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001669 bool is_wb = fc->writeback_cache;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001670 loff_t oldsize;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001671 int err;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001672 bool trust_local_cmtime = is_wb && S_ISREG(inode->i_mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001673
Miklos Szeredi29433a22016-10-01 07:32:32 +02001674 if (!fc->default_permissions)
Christoph Hellwigdb78b872010-06-04 11:30:03 +02001675 attr->ia_valid |= ATTR_FORCE;
1676
Jan Kara31051c82016-05-26 16:55:18 +02001677 err = setattr_prepare(dentry, attr);
Christoph Hellwigdb78b872010-06-04 11:30:03 +02001678 if (err)
1679 return err;
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001680
Miklos Szeredi8d56add2011-02-25 14:44:58 +01001681 if (attr->ia_valid & ATTR_OPEN) {
1682 if (fc->atomic_o_trunc)
1683 return 0;
1684 file = NULL;
1685 }
Miklos Szeredi6ff958e2007-10-18 03:07:02 -07001686
Christoph Hellwig2c27c652010-06-04 11:30:04 +02001687 if (attr->ia_valid & ATTR_SIZE)
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001688 is_truncate = true;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001689
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001690 if (is_truncate) {
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001691 fuse_set_nowrite(inode);
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001692 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001693 if (trust_local_cmtime && attr->ia_size != inode->i_size)
1694 attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001695 }
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001696
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001697 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -07001698 memset(&outarg, 0, sizeof(outarg));
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001699 iattr_to_fattr(attr, &inarg, trust_local_cmtime);
Miklos Szeredi49d49142007-10-18 03:07:00 -07001700 if (file) {
1701 struct fuse_file *ff = file->private_data;
1702 inarg.valid |= FATTR_FH;
1703 inarg.fh = ff->fh;
1704 }
Miklos Szeredif3332112007-10-18 03:07:04 -07001705 if (attr->ia_valid & ATTR_SIZE) {
1706 /* For mandatory locking in truncate */
1707 inarg.valid |= FATTR_LOCKOWNER;
1708 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1709 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001710 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
1711 err = fuse_simple_request(fc, &args);
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001712 if (err) {
1713 if (err == -EINTR)
1714 fuse_invalidate_attr(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001715 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001716 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001717
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001718 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1719 make_bad_inode(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001720 err = -EIO;
1721 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001722 }
1723
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001724 spin_lock(&fc->lock);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001725 /* the kernel maintains i_mtime locally */
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001726 if (trust_local_cmtime) {
1727 if (attr->ia_valid & ATTR_MTIME)
1728 inode->i_mtime = attr->ia_mtime;
1729 if (attr->ia_valid & ATTR_CTIME)
1730 inode->i_ctime = attr->ia_ctime;
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001731 /* FIXME: clear I_DIRTY_SYNC? */
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001732 }
1733
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001734 fuse_change_attributes_common(inode, &outarg.attr,
1735 attr_timeout(&outarg));
1736 oldsize = inode->i_size;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001737 /* see the comment in fuse_change_attributes() */
1738 if (!is_wb || is_truncate || !S_ISREG(inode->i_mode))
1739 i_size_write(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001740
1741 if (is_truncate) {
1742 /* NOTE: this may release/reacquire fc->lock */
1743 __fuse_release_nowrite(inode);
1744 }
1745 spin_unlock(&fc->lock);
1746
1747 /*
1748 * Only call invalidate_inode_pages2() after removing
1749 * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1750 */
Pavel Emelyanov83732002013-10-10 17:10:46 +04001751 if ((is_truncate || !is_wb) &&
1752 S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
Kirill A. Shutemov7caef262013-09-12 15:13:56 -07001753 truncate_pagecache(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001754 invalidate_inode_pages2(inode->i_mapping);
1755 }
1756
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001757 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001758 return 0;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001759
1760error:
1761 if (is_truncate)
1762 fuse_release_nowrite(inode);
1763
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001764 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001765 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001766}
1767
Miklos Szeredi49d49142007-10-18 03:07:00 -07001768static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1769{
David Howells2b0143b2015-03-17 22:25:59 +00001770 struct inode *inode = d_inode(entry);
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001771 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001772 struct file *file = (attr->ia_valid & ATTR_FILE) ? attr->ia_file : NULL;
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001773 int ret;
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001774
1775 if (!fuse_allow_current_process(get_fuse_conn(inode)))
1776 return -EACCES;
1777
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001778 if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001779 attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
1780 ATTR_MODE);
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001781
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001782 /*
1783 * The only sane way to reliably kill suid/sgid is to do it in
1784 * the userspace filesystem
1785 *
1786 * This should be done on write(), truncate() and chown().
1787 */
1788 if (!fc->handle_killpriv) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001789 /*
1790 * ia_mode calculation may have used stale i_mode.
1791 * Refresh and recalculate.
1792 */
1793 ret = fuse_do_getattr(inode, NULL, file);
1794 if (ret)
1795 return ret;
1796
1797 attr->ia_mode = inode->i_mode;
Miklos Szeredic01638f2016-12-06 16:18:45 +01001798 if (inode->i_mode & S_ISUID) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001799 attr->ia_valid |= ATTR_MODE;
1800 attr->ia_mode &= ~S_ISUID;
1801 }
Miklos Szeredic01638f2016-12-06 16:18:45 +01001802 if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001803 attr->ia_valid |= ATTR_MODE;
1804 attr->ia_mode &= ~S_ISGID;
1805 }
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001806 }
1807 }
1808 if (!attr->ia_valid)
1809 return 0;
1810
Linus Torvaldsabb5a142016-10-10 13:04:49 -07001811 ret = fuse_do_setattr(entry, attr, file);
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001812 if (!ret) {
Seth Forshee60bcc882016-08-29 08:46:37 -05001813 /*
1814 * If filesystem supports acls it may have updated acl xattrs in
1815 * the filesystem, so forget cached acls for the inode.
1816 */
1817 if (fc->posix_acl)
1818 forget_all_cached_acls(inode);
1819
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001820 /* Directory mode changed, may need to revalidate access */
1821 if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE))
1822 fuse_invalidate_entry_cache(entry);
1823 }
1824 return ret;
Miklos Szeredi49d49142007-10-18 03:07:00 -07001825}
1826
Miklos Szeredie5e55582005-09-09 13:10:28 -07001827static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
1828 struct kstat *stat)
1829{
David Howells2b0143b2015-03-17 22:25:59 +00001830 struct inode *inode = d_inode(entry);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001831 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001832
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001833 if (!fuse_allow_current_process(fc))
Miklos Szeredi244f6382007-10-16 23:31:02 -07001834 return -EACCES;
1835
Miklos Szeredibcb4be82007-11-28 16:21:59 -08001836 return fuse_update_attributes(inode, stat, NULL, NULL);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001837}
1838
Arjan van de Ven754661f2007-02-12 00:55:38 -08001839static const struct inode_operations fuse_dir_inode_operations = {
Miklos Szeredie5e55582005-09-09 13:10:28 -07001840 .lookup = fuse_lookup,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001841 .mkdir = fuse_mkdir,
1842 .symlink = fuse_symlink,
1843 .unlink = fuse_unlink,
1844 .rmdir = fuse_rmdir,
Miklos Szeredi2773bf02016-09-27 11:03:58 +02001845 .rename = fuse_rename2,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001846 .link = fuse_link,
1847 .setattr = fuse_setattr,
1848 .create = fuse_create,
Miklos Szeredic8ccbe02012-06-05 15:10:22 +02001849 .atomic_open = fuse_atomic_open,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001850 .mknod = fuse_mknod,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001851 .permission = fuse_permission,
1852 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001853 .listxattr = fuse_listxattr,
Seth Forshee60bcc882016-08-29 08:46:37 -05001854 .get_acl = fuse_get_acl,
1855 .set_acl = fuse_set_acl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001856};
1857
Arjan van de Ven4b6f5d22006-03-28 01:56:42 -08001858static const struct file_operations fuse_dir_operations = {
Miklos Szeredib6aeade2005-09-09 13:10:30 -07001859 .llseek = generic_file_llseek,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001860 .read = generic_read_dir,
Al Virod9b3dbd2016-04-20 17:30:32 -04001861 .iterate_shared = fuse_readdir,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001862 .open = fuse_dir_open,
1863 .release = fuse_dir_release,
Miklos Szeredi82547982005-09-09 13:10:38 -07001864 .fsync = fuse_dir_fsync,
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001865 .unlocked_ioctl = fuse_dir_ioctl,
1866 .compat_ioctl = fuse_dir_compat_ioctl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001867};
1868
Arjan van de Ven754661f2007-02-12 00:55:38 -08001869static const struct inode_operations fuse_common_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001870 .setattr = fuse_setattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001871 .permission = fuse_permission,
1872 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001873 .listxattr = fuse_listxattr,
Seth Forshee60bcc882016-08-29 08:46:37 -05001874 .get_acl = fuse_get_acl,
1875 .set_acl = fuse_set_acl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001876};
1877
Arjan van de Ven754661f2007-02-12 00:55:38 -08001878static const struct inode_operations fuse_symlink_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001879 .setattr = fuse_setattr,
Al Viro6b255392015-11-17 10:20:54 -05001880 .get_link = fuse_get_link,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001881 .readlink = generic_readlink,
1882 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001883 .listxattr = fuse_listxattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001884};
1885
1886void fuse_init_common(struct inode *inode)
1887{
1888 inode->i_op = &fuse_common_inode_operations;
1889}
1890
1891void fuse_init_dir(struct inode *inode)
1892{
1893 inode->i_op = &fuse_dir_inode_operations;
1894 inode->i_fop = &fuse_dir_operations;
1895}
1896
1897void fuse_init_symlink(struct inode *inode)
1898{
1899 inode->i_op = &fuse_symlink_inode_operations;
1900}