blob: fc8ba62d5c31f8a857988e6c0b799bdae40883b3 [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);
1361 ctx->pos = dirent->off;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001362 }
1363
1364 buf += reclen;
1365 nbytes -= reclen;
1366
1367 ret = fuse_direntplus_link(file, direntplus, attr_version);
1368 if (ret)
1369 fuse_force_forget(file, direntplus->entry_out.nodeid);
1370 }
1371
1372 return 0;
1373}
1374
Al Viro8d3af7f2013-05-18 03:03:58 -04001375static int fuse_readdir(struct file *file, struct dir_context *ctx)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001376{
Feng Shuo4582a4a2013-01-15 11:23:28 +08001377 int plus, err;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001378 size_t nbytes;
1379 struct page *page;
Al Viro496ad9a2013-01-23 17:07:38 -05001380 struct inode *inode = file_inode(file);
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001381 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi248d86e2006-01-06 00:19:39 -08001382 struct fuse_req *req;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001383 u64 attr_version = 0;
Miklos Szeredi248d86e2006-01-06 00:19:39 -08001384
1385 if (is_bad_inode(inode))
1386 return -EIO;
1387
Maxim Patlasovb111c8c2012-10-26 19:48:30 +04001388 req = fuse_get_req(fc, 1);
Miklos Szeredice1d5a42006-04-10 22:54:58 -07001389 if (IS_ERR(req))
1390 return PTR_ERR(req);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001391
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001392 page = alloc_page(GFP_KERNEL);
1393 if (!page) {
1394 fuse_put_request(fc, req);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001395 return -ENOMEM;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001396 }
Feng Shuo4582a4a2013-01-15 11:23:28 +08001397
Al Viro8d3af7f2013-05-18 03:03:58 -04001398 plus = fuse_use_readdirplus(inode, ctx);
Miklos Szeredif4975c62009-04-02 14:25:34 +02001399 req->out.argpages = 1;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001400 req->num_pages = 1;
1401 req->pages[0] = page;
Maxim Patlasov85f40ae2012-10-26 19:49:33 +04001402 req->page_descs[0].length = PAGE_SIZE;
Feng Shuo4582a4a2013-01-15 11:23:28 +08001403 if (plus) {
Anand V. Avati0b05b182012-08-19 08:53:23 -04001404 attr_version = fuse_get_attr_version(fc);
Al Viro8d3af7f2013-05-18 03:03:58 -04001405 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
Anand V. Avati0b05b182012-08-19 08:53:23 -04001406 FUSE_READDIRPLUS);
1407 } else {
Al Viro8d3af7f2013-05-18 03:03:58 -04001408 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
Anand V. Avati0b05b182012-08-19 08:53:23 -04001409 FUSE_READDIR);
1410 }
Miklos Szeredi5c672ab2016-06-30 13:10:49 +02001411 fuse_lock_inode(inode);
Tejun Heob93f8582008-11-26 12:03:55 +01001412 fuse_request_send(fc, req);
Miklos Szeredi5c672ab2016-06-30 13:10:49 +02001413 fuse_unlock_inode(inode);
Miklos Szeredi361b1eb52006-01-16 22:14:45 -08001414 nbytes = req->out.args[0].size;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001415 err = req->out.h.error;
1416 fuse_put_request(fc, req);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001417 if (!err) {
Feng Shuo4582a4a2013-01-15 11:23:28 +08001418 if (plus) {
Anand V. Avati0b05b182012-08-19 08:53:23 -04001419 err = parse_dirplusfile(page_address(page), nbytes,
Al Viro8d3af7f2013-05-18 03:03:58 -04001420 file, ctx,
Anand V. Avati0b05b182012-08-19 08:53:23 -04001421 attr_version);
1422 } else {
1423 err = parse_dirfile(page_address(page), nbytes, file,
Al Viro8d3af7f2013-05-18 03:03:58 -04001424 ctx);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001425 }
1426 }
Miklos Szeredie5e55582005-09-09 13:10:28 -07001427
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001428 __free_page(page);
Andrew Gallagher451418f2013-11-05 03:55:43 -08001429 fuse_invalidate_atime(inode);
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001430 return err;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001431}
1432
Al Viro6b255392015-11-17 10:20:54 -05001433static const char *fuse_get_link(struct dentry *dentry,
Al Virofceef392015-12-29 15:58:39 -05001434 struct inode *inode,
1435 struct delayed_call *done)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001436{
Miklos Szeredie5e55582005-09-09 13:10:28 -07001437 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001438 FUSE_ARGS(args);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001439 char *link;
Miklos Szeredi70781872014-12-12 09:49:05 +01001440 ssize_t ret;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001441
Al Viro6b255392015-11-17 10:20:54 -05001442 if (!dentry)
1443 return ERR_PTR(-ECHILD);
1444
Al Virocd3417c2015-12-29 16:03:53 -05001445 link = kmalloc(PAGE_SIZE, GFP_KERNEL);
Miklos Szeredi70781872014-12-12 09:49:05 +01001446 if (!link)
1447 return ERR_PTR(-ENOMEM);
1448
1449 args.in.h.opcode = FUSE_READLINK;
1450 args.in.h.nodeid = get_node_id(inode);
1451 args.out.argvar = 1;
1452 args.out.numargs = 1;
1453 args.out.args[0].size = PAGE_SIZE - 1;
1454 args.out.args[0].value = link;
1455 ret = fuse_simple_request(fc, &args);
1456 if (ret < 0) {
Al Virocd3417c2015-12-29 16:03:53 -05001457 kfree(link);
Miklos Szeredi70781872014-12-12 09:49:05 +01001458 link = ERR_PTR(ret);
1459 } else {
1460 link[ret] = '\0';
Al Virofceef392015-12-29 15:58:39 -05001461 set_delayed_call(done, kfree_link, link);
Miklos Szeredi70781872014-12-12 09:49:05 +01001462 }
Andrew Gallagher451418f2013-11-05 03:55:43 -08001463 fuse_invalidate_atime(inode);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001464 return link;
1465}
1466
Miklos Szeredie5e55582005-09-09 13:10:28 -07001467static int fuse_dir_open(struct inode *inode, struct file *file)
1468{
Miklos Szeredi91fe96b2009-04-28 16:56:37 +02001469 return fuse_open_common(inode, file, true);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001470}
1471
1472static int fuse_dir_release(struct inode *inode, struct file *file)
1473{
Miklos Szeredi8b0797a2009-04-28 16:56:39 +02001474 fuse_release_common(file, FUSE_RELEASEDIR);
1475
1476 return 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001477}
1478
Josef Bacik02c24a82011-07-16 20:44:56 -04001479static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1480 int datasync)
Miklos Szeredi82547982005-09-09 13:10:38 -07001481{
Josef Bacik02c24a82011-07-16 20:44:56 -04001482 return fuse_fsync_common(file, start, end, datasync, 1);
Miklos Szeredi82547982005-09-09 13:10:38 -07001483}
1484
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001485static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1486 unsigned long arg)
1487{
1488 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1489
1490 /* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1491 if (fc->minor < 18)
1492 return -ENOTTY;
1493
1494 return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1495}
1496
1497static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1498 unsigned long arg)
1499{
1500 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1501
1502 if (fc->minor < 18)
1503 return -ENOTTY;
1504
1505 return fuse_ioctl_common(file, cmd, arg,
1506 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1507}
1508
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001509static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001510{
1511 /* Always update if mtime is explicitly set */
1512 if (ivalid & ATTR_MTIME_SET)
1513 return true;
1514
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001515 /* Or if kernel i_mtime is the official one */
1516 if (trust_local_mtime)
1517 return true;
1518
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001519 /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1520 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1521 return false;
1522
1523 /* In all other cases update */
1524 return true;
1525}
1526
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001527static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg,
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001528 bool trust_local_cmtime)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001529{
1530 unsigned ivalid = iattr->ia_valid;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001531
1532 if (ivalid & ATTR_MODE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001533 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001534 if (ivalid & ATTR_UID)
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001535 arg->valid |= FATTR_UID, arg->uid = from_kuid(&init_user_ns, iattr->ia_uid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001536 if (ivalid & ATTR_GID)
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001537 arg->valid |= FATTR_GID, arg->gid = from_kgid(&init_user_ns, iattr->ia_gid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001538 if (ivalid & ATTR_SIZE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001539 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001540 if (ivalid & ATTR_ATIME) {
1541 arg->valid |= FATTR_ATIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001542 arg->atime = iattr->ia_atime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001543 arg->atimensec = iattr->ia_atime.tv_nsec;
1544 if (!(ivalid & ATTR_ATIME_SET))
1545 arg->valid |= FATTR_ATIME_NOW;
1546 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001547 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001548 arg->valid |= FATTR_MTIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001549 arg->mtime = iattr->ia_mtime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001550 arg->mtimensec = iattr->ia_mtime.tv_nsec;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001551 if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001552 arg->valid |= FATTR_MTIME_NOW;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001553 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001554 if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
1555 arg->valid |= FATTR_CTIME;
1556 arg->ctime = iattr->ia_ctime.tv_sec;
1557 arg->ctimensec = iattr->ia_ctime.tv_nsec;
1558 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001559}
1560
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001561/*
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001562 * Prevent concurrent writepages on inode
1563 *
1564 * This is done by adding a negative bias to the inode write counter
1565 * and waiting for all pending writes to finish.
1566 */
1567void fuse_set_nowrite(struct inode *inode)
1568{
1569 struct fuse_conn *fc = get_fuse_conn(inode);
1570 struct fuse_inode *fi = get_fuse_inode(inode);
1571
Al Viro59551022016-01-22 15:40:57 -05001572 BUG_ON(!inode_is_locked(inode));
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001573
1574 spin_lock(&fc->lock);
1575 BUG_ON(fi->writectr < 0);
1576 fi->writectr += FUSE_NOWRITE;
1577 spin_unlock(&fc->lock);
1578 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1579}
1580
1581/*
1582 * Allow writepages on inode
1583 *
1584 * Remove the bias from the writecounter and send any queued
1585 * writepages.
1586 */
1587static void __fuse_release_nowrite(struct inode *inode)
1588{
1589 struct fuse_inode *fi = get_fuse_inode(inode);
1590
1591 BUG_ON(fi->writectr != FUSE_NOWRITE);
1592 fi->writectr = 0;
1593 fuse_flush_writepages(inode);
1594}
1595
1596void fuse_release_nowrite(struct inode *inode)
1597{
1598 struct fuse_conn *fc = get_fuse_conn(inode);
1599
1600 spin_lock(&fc->lock);
1601 __fuse_release_nowrite(inode);
1602 spin_unlock(&fc->lock);
1603}
1604
Miklos Szeredi70781872014-12-12 09:49:05 +01001605static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001606 struct inode *inode,
1607 struct fuse_setattr_in *inarg_p,
1608 struct fuse_attr_out *outarg_p)
1609{
Miklos Szeredi70781872014-12-12 09:49:05 +01001610 args->in.h.opcode = FUSE_SETATTR;
1611 args->in.h.nodeid = get_node_id(inode);
1612 args->in.numargs = 1;
1613 args->in.args[0].size = sizeof(*inarg_p);
1614 args->in.args[0].value = inarg_p;
1615 args->out.numargs = 1;
Miklos Szeredi21f62172015-01-06 10:45:35 +01001616 args->out.args[0].size = sizeof(*outarg_p);
Miklos Szeredi70781872014-12-12 09:49:05 +01001617 args->out.args[0].value = outarg_p;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001618}
1619
1620/*
1621 * Flush inode->i_mtime to the server
1622 */
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001623int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001624{
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001625 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001626 FUSE_ARGS(args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001627 struct fuse_setattr_in inarg;
1628 struct fuse_attr_out outarg;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001629
1630 memset(&inarg, 0, sizeof(inarg));
1631 memset(&outarg, 0, sizeof(outarg));
1632
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001633 inarg.valid = FATTR_MTIME;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001634 inarg.mtime = inode->i_mtime.tv_sec;
1635 inarg.mtimensec = inode->i_mtime.tv_nsec;
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001636 if (fc->minor >= 23) {
1637 inarg.valid |= FATTR_CTIME;
1638 inarg.ctime = inode->i_ctime.tv_sec;
1639 inarg.ctimensec = inode->i_ctime.tv_nsec;
1640 }
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001641 if (ff) {
1642 inarg.valid |= FATTR_FH;
1643 inarg.fh = ff->fh;
1644 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001645 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001646
Miklos Szeredi70781872014-12-12 09:49:05 +01001647 return fuse_simple_request(fc, &args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001648}
1649
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001650/*
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001651 * Set attributes, and at the same time refresh them.
1652 *
1653 * Truncation is slightly complicated, because the 'truncate' request
1654 * may fail, in which case we don't want to touch the mapping.
Miklos Szeredi9ffbb912006-10-17 00:10:06 -07001655 * vmtruncate() doesn't allow for this case, so do the rlimit checking
1656 * and the actual truncation by hand.
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001657 */
Jan Kara62490332016-05-26 17:12:41 +02001658int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001659 struct file *file)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001660{
Jan Kara62490332016-05-26 17:12:41 +02001661 struct inode *inode = d_inode(dentry);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001662 struct fuse_conn *fc = get_fuse_conn(inode);
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001663 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001664 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001665 struct fuse_setattr_in inarg;
1666 struct fuse_attr_out outarg;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001667 bool is_truncate = false;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001668 bool is_wb = fc->writeback_cache;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001669 loff_t oldsize;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001670 int err;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001671 bool trust_local_cmtime = is_wb && S_ISREG(inode->i_mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001672
Miklos Szeredi29433a22016-10-01 07:32:32 +02001673 if (!fc->default_permissions)
Christoph Hellwigdb78b872010-06-04 11:30:03 +02001674 attr->ia_valid |= ATTR_FORCE;
1675
Jan Kara31051c82016-05-26 16:55:18 +02001676 err = setattr_prepare(dentry, attr);
Christoph Hellwigdb78b872010-06-04 11:30:03 +02001677 if (err)
1678 return err;
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001679
Miklos Szeredi8d56add2011-02-25 14:44:58 +01001680 if (attr->ia_valid & ATTR_OPEN) {
1681 if (fc->atomic_o_trunc)
1682 return 0;
1683 file = NULL;
1684 }
Miklos Szeredi6ff958e2007-10-18 03:07:02 -07001685
Christoph Hellwig2c27c652010-06-04 11:30:04 +02001686 if (attr->ia_valid & ATTR_SIZE)
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001687 is_truncate = true;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001688
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001689 if (is_truncate) {
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001690 fuse_set_nowrite(inode);
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001691 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001692 if (trust_local_cmtime && attr->ia_size != inode->i_size)
1693 attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001694 }
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001695
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001696 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -07001697 memset(&outarg, 0, sizeof(outarg));
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001698 iattr_to_fattr(attr, &inarg, trust_local_cmtime);
Miklos Szeredi49d49142007-10-18 03:07:00 -07001699 if (file) {
1700 struct fuse_file *ff = file->private_data;
1701 inarg.valid |= FATTR_FH;
1702 inarg.fh = ff->fh;
1703 }
Miklos Szeredif3332112007-10-18 03:07:04 -07001704 if (attr->ia_valid & ATTR_SIZE) {
1705 /* For mandatory locking in truncate */
1706 inarg.valid |= FATTR_LOCKOWNER;
1707 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1708 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001709 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
1710 err = fuse_simple_request(fc, &args);
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001711 if (err) {
1712 if (err == -EINTR)
1713 fuse_invalidate_attr(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001714 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001715 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001716
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001717 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1718 make_bad_inode(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001719 err = -EIO;
1720 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001721 }
1722
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001723 spin_lock(&fc->lock);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001724 /* the kernel maintains i_mtime locally */
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001725 if (trust_local_cmtime) {
1726 if (attr->ia_valid & ATTR_MTIME)
1727 inode->i_mtime = attr->ia_mtime;
1728 if (attr->ia_valid & ATTR_CTIME)
1729 inode->i_ctime = attr->ia_ctime;
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001730 /* FIXME: clear I_DIRTY_SYNC? */
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001731 }
1732
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001733 fuse_change_attributes_common(inode, &outarg.attr,
1734 attr_timeout(&outarg));
1735 oldsize = inode->i_size;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001736 /* see the comment in fuse_change_attributes() */
1737 if (!is_wb || is_truncate || !S_ISREG(inode->i_mode))
1738 i_size_write(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001739
1740 if (is_truncate) {
1741 /* NOTE: this may release/reacquire fc->lock */
1742 __fuse_release_nowrite(inode);
1743 }
1744 spin_unlock(&fc->lock);
1745
1746 /*
1747 * Only call invalidate_inode_pages2() after removing
1748 * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1749 */
Pavel Emelyanov83732002013-10-10 17:10:46 +04001750 if ((is_truncate || !is_wb) &&
1751 S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
Kirill A. Shutemov7caef262013-09-12 15:13:56 -07001752 truncate_pagecache(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001753 invalidate_inode_pages2(inode->i_mapping);
1754 }
1755
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001756 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001757 return 0;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001758
1759error:
1760 if (is_truncate)
1761 fuse_release_nowrite(inode);
1762
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001763 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001764 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001765}
1766
Miklos Szeredi49d49142007-10-18 03:07:00 -07001767static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1768{
David Howells2b0143b2015-03-17 22:25:59 +00001769 struct inode *inode = d_inode(entry);
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001770 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001771 struct file *file = (attr->ia_valid & ATTR_FILE) ? attr->ia_file : NULL;
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001772 int ret;
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001773
1774 if (!fuse_allow_current_process(get_fuse_conn(inode)))
1775 return -EACCES;
1776
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001777 if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001778 attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
1779 ATTR_MODE);
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001780
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001781 /*
1782 * The only sane way to reliably kill suid/sgid is to do it in
1783 * the userspace filesystem
1784 *
1785 * This should be done on write(), truncate() and chown().
1786 */
1787 if (!fc->handle_killpriv) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001788 /*
1789 * ia_mode calculation may have used stale i_mode.
1790 * Refresh and recalculate.
1791 */
1792 ret = fuse_do_getattr(inode, NULL, file);
1793 if (ret)
1794 return ret;
1795
1796 attr->ia_mode = inode->i_mode;
Miklos Szeredic01638f2016-12-06 16:18:45 +01001797 if (inode->i_mode & S_ISUID) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001798 attr->ia_valid |= ATTR_MODE;
1799 attr->ia_mode &= ~S_ISUID;
1800 }
Miklos Szeredic01638f2016-12-06 16:18:45 +01001801 if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
Miklos Szeredi5e940c12016-10-01 07:32:32 +02001802 attr->ia_valid |= ATTR_MODE;
1803 attr->ia_mode &= ~S_ISGID;
1804 }
Miklos Szeredia09f99e2016-10-01 07:32:32 +02001805 }
1806 }
1807 if (!attr->ia_valid)
1808 return 0;
1809
Linus Torvaldsabb5a142016-10-10 13:04:49 -07001810 ret = fuse_do_setattr(entry, attr, file);
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001811 if (!ret) {
Seth Forshee60bcc882016-08-29 08:46:37 -05001812 /*
1813 * If filesystem supports acls it may have updated acl xattrs in
1814 * the filesystem, so forget cached acls for the inode.
1815 */
1816 if (fc->posix_acl)
1817 forget_all_cached_acls(inode);
1818
Miklos Szeredi5e2b8822016-10-01 07:32:32 +02001819 /* Directory mode changed, may need to revalidate access */
1820 if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE))
1821 fuse_invalidate_entry_cache(entry);
1822 }
1823 return ret;
Miklos Szeredi49d49142007-10-18 03:07:00 -07001824}
1825
Miklos Szeredie5e55582005-09-09 13:10:28 -07001826static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
1827 struct kstat *stat)
1828{
David Howells2b0143b2015-03-17 22:25:59 +00001829 struct inode *inode = d_inode(entry);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001830 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001831
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001832 if (!fuse_allow_current_process(fc))
Miklos Szeredi244f6382007-10-16 23:31:02 -07001833 return -EACCES;
1834
Miklos Szeredibcb4be82007-11-28 16:21:59 -08001835 return fuse_update_attributes(inode, stat, NULL, NULL);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001836}
1837
Arjan van de Ven754661f2007-02-12 00:55:38 -08001838static const struct inode_operations fuse_dir_inode_operations = {
Miklos Szeredie5e55582005-09-09 13:10:28 -07001839 .lookup = fuse_lookup,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001840 .mkdir = fuse_mkdir,
1841 .symlink = fuse_symlink,
1842 .unlink = fuse_unlink,
1843 .rmdir = fuse_rmdir,
Miklos Szeredi2773bf02016-09-27 11:03:58 +02001844 .rename = fuse_rename2,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001845 .link = fuse_link,
1846 .setattr = fuse_setattr,
1847 .create = fuse_create,
Miklos Szeredic8ccbe02012-06-05 15:10:22 +02001848 .atomic_open = fuse_atomic_open,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001849 .mknod = fuse_mknod,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001850 .permission = fuse_permission,
1851 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001852 .listxattr = fuse_listxattr,
Seth Forshee60bcc882016-08-29 08:46:37 -05001853 .get_acl = fuse_get_acl,
1854 .set_acl = fuse_set_acl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001855};
1856
Arjan van de Ven4b6f5d22006-03-28 01:56:42 -08001857static const struct file_operations fuse_dir_operations = {
Miklos Szeredib6aeade2005-09-09 13:10:30 -07001858 .llseek = generic_file_llseek,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001859 .read = generic_read_dir,
Al Virod9b3dbd2016-04-20 17:30:32 -04001860 .iterate_shared = fuse_readdir,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001861 .open = fuse_dir_open,
1862 .release = fuse_dir_release,
Miklos Szeredi82547982005-09-09 13:10:38 -07001863 .fsync = fuse_dir_fsync,
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001864 .unlocked_ioctl = fuse_dir_ioctl,
1865 .compat_ioctl = fuse_dir_compat_ioctl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001866};
1867
Arjan van de Ven754661f2007-02-12 00:55:38 -08001868static const struct inode_operations fuse_common_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001869 .setattr = fuse_setattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001870 .permission = fuse_permission,
1871 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001872 .listxattr = fuse_listxattr,
Seth Forshee60bcc882016-08-29 08:46:37 -05001873 .get_acl = fuse_get_acl,
1874 .set_acl = fuse_set_acl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001875};
1876
Arjan van de Ven754661f2007-02-12 00:55:38 -08001877static const struct inode_operations fuse_symlink_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001878 .setattr = fuse_setattr,
Al Viro6b255392015-11-17 10:20:54 -05001879 .get_link = fuse_get_link,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001880 .readlink = generic_readlink,
1881 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001882 .listxattr = fuse_listxattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001883};
1884
1885void fuse_init_common(struct inode *inode)
1886{
1887 inode->i_op = &fuse_common_inode_operations;
1888}
1889
1890void fuse_init_dir(struct inode *inode)
1891{
1892 inode->i_op = &fuse_dir_inode_operations;
1893 inode->i_fop = &fuse_dir_operations;
1894}
1895
1896void fuse_init_symlink(struct inode *inode)
1897{
1898 inode->i_op = &fuse_symlink_inode_operations;
1899}