]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - fs/fuse/dir.c
fuse: clear FUSE_I_CTIME_DIRTY flag on setattr
[mirror_ubuntu-artful-kernel.git] / fs / fuse / dir.c
CommitLineData
e5e5558e
MS
1/*
2 FUSE: Filesystem in Userspace
1729a16c 3 Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu>
e5e5558e
MS
4
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>
e5e5558e
MS
13#include <linux/sched.h>
14#include <linux/namei.h>
07e77dca 15#include <linux/slab.h>
e5e5558e 16
8d3af7f3 17static bool fuse_use_readdirplus(struct inode *dir, struct dir_context *ctx)
4582a4ab
FS
18{
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;
634734b6
EW
24 if (!fc->readdirplus_auto)
25 return true;
4582a4ab
FS
26 if (test_and_clear_bit(FUSE_I_ADVISE_RDPLUS, &fi->state))
27 return true;
8d3af7f3 28 if (ctx->pos == 0)
4582a4ab
FS
29 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
0a0898cf
MS
40#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
6f9f1180
MS
67/*
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 */
0a0898cf 76static u64 time_to_jiffies(unsigned long sec, unsigned long nsec)
e5e5558e 77{
685d16dd
MS
78 if (sec || nsec) {
79 struct timespec ts = {sec, nsec};
0a0898cf 80 return get_jiffies_64() + timespec_to_jiffies(&ts);
685d16dd 81 } else
0a0898cf 82 return 0;
e5e5558e
MS
83}
84
6f9f1180
MS
85/*
86 * Set dentry and possibly attribute timeouts from the lookup/mk*
87 * replies
88 */
1fb69e78
MS
89static void fuse_change_entry_timeout(struct dentry *entry,
90 struct fuse_entry_out *o)
0aa7c699 91{
0a0898cf
MS
92 fuse_dentry_settime(entry,
93 time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
1fb69e78
MS
94}
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);
8cbdf1e6
MS
104}
105
6f9f1180
MS
106/*
107 * Mark the attributes as stale, so that at the next call to
108 * ->getattr() they will be fetched from userspace
109 */
8cbdf1e6
MS
110void fuse_invalidate_attr(struct inode *inode)
111{
0a0898cf 112 get_fuse_inode(inode)->i_time = 0;
8cbdf1e6
MS
113}
114
451418fc
AG
115/**
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
6f9f1180
MS
125/*
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 */
dbd561d2 133void fuse_invalidate_entry_cache(struct dentry *entry)
8cbdf1e6 134{
0a0898cf 135 fuse_dentry_settime(entry, 0);
8cbdf1e6
MS
136}
137
6f9f1180
MS
138/*
139 * Same as fuse_invalidate_entry_cache(), but also try to remove the
140 * dentry from the hash
141 */
8cbdf1e6
MS
142static void fuse_invalidate_entry(struct dentry *entry)
143{
144 d_invalidate(entry);
145 fuse_invalidate_entry_cache(entry);
0aa7c699
MS
146}
147
c180eebe
MS
148static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_req *req,
149 u64 nodeid, struct qstr *name,
e5e5558e
MS
150 struct fuse_entry_out *outarg)
151{
0e9663ee 152 memset(outarg, 0, sizeof(struct fuse_entry_out));
e5e5558e 153 req->in.h.opcode = FUSE_LOOKUP;
c180eebe 154 req->in.h.nodeid = nodeid;
e5e5558e 155 req->in.numargs = 1;
c180eebe
MS
156 req->in.args[0].size = name->len + 1;
157 req->in.args[0].value = name->name;
e5e5558e 158 req->out.numargs = 1;
0e9663ee
MS
159 if (fc->minor < 9)
160 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
161 else
162 req->out.args[0].size = sizeof(struct fuse_entry_out);
e5e5558e
MS
163 req->out.args[0].value = outarg;
164}
165
5c5c5e51 166u64 fuse_get_attr_version(struct fuse_conn *fc)
7dca9fd3
MS
167{
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
6f9f1180
MS
181/*
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 */
0b728e19 190static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
e5e5558e 191{
34286d66 192 struct inode *inode;
28420dad
MS
193 struct dentry *parent;
194 struct fuse_conn *fc;
6314efee 195 struct fuse_inode *fi;
e2a6b952 196 int ret;
8cbdf1e6 197
e7c0a167 198 inode = ACCESS_ONCE(entry->d_inode);
8cbdf1e6 199 if (inode && is_bad_inode(inode))
e2a6b952 200 goto invalid;
0a0898cf 201 else if (fuse_dentry_time(entry) < get_jiffies_64()) {
e5e5558e 202 int err;
e5e5558e 203 struct fuse_entry_out outarg;
8cbdf1e6 204 struct fuse_req *req;
07e77dca 205 struct fuse_forget_link *forget;
1fb69e78 206 u64 attr_version;
8cbdf1e6 207
50322fe7 208 /* For negative dentries, always do a fresh lookup */
8cbdf1e6 209 if (!inode)
e2a6b952 210 goto invalid;
8cbdf1e6 211
e2a6b952 212 ret = -ECHILD;
0b728e19 213 if (flags & LOOKUP_RCU)
e2a6b952 214 goto out;
e7c0a167 215
8cbdf1e6 216 fc = get_fuse_conn(inode);
b111c8c0 217 req = fuse_get_req_nopages(fc);
e2a6b952 218 ret = PTR_ERR(req);
ce1d5a49 219 if (IS_ERR(req))
e2a6b952 220 goto out;
e5e5558e 221
07e77dca
MS
222 forget = fuse_alloc_forget();
223 if (!forget) {
2d51013e 224 fuse_put_request(fc, req);
e2a6b952
MS
225 ret = -ENOMEM;
226 goto out;
2d51013e
MS
227 }
228
7dca9fd3 229 attr_version = fuse_get_attr_version(fc);
1fb69e78 230
e956edd0 231 parent = dget_parent(entry);
c180eebe
MS
232 fuse_lookup_init(fc, req, get_node_id(parent->d_inode),
233 &entry->d_name, &outarg);
b93f858a 234 fuse_request_send(fc, req);
e956edd0 235 dput(parent);
e5e5558e 236 err = req->out.h.error;
2d51013e 237 fuse_put_request(fc, req);
50322fe7
MS
238 /* Zero nodeid is same as -ENOENT */
239 if (!err && !outarg.nodeid)
240 err = -ENOENT;
9e6268db 241 if (!err) {
6314efee 242 fi = get_fuse_inode(inode);
9e6268db 243 if (outarg.nodeid != get_node_id(inode)) {
07e77dca 244 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
e2a6b952 245 goto invalid;
9e6268db 246 }
8da5ff23 247 spin_lock(&fc->lock);
1729a16c 248 fi->nlookup++;
8da5ff23 249 spin_unlock(&fc->lock);
9e6268db 250 }
07e77dca 251 kfree(forget);
9e6268db 252 if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
e2a6b952 253 goto invalid;
e5e5558e 254
1fb69e78
MS
255 fuse_change_attributes(inode, &outarg.attr,
256 entry_attr_timeout(&outarg),
257 attr_version);
258 fuse_change_entry_timeout(entry, &outarg);
28420dad 259 } else if (inode) {
6314efee
MS
260 fi = get_fuse_inode(inode);
261 if (flags & LOOKUP_RCU) {
262 if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state))
263 return -ECHILD;
264 } else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) {
28420dad
MS
265 parent = dget_parent(entry);
266 fuse_advise_use_readdirplus(parent->d_inode);
267 dput(parent);
268 }
e5e5558e 269 }
e2a6b952
MS
270 ret = 1;
271out:
272 return ret;
273
274invalid:
275 ret = 0;
3c70b8ee
MS
276
277 if (!(flags & LOOKUP_RCU) && check_submounts_and_drop(entry) != 0)
46ea1562 278 ret = 1;
e2a6b952 279 goto out;
e5e5558e
MS
280}
281
8bfc016d 282static int invalid_nodeid(u64 nodeid)
2827d0b2
MS
283{
284 return !nodeid || nodeid == FUSE_ROOT_ID;
285}
286
4269590a 287const struct dentry_operations fuse_dentry_operations = {
e5e5558e
MS
288 .d_revalidate = fuse_dentry_revalidate,
289};
290
a5bfffac 291int fuse_valid_type(int m)
39ee059a
MS
292{
293 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
294 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
295}
296
c180eebe
MS
297int fuse_lookup_name(struct super_block *sb, u64 nodeid, struct qstr *name,
298 struct fuse_entry_out *outarg, struct inode **inode)
e5e5558e 299{
c180eebe 300 struct fuse_conn *fc = get_fuse_conn_super(sb);
e5e5558e 301 struct fuse_req *req;
07e77dca 302 struct fuse_forget_link *forget;
1fb69e78 303 u64 attr_version;
c180eebe 304 int err;
e5e5558e 305
c180eebe
MS
306 *inode = NULL;
307 err = -ENAMETOOLONG;
308 if (name->len > FUSE_NAME_MAX)
309 goto out;
e5e5558e 310
b111c8c0 311 req = fuse_get_req_nopages(fc);
c180eebe 312 err = PTR_ERR(req);
ce1d5a49 313 if (IS_ERR(req))
c180eebe 314 goto out;
e5e5558e 315
07e77dca
MS
316 forget = fuse_alloc_forget();
317 err = -ENOMEM;
318 if (!forget) {
2d51013e 319 fuse_put_request(fc, req);
c180eebe 320 goto out;
2d51013e
MS
321 }
322
7dca9fd3 323 attr_version = fuse_get_attr_version(fc);
1fb69e78 324
c180eebe 325 fuse_lookup_init(fc, req, nodeid, name, outarg);
b93f858a 326 fuse_request_send(fc, req);
e5e5558e 327 err = req->out.h.error;
2d51013e 328 fuse_put_request(fc, req);
50322fe7 329 /* Zero nodeid is same as -ENOENT, but with valid timeout */
c180eebe
MS
330 if (err || !outarg->nodeid)
331 goto out_put_forget;
332
333 err = -EIO;
334 if (!outarg->nodeid)
335 goto out_put_forget;
336 if (!fuse_valid_type(outarg->attr.mode))
337 goto out_put_forget;
338
339 *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
340 &outarg->attr, entry_attr_timeout(outarg),
341 attr_version);
342 err = -ENOMEM;
343 if (!*inode) {
07e77dca 344 fuse_queue_forget(fc, forget, outarg->nodeid, 1);
c180eebe 345 goto out;
e5e5558e 346 }
c180eebe
MS
347 err = 0;
348
349 out_put_forget:
07e77dca 350 kfree(forget);
c180eebe
MS
351 out:
352 return err;
353}
354
355static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
00cd8dd3 356 unsigned int flags)
c180eebe
MS
357{
358 int err;
359 struct fuse_entry_out outarg;
360 struct inode *inode;
361 struct dentry *newent;
c180eebe
MS
362 bool outarg_valid = true;
363
364 err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
365 &outarg, &inode);
366 if (err == -ENOENT) {
367 outarg_valid = false;
368 err = 0;
369 }
370 if (err)
371 goto out_err;
372
373 err = -EIO;
374 if (inode && get_node_id(inode) == FUSE_ROOT_ID)
375 goto out_iput;
e5e5558e 376
b70a80e7 377 newent = d_materialise_unique(entry, inode);
5835f339
MS
378 err = PTR_ERR(newent);
379 if (IS_ERR(newent))
380 goto out_err;
d2a85164 381
0de6256d 382 entry = newent ? newent : entry;
c180eebe 383 if (outarg_valid)
1fb69e78 384 fuse_change_entry_timeout(entry, &outarg);
8cbdf1e6
MS
385 else
386 fuse_invalidate_entry_cache(entry);
c180eebe 387
4582a4ab 388 fuse_advise_use_readdirplus(dir);
0de6256d 389 return newent;
c180eebe
MS
390
391 out_iput:
392 iput(inode);
393 out_err:
394 return ERR_PTR(err);
e5e5558e
MS
395}
396
6f9f1180
MS
397/*
398 * Atomic create+open operation
399 *
400 * If the filesystem doesn't support this, then fall back to separate
401 * 'mknod' + 'open' requests.
402 */
d9585277 403static int fuse_create_open(struct inode *dir, struct dentry *entry,
30d90494 404 struct file *file, unsigned flags,
d9585277 405 umode_t mode, int *opened)
fd72faac
MS
406{
407 int err;
408 struct inode *inode;
409 struct fuse_conn *fc = get_fuse_conn(dir);
410 struct fuse_req *req;
07e77dca 411 struct fuse_forget_link *forget;
e0a43ddc 412 struct fuse_create_in inarg;
fd72faac
MS
413 struct fuse_open_out outopen;
414 struct fuse_entry_out outentry;
fd72faac 415 struct fuse_file *ff;
fd72faac 416
af109bca
MS
417 /* Userspace expects S_IFREG in create mode */
418 BUG_ON((mode & S_IFMT) != S_IFREG);
419
07e77dca 420 forget = fuse_alloc_forget();
c8ccbe03 421 err = -ENOMEM;
07e77dca 422 if (!forget)
c8ccbe03 423 goto out_err;
51eb01e7 424
b111c8c0 425 req = fuse_get_req_nopages(fc);
51eb01e7 426 err = PTR_ERR(req);
ce1d5a49 427 if (IS_ERR(req))
51eb01e7 428 goto out_put_forget_req;
fd72faac 429
ce1d5a49 430 err = -ENOMEM;
acf99433 431 ff = fuse_file_alloc(fc);
fd72faac
MS
432 if (!ff)
433 goto out_put_request;
434
e0a43ddc
MS
435 if (!fc->dont_mask)
436 mode &= ~current_umask();
437
fd72faac
MS
438 flags &= ~O_NOCTTY;
439 memset(&inarg, 0, sizeof(inarg));
0e9663ee 440 memset(&outentry, 0, sizeof(outentry));
fd72faac
MS
441 inarg.flags = flags;
442 inarg.mode = mode;
e0a43ddc 443 inarg.umask = current_umask();
fd72faac
MS
444 req->in.h.opcode = FUSE_CREATE;
445 req->in.h.nodeid = get_node_id(dir);
fd72faac 446 req->in.numargs = 2;
e0a43ddc
MS
447 req->in.args[0].size = fc->minor < 12 ? sizeof(struct fuse_open_in) :
448 sizeof(inarg);
fd72faac
MS
449 req->in.args[0].value = &inarg;
450 req->in.args[1].size = entry->d_name.len + 1;
451 req->in.args[1].value = entry->d_name.name;
452 req->out.numargs = 2;
0e9663ee
MS
453 if (fc->minor < 9)
454 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
455 else
456 req->out.args[0].size = sizeof(outentry);
fd72faac
MS
457 req->out.args[0].value = &outentry;
458 req->out.args[1].size = sizeof(outopen);
459 req->out.args[1].value = &outopen;
b93f858a 460 fuse_request_send(fc, req);
fd72faac 461 err = req->out.h.error;
c8ccbe03 462 if (err)
fd72faac 463 goto out_free_ff;
fd72faac
MS
464
465 err = -EIO;
2827d0b2 466 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
fd72faac
MS
467 goto out_free_ff;
468
51eb01e7 469 fuse_put_request(fc, req);
c7b7143c
MS
470 ff->fh = outopen.fh;
471 ff->nodeid = outentry.nodeid;
472 ff->open_flags = outopen.open_flags;
fd72faac 473 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
1fb69e78 474 &outentry.attr, entry_attr_timeout(&outentry), 0);
fd72faac
MS
475 if (!inode) {
476 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
8b0797a4 477 fuse_sync_release(ff, flags);
07e77dca 478 fuse_queue_forget(fc, forget, outentry.nodeid, 1);
c8ccbe03
MS
479 err = -ENOMEM;
480 goto out_err;
fd72faac 481 }
07e77dca 482 kfree(forget);
fd72faac 483 d_instantiate(entry, inode);
1fb69e78 484 fuse_change_entry_timeout(entry, &outentry);
0952b2a4 485 fuse_invalidate_attr(dir);
30d90494
AV
486 err = finish_open(file, entry, generic_file_open, opened);
487 if (err) {
8b0797a4 488 fuse_sync_release(ff, flags);
c8ccbe03
MS
489 } else {
490 file->private_data = fuse_file_get(ff);
491 fuse_finish_open(inode, file);
fd72faac 492 }
d9585277 493 return err;
fd72faac 494
c8ccbe03 495out_free_ff:
fd72faac 496 fuse_file_free(ff);
c8ccbe03 497out_put_request:
fd72faac 498 fuse_put_request(fc, req);
c8ccbe03 499out_put_forget_req:
07e77dca 500 kfree(forget);
c8ccbe03 501out_err:
d9585277 502 return err;
c8ccbe03
MS
503}
504
505static int fuse_mknod(struct inode *, struct dentry *, umode_t, dev_t);
d9585277 506static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
30d90494 507 struct file *file, unsigned flags,
d9585277 508 umode_t mode, int *opened)
c8ccbe03
MS
509{
510 int err;
511 struct fuse_conn *fc = get_fuse_conn(dir);
c8ccbe03
MS
512 struct dentry *res = NULL;
513
514 if (d_unhashed(entry)) {
00cd8dd3 515 res = fuse_lookup(dir, entry, 0);
c8ccbe03 516 if (IS_ERR(res))
d9585277 517 return PTR_ERR(res);
c8ccbe03
MS
518
519 if (res)
520 entry = res;
521 }
522
523 if (!(flags & O_CREAT) || entry->d_inode)
524 goto no_open;
525
526 /* Only creates */
47237687 527 *opened |= FILE_CREATED;
c8ccbe03
MS
528
529 if (fc->no_create)
530 goto mknod;
531
30d90494 532 err = fuse_create_open(dir, entry, file, flags, mode, opened);
d9585277 533 if (err == -ENOSYS) {
c8ccbe03
MS
534 fc->no_create = 1;
535 goto mknod;
536 }
537out_dput:
538 dput(res);
d9585277 539 return err;
c8ccbe03
MS
540
541mknod:
542 err = fuse_mknod(dir, entry, mode, 0);
d9585277 543 if (err)
c8ccbe03 544 goto out_dput;
c8ccbe03 545no_open:
e45198a6 546 return finish_no_open(file, res);
fd72faac
MS
547}
548
6f9f1180
MS
549/*
550 * Code shared between mknod, mkdir, symlink and link
551 */
9e6268db
MS
552static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
553 struct inode *dir, struct dentry *entry,
541af6a0 554 umode_t mode)
9e6268db
MS
555{
556 struct fuse_entry_out outarg;
557 struct inode *inode;
9e6268db 558 int err;
07e77dca 559 struct fuse_forget_link *forget;
2d51013e 560
07e77dca
MS
561 forget = fuse_alloc_forget();
562 if (!forget) {
2d51013e 563 fuse_put_request(fc, req);
07e77dca 564 return -ENOMEM;
2d51013e 565 }
9e6268db 566
0e9663ee 567 memset(&outarg, 0, sizeof(outarg));
9e6268db 568 req->in.h.nodeid = get_node_id(dir);
9e6268db 569 req->out.numargs = 1;
0e9663ee
MS
570 if (fc->minor < 9)
571 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
572 else
573 req->out.args[0].size = sizeof(outarg);
9e6268db 574 req->out.args[0].value = &outarg;
b93f858a 575 fuse_request_send(fc, req);
9e6268db 576 err = req->out.h.error;
2d51013e
MS
577 fuse_put_request(fc, req);
578 if (err)
579 goto out_put_forget_req;
580
39ee059a
MS
581 err = -EIO;
582 if (invalid_nodeid(outarg.nodeid))
2d51013e 583 goto out_put_forget_req;
39ee059a
MS
584
585 if ((outarg.attr.mode ^ mode) & S_IFMT)
2d51013e 586 goto out_put_forget_req;
39ee059a 587
9e6268db 588 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
1fb69e78 589 &outarg.attr, entry_attr_timeout(&outarg), 0);
9e6268db 590 if (!inode) {
07e77dca 591 fuse_queue_forget(fc, forget, outarg.nodeid, 1);
9e6268db
MS
592 return -ENOMEM;
593 }
07e77dca 594 kfree(forget);
9e6268db 595
b70a80e7
MS
596 err = d_instantiate_no_diralias(entry, inode);
597 if (err)
598 return err;
9e6268db 599
1fb69e78 600 fuse_change_entry_timeout(entry, &outarg);
9e6268db
MS
601 fuse_invalidate_attr(dir);
602 return 0;
39ee059a 603
2d51013e 604 out_put_forget_req:
07e77dca 605 kfree(forget);
39ee059a 606 return err;
9e6268db
MS
607}
608
1a67aafb 609static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode,
9e6268db
MS
610 dev_t rdev)
611{
612 struct fuse_mknod_in inarg;
613 struct fuse_conn *fc = get_fuse_conn(dir);
b111c8c0 614 struct fuse_req *req = fuse_get_req_nopages(fc);
ce1d5a49
MS
615 if (IS_ERR(req))
616 return PTR_ERR(req);
9e6268db 617
e0a43ddc
MS
618 if (!fc->dont_mask)
619 mode &= ~current_umask();
620
9e6268db
MS
621 memset(&inarg, 0, sizeof(inarg));
622 inarg.mode = mode;
623 inarg.rdev = new_encode_dev(rdev);
e0a43ddc 624 inarg.umask = current_umask();
9e6268db
MS
625 req->in.h.opcode = FUSE_MKNOD;
626 req->in.numargs = 2;
e0a43ddc
MS
627 req->in.args[0].size = fc->minor < 12 ? FUSE_COMPAT_MKNOD_IN_SIZE :
628 sizeof(inarg);
9e6268db
MS
629 req->in.args[0].value = &inarg;
630 req->in.args[1].size = entry->d_name.len + 1;
631 req->in.args[1].value = entry->d_name.name;
632 return create_new_entry(fc, req, dir, entry, mode);
633}
634
4acdaf27 635static int fuse_create(struct inode *dir, struct dentry *entry, umode_t mode,
ebfc3b49 636 bool excl)
9e6268db
MS
637{
638 return fuse_mknod(dir, entry, mode, 0);
639}
640
18bb1db3 641static int fuse_mkdir(struct inode *dir, struct dentry *entry, umode_t mode)
9e6268db
MS
642{
643 struct fuse_mkdir_in inarg;
644 struct fuse_conn *fc = get_fuse_conn(dir);
b111c8c0 645 struct fuse_req *req = fuse_get_req_nopages(fc);
ce1d5a49
MS
646 if (IS_ERR(req))
647 return PTR_ERR(req);
9e6268db 648
e0a43ddc
MS
649 if (!fc->dont_mask)
650 mode &= ~current_umask();
651
9e6268db
MS
652 memset(&inarg, 0, sizeof(inarg));
653 inarg.mode = mode;
e0a43ddc 654 inarg.umask = current_umask();
9e6268db
MS
655 req->in.h.opcode = FUSE_MKDIR;
656 req->in.numargs = 2;
657 req->in.args[0].size = sizeof(inarg);
658 req->in.args[0].value = &inarg;
659 req->in.args[1].size = entry->d_name.len + 1;
660 req->in.args[1].value = entry->d_name.name;
661 return create_new_entry(fc, req, dir, entry, S_IFDIR);
662}
663
664static int fuse_symlink(struct inode *dir, struct dentry *entry,
665 const char *link)
666{
667 struct fuse_conn *fc = get_fuse_conn(dir);
668 unsigned len = strlen(link) + 1;
b111c8c0 669 struct fuse_req *req = fuse_get_req_nopages(fc);
ce1d5a49
MS
670 if (IS_ERR(req))
671 return PTR_ERR(req);
9e6268db
MS
672
673 req->in.h.opcode = FUSE_SYMLINK;
674 req->in.numargs = 2;
675 req->in.args[0].size = entry->d_name.len + 1;
676 req->in.args[0].value = entry->d_name.name;
677 req->in.args[1].size = len;
678 req->in.args[1].value = link;
679 return create_new_entry(fc, req, dir, entry, S_IFLNK);
680}
681
31f3267b
MP
682static inline void fuse_update_ctime(struct inode *inode)
683{
684 if (!IS_NOCMTIME(inode)) {
685 inode->i_ctime = current_fs_time(inode->i_sb);
686 mark_inode_dirty_sync(inode);
687 }
688}
689
9e6268db
MS
690static int fuse_unlink(struct inode *dir, struct dentry *entry)
691{
692 int err;
693 struct fuse_conn *fc = get_fuse_conn(dir);
b111c8c0 694 struct fuse_req *req = fuse_get_req_nopages(fc);
ce1d5a49
MS
695 if (IS_ERR(req))
696 return PTR_ERR(req);
9e6268db
MS
697
698 req->in.h.opcode = FUSE_UNLINK;
699 req->in.h.nodeid = get_node_id(dir);
9e6268db
MS
700 req->in.numargs = 1;
701 req->in.args[0].size = entry->d_name.len + 1;
702 req->in.args[0].value = entry->d_name.name;
b93f858a 703 fuse_request_send(fc, req);
9e6268db
MS
704 err = req->out.h.error;
705 fuse_put_request(fc, req);
706 if (!err) {
707 struct inode *inode = entry->d_inode;
ac45d613 708 struct fuse_inode *fi = get_fuse_inode(inode);
9e6268db 709
ac45d613
MS
710 spin_lock(&fc->lock);
711 fi->attr_version = ++fc->attr_version;
dfca7ceb
MS
712 /*
713 * If i_nlink == 0 then unlink doesn't make sense, yet this can
714 * happen if userspace filesystem is careless. It would be
715 * difficult to enforce correct nlink usage so just ignore this
716 * condition here
717 */
718 if (inode->i_nlink > 0)
719 drop_nlink(inode);
ac45d613 720 spin_unlock(&fc->lock);
9e6268db
MS
721 fuse_invalidate_attr(inode);
722 fuse_invalidate_attr(dir);
8cbdf1e6 723 fuse_invalidate_entry_cache(entry);
31f3267b 724 fuse_update_ctime(inode);
9e6268db
MS
725 } else if (err == -EINTR)
726 fuse_invalidate_entry(entry);
727 return err;
728}
729
730static int fuse_rmdir(struct inode *dir, struct dentry *entry)
731{
732 int err;
733 struct fuse_conn *fc = get_fuse_conn(dir);
b111c8c0 734 struct fuse_req *req = fuse_get_req_nopages(fc);
ce1d5a49
MS
735 if (IS_ERR(req))
736 return PTR_ERR(req);
9e6268db
MS
737
738 req->in.h.opcode = FUSE_RMDIR;
739 req->in.h.nodeid = get_node_id(dir);
9e6268db
MS
740 req->in.numargs = 1;
741 req->in.args[0].size = entry->d_name.len + 1;
742 req->in.args[0].value = entry->d_name.name;
b93f858a 743 fuse_request_send(fc, req);
9e6268db
MS
744 err = req->out.h.error;
745 fuse_put_request(fc, req);
746 if (!err) {
ce71ec36 747 clear_nlink(entry->d_inode);
9e6268db 748 fuse_invalidate_attr(dir);
8cbdf1e6 749 fuse_invalidate_entry_cache(entry);
9e6268db
MS
750 } else if (err == -EINTR)
751 fuse_invalidate_entry(entry);
752 return err;
753}
754
755static int fuse_rename(struct inode *olddir, struct dentry *oldent,
756 struct inode *newdir, struct dentry *newent)
757{
758 int err;
759 struct fuse_rename_in inarg;
760 struct fuse_conn *fc = get_fuse_conn(olddir);
b111c8c0 761 struct fuse_req *req = fuse_get_req_nopages(fc);
e4eaac06 762
ce1d5a49
MS
763 if (IS_ERR(req))
764 return PTR_ERR(req);
9e6268db
MS
765
766 memset(&inarg, 0, sizeof(inarg));
767 inarg.newdir = get_node_id(newdir);
768 req->in.h.opcode = FUSE_RENAME;
769 req->in.h.nodeid = get_node_id(olddir);
9e6268db
MS
770 req->in.numargs = 3;
771 req->in.args[0].size = sizeof(inarg);
772 req->in.args[0].value = &inarg;
773 req->in.args[1].size = oldent->d_name.len + 1;
774 req->in.args[1].value = oldent->d_name.name;
775 req->in.args[2].size = newent->d_name.len + 1;
776 req->in.args[2].value = newent->d_name.name;
b93f858a 777 fuse_request_send(fc, req);
9e6268db
MS
778 err = req->out.h.error;
779 fuse_put_request(fc, req);
780 if (!err) {
08b63307
MS
781 /* ctime changes */
782 fuse_invalidate_attr(oldent->d_inode);
31f3267b 783 fuse_update_ctime(oldent->d_inode);
08b63307 784
9e6268db
MS
785 fuse_invalidate_attr(olddir);
786 if (olddir != newdir)
787 fuse_invalidate_attr(newdir);
8cbdf1e6
MS
788
789 /* newent will end up negative */
5219f346
MS
790 if (newent->d_inode) {
791 fuse_invalidate_attr(newent->d_inode);
8cbdf1e6 792 fuse_invalidate_entry_cache(newent);
31f3267b 793 fuse_update_ctime(newent->d_inode);
5219f346 794 }
9e6268db
MS
795 } else if (err == -EINTR) {
796 /* If request was interrupted, DEITY only knows if the
797 rename actually took place. If the invalidation
798 fails (e.g. some process has CWD under the renamed
799 directory), then there can be inconsistency between
800 the dcache and the real filesystem. Tough luck. */
801 fuse_invalidate_entry(oldent);
802 if (newent->d_inode)
803 fuse_invalidate_entry(newent);
804 }
805
806 return err;
807}
808
809static int fuse_link(struct dentry *entry, struct inode *newdir,
810 struct dentry *newent)
811{
812 int err;
813 struct fuse_link_in inarg;
814 struct inode *inode = entry->d_inode;
815 struct fuse_conn *fc = get_fuse_conn(inode);
b111c8c0 816 struct fuse_req *req = fuse_get_req_nopages(fc);
ce1d5a49
MS
817 if (IS_ERR(req))
818 return PTR_ERR(req);
9e6268db
MS
819
820 memset(&inarg, 0, sizeof(inarg));
821 inarg.oldnodeid = get_node_id(inode);
822 req->in.h.opcode = FUSE_LINK;
9e6268db
MS
823 req->in.numargs = 2;
824 req->in.args[0].size = sizeof(inarg);
825 req->in.args[0].value = &inarg;
826 req->in.args[1].size = newent->d_name.len + 1;
827 req->in.args[1].value = newent->d_name.name;
828 err = create_new_entry(fc, req, newdir, newent, inode->i_mode);
829 /* Contrary to "normal" filesystems it can happen that link
830 makes two "logical" inodes point to the same "physical"
831 inode. We invalidate the attributes of the old one, so it
832 will reflect changes in the backing inode (link count,
833 etc.)
834 */
ac45d613
MS
835 if (!err) {
836 struct fuse_inode *fi = get_fuse_inode(inode);
837
838 spin_lock(&fc->lock);
839 fi->attr_version = ++fc->attr_version;
840 inc_nlink(inode);
841 spin_unlock(&fc->lock);
9e6268db 842 fuse_invalidate_attr(inode);
31f3267b 843 fuse_update_ctime(inode);
ac45d613
MS
844 } else if (err == -EINTR) {
845 fuse_invalidate_attr(inode);
846 }
9e6268db
MS
847 return err;
848}
849
1fb69e78
MS
850static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
851 struct kstat *stat)
852{
203627bb 853 unsigned int blkbits;
8373200b
PE
854 struct fuse_conn *fc = get_fuse_conn(inode);
855
856 /* see the comment in fuse_change_attributes() */
b0aa7606 857 if (fc->writeback_cache && S_ISREG(inode->i_mode)) {
8373200b 858 attr->size = i_size_read(inode);
b0aa7606
MP
859 attr->mtime = inode->i_mtime.tv_sec;
860 attr->mtimensec = inode->i_mtime.tv_nsec;
31f3267b
MP
861 attr->ctime = inode->i_ctime.tv_sec;
862 attr->ctimensec = inode->i_ctime.tv_nsec;
b0aa7606 863 }
203627bb 864
1fb69e78
MS
865 stat->dev = inode->i_sb->s_dev;
866 stat->ino = attr->ino;
867 stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
868 stat->nlink = attr->nlink;
499dcf20
EB
869 stat->uid = make_kuid(&init_user_ns, attr->uid);
870 stat->gid = make_kgid(&init_user_ns, attr->gid);
1fb69e78
MS
871 stat->rdev = inode->i_rdev;
872 stat->atime.tv_sec = attr->atime;
873 stat->atime.tv_nsec = attr->atimensec;
874 stat->mtime.tv_sec = attr->mtime;
875 stat->mtime.tv_nsec = attr->mtimensec;
876 stat->ctime.tv_sec = attr->ctime;
877 stat->ctime.tv_nsec = attr->ctimensec;
878 stat->size = attr->size;
879 stat->blocks = attr->blocks;
203627bb
MS
880
881 if (attr->blksize != 0)
882 blkbits = ilog2(attr->blksize);
883 else
884 blkbits = inode->i_sb->s_blocksize_bits;
885
886 stat->blksize = 1 << blkbits;
1fb69e78
MS
887}
888
c79e322f
MS
889static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
890 struct file *file)
e5e5558e
MS
891{
892 int err;
c79e322f
MS
893 struct fuse_getattr_in inarg;
894 struct fuse_attr_out outarg;
e5e5558e 895 struct fuse_conn *fc = get_fuse_conn(inode);
1fb69e78
MS
896 struct fuse_req *req;
897 u64 attr_version;
898
b111c8c0 899 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
900 if (IS_ERR(req))
901 return PTR_ERR(req);
e5e5558e 902
7dca9fd3 903 attr_version = fuse_get_attr_version(fc);
1fb69e78 904
c79e322f 905 memset(&inarg, 0, sizeof(inarg));
0e9663ee 906 memset(&outarg, 0, sizeof(outarg));
c79e322f
MS
907 /* Directories have separate file-handle space */
908 if (file && S_ISREG(inode->i_mode)) {
909 struct fuse_file *ff = file->private_data;
910
911 inarg.getattr_flags |= FUSE_GETATTR_FH;
912 inarg.fh = ff->fh;
913 }
e5e5558e
MS
914 req->in.h.opcode = FUSE_GETATTR;
915 req->in.h.nodeid = get_node_id(inode);
c79e322f
MS
916 req->in.numargs = 1;
917 req->in.args[0].size = sizeof(inarg);
918 req->in.args[0].value = &inarg;
e5e5558e 919 req->out.numargs = 1;
0e9663ee
MS
920 if (fc->minor < 9)
921 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
922 else
923 req->out.args[0].size = sizeof(outarg);
c79e322f 924 req->out.args[0].value = &outarg;
b93f858a 925 fuse_request_send(fc, req);
e5e5558e
MS
926 err = req->out.h.error;
927 fuse_put_request(fc, req);
928 if (!err) {
c79e322f 929 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
e5e5558e
MS
930 make_bad_inode(inode);
931 err = -EIO;
932 } else {
c79e322f
MS
933 fuse_change_attributes(inode, &outarg.attr,
934 attr_timeout(&outarg),
1fb69e78
MS
935 attr_version);
936 if (stat)
c79e322f 937 fuse_fillattr(inode, &outarg.attr, stat);
e5e5558e
MS
938 }
939 }
940 return err;
941}
942
bcb4be80
MS
943int fuse_update_attributes(struct inode *inode, struct kstat *stat,
944 struct file *file, bool *refreshed)
945{
946 struct fuse_inode *fi = get_fuse_inode(inode);
947 int err;
948 bool r;
949
950 if (fi->i_time < get_jiffies_64()) {
951 r = true;
952 err = fuse_do_getattr(inode, stat, file);
953 } else {
954 r = false;
955 err = 0;
956 if (stat) {
957 generic_fillattr(inode, stat);
958 stat->mode = fi->orig_i_mode;
45c72cd7 959 stat->ino = fi->orig_ino;
bcb4be80
MS
960 }
961 }
962
963 if (refreshed != NULL)
964 *refreshed = r;
965
966 return err;
967}
968
3b463ae0 969int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
451d0f59 970 u64 child_nodeid, struct qstr *name)
3b463ae0
JM
971{
972 int err = -ENOTDIR;
973 struct inode *parent;
974 struct dentry *dir;
975 struct dentry *entry;
976
977 parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
978 if (!parent)
979 return -ENOENT;
980
981 mutex_lock(&parent->i_mutex);
982 if (!S_ISDIR(parent->i_mode))
983 goto unlock;
984
985 err = -ENOENT;
986 dir = d_find_alias(parent);
987 if (!dir)
988 goto unlock;
989
990 entry = d_lookup(dir, name);
991 dput(dir);
992 if (!entry)
993 goto unlock;
994
995 fuse_invalidate_attr(parent);
996 fuse_invalidate_entry(entry);
451d0f59
JM
997
998 if (child_nodeid != 0 && entry->d_inode) {
999 mutex_lock(&entry->d_inode->i_mutex);
1000 if (get_node_id(entry->d_inode) != child_nodeid) {
1001 err = -ENOENT;
1002 goto badentry;
1003 }
1004 if (d_mountpoint(entry)) {
1005 err = -EBUSY;
1006 goto badentry;
1007 }
1008 if (S_ISDIR(entry->d_inode->i_mode)) {
1009 shrink_dcache_parent(entry);
1010 if (!simple_empty(entry)) {
1011 err = -ENOTEMPTY;
1012 goto badentry;
1013 }
1014 entry->d_inode->i_flags |= S_DEAD;
1015 }
1016 dont_mount(entry);
1017 clear_nlink(entry->d_inode);
1018 err = 0;
1019 badentry:
1020 mutex_unlock(&entry->d_inode->i_mutex);
1021 if (!err)
1022 d_delete(entry);
1023 } else {
1024 err = 0;
1025 }
3b463ae0 1026 dput(entry);
3b463ae0
JM
1027
1028 unlock:
1029 mutex_unlock(&parent->i_mutex);
1030 iput(parent);
1031 return err;
1032}
1033
87729a55
MS
1034/*
1035 * Calling into a user-controlled filesystem gives the filesystem
c2132c1b 1036 * daemon ptrace-like capabilities over the current process. This
87729a55
MS
1037 * means, that the filesystem daemon is able to record the exact
1038 * filesystem operations performed, and can also control the behavior
1039 * of the requester process in otherwise impossible ways. For example
1040 * it can delay the operation for arbitrary length of time allowing
1041 * DoS against the requester.
1042 *
1043 * For this reason only those processes can call into the filesystem,
1044 * for which the owner of the mount has ptrace privilege. This
1045 * excludes processes started by other users, suid or sgid processes.
1046 */
c2132c1b 1047int fuse_allow_current_process(struct fuse_conn *fc)
87729a55 1048{
c69e8d9c 1049 const struct cred *cred;
87729a55 1050
c69e8d9c 1051 if (fc->flags & FUSE_ALLOW_OTHER)
87729a55
MS
1052 return 1;
1053
c2132c1b 1054 cred = current_cred();
499dcf20
EB
1055 if (uid_eq(cred->euid, fc->user_id) &&
1056 uid_eq(cred->suid, fc->user_id) &&
1057 uid_eq(cred->uid, fc->user_id) &&
1058 gid_eq(cred->egid, fc->group_id) &&
1059 gid_eq(cred->sgid, fc->group_id) &&
1060 gid_eq(cred->gid, fc->group_id))
c2132c1b 1061 return 1;
c69e8d9c 1062
c2132c1b 1063 return 0;
87729a55
MS
1064}
1065
31d40d74
MS
1066static int fuse_access(struct inode *inode, int mask)
1067{
1068 struct fuse_conn *fc = get_fuse_conn(inode);
1069 struct fuse_req *req;
1070 struct fuse_access_in inarg;
1071 int err;
1072
698fa1d1
MS
1073 BUG_ON(mask & MAY_NOT_BLOCK);
1074
31d40d74
MS
1075 if (fc->no_access)
1076 return 0;
1077
b111c8c0 1078 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1079 if (IS_ERR(req))
1080 return PTR_ERR(req);
31d40d74
MS
1081
1082 memset(&inarg, 0, sizeof(inarg));
e6305c43 1083 inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
31d40d74
MS
1084 req->in.h.opcode = FUSE_ACCESS;
1085 req->in.h.nodeid = get_node_id(inode);
31d40d74
MS
1086 req->in.numargs = 1;
1087 req->in.args[0].size = sizeof(inarg);
1088 req->in.args[0].value = &inarg;
b93f858a 1089 fuse_request_send(fc, req);
31d40d74
MS
1090 err = req->out.h.error;
1091 fuse_put_request(fc, req);
1092 if (err == -ENOSYS) {
1093 fc->no_access = 1;
1094 err = 0;
1095 }
1096 return err;
1097}
1098
10556cb2 1099static int fuse_perm_getattr(struct inode *inode, int mask)
19690ddb 1100{
10556cb2 1101 if (mask & MAY_NOT_BLOCK)
19690ddb
MS
1102 return -ECHILD;
1103
1104 return fuse_do_getattr(inode, NULL, NULL);
1105}
1106
6f9f1180
MS
1107/*
1108 * Check permission. The two basic access models of FUSE are:
1109 *
1110 * 1) Local access checking ('default_permissions' mount option) based
1111 * on file mode. This is the plain old disk filesystem permission
1112 * modell.
1113 *
1114 * 2) "Remote" access checking, where server is responsible for
1115 * checking permission in each inode operation. An exception to this
1116 * is if ->permission() was invoked from sys_access() in which case an
1117 * access request is sent. Execute permission is still checked
1118 * locally based on file mode.
1119 */
10556cb2 1120static int fuse_permission(struct inode *inode, int mask)
e5e5558e
MS
1121{
1122 struct fuse_conn *fc = get_fuse_conn(inode);
244f6385
MS
1123 bool refreshed = false;
1124 int err = 0;
e5e5558e 1125
c2132c1b 1126 if (!fuse_allow_current_process(fc))
e5e5558e 1127 return -EACCES;
244f6385
MS
1128
1129 /*
e8e96157 1130 * If attributes are needed, refresh them before proceeding
244f6385 1131 */
e8e96157
MS
1132 if ((fc->flags & FUSE_DEFAULT_PERMISSIONS) ||
1133 ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
19690ddb
MS
1134 struct fuse_inode *fi = get_fuse_inode(inode);
1135
1136 if (fi->i_time < get_jiffies_64()) {
1137 refreshed = true;
1138
10556cb2 1139 err = fuse_perm_getattr(inode, mask);
19690ddb
MS
1140 if (err)
1141 return err;
1142 }
244f6385
MS
1143 }
1144
1145 if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
2830ba7f 1146 err = generic_permission(inode, mask);
1e9a4ed9
MS
1147
1148 /* If permission is denied, try to refresh file
1149 attributes. This is also needed, because the root
1150 node will at first have no permissions */
244f6385 1151 if (err == -EACCES && !refreshed) {
10556cb2 1152 err = fuse_perm_getattr(inode, mask);
1e9a4ed9 1153 if (!err)
2830ba7f 1154 err = generic_permission(inode, mask);
1e9a4ed9
MS
1155 }
1156
6f9f1180
MS
1157 /* Note: the opposite of the above test does not
1158 exist. So if permissions are revoked this won't be
1159 noticed immediately, only after the attribute
1160 timeout has expired */
9cfcac81 1161 } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
e8e96157
MS
1162 err = fuse_access(inode, mask);
1163 } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1164 if (!(inode->i_mode & S_IXUGO)) {
1165 if (refreshed)
1166 return -EACCES;
1167
10556cb2 1168 err = fuse_perm_getattr(inode, mask);
e8e96157
MS
1169 if (!err && !(inode->i_mode & S_IXUGO))
1170 return -EACCES;
1171 }
e5e5558e 1172 }
244f6385 1173 return err;
e5e5558e
MS
1174}
1175
1176static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
8d3af7f3 1177 struct dir_context *ctx)
e5e5558e
MS
1178{
1179 while (nbytes >= FUSE_NAME_OFFSET) {
1180 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
1181 size_t reclen = FUSE_DIRENT_SIZE(dirent);
e5e5558e
MS
1182 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1183 return -EIO;
1184 if (reclen > nbytes)
1185 break;
efeb9e60
MS
1186 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
1187 return -EIO;
e5e5558e 1188
8d3af7f3
AV
1189 if (!dir_emit(ctx, dirent->name, dirent->namelen,
1190 dirent->ino, dirent->type))
e5e5558e
MS
1191 break;
1192
1193 buf += reclen;
1194 nbytes -= reclen;
8d3af7f3 1195 ctx->pos = dirent->off;
e5e5558e
MS
1196 }
1197
1198 return 0;
1199}
1200
0b05b183
AA
1201static int fuse_direntplus_link(struct file *file,
1202 struct fuse_direntplus *direntplus,
1203 u64 attr_version)
1204{
1205 int err;
1206 struct fuse_entry_out *o = &direntplus->entry_out;
1207 struct fuse_dirent *dirent = &direntplus->dirent;
1208 struct dentry *parent = file->f_path.dentry;
1209 struct qstr name = QSTR_INIT(dirent->name, dirent->namelen);
1210 struct dentry *dentry;
1211 struct dentry *alias;
1212 struct inode *dir = parent->d_inode;
1213 struct fuse_conn *fc;
1214 struct inode *inode;
1215
1216 if (!o->nodeid) {
1217 /*
1218 * Unlike in the case of fuse_lookup, zero nodeid does not mean
1219 * ENOENT. Instead, it only means the userspace filesystem did
1220 * not want to return attributes/handle for this entry.
1221 *
1222 * So do nothing.
1223 */
1224 return 0;
1225 }
1226
1227 if (name.name[0] == '.') {
1228 /*
1229 * We could potentially refresh the attributes of the directory
1230 * and its parent?
1231 */
1232 if (name.len == 1)
1233 return 0;
1234 if (name.name[1] == '.' && name.len == 2)
1235 return 0;
1236 }
a28ef45c
MS
1237
1238 if (invalid_nodeid(o->nodeid))
1239 return -EIO;
1240 if (!fuse_valid_type(o->attr.mode))
1241 return -EIO;
1242
0b05b183
AA
1243 fc = get_fuse_conn(dir);
1244
1245 name.hash = full_name_hash(name.name, name.len);
1246 dentry = d_lookup(parent, &name);
53ce9a33 1247 if (dentry) {
0b05b183 1248 inode = dentry->d_inode;
53ce9a33
NV
1249 if (!inode) {
1250 d_drop(dentry);
a28ef45c
MS
1251 } else if (get_node_id(inode) != o->nodeid ||
1252 ((o->attr.mode ^ inode->i_mode) & S_IFMT)) {
53ce9a33
NV
1253 err = d_invalidate(dentry);
1254 if (err)
1255 goto out;
a28ef45c
MS
1256 } else if (is_bad_inode(inode)) {
1257 err = -EIO;
1258 goto out;
53ce9a33 1259 } else {
0b05b183
AA
1260 struct fuse_inode *fi;
1261 fi = get_fuse_inode(inode);
1262 spin_lock(&fc->lock);
1263 fi->nlookup++;
1264 spin_unlock(&fc->lock);
1265
fa2b7213
MS
1266 fuse_change_attributes(inode, &o->attr,
1267 entry_attr_timeout(o),
1268 attr_version);
1269
0b05b183
AA
1270 /*
1271 * The other branch to 'found' comes via fuse_iget()
1272 * which bumps nlookup inside
1273 */
1274 goto found;
1275 }
0b05b183 1276 dput(dentry);
0b05b183
AA
1277 }
1278
1279 dentry = d_alloc(parent, &name);
1280 err = -ENOMEM;
1281 if (!dentry)
1282 goto out;
1283
1284 inode = fuse_iget(dir->i_sb, o->nodeid, o->generation,
1285 &o->attr, entry_attr_timeout(o), attr_version);
1286 if (!inode)
1287 goto out;
1288
b70a80e7 1289 alias = d_materialise_unique(dentry, inode);
5835f339
MS
1290 err = PTR_ERR(alias);
1291 if (IS_ERR(alias))
1292 goto out;
2914941e 1293
0b05b183
AA
1294 if (alias) {
1295 dput(dentry);
1296 dentry = alias;
1297 }
1298
1299found:
6314efee
MS
1300 if (fc->readdirplus_auto)
1301 set_bit(FUSE_I_INIT_RDPLUS, &get_fuse_inode(inode)->state);
0b05b183
AA
1302 fuse_change_entry_timeout(dentry, o);
1303
1304 err = 0;
1305out:
c7263bcd 1306 dput(dentry);
0b05b183
AA
1307 return err;
1308}
1309
1310static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file,
8d3af7f3 1311 struct dir_context *ctx, u64 attr_version)
0b05b183
AA
1312{
1313 struct fuse_direntplus *direntplus;
1314 struct fuse_dirent *dirent;
1315 size_t reclen;
1316 int over = 0;
1317 int ret;
1318
1319 while (nbytes >= FUSE_NAME_OFFSET_DIRENTPLUS) {
1320 direntplus = (struct fuse_direntplus *) buf;
1321 dirent = &direntplus->dirent;
1322 reclen = FUSE_DIRENTPLUS_SIZE(direntplus);
1323
1324 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1325 return -EIO;
1326 if (reclen > nbytes)
1327 break;
efeb9e60
MS
1328 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
1329 return -EIO;
0b05b183
AA
1330
1331 if (!over) {
1332 /* We fill entries into dstbuf only as much as
1333 it can hold. But we still continue iterating
1334 over remaining entries to link them. If not,
1335 we need to send a FORGET for each of those
1336 which we did not link.
1337 */
8d3af7f3
AV
1338 over = !dir_emit(ctx, dirent->name, dirent->namelen,
1339 dirent->ino, dirent->type);
1340 ctx->pos = dirent->off;
0b05b183
AA
1341 }
1342
1343 buf += reclen;
1344 nbytes -= reclen;
1345
1346 ret = fuse_direntplus_link(file, direntplus, attr_version);
1347 if (ret)
1348 fuse_force_forget(file, direntplus->entry_out.nodeid);
1349 }
1350
1351 return 0;
1352}
1353
8d3af7f3 1354static int fuse_readdir(struct file *file, struct dir_context *ctx)
e5e5558e 1355{
4582a4ab 1356 int plus, err;
04730fef
MS
1357 size_t nbytes;
1358 struct page *page;
496ad9aa 1359 struct inode *inode = file_inode(file);
e5e5558e 1360 struct fuse_conn *fc = get_fuse_conn(inode);
248d86e8 1361 struct fuse_req *req;
0b05b183 1362 u64 attr_version = 0;
248d86e8
MS
1363
1364 if (is_bad_inode(inode))
1365 return -EIO;
1366
b111c8c0 1367 req = fuse_get_req(fc, 1);
ce1d5a49
MS
1368 if (IS_ERR(req))
1369 return PTR_ERR(req);
e5e5558e 1370
04730fef
MS
1371 page = alloc_page(GFP_KERNEL);
1372 if (!page) {
1373 fuse_put_request(fc, req);
1374 return -ENOMEM;
1375 }
4582a4ab 1376
8d3af7f3 1377 plus = fuse_use_readdirplus(inode, ctx);
f4975c67 1378 req->out.argpages = 1;
04730fef
MS
1379 req->num_pages = 1;
1380 req->pages[0] = page;
85f40aec 1381 req->page_descs[0].length = PAGE_SIZE;
4582a4ab 1382 if (plus) {
0b05b183 1383 attr_version = fuse_get_attr_version(fc);
8d3af7f3 1384 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
0b05b183
AA
1385 FUSE_READDIRPLUS);
1386 } else {
8d3af7f3 1387 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
0b05b183
AA
1388 FUSE_READDIR);
1389 }
b93f858a 1390 fuse_request_send(fc, req);
361b1eb5 1391 nbytes = req->out.args[0].size;
e5e5558e
MS
1392 err = req->out.h.error;
1393 fuse_put_request(fc, req);
0b05b183 1394 if (!err) {
4582a4ab 1395 if (plus) {
0b05b183 1396 err = parse_dirplusfile(page_address(page), nbytes,
8d3af7f3 1397 file, ctx,
0b05b183
AA
1398 attr_version);
1399 } else {
1400 err = parse_dirfile(page_address(page), nbytes, file,
8d3af7f3 1401 ctx);
0b05b183
AA
1402 }
1403 }
e5e5558e 1404
04730fef 1405 __free_page(page);
451418fc 1406 fuse_invalidate_atime(inode);
04730fef 1407 return err;
e5e5558e
MS
1408}
1409
1410static char *read_link(struct dentry *dentry)
1411{
1412 struct inode *inode = dentry->d_inode;
1413 struct fuse_conn *fc = get_fuse_conn(inode);
b111c8c0 1414 struct fuse_req *req = fuse_get_req_nopages(fc);
e5e5558e
MS
1415 char *link;
1416
ce1d5a49 1417 if (IS_ERR(req))
e231c2ee 1418 return ERR_CAST(req);
e5e5558e
MS
1419
1420 link = (char *) __get_free_page(GFP_KERNEL);
1421 if (!link) {
1422 link = ERR_PTR(-ENOMEM);
1423 goto out;
1424 }
1425 req->in.h.opcode = FUSE_READLINK;
1426 req->in.h.nodeid = get_node_id(inode);
e5e5558e
MS
1427 req->out.argvar = 1;
1428 req->out.numargs = 1;
1429 req->out.args[0].size = PAGE_SIZE - 1;
1430 req->out.args[0].value = link;
b93f858a 1431 fuse_request_send(fc, req);
e5e5558e
MS
1432 if (req->out.h.error) {
1433 free_page((unsigned long) link);
1434 link = ERR_PTR(req->out.h.error);
1435 } else
1436 link[req->out.args[0].size] = '\0';
1437 out:
1438 fuse_put_request(fc, req);
451418fc 1439 fuse_invalidate_atime(inode);
e5e5558e
MS
1440 return link;
1441}
1442
1443static void free_link(char *link)
1444{
1445 if (!IS_ERR(link))
1446 free_page((unsigned long) link);
1447}
1448
1449static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd)
1450{
1451 nd_set_link(nd, read_link(dentry));
1452 return NULL;
1453}
1454
1455static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
1456{
1457 free_link(nd_get_link(nd));
1458}
1459
1460static int fuse_dir_open(struct inode *inode, struct file *file)
1461{
91fe96b4 1462 return fuse_open_common(inode, file, true);
e5e5558e
MS
1463}
1464
1465static int fuse_dir_release(struct inode *inode, struct file *file)
1466{
8b0797a4
MS
1467 fuse_release_common(file, FUSE_RELEASEDIR);
1468
1469 return 0;
e5e5558e
MS
1470}
1471
02c24a82
JB
1472static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1473 int datasync)
82547981 1474{
02c24a82 1475 return fuse_fsync_common(file, start, end, datasync, 1);
82547981
MS
1476}
1477
b18da0c5
MS
1478static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1479 unsigned long arg)
1480{
1481 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1482
1483 /* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1484 if (fc->minor < 18)
1485 return -ENOTTY;
1486
1487 return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1488}
1489
1490static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1491 unsigned long arg)
1492{
1493 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1494
1495 if (fc->minor < 18)
1496 return -ENOTTY;
1497
1498 return fuse_ioctl_common(file, cmd, arg,
1499 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1500}
1501
b0aa7606 1502static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
17637cba
MS
1503{
1504 /* Always update if mtime is explicitly set */
1505 if (ivalid & ATTR_MTIME_SET)
1506 return true;
1507
b0aa7606
MP
1508 /* Or if kernel i_mtime is the official one */
1509 if (trust_local_mtime)
1510 return true;
1511
17637cba
MS
1512 /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1513 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1514 return false;
1515
1516 /* In all other cases update */
1517 return true;
1518}
1519
b0aa7606 1520static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg,
3ad22c62 1521 bool trust_local_cmtime)
9e6268db
MS
1522{
1523 unsigned ivalid = iattr->ia_valid;
9e6268db
MS
1524
1525 if (ivalid & ATTR_MODE)
befc649c 1526 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
9e6268db 1527 if (ivalid & ATTR_UID)
499dcf20 1528 arg->valid |= FATTR_UID, arg->uid = from_kuid(&init_user_ns, iattr->ia_uid);
9e6268db 1529 if (ivalid & ATTR_GID)
499dcf20 1530 arg->valid |= FATTR_GID, arg->gid = from_kgid(&init_user_ns, iattr->ia_gid);
9e6268db 1531 if (ivalid & ATTR_SIZE)
befc649c 1532 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
17637cba
MS
1533 if (ivalid & ATTR_ATIME) {
1534 arg->valid |= FATTR_ATIME;
befc649c 1535 arg->atime = iattr->ia_atime.tv_sec;
17637cba
MS
1536 arg->atimensec = iattr->ia_atime.tv_nsec;
1537 if (!(ivalid & ATTR_ATIME_SET))
1538 arg->valid |= FATTR_ATIME_NOW;
1539 }
3ad22c62 1540 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
17637cba 1541 arg->valid |= FATTR_MTIME;
befc649c 1542 arg->mtime = iattr->ia_mtime.tv_sec;
17637cba 1543 arg->mtimensec = iattr->ia_mtime.tv_nsec;
3ad22c62 1544 if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
17637cba 1545 arg->valid |= FATTR_MTIME_NOW;
befc649c 1546 }
3ad22c62
MP
1547 if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
1548 arg->valid |= FATTR_CTIME;
1549 arg->ctime = iattr->ia_ctime.tv_sec;
1550 arg->ctimensec = iattr->ia_ctime.tv_nsec;
1551 }
9e6268db
MS
1552}
1553
3be5a52b
MS
1554/*
1555 * Prevent concurrent writepages on inode
1556 *
1557 * This is done by adding a negative bias to the inode write counter
1558 * and waiting for all pending writes to finish.
1559 */
1560void fuse_set_nowrite(struct inode *inode)
1561{
1562 struct fuse_conn *fc = get_fuse_conn(inode);
1563 struct fuse_inode *fi = get_fuse_inode(inode);
1564
1565 BUG_ON(!mutex_is_locked(&inode->i_mutex));
1566
1567 spin_lock(&fc->lock);
1568 BUG_ON(fi->writectr < 0);
1569 fi->writectr += FUSE_NOWRITE;
1570 spin_unlock(&fc->lock);
1571 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1572}
1573
1574/*
1575 * Allow writepages on inode
1576 *
1577 * Remove the bias from the writecounter and send any queued
1578 * writepages.
1579 */
1580static void __fuse_release_nowrite(struct inode *inode)
1581{
1582 struct fuse_inode *fi = get_fuse_inode(inode);
1583
1584 BUG_ON(fi->writectr != FUSE_NOWRITE);
1585 fi->writectr = 0;
1586 fuse_flush_writepages(inode);
1587}
1588
1589void fuse_release_nowrite(struct inode *inode)
1590{
1591 struct fuse_conn *fc = get_fuse_conn(inode);
1592
1593 spin_lock(&fc->lock);
1594 __fuse_release_nowrite(inode);
1595 spin_unlock(&fc->lock);
1596}
1597
b0aa7606
MP
1598static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_req *req,
1599 struct inode *inode,
1600 struct fuse_setattr_in *inarg_p,
1601 struct fuse_attr_out *outarg_p)
1602{
1603 req->in.h.opcode = FUSE_SETATTR;
1604 req->in.h.nodeid = get_node_id(inode);
1605 req->in.numargs = 1;
1606 req->in.args[0].size = sizeof(*inarg_p);
1607 req->in.args[0].value = inarg_p;
1608 req->out.numargs = 1;
1609 if (fc->minor < 9)
1610 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
1611 else
1612 req->out.args[0].size = sizeof(*outarg_p);
1613 req->out.args[0].value = outarg_p;
1614}
1615
1616/*
1617 * Flush inode->i_mtime to the server
1618 */
ab9e13f7 1619int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
b0aa7606 1620{
b0aa7606 1621 struct fuse_conn *fc = get_fuse_conn(inode);
1e18bda8 1622 struct fuse_req *req;
b0aa7606
MP
1623 struct fuse_setattr_in inarg;
1624 struct fuse_attr_out outarg;
1625 int err;
1626
1e18bda8
MS
1627 req = fuse_get_req_nopages(fc);
1628 if (IS_ERR(req))
1629 return PTR_ERR(req);
b0aa7606
MP
1630
1631 memset(&inarg, 0, sizeof(inarg));
1632 memset(&outarg, 0, sizeof(outarg));
1633
ab9e13f7 1634 inarg.valid = FATTR_MTIME;
b0aa7606
MP
1635 inarg.mtime = inode->i_mtime.tv_sec;
1636 inarg.mtimensec = inode->i_mtime.tv_nsec;
ab9e13f7
MP
1637 if (fc->minor >= 23) {
1638 inarg.valid |= FATTR_CTIME;
1639 inarg.ctime = inode->i_ctime.tv_sec;
1640 inarg.ctimensec = inode->i_ctime.tv_nsec;
1641 }
1e18bda8
MS
1642 if (ff) {
1643 inarg.valid |= FATTR_FH;
1644 inarg.fh = ff->fh;
1645 }
b0aa7606
MP
1646 fuse_setattr_fill(fc, req, inode, &inarg, &outarg);
1647 fuse_request_send(fc, req);
1648 err = req->out.h.error;
1649 fuse_put_request(fc, req);
1650
b0aa7606
MP
1651 return err;
1652}
1653
6f9f1180
MS
1654/*
1655 * Set attributes, and at the same time refresh them.
1656 *
1657 * Truncation is slightly complicated, because the 'truncate' request
1658 * may fail, in which case we don't want to touch the mapping.
9ffbb916
MS
1659 * vmtruncate() doesn't allow for this case, so do the rlimit checking
1660 * and the actual truncation by hand.
6f9f1180 1661 */
efb9fa9e
MP
1662int fuse_do_setattr(struct inode *inode, struct iattr *attr,
1663 struct file *file)
9e6268db 1664{
9e6268db 1665 struct fuse_conn *fc = get_fuse_conn(inode);
06a7c3c2 1666 struct fuse_inode *fi = get_fuse_inode(inode);
9e6268db
MS
1667 struct fuse_req *req;
1668 struct fuse_setattr_in inarg;
1669 struct fuse_attr_out outarg;
3be5a52b 1670 bool is_truncate = false;
8373200b 1671 bool is_wb = fc->writeback_cache;
3be5a52b 1672 loff_t oldsize;
9e6268db 1673 int err;
3ad22c62 1674 bool trust_local_cmtime = is_wb && S_ISREG(inode->i_mode);
9e6268db 1675
db78b877
CH
1676 if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
1677 attr->ia_valid |= ATTR_FORCE;
1678
1679 err = inode_change_ok(inode, attr);
1680 if (err)
1681 return err;
1e9a4ed9 1682
8d56addd
MS
1683 if (attr->ia_valid & ATTR_OPEN) {
1684 if (fc->atomic_o_trunc)
1685 return 0;
1686 file = NULL;
1687 }
6ff958ed 1688
2c27c65e 1689 if (attr->ia_valid & ATTR_SIZE)
3be5a52b 1690 is_truncate = true;
9e6268db 1691
b111c8c0 1692 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1693 if (IS_ERR(req))
1694 return PTR_ERR(req);
9e6268db 1695
06a7c3c2 1696 if (is_truncate) {
3be5a52b 1697 fuse_set_nowrite(inode);
06a7c3c2 1698 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
3ad22c62
MP
1699 if (trust_local_cmtime && attr->ia_size != inode->i_size)
1700 attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
06a7c3c2 1701 }
3be5a52b 1702
9e6268db 1703 memset(&inarg, 0, sizeof(inarg));
0e9663ee 1704 memset(&outarg, 0, sizeof(outarg));
3ad22c62 1705 iattr_to_fattr(attr, &inarg, trust_local_cmtime);
49d4914f
MS
1706 if (file) {
1707 struct fuse_file *ff = file->private_data;
1708 inarg.valid |= FATTR_FH;
1709 inarg.fh = ff->fh;
1710 }
f3332114
MS
1711 if (attr->ia_valid & ATTR_SIZE) {
1712 /* For mandatory locking in truncate */
1713 inarg.valid |= FATTR_LOCKOWNER;
1714 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1715 }
b0aa7606 1716 fuse_setattr_fill(fc, req, inode, &inarg, &outarg);
b93f858a 1717 fuse_request_send(fc, req);
9e6268db
MS
1718 err = req->out.h.error;
1719 fuse_put_request(fc, req);
e00d2c2d
MS
1720 if (err) {
1721 if (err == -EINTR)
1722 fuse_invalidate_attr(inode);
3be5a52b 1723 goto error;
e00d2c2d 1724 }
9e6268db 1725
e00d2c2d
MS
1726 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1727 make_bad_inode(inode);
3be5a52b
MS
1728 err = -EIO;
1729 goto error;
1730 }
1731
1732 spin_lock(&fc->lock);
b0aa7606 1733 /* the kernel maintains i_mtime locally */
3ad22c62
MP
1734 if (trust_local_cmtime) {
1735 if (attr->ia_valid & ATTR_MTIME)
1736 inode->i_mtime = attr->ia_mtime;
1737 if (attr->ia_valid & ATTR_CTIME)
1738 inode->i_ctime = attr->ia_ctime;
1e18bda8 1739 /* FIXME: clear I_DIRTY_SYNC? */
b0aa7606
MP
1740 }
1741
3be5a52b
MS
1742 fuse_change_attributes_common(inode, &outarg.attr,
1743 attr_timeout(&outarg));
1744 oldsize = inode->i_size;
8373200b
PE
1745 /* see the comment in fuse_change_attributes() */
1746 if (!is_wb || is_truncate || !S_ISREG(inode->i_mode))
1747 i_size_write(inode, outarg.attr.size);
3be5a52b
MS
1748
1749 if (is_truncate) {
1750 /* NOTE: this may release/reacquire fc->lock */
1751 __fuse_release_nowrite(inode);
1752 }
1753 spin_unlock(&fc->lock);
1754
1755 /*
1756 * Only call invalidate_inode_pages2() after removing
1757 * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1758 */
8373200b
PE
1759 if ((is_truncate || !is_wb) &&
1760 S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
7caef267 1761 truncate_pagecache(inode, outarg.attr.size);
3be5a52b 1762 invalidate_inode_pages2(inode->i_mapping);
e00d2c2d
MS
1763 }
1764
06a7c3c2 1765 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
e00d2c2d 1766 return 0;
3be5a52b
MS
1767
1768error:
1769 if (is_truncate)
1770 fuse_release_nowrite(inode);
1771
06a7c3c2 1772 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
3be5a52b 1773 return err;
9e6268db
MS
1774}
1775
49d4914f
MS
1776static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1777{
efb9fa9e
MP
1778 struct inode *inode = entry->d_inode;
1779
1780 if (!fuse_allow_current_process(get_fuse_conn(inode)))
1781 return -EACCES;
1782
49d4914f 1783 if (attr->ia_valid & ATTR_FILE)
efb9fa9e 1784 return fuse_do_setattr(inode, attr, attr->ia_file);
49d4914f 1785 else
efb9fa9e 1786 return fuse_do_setattr(inode, attr, NULL);
49d4914f
MS
1787}
1788
e5e5558e
MS
1789static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
1790 struct kstat *stat)
1791{
1792 struct inode *inode = entry->d_inode;
244f6385 1793 struct fuse_conn *fc = get_fuse_conn(inode);
244f6385 1794
c2132c1b 1795 if (!fuse_allow_current_process(fc))
244f6385
MS
1796 return -EACCES;
1797
bcb4be80 1798 return fuse_update_attributes(inode, stat, NULL, NULL);
e5e5558e
MS
1799}
1800
92a8780e
MS
1801static int fuse_setxattr(struct dentry *entry, const char *name,
1802 const void *value, size_t size, int flags)
1803{
1804 struct inode *inode = entry->d_inode;
1805 struct fuse_conn *fc = get_fuse_conn(inode);
1806 struct fuse_req *req;
1807 struct fuse_setxattr_in inarg;
1808 int err;
1809
92a8780e
MS
1810 if (fc->no_setxattr)
1811 return -EOPNOTSUPP;
1812
b111c8c0 1813 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1814 if (IS_ERR(req))
1815 return PTR_ERR(req);
92a8780e
MS
1816
1817 memset(&inarg, 0, sizeof(inarg));
1818 inarg.size = size;
1819 inarg.flags = flags;
1820 req->in.h.opcode = FUSE_SETXATTR;
1821 req->in.h.nodeid = get_node_id(inode);
92a8780e
MS
1822 req->in.numargs = 3;
1823 req->in.args[0].size = sizeof(inarg);
1824 req->in.args[0].value = &inarg;
1825 req->in.args[1].size = strlen(name) + 1;
1826 req->in.args[1].value = name;
1827 req->in.args[2].size = size;
1828 req->in.args[2].value = value;
b93f858a 1829 fuse_request_send(fc, req);
92a8780e
MS
1830 err = req->out.h.error;
1831 fuse_put_request(fc, req);
1832 if (err == -ENOSYS) {
1833 fc->no_setxattr = 1;
1834 err = -EOPNOTSUPP;
1835 }
31f3267b 1836 if (!err) {
d331a415 1837 fuse_invalidate_attr(inode);
31f3267b
MP
1838 fuse_update_ctime(inode);
1839 }
92a8780e
MS
1840 return err;
1841}
1842
1843static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
1844 void *value, size_t size)
1845{
1846 struct inode *inode = entry->d_inode;
1847 struct fuse_conn *fc = get_fuse_conn(inode);
1848 struct fuse_req *req;
1849 struct fuse_getxattr_in inarg;
1850 struct fuse_getxattr_out outarg;
1851 ssize_t ret;
1852
1853 if (fc->no_getxattr)
1854 return -EOPNOTSUPP;
1855
b111c8c0 1856 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1857 if (IS_ERR(req))
1858 return PTR_ERR(req);
92a8780e
MS
1859
1860 memset(&inarg, 0, sizeof(inarg));
1861 inarg.size = size;
1862 req->in.h.opcode = FUSE_GETXATTR;
1863 req->in.h.nodeid = get_node_id(inode);
92a8780e
MS
1864 req->in.numargs = 2;
1865 req->in.args[0].size = sizeof(inarg);
1866 req->in.args[0].value = &inarg;
1867 req->in.args[1].size = strlen(name) + 1;
1868 req->in.args[1].value = name;
1869 /* This is really two different operations rolled into one */
1870 req->out.numargs = 1;
1871 if (size) {
1872 req->out.argvar = 1;
1873 req->out.args[0].size = size;
1874 req->out.args[0].value = value;
1875 } else {
1876 req->out.args[0].size = sizeof(outarg);
1877 req->out.args[0].value = &outarg;
1878 }
b93f858a 1879 fuse_request_send(fc, req);
92a8780e
MS
1880 ret = req->out.h.error;
1881 if (!ret)
1882 ret = size ? req->out.args[0].size : outarg.size;
1883 else {
1884 if (ret == -ENOSYS) {
1885 fc->no_getxattr = 1;
1886 ret = -EOPNOTSUPP;
1887 }
1888 }
1889 fuse_put_request(fc, req);
1890 return ret;
1891}
1892
1893static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
1894{
1895 struct inode *inode = entry->d_inode;
1896 struct fuse_conn *fc = get_fuse_conn(inode);
1897 struct fuse_req *req;
1898 struct fuse_getxattr_in inarg;
1899 struct fuse_getxattr_out outarg;
1900 ssize_t ret;
1901
c2132c1b 1902 if (!fuse_allow_current_process(fc))
e57ac683
MS
1903 return -EACCES;
1904
92a8780e
MS
1905 if (fc->no_listxattr)
1906 return -EOPNOTSUPP;
1907
b111c8c0 1908 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1909 if (IS_ERR(req))
1910 return PTR_ERR(req);
92a8780e
MS
1911
1912 memset(&inarg, 0, sizeof(inarg));
1913 inarg.size = size;
1914 req->in.h.opcode = FUSE_LISTXATTR;
1915 req->in.h.nodeid = get_node_id(inode);
92a8780e
MS
1916 req->in.numargs = 1;
1917 req->in.args[0].size = sizeof(inarg);
1918 req->in.args[0].value = &inarg;
1919 /* This is really two different operations rolled into one */
1920 req->out.numargs = 1;
1921 if (size) {
1922 req->out.argvar = 1;
1923 req->out.args[0].size = size;
1924 req->out.args[0].value = list;
1925 } else {
1926 req->out.args[0].size = sizeof(outarg);
1927 req->out.args[0].value = &outarg;
1928 }
b93f858a 1929 fuse_request_send(fc, req);
92a8780e
MS
1930 ret = req->out.h.error;
1931 if (!ret)
1932 ret = size ? req->out.args[0].size : outarg.size;
1933 else {
1934 if (ret == -ENOSYS) {
1935 fc->no_listxattr = 1;
1936 ret = -EOPNOTSUPP;
1937 }
1938 }
1939 fuse_put_request(fc, req);
1940 return ret;
1941}
1942
1943static int fuse_removexattr(struct dentry *entry, const char *name)
1944{
1945 struct inode *inode = entry->d_inode;
1946 struct fuse_conn *fc = get_fuse_conn(inode);
1947 struct fuse_req *req;
1948 int err;
1949
1950 if (fc->no_removexattr)
1951 return -EOPNOTSUPP;
1952
b111c8c0 1953 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1954 if (IS_ERR(req))
1955 return PTR_ERR(req);
92a8780e
MS
1956
1957 req->in.h.opcode = FUSE_REMOVEXATTR;
1958 req->in.h.nodeid = get_node_id(inode);
92a8780e
MS
1959 req->in.numargs = 1;
1960 req->in.args[0].size = strlen(name) + 1;
1961 req->in.args[0].value = name;
b93f858a 1962 fuse_request_send(fc, req);
92a8780e
MS
1963 err = req->out.h.error;
1964 fuse_put_request(fc, req);
1965 if (err == -ENOSYS) {
1966 fc->no_removexattr = 1;
1967 err = -EOPNOTSUPP;
1968 }
31f3267b 1969 if (!err) {
d331a415 1970 fuse_invalidate_attr(inode);
31f3267b
MP
1971 fuse_update_ctime(inode);
1972 }
92a8780e
MS
1973 return err;
1974}
1975
754661f1 1976static const struct inode_operations fuse_dir_inode_operations = {
e5e5558e 1977 .lookup = fuse_lookup,
9e6268db
MS
1978 .mkdir = fuse_mkdir,
1979 .symlink = fuse_symlink,
1980 .unlink = fuse_unlink,
1981 .rmdir = fuse_rmdir,
1982 .rename = fuse_rename,
1983 .link = fuse_link,
1984 .setattr = fuse_setattr,
1985 .create = fuse_create,
c8ccbe03 1986 .atomic_open = fuse_atomic_open,
9e6268db 1987 .mknod = fuse_mknod,
e5e5558e
MS
1988 .permission = fuse_permission,
1989 .getattr = fuse_getattr,
92a8780e
MS
1990 .setxattr = fuse_setxattr,
1991 .getxattr = fuse_getxattr,
1992 .listxattr = fuse_listxattr,
1993 .removexattr = fuse_removexattr,
e5e5558e
MS
1994};
1995
4b6f5d20 1996static const struct file_operations fuse_dir_operations = {
b6aeaded 1997 .llseek = generic_file_llseek,
e5e5558e 1998 .read = generic_read_dir,
8d3af7f3 1999 .iterate = fuse_readdir,
e5e5558e
MS
2000 .open = fuse_dir_open,
2001 .release = fuse_dir_release,
82547981 2002 .fsync = fuse_dir_fsync,
b18da0c5
MS
2003 .unlocked_ioctl = fuse_dir_ioctl,
2004 .compat_ioctl = fuse_dir_compat_ioctl,
e5e5558e
MS
2005};
2006
754661f1 2007static const struct inode_operations fuse_common_inode_operations = {
9e6268db 2008 .setattr = fuse_setattr,
e5e5558e
MS
2009 .permission = fuse_permission,
2010 .getattr = fuse_getattr,
92a8780e
MS
2011 .setxattr = fuse_setxattr,
2012 .getxattr = fuse_getxattr,
2013 .listxattr = fuse_listxattr,
2014 .removexattr = fuse_removexattr,
e5e5558e
MS
2015};
2016
754661f1 2017static const struct inode_operations fuse_symlink_inode_operations = {
9e6268db 2018 .setattr = fuse_setattr,
e5e5558e
MS
2019 .follow_link = fuse_follow_link,
2020 .put_link = fuse_put_link,
2021 .readlink = generic_readlink,
2022 .getattr = fuse_getattr,
92a8780e
MS
2023 .setxattr = fuse_setxattr,
2024 .getxattr = fuse_getxattr,
2025 .listxattr = fuse_listxattr,
2026 .removexattr = fuse_removexattr,
e5e5558e
MS
2027};
2028
2029void fuse_init_common(struct inode *inode)
2030{
2031 inode->i_op = &fuse_common_inode_operations;
2032}
2033
2034void fuse_init_dir(struct inode *inode)
2035{
2036 inode->i_op = &fuse_dir_inode_operations;
2037 inode->i_fop = &fuse_dir_operations;
2038}
2039
2040void fuse_init_symlink(struct inode *inode)
2041{
2042 inode->i_op = &fuse_symlink_inode_operations;
2043}