blob: f7ae3f58c7fc5a5a7225246e85f069ade2321c7d [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>
Miklos Szeredie5e55582005-09-09 13:10:28 -070016
Al Viro8d3af7f2013-05-18 03:03:58 -040017static bool fuse_use_readdirplus(struct inode *dir, struct dir_context *ctx)
Feng Shuo4582a4a2013-01-15 11:23:28 +080018{
19 struct fuse_conn *fc = get_fuse_conn(dir);
20 struct fuse_inode *fi = get_fuse_inode(dir);
21
22 if (!fc->do_readdirplus)
23 return false;
Eric Wong634734b2013-02-06 22:29:01 +000024 if (!fc->readdirplus_auto)
25 return true;
Feng Shuo4582a4a2013-01-15 11:23:28 +080026 if (test_and_clear_bit(FUSE_I_ADVISE_RDPLUS, &fi->state))
27 return true;
Al Viro8d3af7f2013-05-18 03:03:58 -040028 if (ctx->pos == 0)
Feng Shuo4582a4a2013-01-15 11:23:28 +080029 return true;
30 return false;
31}
32
33static void fuse_advise_use_readdirplus(struct inode *dir)
34{
35 struct fuse_inode *fi = get_fuse_inode(dir);
36
37 set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state);
38}
39
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070040#if BITS_PER_LONG >= 64
41static inline void fuse_dentry_settime(struct dentry *entry, u64 time)
42{
43 entry->d_time = time;
44}
45
46static inline u64 fuse_dentry_time(struct dentry *entry)
47{
48 return entry->d_time;
49}
50#else
51/*
52 * On 32 bit archs store the high 32 bits of time in d_fsdata
53 */
54static void fuse_dentry_settime(struct dentry *entry, u64 time)
55{
56 entry->d_time = time;
57 entry->d_fsdata = (void *) (unsigned long) (time >> 32);
58}
59
60static u64 fuse_dentry_time(struct dentry *entry)
61{
62 return (u64) entry->d_time +
63 ((u64) (unsigned long) entry->d_fsdata << 32);
64}
65#endif
66
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080067/*
68 * FUSE caches dentries and attributes with separate timeout. The
69 * time in jiffies until the dentry/attributes are valid is stored in
70 * dentry->d_time and fuse_inode->i_time respectively.
71 */
72
73/*
74 * Calculate the time in jiffies until a dentry/attributes are valid
75 */
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070076static u64 time_to_jiffies(unsigned long sec, unsigned long nsec)
Miklos Szeredie5e55582005-09-09 13:10:28 -070077{
Miklos Szeredi685d16d2006-07-30 03:04:08 -070078 if (sec || nsec) {
79 struct timespec ts = {sec, nsec};
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070080 return get_jiffies_64() + timespec_to_jiffies(&ts);
Miklos Szeredi685d16d2006-07-30 03:04:08 -070081 } else
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070082 return 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -070083}
84
Miklos Szeredi6f9f1182006-01-06 00:19:39 -080085/*
86 * Set dentry and possibly attribute timeouts from the lookup/mk*
87 * replies
88 */
Miklos Szeredi1fb69e72007-10-18 03:06:58 -070089static void fuse_change_entry_timeout(struct dentry *entry,
90 struct fuse_entry_out *o)
Miklos Szeredi0aa7c692006-01-06 00:19:34 -080091{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -070092 fuse_dentry_settime(entry,
93 time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
Miklos Szeredi1fb69e72007-10-18 03:06:58 -070094}
95
96static u64 attr_timeout(struct fuse_attr_out *o)
97{
98 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
99}
100
101static u64 entry_attr_timeout(struct fuse_entry_out *o)
102{
103 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800104}
105
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800106/*
107 * Mark the attributes as stale, so that at the next call to
108 * ->getattr() they will be fetched from userspace
109 */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800110void fuse_invalidate_attr(struct inode *inode)
111{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -0700112 get_fuse_inode(inode)->i_time = 0;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800113}
114
Andrew Gallagher451418f2013-11-05 03:55:43 -0800115/**
116 * Mark the attributes as stale due to an atime change. Avoid the invalidate if
117 * atime is not used.
118 */
119void fuse_invalidate_atime(struct inode *inode)
120{
121 if (!IS_RDONLY(inode))
122 fuse_invalidate_attr(inode);
123}
124
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800125/*
126 * Just mark the entry as stale, so that a next attempt to look it up
127 * will result in a new lookup call to userspace
128 *
129 * This is called when a dentry is about to become negative and the
130 * timeout is unknown (unlink, rmdir, rename and in some cases
131 * lookup)
132 */
Miklos Szeredidbd561d2008-07-25 01:49:00 -0700133void fuse_invalidate_entry_cache(struct dentry *entry)
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800134{
Miklos Szeredi0a0898c2006-07-30 03:04:10 -0700135 fuse_dentry_settime(entry, 0);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800136}
137
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800138/*
139 * Same as fuse_invalidate_entry_cache(), but also try to remove the
140 * dentry from the hash
141 */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800142static void fuse_invalidate_entry(struct dentry *entry)
143{
144 d_invalidate(entry);
145 fuse_invalidate_entry_cache(entry);
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800146}
147
Miklos Szeredi70781872014-12-12 09:49:05 +0100148static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_args *args,
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700149 u64 nodeid, struct qstr *name,
Miklos Szeredie5e55582005-09-09 13:10:28 -0700150 struct fuse_entry_out *outarg)
151{
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700152 memset(outarg, 0, sizeof(struct fuse_entry_out));
Miklos Szeredi70781872014-12-12 09:49:05 +0100153 args->in.h.opcode = FUSE_LOOKUP;
154 args->in.h.nodeid = nodeid;
155 args->in.numargs = 1;
156 args->in.args[0].size = name->len + 1;
157 args->in.args[0].value = name->name;
158 args->out.numargs = 1;
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700159 if (fc->minor < 9)
Miklos Szeredi70781872014-12-12 09:49:05 +0100160 args->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700161 else
Miklos Szeredi70781872014-12-12 09:49:05 +0100162 args->out.args[0].size = sizeof(struct fuse_entry_out);
163 args->out.args[0].value = outarg;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700164}
165
Miklos Szeredi5c5c5e52008-04-30 00:54:43 -0700166u64 fuse_get_attr_version(struct fuse_conn *fc)
Miklos Szeredi7dca9fd2007-11-28 16:21:59 -0800167{
168 u64 curr_version;
169
170 /*
171 * The spin lock isn't actually needed on 64bit archs, but we
172 * don't yet care too much about such optimizations.
173 */
174 spin_lock(&fc->lock);
175 curr_version = fc->attr_version;
176 spin_unlock(&fc->lock);
177
178 return curr_version;
179}
180
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800181/*
182 * Check whether the dentry is still valid
183 *
184 * If the entry validity timeout has expired and the dentry is
185 * positive, try to redo the lookup. If the lookup results in a
186 * different inode, then let the VFS invalidate the dentry and redo
187 * the lookup once more. If the lookup results in the same inode,
188 * then refresh the attributes, timeouts and mark the dentry valid.
189 */
Al Viro0b728e12012-06-10 16:03:43 -0400190static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700191{
Nick Piggin34286d62011-01-07 17:49:57 +1100192 struct inode *inode;
Miklos Szeredi28420da2013-06-03 14:40:22 +0200193 struct dentry *parent;
194 struct fuse_conn *fc;
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200195 struct fuse_inode *fi;
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200196 int ret;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800197
Miklos Szeredie7c0a162011-03-21 13:58:06 +0100198 inode = ACCESS_ONCE(entry->d_inode);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800199 if (inode && is_bad_inode(inode))
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200200 goto invalid;
Anand Avati154210c2014-06-26 20:21:57 -0400201 else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
202 (flags & LOOKUP_REVAL)) {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700203 struct fuse_entry_out outarg;
Miklos Szeredi70781872014-12-12 09:49:05 +0100204 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100205 struct fuse_forget_link *forget;
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700206 u64 attr_version;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800207
Miklos Szeredi50322fe2006-02-28 16:59:03 -0800208 /* For negative dentries, always do a fresh lookup */
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800209 if (!inode)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200210 goto invalid;
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800211
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200212 ret = -ECHILD;
Al Viro0b728e12012-06-10 16:03:43 -0400213 if (flags & LOOKUP_RCU)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200214 goto out;
Miklos Szeredie7c0a162011-03-21 13:58:06 +0100215
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800216 fc = get_fuse_conn(inode);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700217
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100218 forget = fuse_alloc_forget();
Miklos Szeredi70781872014-12-12 09:49:05 +0100219 ret = -ENOMEM;
220 if (!forget)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200221 goto out;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800222
Miklos Szeredi7dca9fd2007-11-28 16:21:59 -0800223 attr_version = fuse_get_attr_version(fc);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700224
Miklos Szeredie956edd2006-10-17 00:10:12 -0700225 parent = dget_parent(entry);
Miklos Szeredi70781872014-12-12 09:49:05 +0100226 fuse_lookup_init(fc, &args, get_node_id(parent->d_inode),
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700227 &entry->d_name, &outarg);
Miklos Szeredi70781872014-12-12 09:49:05 +0100228 ret = fuse_simple_request(fc, &args);
Miklos Szeredie956edd2006-10-17 00:10:12 -0700229 dput(parent);
Miklos Szeredi50322fe2006-02-28 16:59:03 -0800230 /* Zero nodeid is same as -ENOENT */
Miklos Szeredi70781872014-12-12 09:49:05 +0100231 if (!ret && !outarg.nodeid)
232 ret = -ENOENT;
233 if (!ret) {
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200234 fi = get_fuse_inode(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700235 if (outarg.nodeid != get_node_id(inode)) {
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100236 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200237 goto invalid;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700238 }
Miklos Szeredi8da5ff22006-10-17 00:10:08 -0700239 spin_lock(&fc->lock);
Miklos Szeredi1729a162008-11-26 12:03:54 +0100240 fi->nlookup++;
Miklos Szeredi8da5ff22006-10-17 00:10:08 -0700241 spin_unlock(&fc->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700242 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100243 kfree(forget);
Miklos Szeredi70781872014-12-12 09:49:05 +0100244 if (ret == -ENOMEM)
245 goto out;
246 if (ret || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200247 goto invalid;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700248
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700249 fuse_change_attributes(inode, &outarg.attr,
250 entry_attr_timeout(&outarg),
251 attr_version);
252 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi28420da2013-06-03 14:40:22 +0200253 } else if (inode) {
Miklos Szeredi6314efe2013-10-01 16:41:22 +0200254 fi = get_fuse_inode(inode);
255 if (flags & LOOKUP_RCU) {
256 if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state))
257 return -ECHILD;
258 } else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) {
Miklos Szeredi28420da2013-06-03 14:40:22 +0200259 parent = dget_parent(entry);
260 fuse_advise_use_readdirplus(parent->d_inode);
261 dput(parent);
262 }
Miklos Szeredie5e55582005-09-09 13:10:28 -0700263 }
Miklos Szeredie2a6b952013-09-05 11:44:43 +0200264 ret = 1;
265out:
266 return ret;
267
268invalid:
269 ret = 0;
270 goto out;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700271}
272
Miklos Szeredi8bfc0162006-01-16 22:14:28 -0800273static int invalid_nodeid(u64 nodeid)
Miklos Szeredi2827d0b22005-11-28 13:44:16 -0800274{
275 return !nodeid || nodeid == FUSE_ROOT_ID;
276}
277
Al Viro42695902009-02-20 05:59:13 +0000278const struct dentry_operations fuse_dentry_operations = {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700279 .d_revalidate = fuse_dentry_revalidate,
280};
281
Timo Savolaa5bfffac2007-04-08 16:04:00 -0700282int fuse_valid_type(int m)
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800283{
284 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
285 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
286}
287
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700288int fuse_lookup_name(struct super_block *sb, u64 nodeid, struct qstr *name,
289 struct fuse_entry_out *outarg, struct inode **inode)
290{
291 struct fuse_conn *fc = get_fuse_conn_super(sb);
Miklos Szeredi70781872014-12-12 09:49:05 +0100292 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100293 struct fuse_forget_link *forget;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700294 u64 attr_version;
295 int err;
296
297 *inode = NULL;
298 err = -ENAMETOOLONG;
299 if (name->len > FUSE_NAME_MAX)
300 goto out;
301
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700302
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100303 forget = fuse_alloc_forget();
304 err = -ENOMEM;
Miklos Szeredi70781872014-12-12 09:49:05 +0100305 if (!forget)
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700306 goto out;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700307
308 attr_version = fuse_get_attr_version(fc);
309
Miklos Szeredi70781872014-12-12 09:49:05 +0100310 fuse_lookup_init(fc, &args, nodeid, name, outarg);
311 err = fuse_simple_request(fc, &args);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700312 /* Zero nodeid is same as -ENOENT, but with valid timeout */
313 if (err || !outarg->nodeid)
314 goto out_put_forget;
315
316 err = -EIO;
317 if (!outarg->nodeid)
318 goto out_put_forget;
319 if (!fuse_valid_type(outarg->attr.mode))
320 goto out_put_forget;
321
322 *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
323 &outarg->attr, entry_attr_timeout(outarg),
324 attr_version);
325 err = -ENOMEM;
326 if (!*inode) {
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100327 fuse_queue_forget(fc, forget, outarg->nodeid, 1);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700328 goto out;
329 }
330 err = 0;
331
332 out_put_forget:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100333 kfree(forget);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700334 out:
335 return err;
336}
337
Miklos Szeredi0aa7c692006-01-06 00:19:34 -0800338static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
Al Viro00cd8dd2012-06-10 17:13:09 -0400339 unsigned int flags)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700340{
341 int err;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700342 struct fuse_entry_out outarg;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700343 struct inode *inode;
Miklos Szeredi0de62562008-07-25 01:48:59 -0700344 struct dentry *newent;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700345 bool outarg_valid = true;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700346
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700347 err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
348 &outarg, &inode);
349 if (err == -ENOENT) {
350 outarg_valid = false;
351 err = 0;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800352 }
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700353 if (err)
354 goto out_err;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800355
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700356 err = -EIO;
357 if (inode && get_node_id(inode) == FUSE_ROOT_ID)
358 goto out_iput;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700359
Miklos Szeredib70a80e2013-10-01 16:44:54 +0200360 newent = d_materialise_unique(entry, inode);
Miklos Szeredi5835f332013-09-05 11:44:42 +0200361 err = PTR_ERR(newent);
362 if (IS_ERR(newent))
363 goto out_err;
Miklos Szeredid2a85162006-10-17 00:10:11 -0700364
Miklos Szeredi0de62562008-07-25 01:48:59 -0700365 entry = newent ? newent : entry;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700366 if (outarg_valid)
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700367 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800368 else
369 fuse_invalidate_entry_cache(entry);
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700370
Feng Shuo4582a4a2013-01-15 11:23:28 +0800371 fuse_advise_use_readdirplus(dir);
Miklos Szeredi0de62562008-07-25 01:48:59 -0700372 return newent;
Miklos Szeredic180eeb2008-07-25 01:49:01 -0700373
374 out_iput:
375 iput(inode);
376 out_err:
377 return ERR_PTR(err);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700378}
379
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800380/*
381 * Atomic create+open operation
382 *
383 * If the filesystem doesn't support this, then fall back to separate
384 * 'mknod' + 'open' requests.
385 */
Al Virod9585272012-06-22 12:39:14 +0400386static int fuse_create_open(struct inode *dir, struct dentry *entry,
Al Viro30d90492012-06-22 12:40:19 +0400387 struct file *file, unsigned flags,
Al Virod9585272012-06-22 12:39:14 +0400388 umode_t mode, int *opened)
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800389{
390 int err;
391 struct inode *inode;
392 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100393 FUSE_ARGS(args);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100394 struct fuse_forget_link *forget;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200395 struct fuse_create_in inarg;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800396 struct fuse_open_out outopen;
397 struct fuse_entry_out outentry;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800398 struct fuse_file *ff;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800399
Miklos Szerediaf109bc2012-08-15 13:01:24 +0200400 /* Userspace expects S_IFREG in create mode */
401 BUG_ON((mode & S_IFMT) != S_IFREG);
402
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100403 forget = fuse_alloc_forget();
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200404 err = -ENOMEM;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100405 if (!forget)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200406 goto out_err;
Miklos Szeredi51eb01e2006-06-25 05:48:50 -0700407
Miklos Szeredice1d5a42006-04-10 22:54:58 -0700408 err = -ENOMEM;
Tejun Heoacf99432008-11-26 12:03:55 +0100409 ff = fuse_file_alloc(fc);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800410 if (!ff)
Miklos Szeredi70781872014-12-12 09:49:05 +0100411 goto out_put_forget_req;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800412
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200413 if (!fc->dont_mask)
414 mode &= ~current_umask();
415
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800416 flags &= ~O_NOCTTY;
417 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700418 memset(&outentry, 0, sizeof(outentry));
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800419 inarg.flags = flags;
420 inarg.mode = mode;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200421 inarg.umask = current_umask();
Miklos Szeredi70781872014-12-12 09:49:05 +0100422 args.in.h.opcode = FUSE_CREATE;
423 args.in.h.nodeid = get_node_id(dir);
424 args.in.numargs = 2;
425 args.in.args[0].size = fc->minor < 12 ? sizeof(struct fuse_open_in) :
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200426 sizeof(inarg);
Miklos Szeredi70781872014-12-12 09:49:05 +0100427 args.in.args[0].value = &inarg;
428 args.in.args[1].size = entry->d_name.len + 1;
429 args.in.args[1].value = entry->d_name.name;
430 args.out.numargs = 2;
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700431 if (fc->minor < 9)
Miklos Szeredi70781872014-12-12 09:49:05 +0100432 args.out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700433 else
Miklos Szeredi70781872014-12-12 09:49:05 +0100434 args.out.args[0].size = sizeof(outentry);
435 args.out.args[0].value = &outentry;
436 args.out.args[1].size = sizeof(outopen);
437 args.out.args[1].value = &outopen;
438 err = fuse_simple_request(fc, &args);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200439 if (err)
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800440 goto out_free_ff;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800441
442 err = -EIO;
Miklos Szeredi2827d0b22005-11-28 13:44:16 -0800443 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800444 goto out_free_ff;
445
Miklos Szeredic7b71432009-04-28 16:56:37 +0200446 ff->fh = outopen.fh;
447 ff->nodeid = outentry.nodeid;
448 ff->open_flags = outopen.open_flags;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800449 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700450 &outentry.attr, entry_attr_timeout(&outentry), 0);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800451 if (!inode) {
452 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
Miklos Szeredi8b0797a2009-04-28 16:56:39 +0200453 fuse_sync_release(ff, flags);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100454 fuse_queue_forget(fc, forget, outentry.nodeid, 1);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200455 err = -ENOMEM;
456 goto out_err;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800457 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100458 kfree(forget);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800459 d_instantiate(entry, inode);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700460 fuse_change_entry_timeout(entry, &outentry);
Miklos Szeredi0952b2a2008-02-06 01:38:38 -0800461 fuse_invalidate_attr(dir);
Al Viro30d90492012-06-22 12:40:19 +0400462 err = finish_open(file, entry, generic_file_open, opened);
463 if (err) {
Miklos Szeredi8b0797a2009-04-28 16:56:39 +0200464 fuse_sync_release(ff, flags);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200465 } else {
466 file->private_data = fuse_file_get(ff);
467 fuse_finish_open(inode, file);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800468 }
Al Virod9585272012-06-22 12:39:14 +0400469 return err;
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800470
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200471out_free_ff:
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800472 fuse_file_free(ff);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200473out_put_forget_req:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100474 kfree(forget);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200475out_err:
Al Virod9585272012-06-22 12:39:14 +0400476 return err;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200477}
478
479static int fuse_mknod(struct inode *, struct dentry *, umode_t, dev_t);
Al Virod9585272012-06-22 12:39:14 +0400480static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
Al Viro30d90492012-06-22 12:40:19 +0400481 struct file *file, unsigned flags,
Al Virod9585272012-06-22 12:39:14 +0400482 umode_t mode, int *opened)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200483{
484 int err;
485 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200486 struct dentry *res = NULL;
487
488 if (d_unhashed(entry)) {
Al Viro00cd8dd2012-06-10 17:13:09 -0400489 res = fuse_lookup(dir, entry, 0);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200490 if (IS_ERR(res))
Al Virod9585272012-06-22 12:39:14 +0400491 return PTR_ERR(res);
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200492
493 if (res)
494 entry = res;
495 }
496
497 if (!(flags & O_CREAT) || entry->d_inode)
498 goto no_open;
499
500 /* Only creates */
Al Viro47237682012-06-10 05:01:45 -0400501 *opened |= FILE_CREATED;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200502
503 if (fc->no_create)
504 goto mknod;
505
Al Viro30d90492012-06-22 12:40:19 +0400506 err = fuse_create_open(dir, entry, file, flags, mode, opened);
Al Virod9585272012-06-22 12:39:14 +0400507 if (err == -ENOSYS) {
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200508 fc->no_create = 1;
509 goto mknod;
510 }
511out_dput:
512 dput(res);
Al Virod9585272012-06-22 12:39:14 +0400513 return err;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200514
515mknod:
516 err = fuse_mknod(dir, entry, mode, 0);
Al Virod9585272012-06-22 12:39:14 +0400517 if (err)
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200518 goto out_dput;
Miklos Szeredic8ccbe02012-06-05 15:10:22 +0200519no_open:
Al Viroe45198a2012-06-10 06:48:09 -0400520 return finish_no_open(file, res);
Miklos Szeredifd72faa2005-11-07 00:59:51 -0800521}
522
Miklos Szeredi6f9f1182006-01-06 00:19:39 -0800523/*
524 * Code shared between mknod, mkdir, symlink and link
525 */
Miklos Szeredi70781872014-12-12 09:49:05 +0100526static int create_new_entry(struct fuse_conn *fc, struct fuse_args *args,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700527 struct inode *dir, struct dentry *entry,
Al Viro541af6a2011-07-26 03:17:33 -0400528 umode_t mode)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700529{
530 struct fuse_entry_out outarg;
531 struct inode *inode;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700532 int err;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100533 struct fuse_forget_link *forget;
Miklos Szeredi2d510132006-11-25 11:09:20 -0800534
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100535 forget = fuse_alloc_forget();
Miklos Szeredi70781872014-12-12 09:49:05 +0100536 if (!forget)
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100537 return -ENOMEM;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700538
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700539 memset(&outarg, 0, sizeof(outarg));
Miklos Szeredi70781872014-12-12 09:49:05 +0100540 args->in.h.nodeid = get_node_id(dir);
541 args->out.numargs = 1;
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700542 if (fc->minor < 9)
Miklos Szeredi70781872014-12-12 09:49:05 +0100543 args->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700544 else
Miklos Szeredi70781872014-12-12 09:49:05 +0100545 args->out.args[0].size = sizeof(outarg);
546 args->out.args[0].value = &outarg;
547 err = fuse_simple_request(fc, args);
Miklos Szeredi2d510132006-11-25 11:09:20 -0800548 if (err)
549 goto out_put_forget_req;
550
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800551 err = -EIO;
552 if (invalid_nodeid(outarg.nodeid))
Miklos Szeredi2d510132006-11-25 11:09:20 -0800553 goto out_put_forget_req;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800554
555 if ((outarg.attr.mode ^ mode) & S_IFMT)
Miklos Szeredi2d510132006-11-25 11:09:20 -0800556 goto out_put_forget_req;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800557
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700558 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700559 &outarg.attr, entry_attr_timeout(&outarg), 0);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700560 if (!inode) {
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100561 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700562 return -ENOMEM;
563 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100564 kfree(forget);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700565
Miklos Szeredib70a80e2013-10-01 16:44:54 +0200566 err = d_instantiate_no_diralias(entry, inode);
567 if (err)
568 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700569
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700570 fuse_change_entry_timeout(entry, &outarg);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700571 fuse_invalidate_attr(dir);
572 return 0;
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800573
Miklos Szeredi2d510132006-11-25 11:09:20 -0800574 out_put_forget_req:
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100575 kfree(forget);
Miklos Szeredi39ee0592006-01-06 00:19:43 -0800576 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700577}
578
Al Viro1a67aaf2011-07-26 01:52:52 -0400579static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700580 dev_t rdev)
581{
582 struct fuse_mknod_in inarg;
583 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100584 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700585
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200586 if (!fc->dont_mask)
587 mode &= ~current_umask();
588
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700589 memset(&inarg, 0, sizeof(inarg));
590 inarg.mode = mode;
591 inarg.rdev = new_encode_dev(rdev);
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200592 inarg.umask = current_umask();
Miklos Szeredi70781872014-12-12 09:49:05 +0100593 args.in.h.opcode = FUSE_MKNOD;
594 args.in.numargs = 2;
595 args.in.args[0].size = fc->minor < 12 ? FUSE_COMPAT_MKNOD_IN_SIZE :
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200596 sizeof(inarg);
Miklos Szeredi70781872014-12-12 09:49:05 +0100597 args.in.args[0].value = &inarg;
598 args.in.args[1].size = entry->d_name.len + 1;
599 args.in.args[1].value = entry->d_name.name;
600 return create_new_entry(fc, &args, dir, entry, mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700601}
602
Al Viro4acdaf22011-07-26 01:42:34 -0400603static int fuse_create(struct inode *dir, struct dentry *entry, umode_t mode,
Al Viroebfc3b42012-06-10 18:05:36 -0400604 bool excl)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700605{
606 return fuse_mknod(dir, entry, mode, 0);
607}
608
Al Viro18bb1db2011-07-26 01:41:39 -0400609static int fuse_mkdir(struct inode *dir, struct dentry *entry, umode_t mode)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700610{
611 struct fuse_mkdir_in inarg;
612 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100613 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700614
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200615 if (!fc->dont_mask)
616 mode &= ~current_umask();
617
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700618 memset(&inarg, 0, sizeof(inarg));
619 inarg.mode = mode;
Miklos Szeredie0a43dd2009-06-30 20:12:23 +0200620 inarg.umask = current_umask();
Miklos Szeredi70781872014-12-12 09:49:05 +0100621 args.in.h.opcode = FUSE_MKDIR;
622 args.in.numargs = 2;
623 args.in.args[0].size = sizeof(inarg);
624 args.in.args[0].value = &inarg;
625 args.in.args[1].size = entry->d_name.len + 1;
626 args.in.args[1].value = entry->d_name.name;
627 return create_new_entry(fc, &args, dir, entry, S_IFDIR);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700628}
629
630static int fuse_symlink(struct inode *dir, struct dentry *entry,
631 const char *link)
632{
633 struct fuse_conn *fc = get_fuse_conn(dir);
634 unsigned len = strlen(link) + 1;
Miklos Szeredi70781872014-12-12 09:49:05 +0100635 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700636
Miklos Szeredi70781872014-12-12 09:49:05 +0100637 args.in.h.opcode = FUSE_SYMLINK;
638 args.in.numargs = 2;
639 args.in.args[0].size = entry->d_name.len + 1;
640 args.in.args[0].value = entry->d_name.name;
641 args.in.args[1].size = len;
642 args.in.args[1].value = link;
643 return create_new_entry(fc, &args, dir, entry, S_IFLNK);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700644}
645
Maxim Patlasov31f32672014-04-28 14:19:24 +0200646static inline void fuse_update_ctime(struct inode *inode)
647{
648 if (!IS_NOCMTIME(inode)) {
649 inode->i_ctime = current_fs_time(inode->i_sb);
650 mark_inode_dirty_sync(inode);
651 }
652}
653
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700654static int fuse_unlink(struct inode *dir, struct dentry *entry)
655{
656 int err;
657 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100658 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700659
Miklos Szeredi70781872014-12-12 09:49:05 +0100660 args.in.h.opcode = FUSE_UNLINK;
661 args.in.h.nodeid = get_node_id(dir);
662 args.in.numargs = 1;
663 args.in.args[0].size = entry->d_name.len + 1;
664 args.in.args[0].value = entry->d_name.name;
665 err = fuse_simple_request(fc, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700666 if (!err) {
667 struct inode *inode = entry->d_inode;
Miklos Szerediac45d612012-03-05 15:48:11 +0100668 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700669
Miklos Szerediac45d612012-03-05 15:48:11 +0100670 spin_lock(&fc->lock);
671 fi->attr_version = ++fc->attr_version;
Miklos Szeredidfca7ce2013-02-04 15:57:42 +0100672 /*
673 * If i_nlink == 0 then unlink doesn't make sense, yet this can
674 * happen if userspace filesystem is careless. It would be
675 * difficult to enforce correct nlink usage so just ignore this
676 * condition here
677 */
678 if (inode->i_nlink > 0)
679 drop_nlink(inode);
Miklos Szerediac45d612012-03-05 15:48:11 +0100680 spin_unlock(&fc->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700681 fuse_invalidate_attr(inode);
682 fuse_invalidate_attr(dir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800683 fuse_invalidate_entry_cache(entry);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200684 fuse_update_ctime(inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700685 } else if (err == -EINTR)
686 fuse_invalidate_entry(entry);
687 return err;
688}
689
690static int fuse_rmdir(struct inode *dir, struct dentry *entry)
691{
692 int err;
693 struct fuse_conn *fc = get_fuse_conn(dir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100694 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700695
Miklos Szeredi70781872014-12-12 09:49:05 +0100696 args.in.h.opcode = FUSE_RMDIR;
697 args.in.h.nodeid = get_node_id(dir);
698 args.in.numargs = 1;
699 args.in.args[0].size = entry->d_name.len + 1;
700 args.in.args[0].value = entry->d_name.name;
701 err = fuse_simple_request(fc, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700702 if (!err) {
Dave Hansence71ec32006-09-30 23:29:06 -0700703 clear_nlink(entry->d_inode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700704 fuse_invalidate_attr(dir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800705 fuse_invalidate_entry_cache(entry);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700706 } else if (err == -EINTR)
707 fuse_invalidate_entry(entry);
708 return err;
709}
710
Miklos Szeredi1560c972014-04-28 16:43:44 +0200711static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
712 struct inode *newdir, struct dentry *newent,
713 unsigned int flags, int opcode, size_t argsize)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700714{
715 int err;
Miklos Szeredi1560c972014-04-28 16:43:44 +0200716 struct fuse_rename2_in inarg;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700717 struct fuse_conn *fc = get_fuse_conn(olddir);
Miklos Szeredi70781872014-12-12 09:49:05 +0100718 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700719
Miklos Szeredi1560c972014-04-28 16:43:44 +0200720 memset(&inarg, 0, argsize);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700721 inarg.newdir = get_node_id(newdir);
Miklos Szeredi1560c972014-04-28 16:43:44 +0200722 inarg.flags = flags;
Miklos Szeredi70781872014-12-12 09:49:05 +0100723 args.in.h.opcode = opcode;
724 args.in.h.nodeid = get_node_id(olddir);
725 args.in.numargs = 3;
726 args.in.args[0].size = argsize;
727 args.in.args[0].value = &inarg;
728 args.in.args[1].size = oldent->d_name.len + 1;
729 args.in.args[1].value = oldent->d_name.name;
730 args.in.args[2].size = newent->d_name.len + 1;
731 args.in.args[2].value = newent->d_name.name;
732 err = fuse_simple_request(fc, &args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700733 if (!err) {
Miklos Szeredi08b63302007-11-28 16:22:03 -0800734 /* ctime changes */
735 fuse_invalidate_attr(oldent->d_inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200736 fuse_update_ctime(oldent->d_inode);
Miklos Szeredi08b63302007-11-28 16:22:03 -0800737
Miklos Szeredi1560c972014-04-28 16:43:44 +0200738 if (flags & RENAME_EXCHANGE) {
739 fuse_invalidate_attr(newent->d_inode);
740 fuse_update_ctime(newent->d_inode);
741 }
742
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700743 fuse_invalidate_attr(olddir);
744 if (olddir != newdir)
745 fuse_invalidate_attr(newdir);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800746
747 /* newent will end up negative */
Miklos Szeredi1560c972014-04-28 16:43:44 +0200748 if (!(flags & RENAME_EXCHANGE) && newent->d_inode) {
Miklos Szeredi5219f342009-11-04 10:24:52 +0100749 fuse_invalidate_attr(newent->d_inode);
Miklos Szeredi8cbdf1e2006-01-06 00:19:38 -0800750 fuse_invalidate_entry_cache(newent);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200751 fuse_update_ctime(newent->d_inode);
Miklos Szeredi5219f342009-11-04 10:24:52 +0100752 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700753 } else if (err == -EINTR) {
754 /* If request was interrupted, DEITY only knows if the
755 rename actually took place. If the invalidation
756 fails (e.g. some process has CWD under the renamed
757 directory), then there can be inconsistency between
758 the dcache and the real filesystem. Tough luck. */
759 fuse_invalidate_entry(oldent);
760 if (newent->d_inode)
761 fuse_invalidate_entry(newent);
762 }
763
764 return err;
765}
766
Miklos Szeredi1560c972014-04-28 16:43:44 +0200767static int fuse_rename2(struct inode *olddir, struct dentry *oldent,
768 struct inode *newdir, struct dentry *newent,
769 unsigned int flags)
770{
771 struct fuse_conn *fc = get_fuse_conn(olddir);
772 int err;
773
774 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
775 return -EINVAL;
776
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200777 if (flags) {
778 if (fc->no_rename2 || fc->minor < 23)
779 return -EINVAL;
Miklos Szeredi1560c972014-04-28 16:43:44 +0200780
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200781 err = fuse_rename_common(olddir, oldent, newdir, newent, flags,
782 FUSE_RENAME2,
783 sizeof(struct fuse_rename2_in));
784 if (err == -ENOSYS) {
785 fc->no_rename2 = 1;
786 err = -EINVAL;
787 }
788 } else {
789 err = fuse_rename_common(olddir, oldent, newdir, newent, 0,
790 FUSE_RENAME,
791 sizeof(struct fuse_rename_in));
Miklos Szeredi1560c972014-04-28 16:43:44 +0200792 }
Miklos Szeredi1560c972014-04-28 16:43:44 +0200793
Miklos Szeredi4237ba42014-07-10 10:50:19 +0200794 return err;
795}
796
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700797static int fuse_link(struct dentry *entry, struct inode *newdir,
798 struct dentry *newent)
799{
800 int err;
801 struct fuse_link_in inarg;
802 struct inode *inode = entry->d_inode;
803 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +0100804 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700805
806 memset(&inarg, 0, sizeof(inarg));
807 inarg.oldnodeid = get_node_id(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +0100808 args.in.h.opcode = FUSE_LINK;
809 args.in.numargs = 2;
810 args.in.args[0].size = sizeof(inarg);
811 args.in.args[0].value = &inarg;
812 args.in.args[1].size = newent->d_name.len + 1;
813 args.in.args[1].value = newent->d_name.name;
814 err = create_new_entry(fc, &args, newdir, newent, inode->i_mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700815 /* Contrary to "normal" filesystems it can happen that link
816 makes two "logical" inodes point to the same "physical"
817 inode. We invalidate the attributes of the old one, so it
818 will reflect changes in the backing inode (link count,
819 etc.)
820 */
Miklos Szerediac45d612012-03-05 15:48:11 +0100821 if (!err) {
822 struct fuse_inode *fi = get_fuse_inode(inode);
823
824 spin_lock(&fc->lock);
825 fi->attr_version = ++fc->attr_version;
826 inc_nlink(inode);
827 spin_unlock(&fc->lock);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700828 fuse_invalidate_attr(inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +0200829 fuse_update_ctime(inode);
Miklos Szerediac45d612012-03-05 15:48:11 +0100830 } else if (err == -EINTR) {
831 fuse_invalidate_attr(inode);
832 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -0700833 return err;
834}
835
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700836static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
837 struct kstat *stat)
838{
Miklos Szeredi203627b2012-05-10 19:49:38 +0400839 unsigned int blkbits;
Pavel Emelyanov83732002013-10-10 17:10:46 +0400840 struct fuse_conn *fc = get_fuse_conn(inode);
841
842 /* see the comment in fuse_change_attributes() */
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400843 if (fc->writeback_cache && S_ISREG(inode->i_mode)) {
Pavel Emelyanov83732002013-10-10 17:10:46 +0400844 attr->size = i_size_read(inode);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400845 attr->mtime = inode->i_mtime.tv_sec;
846 attr->mtimensec = inode->i_mtime.tv_nsec;
Maxim Patlasov31f32672014-04-28 14:19:24 +0200847 attr->ctime = inode->i_ctime.tv_sec;
848 attr->ctimensec = inode->i_ctime.tv_nsec;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +0400849 }
Miklos Szeredi203627b2012-05-10 19:49:38 +0400850
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700851 stat->dev = inode->i_sb->s_dev;
852 stat->ino = attr->ino;
853 stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
854 stat->nlink = attr->nlink;
Eric W. Biederman499dcf22012-02-07 16:26:03 -0800855 stat->uid = make_kuid(&init_user_ns, attr->uid);
856 stat->gid = make_kgid(&init_user_ns, attr->gid);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700857 stat->rdev = inode->i_rdev;
858 stat->atime.tv_sec = attr->atime;
859 stat->atime.tv_nsec = attr->atimensec;
860 stat->mtime.tv_sec = attr->mtime;
861 stat->mtime.tv_nsec = attr->mtimensec;
862 stat->ctime.tv_sec = attr->ctime;
863 stat->ctime.tv_nsec = attr->ctimensec;
864 stat->size = attr->size;
865 stat->blocks = attr->blocks;
Miklos Szeredi203627b2012-05-10 19:49:38 +0400866
867 if (attr->blksize != 0)
868 blkbits = ilog2(attr->blksize);
869 else
870 blkbits = inode->i_sb->s_blocksize_bits;
871
872 stat->blksize = 1 << blkbits;
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700873}
874
Miklos Szeredic79e3222007-10-18 03:06:59 -0700875static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
876 struct file *file)
Miklos Szeredie5e55582005-09-09 13:10:28 -0700877{
878 int err;
Miklos Szeredic79e3222007-10-18 03:06:59 -0700879 struct fuse_getattr_in inarg;
880 struct fuse_attr_out outarg;
Miklos Szeredie5e55582005-09-09 13:10:28 -0700881 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +0100882 FUSE_ARGS(args);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700883 u64 attr_version;
884
Miklos Szeredi7dca9fd2007-11-28 16:21:59 -0800885 attr_version = fuse_get_attr_version(fc);
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700886
Miklos Szeredic79e3222007-10-18 03:06:59 -0700887 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700888 memset(&outarg, 0, sizeof(outarg));
Miklos Szeredic79e3222007-10-18 03:06:59 -0700889 /* Directories have separate file-handle space */
890 if (file && S_ISREG(inode->i_mode)) {
891 struct fuse_file *ff = file->private_data;
892
893 inarg.getattr_flags |= FUSE_GETATTR_FH;
894 inarg.fh = ff->fh;
895 }
Miklos Szeredi70781872014-12-12 09:49:05 +0100896 args.in.h.opcode = FUSE_GETATTR;
897 args.in.h.nodeid = get_node_id(inode);
898 args.in.numargs = 1;
899 args.in.args[0].size = sizeof(inarg);
900 args.in.args[0].value = &inarg;
901 args.out.numargs = 1;
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700902 if (fc->minor < 9)
Miklos Szeredi70781872014-12-12 09:49:05 +0100903 args.out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
Miklos Szeredi0e9663e2007-10-18 03:07:05 -0700904 else
Miklos Szeredi70781872014-12-12 09:49:05 +0100905 args.out.args[0].size = sizeof(outarg);
906 args.out.args[0].value = &outarg;
907 err = fuse_simple_request(fc, &args);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700908 if (!err) {
Miklos Szeredic79e3222007-10-18 03:06:59 -0700909 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
Miklos Szeredie5e55582005-09-09 13:10:28 -0700910 make_bad_inode(inode);
911 err = -EIO;
912 } else {
Miklos Szeredic79e3222007-10-18 03:06:59 -0700913 fuse_change_attributes(inode, &outarg.attr,
914 attr_timeout(&outarg),
Miklos Szeredi1fb69e72007-10-18 03:06:58 -0700915 attr_version);
916 if (stat)
Miklos Szeredic79e3222007-10-18 03:06:59 -0700917 fuse_fillattr(inode, &outarg.attr, stat);
Miklos Szeredie5e55582005-09-09 13:10:28 -0700918 }
919 }
920 return err;
921}
922
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800923int fuse_update_attributes(struct inode *inode, struct kstat *stat,
924 struct file *file, bool *refreshed)
925{
926 struct fuse_inode *fi = get_fuse_inode(inode);
927 int err;
928 bool r;
929
Miklos Szeredi126b9d42014-07-07 15:28:50 +0200930 if (time_before64(fi->i_time, get_jiffies_64())) {
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800931 r = true;
932 err = fuse_do_getattr(inode, stat, file);
933 } else {
934 r = false;
935 err = 0;
936 if (stat) {
937 generic_fillattr(inode, stat);
938 stat->mode = fi->orig_i_mode;
Pavel Shilovsky45c72cd2012-05-10 19:49:38 +0400939 stat->ino = fi->orig_ino;
Miklos Szeredibcb4be82007-11-28 16:21:59 -0800940 }
941 }
942
943 if (refreshed != NULL)
944 *refreshed = r;
945
946 return err;
947}
948
John Muir3b463ae2009-05-31 11:13:57 -0400949int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
John Muir451d0f52011-12-06 21:50:06 +0100950 u64 child_nodeid, struct qstr *name)
John Muir3b463ae2009-05-31 11:13:57 -0400951{
952 int err = -ENOTDIR;
953 struct inode *parent;
954 struct dentry *dir;
955 struct dentry *entry;
956
957 parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
958 if (!parent)
959 return -ENOENT;
960
961 mutex_lock(&parent->i_mutex);
962 if (!S_ISDIR(parent->i_mode))
963 goto unlock;
964
965 err = -ENOENT;
966 dir = d_find_alias(parent);
967 if (!dir)
968 goto unlock;
969
970 entry = d_lookup(dir, name);
971 dput(dir);
972 if (!entry)
973 goto unlock;
974
975 fuse_invalidate_attr(parent);
976 fuse_invalidate_entry(entry);
John Muir451d0f52011-12-06 21:50:06 +0100977
978 if (child_nodeid != 0 && entry->d_inode) {
979 mutex_lock(&entry->d_inode->i_mutex);
980 if (get_node_id(entry->d_inode) != child_nodeid) {
981 err = -ENOENT;
982 goto badentry;
983 }
984 if (d_mountpoint(entry)) {
985 err = -EBUSY;
986 goto badentry;
987 }
988 if (S_ISDIR(entry->d_inode->i_mode)) {
989 shrink_dcache_parent(entry);
990 if (!simple_empty(entry)) {
991 err = -ENOTEMPTY;
992 goto badentry;
993 }
994 entry->d_inode->i_flags |= S_DEAD;
995 }
996 dont_mount(entry);
997 clear_nlink(entry->d_inode);
998 err = 0;
999 badentry:
1000 mutex_unlock(&entry->d_inode->i_mutex);
1001 if (!err)
1002 d_delete(entry);
1003 } else {
1004 err = 0;
1005 }
John Muir3b463ae2009-05-31 11:13:57 -04001006 dput(entry);
John Muir3b463ae2009-05-31 11:13:57 -04001007
1008 unlock:
1009 mutex_unlock(&parent->i_mutex);
1010 iput(parent);
1011 return err;
1012}
1013
Miklos Szeredi87729a52005-09-09 13:10:34 -07001014/*
1015 * Calling into a user-controlled filesystem gives the filesystem
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001016 * daemon ptrace-like capabilities over the current process. This
Miklos Szeredi87729a52005-09-09 13:10:34 -07001017 * means, that the filesystem daemon is able to record the exact
1018 * filesystem operations performed, and can also control the behavior
1019 * of the requester process in otherwise impossible ways. For example
1020 * it can delay the operation for arbitrary length of time allowing
1021 * DoS against the requester.
1022 *
1023 * For this reason only those processes can call into the filesystem,
1024 * for which the owner of the mount has ptrace privilege. This
1025 * excludes processes started by other users, suid or sgid processes.
1026 */
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001027int fuse_allow_current_process(struct fuse_conn *fc)
Miklos Szeredi87729a52005-09-09 13:10:34 -07001028{
David Howellsc69e8d92008-11-14 10:39:19 +11001029 const struct cred *cred;
David Howellsc69e8d92008-11-14 10:39:19 +11001030
Miklos Szeredi87729a52005-09-09 13:10:34 -07001031 if (fc->flags & FUSE_ALLOW_OTHER)
1032 return 1;
1033
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001034 cred = current_cred();
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001035 if (uid_eq(cred->euid, fc->user_id) &&
1036 uid_eq(cred->suid, fc->user_id) &&
1037 uid_eq(cred->uid, fc->user_id) &&
1038 gid_eq(cred->egid, fc->group_id) &&
1039 gid_eq(cred->sgid, fc->group_id) &&
1040 gid_eq(cred->gid, fc->group_id))
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001041 return 1;
Miklos Szeredi87729a52005-09-09 13:10:34 -07001042
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001043 return 0;
Miklos Szeredi87729a52005-09-09 13:10:34 -07001044}
1045
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001046static int fuse_access(struct inode *inode, int mask)
1047{
1048 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001049 FUSE_ARGS(args);
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001050 struct fuse_access_in inarg;
1051 int err;
1052
Miklos Szeredi698fa1d2013-10-01 16:41:23 +02001053 BUG_ON(mask & MAY_NOT_BLOCK);
1054
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001055 if (fc->no_access)
1056 return 0;
1057
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001058 memset(&inarg, 0, sizeof(inarg));
Al Viroe6305c42008-07-15 21:03:57 -04001059 inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
Miklos Szeredi70781872014-12-12 09:49:05 +01001060 args.in.h.opcode = FUSE_ACCESS;
1061 args.in.h.nodeid = get_node_id(inode);
1062 args.in.numargs = 1;
1063 args.in.args[0].size = sizeof(inarg);
1064 args.in.args[0].value = &inarg;
1065 err = fuse_simple_request(fc, &args);
Miklos Szeredi31d40d72005-11-07 00:59:50 -08001066 if (err == -ENOSYS) {
1067 fc->no_access = 1;
1068 err = 0;
1069 }
1070 return err;
1071}
1072
Al Viro10556cb2011-06-20 19:28:19 -04001073static int fuse_perm_getattr(struct inode *inode, int mask)
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001074{
Al Viro10556cb2011-06-20 19:28:19 -04001075 if (mask & MAY_NOT_BLOCK)
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001076 return -ECHILD;
1077
1078 return fuse_do_getattr(inode, NULL, NULL);
1079}
1080
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001081/*
1082 * Check permission. The two basic access models of FUSE are:
1083 *
1084 * 1) Local access checking ('default_permissions' mount option) based
1085 * on file mode. This is the plain old disk filesystem permission
1086 * modell.
1087 *
1088 * 2) "Remote" access checking, where server is responsible for
1089 * checking permission in each inode operation. An exception to this
1090 * is if ->permission() was invoked from sys_access() in which case an
1091 * access request is sent. Execute permission is still checked
1092 * locally based on file mode.
1093 */
Al Viro10556cb2011-06-20 19:28:19 -04001094static int fuse_permission(struct inode *inode, int mask)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001095{
1096 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001097 bool refreshed = false;
1098 int err = 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001099
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001100 if (!fuse_allow_current_process(fc))
Miklos Szeredie5e55582005-09-09 13:10:28 -07001101 return -EACCES;
Miklos Szeredi244f6382007-10-16 23:31:02 -07001102
1103 /*
Miklos Szeredie8e96152007-10-16 23:31:06 -07001104 * If attributes are needed, refresh them before proceeding
Miklos Szeredi244f6382007-10-16 23:31:02 -07001105 */
Miklos Szeredie8e96152007-10-16 23:31:06 -07001106 if ((fc->flags & FUSE_DEFAULT_PERMISSIONS) ||
1107 ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001108 struct fuse_inode *fi = get_fuse_inode(inode);
1109
Miklos Szeredi126b9d42014-07-07 15:28:50 +02001110 if (time_before64(fi->i_time, get_jiffies_64())) {
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001111 refreshed = true;
1112
Al Viro10556cb2011-06-20 19:28:19 -04001113 err = fuse_perm_getattr(inode, mask);
Miklos Szeredi19690dd2011-03-21 13:58:06 +01001114 if (err)
1115 return err;
1116 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001117 }
1118
1119 if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
Al Viro2830ba72011-06-20 19:16:29 -04001120 err = generic_permission(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001121
1122 /* If permission is denied, try to refresh file
1123 attributes. This is also needed, because the root
1124 node will at first have no permissions */
Miklos Szeredi244f6382007-10-16 23:31:02 -07001125 if (err == -EACCES && !refreshed) {
Al Viro10556cb2011-06-20 19:28:19 -04001126 err = fuse_perm_getattr(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001127 if (!err)
Al Viro2830ba72011-06-20 19:16:29 -04001128 err = generic_permission(inode, mask);
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001129 }
1130
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001131 /* Note: the opposite of the above test does not
1132 exist. So if permissions are revoked this won't be
1133 noticed immediately, only after the attribute
1134 timeout has expired */
Eric Paris9cfcac82010-07-23 11:43:51 -04001135 } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
Miklos Szeredie8e96152007-10-16 23:31:06 -07001136 err = fuse_access(inode, mask);
1137 } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1138 if (!(inode->i_mode & S_IXUGO)) {
1139 if (refreshed)
1140 return -EACCES;
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001141
Al Viro10556cb2011-06-20 19:28:19 -04001142 err = fuse_perm_getattr(inode, mask);
Miklos Szeredie8e96152007-10-16 23:31:06 -07001143 if (!err && !(inode->i_mode & S_IXUGO))
1144 return -EACCES;
1145 }
Miklos Szeredie5e55582005-09-09 13:10:28 -07001146 }
Miklos Szeredi244f6382007-10-16 23:31:02 -07001147 return err;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001148}
1149
1150static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
Al Viro8d3af7f2013-05-18 03:03:58 -04001151 struct dir_context *ctx)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001152{
1153 while (nbytes >= FUSE_NAME_OFFSET) {
1154 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
1155 size_t reclen = FUSE_DIRENT_SIZE(dirent);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001156 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1157 return -EIO;
1158 if (reclen > nbytes)
1159 break;
Miklos Szerediefeb9e62013-09-03 14:28:38 +02001160 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
1161 return -EIO;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001162
Al Viro8d3af7f2013-05-18 03:03:58 -04001163 if (!dir_emit(ctx, dirent->name, dirent->namelen,
1164 dirent->ino, dirent->type))
Miklos Szeredie5e55582005-09-09 13:10:28 -07001165 break;
1166
1167 buf += reclen;
1168 nbytes -= reclen;
Al Viro8d3af7f2013-05-18 03:03:58 -04001169 ctx->pos = dirent->off;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001170 }
1171
1172 return 0;
1173}
1174
Anand V. Avati0b05b182012-08-19 08:53:23 -04001175static int fuse_direntplus_link(struct file *file,
1176 struct fuse_direntplus *direntplus,
1177 u64 attr_version)
1178{
1179 int err;
1180 struct fuse_entry_out *o = &direntplus->entry_out;
1181 struct fuse_dirent *dirent = &direntplus->dirent;
1182 struct dentry *parent = file->f_path.dentry;
1183 struct qstr name = QSTR_INIT(dirent->name, dirent->namelen);
1184 struct dentry *dentry;
1185 struct dentry *alias;
1186 struct inode *dir = parent->d_inode;
1187 struct fuse_conn *fc;
1188 struct inode *inode;
1189
1190 if (!o->nodeid) {
1191 /*
1192 * Unlike in the case of fuse_lookup, zero nodeid does not mean
1193 * ENOENT. Instead, it only means the userspace filesystem did
1194 * not want to return attributes/handle for this entry.
1195 *
1196 * So do nothing.
1197 */
1198 return 0;
1199 }
1200
1201 if (name.name[0] == '.') {
1202 /*
1203 * We could potentially refresh the attributes of the directory
1204 * and its parent?
1205 */
1206 if (name.len == 1)
1207 return 0;
1208 if (name.name[1] == '.' && name.len == 2)
1209 return 0;
1210 }
Miklos Szeredia28ef452013-07-17 14:53:53 +02001211
1212 if (invalid_nodeid(o->nodeid))
1213 return -EIO;
1214 if (!fuse_valid_type(o->attr.mode))
1215 return -EIO;
1216
Anand V. Avati0b05b182012-08-19 08:53:23 -04001217 fc = get_fuse_conn(dir);
1218
1219 name.hash = full_name_hash(name.name, name.len);
1220 dentry = d_lookup(parent, &name);
Niels de Vos53ce9a32013-07-17 14:53:53 +02001221 if (dentry) {
Anand V. Avati0b05b182012-08-19 08:53:23 -04001222 inode = dentry->d_inode;
Niels de Vos53ce9a32013-07-17 14:53:53 +02001223 if (!inode) {
1224 d_drop(dentry);
Miklos Szeredia28ef452013-07-17 14:53:53 +02001225 } else if (get_node_id(inode) != o->nodeid ||
1226 ((o->attr.mode ^ inode->i_mode) & S_IFMT)) {
Eric W. Biederman5542aa22014-02-13 09:46:25 -08001227 d_invalidate(dentry);
Miklos Szeredia28ef452013-07-17 14:53:53 +02001228 } else if (is_bad_inode(inode)) {
1229 err = -EIO;
1230 goto out;
Niels de Vos53ce9a32013-07-17 14:53:53 +02001231 } else {
Anand V. Avati0b05b182012-08-19 08:53:23 -04001232 struct fuse_inode *fi;
1233 fi = get_fuse_inode(inode);
1234 spin_lock(&fc->lock);
1235 fi->nlookup++;
1236 spin_unlock(&fc->lock);
1237
Miklos Szeredifa2b7212013-07-17 14:53:53 +02001238 fuse_change_attributes(inode, &o->attr,
1239 entry_attr_timeout(o),
1240 attr_version);
1241
Anand V. Avati0b05b182012-08-19 08:53:23 -04001242 /*
1243 * The other branch to 'found' comes via fuse_iget()
1244 * which bumps nlookup inside
1245 */
1246 goto found;
1247 }
Anand V. Avati0b05b182012-08-19 08:53:23 -04001248 dput(dentry);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001249 }
1250
1251 dentry = d_alloc(parent, &name);
1252 err = -ENOMEM;
1253 if (!dentry)
1254 goto out;
1255
1256 inode = fuse_iget(dir->i_sb, o->nodeid, o->generation,
1257 &o->attr, entry_attr_timeout(o), attr_version);
1258 if (!inode)
1259 goto out;
1260
Miklos Szeredib70a80e2013-10-01 16:44:54 +02001261 alias = d_materialise_unique(dentry, inode);
Miklos Szeredi5835f332013-09-05 11:44:42 +02001262 err = PTR_ERR(alias);
1263 if (IS_ERR(alias))
1264 goto out;
Miklos Szeredi29149412013-07-17 14:53:53 +02001265
Anand V. Avati0b05b182012-08-19 08:53:23 -04001266 if (alias) {
1267 dput(dentry);
1268 dentry = alias;
1269 }
1270
1271found:
Miklos Szeredi6314efe2013-10-01 16:41:22 +02001272 if (fc->readdirplus_auto)
1273 set_bit(FUSE_I_INIT_RDPLUS, &get_fuse_inode(inode)->state);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001274 fuse_change_entry_timeout(dentry, o);
1275
1276 err = 0;
1277out:
Miklos Szeredic7263bc2013-07-17 14:53:54 +02001278 dput(dentry);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001279 return err;
1280}
1281
1282static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file,
Al Viro8d3af7f2013-05-18 03:03:58 -04001283 struct dir_context *ctx, u64 attr_version)
Anand V. Avati0b05b182012-08-19 08:53:23 -04001284{
1285 struct fuse_direntplus *direntplus;
1286 struct fuse_dirent *dirent;
1287 size_t reclen;
1288 int over = 0;
1289 int ret;
1290
1291 while (nbytes >= FUSE_NAME_OFFSET_DIRENTPLUS) {
1292 direntplus = (struct fuse_direntplus *) buf;
1293 dirent = &direntplus->dirent;
1294 reclen = FUSE_DIRENTPLUS_SIZE(direntplus);
1295
1296 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1297 return -EIO;
1298 if (reclen > nbytes)
1299 break;
Miklos Szerediefeb9e62013-09-03 14:28:38 +02001300 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
1301 return -EIO;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001302
1303 if (!over) {
1304 /* We fill entries into dstbuf only as much as
1305 it can hold. But we still continue iterating
1306 over remaining entries to link them. If not,
1307 we need to send a FORGET for each of those
1308 which we did not link.
1309 */
Al Viro8d3af7f2013-05-18 03:03:58 -04001310 over = !dir_emit(ctx, dirent->name, dirent->namelen,
1311 dirent->ino, dirent->type);
1312 ctx->pos = dirent->off;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001313 }
1314
1315 buf += reclen;
1316 nbytes -= reclen;
1317
1318 ret = fuse_direntplus_link(file, direntplus, attr_version);
1319 if (ret)
1320 fuse_force_forget(file, direntplus->entry_out.nodeid);
1321 }
1322
1323 return 0;
1324}
1325
Al Viro8d3af7f2013-05-18 03:03:58 -04001326static int fuse_readdir(struct file *file, struct dir_context *ctx)
Miklos Szeredie5e55582005-09-09 13:10:28 -07001327{
Feng Shuo4582a4a2013-01-15 11:23:28 +08001328 int plus, err;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001329 size_t nbytes;
1330 struct page *page;
Al Viro496ad9a2013-01-23 17:07:38 -05001331 struct inode *inode = file_inode(file);
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001332 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi248d86e2006-01-06 00:19:39 -08001333 struct fuse_req *req;
Anand V. Avati0b05b182012-08-19 08:53:23 -04001334 u64 attr_version = 0;
Miklos Szeredi248d86e2006-01-06 00:19:39 -08001335
1336 if (is_bad_inode(inode))
1337 return -EIO;
1338
Maxim Patlasovb111c8c2012-10-26 19:48:30 +04001339 req = fuse_get_req(fc, 1);
Miklos Szeredice1d5a42006-04-10 22:54:58 -07001340 if (IS_ERR(req))
1341 return PTR_ERR(req);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001342
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001343 page = alloc_page(GFP_KERNEL);
1344 if (!page) {
1345 fuse_put_request(fc, req);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001346 return -ENOMEM;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001347 }
Feng Shuo4582a4a2013-01-15 11:23:28 +08001348
Al Viro8d3af7f2013-05-18 03:03:58 -04001349 plus = fuse_use_readdirplus(inode, ctx);
Miklos Szeredif4975c62009-04-02 14:25:34 +02001350 req->out.argpages = 1;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001351 req->num_pages = 1;
1352 req->pages[0] = page;
Maxim Patlasov85f40ae2012-10-26 19:49:33 +04001353 req->page_descs[0].length = PAGE_SIZE;
Feng Shuo4582a4a2013-01-15 11:23:28 +08001354 if (plus) {
Anand V. Avati0b05b182012-08-19 08:53:23 -04001355 attr_version = fuse_get_attr_version(fc);
Al Viro8d3af7f2013-05-18 03:03:58 -04001356 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
Anand V. Avati0b05b182012-08-19 08:53:23 -04001357 FUSE_READDIRPLUS);
1358 } else {
Al Viro8d3af7f2013-05-18 03:03:58 -04001359 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
Anand V. Avati0b05b182012-08-19 08:53:23 -04001360 FUSE_READDIR);
1361 }
Tejun Heob93f8582008-11-26 12:03:55 +01001362 fuse_request_send(fc, req);
Miklos Szeredi361b1eb52006-01-16 22:14:45 -08001363 nbytes = req->out.args[0].size;
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001364 err = req->out.h.error;
1365 fuse_put_request(fc, req);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001366 if (!err) {
Feng Shuo4582a4a2013-01-15 11:23:28 +08001367 if (plus) {
Anand V. Avati0b05b182012-08-19 08:53:23 -04001368 err = parse_dirplusfile(page_address(page), nbytes,
Al Viro8d3af7f2013-05-18 03:03:58 -04001369 file, ctx,
Anand V. Avati0b05b182012-08-19 08:53:23 -04001370 attr_version);
1371 } else {
1372 err = parse_dirfile(page_address(page), nbytes, file,
Al Viro8d3af7f2013-05-18 03:03:58 -04001373 ctx);
Anand V. Avati0b05b182012-08-19 08:53:23 -04001374 }
1375 }
Miklos Szeredie5e55582005-09-09 13:10:28 -07001376
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001377 __free_page(page);
Andrew Gallagher451418f2013-11-05 03:55:43 -08001378 fuse_invalidate_atime(inode);
Miklos Szeredi04730fe2005-09-09 13:10:36 -07001379 return err;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001380}
1381
1382static char *read_link(struct dentry *dentry)
1383{
1384 struct inode *inode = dentry->d_inode;
1385 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001386 FUSE_ARGS(args);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001387 char *link;
Miklos Szeredi70781872014-12-12 09:49:05 +01001388 ssize_t ret;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001389
1390 link = (char *) __get_free_page(GFP_KERNEL);
Miklos Szeredi70781872014-12-12 09:49:05 +01001391 if (!link)
1392 return ERR_PTR(-ENOMEM);
1393
1394 args.in.h.opcode = FUSE_READLINK;
1395 args.in.h.nodeid = get_node_id(inode);
1396 args.out.argvar = 1;
1397 args.out.numargs = 1;
1398 args.out.args[0].size = PAGE_SIZE - 1;
1399 args.out.args[0].value = link;
1400 ret = fuse_simple_request(fc, &args);
1401 if (ret < 0) {
Miklos Szeredie5e55582005-09-09 13:10:28 -07001402 free_page((unsigned long) link);
Miklos Szeredi70781872014-12-12 09:49:05 +01001403 link = ERR_PTR(ret);
1404 } else {
1405 link[ret] = '\0';
1406 }
Andrew Gallagher451418f2013-11-05 03:55:43 -08001407 fuse_invalidate_atime(inode);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001408 return link;
1409}
1410
1411static void free_link(char *link)
1412{
1413 if (!IS_ERR(link))
1414 free_page((unsigned long) link);
1415}
1416
1417static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd)
1418{
1419 nd_set_link(nd, read_link(dentry));
1420 return NULL;
1421}
1422
1423static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
1424{
1425 free_link(nd_get_link(nd));
1426}
1427
1428static int fuse_dir_open(struct inode *inode, struct file *file)
1429{
Miklos Szeredi91fe96b2009-04-28 16:56:37 +02001430 return fuse_open_common(inode, file, true);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001431}
1432
1433static int fuse_dir_release(struct inode *inode, struct file *file)
1434{
Miklos Szeredi8b0797a2009-04-28 16:56:39 +02001435 fuse_release_common(file, FUSE_RELEASEDIR);
1436
1437 return 0;
Miklos Szeredie5e55582005-09-09 13:10:28 -07001438}
1439
Josef Bacik02c24a82011-07-16 20:44:56 -04001440static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1441 int datasync)
Miklos Szeredi82547982005-09-09 13:10:38 -07001442{
Josef Bacik02c24a82011-07-16 20:44:56 -04001443 return fuse_fsync_common(file, start, end, datasync, 1);
Miklos Szeredi82547982005-09-09 13:10:38 -07001444}
1445
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001446static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1447 unsigned long arg)
1448{
1449 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1450
1451 /* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1452 if (fc->minor < 18)
1453 return -ENOTTY;
1454
1455 return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1456}
1457
1458static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1459 unsigned long arg)
1460{
1461 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1462
1463 if (fc->minor < 18)
1464 return -ENOTTY;
1465
1466 return fuse_ioctl_common(file, cmd, arg,
1467 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1468}
1469
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001470static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001471{
1472 /* Always update if mtime is explicitly set */
1473 if (ivalid & ATTR_MTIME_SET)
1474 return true;
1475
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001476 /* Or if kernel i_mtime is the official one */
1477 if (trust_local_mtime)
1478 return true;
1479
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001480 /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1481 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1482 return false;
1483
1484 /* In all other cases update */
1485 return true;
1486}
1487
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001488static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg,
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001489 bool trust_local_cmtime)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001490{
1491 unsigned ivalid = iattr->ia_valid;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001492
1493 if (ivalid & ATTR_MODE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001494 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001495 if (ivalid & ATTR_UID)
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001496 arg->valid |= FATTR_UID, arg->uid = from_kuid(&init_user_ns, iattr->ia_uid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001497 if (ivalid & ATTR_GID)
Eric W. Biederman499dcf22012-02-07 16:26:03 -08001498 arg->valid |= FATTR_GID, arg->gid = from_kgid(&init_user_ns, iattr->ia_gid);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001499 if (ivalid & ATTR_SIZE)
Miklos Szeredibefc6492005-11-07 00:59:52 -08001500 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001501 if (ivalid & ATTR_ATIME) {
1502 arg->valid |= FATTR_ATIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001503 arg->atime = iattr->ia_atime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001504 arg->atimensec = iattr->ia_atime.tv_nsec;
1505 if (!(ivalid & ATTR_ATIME_SET))
1506 arg->valid |= FATTR_ATIME_NOW;
1507 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001508 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001509 arg->valid |= FATTR_MTIME;
Miklos Szeredibefc6492005-11-07 00:59:52 -08001510 arg->mtime = iattr->ia_mtime.tv_sec;
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001511 arg->mtimensec = iattr->ia_mtime.tv_nsec;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001512 if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
Miklos Szeredi17637cb2007-10-18 03:07:01 -07001513 arg->valid |= FATTR_MTIME_NOW;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001514 }
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001515 if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
1516 arg->valid |= FATTR_CTIME;
1517 arg->ctime = iattr->ia_ctime.tv_sec;
1518 arg->ctimensec = iattr->ia_ctime.tv_nsec;
1519 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001520}
1521
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001522/*
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001523 * Prevent concurrent writepages on inode
1524 *
1525 * This is done by adding a negative bias to the inode write counter
1526 * and waiting for all pending writes to finish.
1527 */
1528void fuse_set_nowrite(struct inode *inode)
1529{
1530 struct fuse_conn *fc = get_fuse_conn(inode);
1531 struct fuse_inode *fi = get_fuse_inode(inode);
1532
1533 BUG_ON(!mutex_is_locked(&inode->i_mutex));
1534
1535 spin_lock(&fc->lock);
1536 BUG_ON(fi->writectr < 0);
1537 fi->writectr += FUSE_NOWRITE;
1538 spin_unlock(&fc->lock);
1539 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1540}
1541
1542/*
1543 * Allow writepages on inode
1544 *
1545 * Remove the bias from the writecounter and send any queued
1546 * writepages.
1547 */
1548static void __fuse_release_nowrite(struct inode *inode)
1549{
1550 struct fuse_inode *fi = get_fuse_inode(inode);
1551
1552 BUG_ON(fi->writectr != FUSE_NOWRITE);
1553 fi->writectr = 0;
1554 fuse_flush_writepages(inode);
1555}
1556
1557void fuse_release_nowrite(struct inode *inode)
1558{
1559 struct fuse_conn *fc = get_fuse_conn(inode);
1560
1561 spin_lock(&fc->lock);
1562 __fuse_release_nowrite(inode);
1563 spin_unlock(&fc->lock);
1564}
1565
Miklos Szeredi70781872014-12-12 09:49:05 +01001566static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001567 struct inode *inode,
1568 struct fuse_setattr_in *inarg_p,
1569 struct fuse_attr_out *outarg_p)
1570{
Miklos Szeredi70781872014-12-12 09:49:05 +01001571 args->in.h.opcode = FUSE_SETATTR;
1572 args->in.h.nodeid = get_node_id(inode);
1573 args->in.numargs = 1;
1574 args->in.args[0].size = sizeof(*inarg_p);
1575 args->in.args[0].value = inarg_p;
1576 args->out.numargs = 1;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001577 if (fc->minor < 9)
Miklos Szeredi70781872014-12-12 09:49:05 +01001578 args->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001579 else
Miklos Szeredi70781872014-12-12 09:49:05 +01001580 args->out.args[0].size = sizeof(*outarg_p);
1581 args->out.args[0].value = outarg_p;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001582}
1583
1584/*
1585 * Flush inode->i_mtime to the server
1586 */
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001587int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001588{
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001589 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001590 FUSE_ARGS(args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001591 struct fuse_setattr_in inarg;
1592 struct fuse_attr_out outarg;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001593
1594 memset(&inarg, 0, sizeof(inarg));
1595 memset(&outarg, 0, sizeof(outarg));
1596
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001597 inarg.valid = FATTR_MTIME;
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001598 inarg.mtime = inode->i_mtime.tv_sec;
1599 inarg.mtimensec = inode->i_mtime.tv_nsec;
Maxim Patlasovab9e13f2014-04-28 14:19:24 +02001600 if (fc->minor >= 23) {
1601 inarg.valid |= FATTR_CTIME;
1602 inarg.ctime = inode->i_ctime.tv_sec;
1603 inarg.ctimensec = inode->i_ctime.tv_nsec;
1604 }
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001605 if (ff) {
1606 inarg.valid |= FATTR_FH;
1607 inarg.fh = ff->fh;
1608 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001609 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001610
Miklos Szeredi70781872014-12-12 09:49:05 +01001611 return fuse_simple_request(fc, &args);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001612}
1613
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001614/*
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001615 * Set attributes, and at the same time refresh them.
1616 *
1617 * Truncation is slightly complicated, because the 'truncate' request
1618 * may fail, in which case we don't want to touch the mapping.
Miklos Szeredi9ffbb912006-10-17 00:10:06 -07001619 * vmtruncate() doesn't allow for this case, so do the rlimit checking
1620 * and the actual truncation by hand.
Miklos Szeredi6f9f1182006-01-06 00:19:39 -08001621 */
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001622int fuse_do_setattr(struct inode *inode, struct iattr *attr,
1623 struct file *file)
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001624{
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001625 struct fuse_conn *fc = get_fuse_conn(inode);
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001626 struct fuse_inode *fi = get_fuse_inode(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001627 FUSE_ARGS(args);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001628 struct fuse_setattr_in inarg;
1629 struct fuse_attr_out outarg;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001630 bool is_truncate = false;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001631 bool is_wb = fc->writeback_cache;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001632 loff_t oldsize;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001633 int err;
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001634 bool trust_local_cmtime = is_wb && S_ISREG(inode->i_mode);
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001635
Christoph Hellwigdb78b872010-06-04 11:30:03 +02001636 if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
1637 attr->ia_valid |= ATTR_FORCE;
1638
1639 err = inode_change_ok(inode, attr);
1640 if (err)
1641 return err;
Miklos Szeredi1e9a4ed2005-09-09 13:10:31 -07001642
Miklos Szeredi8d56add2011-02-25 14:44:58 +01001643 if (attr->ia_valid & ATTR_OPEN) {
1644 if (fc->atomic_o_trunc)
1645 return 0;
1646 file = NULL;
1647 }
Miklos Szeredi6ff958e2007-10-18 03:07:02 -07001648
Christoph Hellwig2c27c652010-06-04 11:30:04 +02001649 if (attr->ia_valid & ATTR_SIZE)
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001650 is_truncate = true;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001651
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001652 if (is_truncate) {
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001653 fuse_set_nowrite(inode);
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001654 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001655 if (trust_local_cmtime && attr->ia_size != inode->i_size)
1656 attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001657 }
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001658
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001659 memset(&inarg, 0, sizeof(inarg));
Miklos Szeredi0e9663e2007-10-18 03:07:05 -07001660 memset(&outarg, 0, sizeof(outarg));
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001661 iattr_to_fattr(attr, &inarg, trust_local_cmtime);
Miklos Szeredi49d49142007-10-18 03:07:00 -07001662 if (file) {
1663 struct fuse_file *ff = file->private_data;
1664 inarg.valid |= FATTR_FH;
1665 inarg.fh = ff->fh;
1666 }
Miklos Szeredif3332112007-10-18 03:07:04 -07001667 if (attr->ia_valid & ATTR_SIZE) {
1668 /* For mandatory locking in truncate */
1669 inarg.valid |= FATTR_LOCKOWNER;
1670 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1671 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001672 fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
1673 err = fuse_simple_request(fc, &args);
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001674 if (err) {
1675 if (err == -EINTR)
1676 fuse_invalidate_attr(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001677 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001678 }
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001679
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001680 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1681 make_bad_inode(inode);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001682 err = -EIO;
1683 goto error;
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001684 }
1685
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001686 spin_lock(&fc->lock);
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001687 /* the kernel maintains i_mtime locally */
Maxim Patlasov3ad22c62014-04-28 14:19:25 +02001688 if (trust_local_cmtime) {
1689 if (attr->ia_valid & ATTR_MTIME)
1690 inode->i_mtime = attr->ia_mtime;
1691 if (attr->ia_valid & ATTR_CTIME)
1692 inode->i_ctime = attr->ia_ctime;
Miklos Szeredi1e18bda2014-04-28 14:19:23 +02001693 /* FIXME: clear I_DIRTY_SYNC? */
Maxim Patlasovb0aa7602013-12-26 19:51:11 +04001694 }
1695
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001696 fuse_change_attributes_common(inode, &outarg.attr,
1697 attr_timeout(&outarg));
1698 oldsize = inode->i_size;
Pavel Emelyanov83732002013-10-10 17:10:46 +04001699 /* see the comment in fuse_change_attributes() */
1700 if (!is_wb || is_truncate || !S_ISREG(inode->i_mode))
1701 i_size_write(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001702
1703 if (is_truncate) {
1704 /* NOTE: this may release/reacquire fc->lock */
1705 __fuse_release_nowrite(inode);
1706 }
1707 spin_unlock(&fc->lock);
1708
1709 /*
1710 * Only call invalidate_inode_pages2() after removing
1711 * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1712 */
Pavel Emelyanov83732002013-10-10 17:10:46 +04001713 if ((is_truncate || !is_wb) &&
1714 S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
Kirill A. Shutemov7caef262013-09-12 15:13:56 -07001715 truncate_pagecache(inode, outarg.attr.size);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001716 invalidate_inode_pages2(inode->i_mapping);
1717 }
1718
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001719 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Miklos Szeredie00d2c22007-10-16 23:31:01 -07001720 return 0;
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001721
1722error:
1723 if (is_truncate)
1724 fuse_release_nowrite(inode);
1725
Maxim Patlasov06a7c3c2013-08-30 17:06:04 +04001726 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
Miklos Szeredi3be5a522008-04-30 00:54:41 -07001727 return err;
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001728}
1729
Miklos Szeredi49d49142007-10-18 03:07:00 -07001730static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1731{
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001732 struct inode *inode = entry->d_inode;
1733
1734 if (!fuse_allow_current_process(get_fuse_conn(inode)))
1735 return -EACCES;
1736
Miklos Szeredi49d49142007-10-18 03:07:00 -07001737 if (attr->ia_valid & ATTR_FILE)
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001738 return fuse_do_setattr(inode, attr, attr->ia_file);
Miklos Szeredi49d49142007-10-18 03:07:00 -07001739 else
Maxim Patlasovefb9fa92012-12-18 14:05:08 +04001740 return fuse_do_setattr(inode, attr, NULL);
Miklos Szeredi49d49142007-10-18 03:07:00 -07001741}
1742
Miklos Szeredie5e55582005-09-09 13:10:28 -07001743static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
1744 struct kstat *stat)
1745{
1746 struct inode *inode = entry->d_inode;
Miklos Szeredi244f6382007-10-16 23:31:02 -07001747 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi244f6382007-10-16 23:31:02 -07001748
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001749 if (!fuse_allow_current_process(fc))
Miklos Szeredi244f6382007-10-16 23:31:02 -07001750 return -EACCES;
1751
Miklos Szeredibcb4be82007-11-28 16:21:59 -08001752 return fuse_update_attributes(inode, stat, NULL, NULL);
Miklos Szeredie5e55582005-09-09 13:10:28 -07001753}
1754
Miklos Szeredi92a87802005-09-09 13:10:31 -07001755static int fuse_setxattr(struct dentry *entry, const char *name,
1756 const void *value, size_t size, int flags)
1757{
1758 struct inode *inode = entry->d_inode;
1759 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001760 FUSE_ARGS(args);
Miklos Szeredi92a87802005-09-09 13:10:31 -07001761 struct fuse_setxattr_in inarg;
1762 int err;
1763
Miklos Szeredi92a87802005-09-09 13:10:31 -07001764 if (fc->no_setxattr)
1765 return -EOPNOTSUPP;
1766
Miklos Szeredi92a87802005-09-09 13:10:31 -07001767 memset(&inarg, 0, sizeof(inarg));
1768 inarg.size = size;
1769 inarg.flags = flags;
Miklos Szeredi70781872014-12-12 09:49:05 +01001770 args.in.h.opcode = FUSE_SETXATTR;
1771 args.in.h.nodeid = get_node_id(inode);
1772 args.in.numargs = 3;
1773 args.in.args[0].size = sizeof(inarg);
1774 args.in.args[0].value = &inarg;
1775 args.in.args[1].size = strlen(name) + 1;
1776 args.in.args[1].value = name;
1777 args.in.args[2].size = size;
1778 args.in.args[2].value = value;
1779 err = fuse_simple_request(fc, &args);
Miklos Szeredi92a87802005-09-09 13:10:31 -07001780 if (err == -ENOSYS) {
1781 fc->no_setxattr = 1;
1782 err = -EOPNOTSUPP;
1783 }
Maxim Patlasov31f32672014-04-28 14:19:24 +02001784 if (!err) {
Anand Avatid331a412013-08-20 02:21:07 -04001785 fuse_invalidate_attr(inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +02001786 fuse_update_ctime(inode);
1787 }
Miklos Szeredi92a87802005-09-09 13:10:31 -07001788 return err;
1789}
1790
1791static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
1792 void *value, size_t size)
1793{
1794 struct inode *inode = entry->d_inode;
1795 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001796 FUSE_ARGS(args);
Miklos Szeredi92a87802005-09-09 13:10:31 -07001797 struct fuse_getxattr_in inarg;
1798 struct fuse_getxattr_out outarg;
1799 ssize_t ret;
1800
1801 if (fc->no_getxattr)
1802 return -EOPNOTSUPP;
1803
Miklos Szeredi92a87802005-09-09 13:10:31 -07001804 memset(&inarg, 0, sizeof(inarg));
1805 inarg.size = size;
Miklos Szeredi70781872014-12-12 09:49:05 +01001806 args.in.h.opcode = FUSE_GETXATTR;
1807 args.in.h.nodeid = get_node_id(inode);
1808 args.in.numargs = 2;
1809 args.in.args[0].size = sizeof(inarg);
1810 args.in.args[0].value = &inarg;
1811 args.in.args[1].size = strlen(name) + 1;
1812 args.in.args[1].value = name;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001813 /* This is really two different operations rolled into one */
Miklos Szeredi70781872014-12-12 09:49:05 +01001814 args.out.numargs = 1;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001815 if (size) {
Miklos Szeredi70781872014-12-12 09:49:05 +01001816 args.out.argvar = 1;
1817 args.out.args[0].size = size;
1818 args.out.args[0].value = value;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001819 } else {
Miklos Szeredi70781872014-12-12 09:49:05 +01001820 args.out.args[0].size = sizeof(outarg);
1821 args.out.args[0].value = &outarg;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001822 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001823 ret = fuse_simple_request(fc, &args);
1824 if (!ret && !size)
1825 ret = outarg.size;
1826 if (ret == -ENOSYS) {
1827 fc->no_getxattr = 1;
1828 ret = -EOPNOTSUPP;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001829 }
Miklos Szeredi92a87802005-09-09 13:10:31 -07001830 return ret;
1831}
1832
1833static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
1834{
1835 struct inode *inode = entry->d_inode;
1836 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001837 FUSE_ARGS(args);
Miklos Szeredi92a87802005-09-09 13:10:31 -07001838 struct fuse_getxattr_in inarg;
1839 struct fuse_getxattr_out outarg;
1840 ssize_t ret;
1841
Anatol Pomozovc2132c12013-01-14 22:30:00 -08001842 if (!fuse_allow_current_process(fc))
Miklos Szeredie57ac682007-10-18 03:06:58 -07001843 return -EACCES;
1844
Miklos Szeredi92a87802005-09-09 13:10:31 -07001845 if (fc->no_listxattr)
1846 return -EOPNOTSUPP;
1847
Miklos Szeredi92a87802005-09-09 13:10:31 -07001848 memset(&inarg, 0, sizeof(inarg));
1849 inarg.size = size;
Miklos Szeredi70781872014-12-12 09:49:05 +01001850 args.in.h.opcode = FUSE_LISTXATTR;
1851 args.in.h.nodeid = get_node_id(inode);
1852 args.in.numargs = 1;
1853 args.in.args[0].size = sizeof(inarg);
1854 args.in.args[0].value = &inarg;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001855 /* This is really two different operations rolled into one */
Miklos Szeredi70781872014-12-12 09:49:05 +01001856 args.out.numargs = 1;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001857 if (size) {
Miklos Szeredi70781872014-12-12 09:49:05 +01001858 args.out.argvar = 1;
1859 args.out.args[0].size = size;
1860 args.out.args[0].value = list;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001861 } else {
Miklos Szeredi70781872014-12-12 09:49:05 +01001862 args.out.args[0].size = sizeof(outarg);
1863 args.out.args[0].value = &outarg;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001864 }
Miklos Szeredi70781872014-12-12 09:49:05 +01001865 ret = fuse_simple_request(fc, &args);
1866 if (!ret && !size)
1867 ret = outarg.size;
1868 if (ret == -ENOSYS) {
1869 fc->no_listxattr = 1;
1870 ret = -EOPNOTSUPP;
Miklos Szeredi92a87802005-09-09 13:10:31 -07001871 }
Miklos Szeredi92a87802005-09-09 13:10:31 -07001872 return ret;
1873}
1874
1875static int fuse_removexattr(struct dentry *entry, const char *name)
1876{
1877 struct inode *inode = entry->d_inode;
1878 struct fuse_conn *fc = get_fuse_conn(inode);
Miklos Szeredi70781872014-12-12 09:49:05 +01001879 FUSE_ARGS(args);
Miklos Szeredi92a87802005-09-09 13:10:31 -07001880 int err;
1881
1882 if (fc->no_removexattr)
1883 return -EOPNOTSUPP;
1884
Miklos Szeredi70781872014-12-12 09:49:05 +01001885 args.in.h.opcode = FUSE_REMOVEXATTR;
1886 args.in.h.nodeid = get_node_id(inode);
1887 args.in.numargs = 1;
1888 args.in.args[0].size = strlen(name) + 1;
1889 args.in.args[0].value = name;
1890 err = fuse_simple_request(fc, &args);
Miklos Szeredi92a87802005-09-09 13:10:31 -07001891 if (err == -ENOSYS) {
1892 fc->no_removexattr = 1;
1893 err = -EOPNOTSUPP;
1894 }
Maxim Patlasov31f32672014-04-28 14:19:24 +02001895 if (!err) {
Anand Avatid331a412013-08-20 02:21:07 -04001896 fuse_invalidate_attr(inode);
Maxim Patlasov31f32672014-04-28 14:19:24 +02001897 fuse_update_ctime(inode);
1898 }
Miklos Szeredi92a87802005-09-09 13:10:31 -07001899 return err;
1900}
1901
Arjan van de Ven754661f2007-02-12 00:55:38 -08001902static const struct inode_operations fuse_dir_inode_operations = {
Miklos Szeredie5e55582005-09-09 13:10:28 -07001903 .lookup = fuse_lookup,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001904 .mkdir = fuse_mkdir,
1905 .symlink = fuse_symlink,
1906 .unlink = fuse_unlink,
1907 .rmdir = fuse_rmdir,
Miklos Szeredi1560c972014-04-28 16:43:44 +02001908 .rename2 = fuse_rename2,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001909 .link = fuse_link,
1910 .setattr = fuse_setattr,
1911 .create = fuse_create,
Miklos Szeredic8ccbe02012-06-05 15:10:22 +02001912 .atomic_open = fuse_atomic_open,
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001913 .mknod = fuse_mknod,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001914 .permission = fuse_permission,
1915 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001916 .setxattr = fuse_setxattr,
1917 .getxattr = fuse_getxattr,
1918 .listxattr = fuse_listxattr,
1919 .removexattr = fuse_removexattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001920};
1921
Arjan van de Ven4b6f5d22006-03-28 01:56:42 -08001922static const struct file_operations fuse_dir_operations = {
Miklos Szeredib6aeade2005-09-09 13:10:30 -07001923 .llseek = generic_file_llseek,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001924 .read = generic_read_dir,
Al Viro8d3af7f2013-05-18 03:03:58 -04001925 .iterate = fuse_readdir,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001926 .open = fuse_dir_open,
1927 .release = fuse_dir_release,
Miklos Szeredi82547982005-09-09 13:10:38 -07001928 .fsync = fuse_dir_fsync,
Miklos Szeredib18da0c2011-12-13 11:58:49 +01001929 .unlocked_ioctl = fuse_dir_ioctl,
1930 .compat_ioctl = fuse_dir_compat_ioctl,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001931};
1932
Arjan van de Ven754661f2007-02-12 00:55:38 -08001933static const struct inode_operations fuse_common_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001934 .setattr = fuse_setattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001935 .permission = fuse_permission,
1936 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001937 .setxattr = fuse_setxattr,
1938 .getxattr = fuse_getxattr,
1939 .listxattr = fuse_listxattr,
1940 .removexattr = fuse_removexattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001941};
1942
Arjan van de Ven754661f2007-02-12 00:55:38 -08001943static const struct inode_operations fuse_symlink_inode_operations = {
Miklos Szeredi9e6268d2005-09-09 13:10:29 -07001944 .setattr = fuse_setattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001945 .follow_link = fuse_follow_link,
1946 .put_link = fuse_put_link,
1947 .readlink = generic_readlink,
1948 .getattr = fuse_getattr,
Miklos Szeredi92a87802005-09-09 13:10:31 -07001949 .setxattr = fuse_setxattr,
1950 .getxattr = fuse_getxattr,
1951 .listxattr = fuse_listxattr,
1952 .removexattr = fuse_removexattr,
Miklos Szeredie5e55582005-09-09 13:10:28 -07001953};
1954
1955void fuse_init_common(struct inode *inode)
1956{
1957 inode->i_op = &fuse_common_inode_operations;
1958}
1959
1960void fuse_init_dir(struct inode *inode)
1961{
1962 inode->i_op = &fuse_dir_inode_operations;
1963 inode->i_fop = &fuse_dir_operations;
1964}
1965
1966void fuse_init_symlink(struct inode *inode)
1967{
1968 inode->i_op = &fuse_symlink_inode_operations;
1969}