fuse: Trust kernel i_size only
[deliverable/linux.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
682static int fuse_unlink(struct inode *dir, struct dentry *entry)
683{
684 int err;
685 struct fuse_conn *fc = get_fuse_conn(dir);
b111c8c0 686 struct fuse_req *req = fuse_get_req_nopages(fc);
ce1d5a49
MS
687 if (IS_ERR(req))
688 return PTR_ERR(req);
9e6268db
MS
689
690 req->in.h.opcode = FUSE_UNLINK;
691 req->in.h.nodeid = get_node_id(dir);
9e6268db
MS
692 req->in.numargs = 1;
693 req->in.args[0].size = entry->d_name.len + 1;
694 req->in.args[0].value = entry->d_name.name;
b93f858a 695 fuse_request_send(fc, req);
9e6268db
MS
696 err = req->out.h.error;
697 fuse_put_request(fc, req);
698 if (!err) {
699 struct inode *inode = entry->d_inode;
ac45d613 700 struct fuse_inode *fi = get_fuse_inode(inode);
9e6268db 701
ac45d613
MS
702 spin_lock(&fc->lock);
703 fi->attr_version = ++fc->attr_version;
dfca7ceb
MS
704 /*
705 * If i_nlink == 0 then unlink doesn't make sense, yet this can
706 * happen if userspace filesystem is careless. It would be
707 * difficult to enforce correct nlink usage so just ignore this
708 * condition here
709 */
710 if (inode->i_nlink > 0)
711 drop_nlink(inode);
ac45d613 712 spin_unlock(&fc->lock);
9e6268db
MS
713 fuse_invalidate_attr(inode);
714 fuse_invalidate_attr(dir);
8cbdf1e6 715 fuse_invalidate_entry_cache(entry);
9e6268db
MS
716 } else if (err == -EINTR)
717 fuse_invalidate_entry(entry);
718 return err;
719}
720
721static int fuse_rmdir(struct inode *dir, struct dentry *entry)
722{
723 int err;
724 struct fuse_conn *fc = get_fuse_conn(dir);
b111c8c0 725 struct fuse_req *req = fuse_get_req_nopages(fc);
ce1d5a49
MS
726 if (IS_ERR(req))
727 return PTR_ERR(req);
9e6268db
MS
728
729 req->in.h.opcode = FUSE_RMDIR;
730 req->in.h.nodeid = get_node_id(dir);
9e6268db
MS
731 req->in.numargs = 1;
732 req->in.args[0].size = entry->d_name.len + 1;
733 req->in.args[0].value = entry->d_name.name;
b93f858a 734 fuse_request_send(fc, req);
9e6268db
MS
735 err = req->out.h.error;
736 fuse_put_request(fc, req);
737 if (!err) {
ce71ec36 738 clear_nlink(entry->d_inode);
9e6268db 739 fuse_invalidate_attr(dir);
8cbdf1e6 740 fuse_invalidate_entry_cache(entry);
9e6268db
MS
741 } else if (err == -EINTR)
742 fuse_invalidate_entry(entry);
743 return err;
744}
745
746static int fuse_rename(struct inode *olddir, struct dentry *oldent,
747 struct inode *newdir, struct dentry *newent)
748{
749 int err;
750 struct fuse_rename_in inarg;
751 struct fuse_conn *fc = get_fuse_conn(olddir);
b111c8c0 752 struct fuse_req *req = fuse_get_req_nopages(fc);
e4eaac06 753
ce1d5a49
MS
754 if (IS_ERR(req))
755 return PTR_ERR(req);
9e6268db
MS
756
757 memset(&inarg, 0, sizeof(inarg));
758 inarg.newdir = get_node_id(newdir);
759 req->in.h.opcode = FUSE_RENAME;
760 req->in.h.nodeid = get_node_id(olddir);
9e6268db
MS
761 req->in.numargs = 3;
762 req->in.args[0].size = sizeof(inarg);
763 req->in.args[0].value = &inarg;
764 req->in.args[1].size = oldent->d_name.len + 1;
765 req->in.args[1].value = oldent->d_name.name;
766 req->in.args[2].size = newent->d_name.len + 1;
767 req->in.args[2].value = newent->d_name.name;
b93f858a 768 fuse_request_send(fc, req);
9e6268db
MS
769 err = req->out.h.error;
770 fuse_put_request(fc, req);
771 if (!err) {
08b63307
MS
772 /* ctime changes */
773 fuse_invalidate_attr(oldent->d_inode);
774
9e6268db
MS
775 fuse_invalidate_attr(olddir);
776 if (olddir != newdir)
777 fuse_invalidate_attr(newdir);
8cbdf1e6
MS
778
779 /* newent will end up negative */
5219f346
MS
780 if (newent->d_inode) {
781 fuse_invalidate_attr(newent->d_inode);
8cbdf1e6 782 fuse_invalidate_entry_cache(newent);
5219f346 783 }
9e6268db
MS
784 } else if (err == -EINTR) {
785 /* If request was interrupted, DEITY only knows if the
786 rename actually took place. If the invalidation
787 fails (e.g. some process has CWD under the renamed
788 directory), then there can be inconsistency between
789 the dcache and the real filesystem. Tough luck. */
790 fuse_invalidate_entry(oldent);
791 if (newent->d_inode)
792 fuse_invalidate_entry(newent);
793 }
794
795 return err;
796}
797
798static int fuse_link(struct dentry *entry, struct inode *newdir,
799 struct dentry *newent)
800{
801 int err;
802 struct fuse_link_in inarg;
803 struct inode *inode = entry->d_inode;
804 struct fuse_conn *fc = get_fuse_conn(inode);
b111c8c0 805 struct fuse_req *req = fuse_get_req_nopages(fc);
ce1d5a49
MS
806 if (IS_ERR(req))
807 return PTR_ERR(req);
9e6268db
MS
808
809 memset(&inarg, 0, sizeof(inarg));
810 inarg.oldnodeid = get_node_id(inode);
811 req->in.h.opcode = FUSE_LINK;
9e6268db
MS
812 req->in.numargs = 2;
813 req->in.args[0].size = sizeof(inarg);
814 req->in.args[0].value = &inarg;
815 req->in.args[1].size = newent->d_name.len + 1;
816 req->in.args[1].value = newent->d_name.name;
817 err = create_new_entry(fc, req, newdir, newent, inode->i_mode);
818 /* Contrary to "normal" filesystems it can happen that link
819 makes two "logical" inodes point to the same "physical"
820 inode. We invalidate the attributes of the old one, so it
821 will reflect changes in the backing inode (link count,
822 etc.)
823 */
ac45d613
MS
824 if (!err) {
825 struct fuse_inode *fi = get_fuse_inode(inode);
826
827 spin_lock(&fc->lock);
828 fi->attr_version = ++fc->attr_version;
829 inc_nlink(inode);
830 spin_unlock(&fc->lock);
9e6268db 831 fuse_invalidate_attr(inode);
ac45d613
MS
832 } else if (err == -EINTR) {
833 fuse_invalidate_attr(inode);
834 }
9e6268db
MS
835 return err;
836}
837
1fb69e78
MS
838static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
839 struct kstat *stat)
840{
203627bb 841 unsigned int blkbits;
8373200b
PE
842 struct fuse_conn *fc = get_fuse_conn(inode);
843
844 /* see the comment in fuse_change_attributes() */
845 if (fc->writeback_cache && S_ISREG(inode->i_mode))
846 attr->size = i_size_read(inode);
203627bb 847
1fb69e78
MS
848 stat->dev = inode->i_sb->s_dev;
849 stat->ino = attr->ino;
850 stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
851 stat->nlink = attr->nlink;
499dcf20
EB
852 stat->uid = make_kuid(&init_user_ns, attr->uid);
853 stat->gid = make_kgid(&init_user_ns, attr->gid);
1fb69e78
MS
854 stat->rdev = inode->i_rdev;
855 stat->atime.tv_sec = attr->atime;
856 stat->atime.tv_nsec = attr->atimensec;
857 stat->mtime.tv_sec = attr->mtime;
858 stat->mtime.tv_nsec = attr->mtimensec;
859 stat->ctime.tv_sec = attr->ctime;
860 stat->ctime.tv_nsec = attr->ctimensec;
861 stat->size = attr->size;
862 stat->blocks = attr->blocks;
203627bb
MS
863
864 if (attr->blksize != 0)
865 blkbits = ilog2(attr->blksize);
866 else
867 blkbits = inode->i_sb->s_blocksize_bits;
868
869 stat->blksize = 1 << blkbits;
1fb69e78
MS
870}
871
c79e322f
MS
872static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
873 struct file *file)
e5e5558e
MS
874{
875 int err;
c79e322f
MS
876 struct fuse_getattr_in inarg;
877 struct fuse_attr_out outarg;
e5e5558e 878 struct fuse_conn *fc = get_fuse_conn(inode);
1fb69e78
MS
879 struct fuse_req *req;
880 u64 attr_version;
881
b111c8c0 882 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
883 if (IS_ERR(req))
884 return PTR_ERR(req);
e5e5558e 885
7dca9fd3 886 attr_version = fuse_get_attr_version(fc);
1fb69e78 887
c79e322f 888 memset(&inarg, 0, sizeof(inarg));
0e9663ee 889 memset(&outarg, 0, sizeof(outarg));
c79e322f
MS
890 /* Directories have separate file-handle space */
891 if (file && S_ISREG(inode->i_mode)) {
892 struct fuse_file *ff = file->private_data;
893
894 inarg.getattr_flags |= FUSE_GETATTR_FH;
895 inarg.fh = ff->fh;
896 }
e5e5558e
MS
897 req->in.h.opcode = FUSE_GETATTR;
898 req->in.h.nodeid = get_node_id(inode);
c79e322f
MS
899 req->in.numargs = 1;
900 req->in.args[0].size = sizeof(inarg);
901 req->in.args[0].value = &inarg;
e5e5558e 902 req->out.numargs = 1;
0e9663ee
MS
903 if (fc->minor < 9)
904 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
905 else
906 req->out.args[0].size = sizeof(outarg);
c79e322f 907 req->out.args[0].value = &outarg;
b93f858a 908 fuse_request_send(fc, req);
e5e5558e
MS
909 err = req->out.h.error;
910 fuse_put_request(fc, req);
911 if (!err) {
c79e322f 912 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
e5e5558e
MS
913 make_bad_inode(inode);
914 err = -EIO;
915 } else {
c79e322f
MS
916 fuse_change_attributes(inode, &outarg.attr,
917 attr_timeout(&outarg),
1fb69e78
MS
918 attr_version);
919 if (stat)
c79e322f 920 fuse_fillattr(inode, &outarg.attr, stat);
e5e5558e
MS
921 }
922 }
923 return err;
924}
925
bcb4be80
MS
926int fuse_update_attributes(struct inode *inode, struct kstat *stat,
927 struct file *file, bool *refreshed)
928{
929 struct fuse_inode *fi = get_fuse_inode(inode);
930 int err;
931 bool r;
932
933 if (fi->i_time < get_jiffies_64()) {
934 r = true;
935 err = fuse_do_getattr(inode, stat, file);
936 } else {
937 r = false;
938 err = 0;
939 if (stat) {
940 generic_fillattr(inode, stat);
941 stat->mode = fi->orig_i_mode;
45c72cd7 942 stat->ino = fi->orig_ino;
bcb4be80
MS
943 }
944 }
945
946 if (refreshed != NULL)
947 *refreshed = r;
948
949 return err;
950}
951
3b463ae0 952int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
451d0f59 953 u64 child_nodeid, struct qstr *name)
3b463ae0
JM
954{
955 int err = -ENOTDIR;
956 struct inode *parent;
957 struct dentry *dir;
958 struct dentry *entry;
959
960 parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
961 if (!parent)
962 return -ENOENT;
963
964 mutex_lock(&parent->i_mutex);
965 if (!S_ISDIR(parent->i_mode))
966 goto unlock;
967
968 err = -ENOENT;
969 dir = d_find_alias(parent);
970 if (!dir)
971 goto unlock;
972
973 entry = d_lookup(dir, name);
974 dput(dir);
975 if (!entry)
976 goto unlock;
977
978 fuse_invalidate_attr(parent);
979 fuse_invalidate_entry(entry);
451d0f59
JM
980
981 if (child_nodeid != 0 && entry->d_inode) {
982 mutex_lock(&entry->d_inode->i_mutex);
983 if (get_node_id(entry->d_inode) != child_nodeid) {
984 err = -ENOENT;
985 goto badentry;
986 }
987 if (d_mountpoint(entry)) {
988 err = -EBUSY;
989 goto badentry;
990 }
991 if (S_ISDIR(entry->d_inode->i_mode)) {
992 shrink_dcache_parent(entry);
993 if (!simple_empty(entry)) {
994 err = -ENOTEMPTY;
995 goto badentry;
996 }
997 entry->d_inode->i_flags |= S_DEAD;
998 }
999 dont_mount(entry);
1000 clear_nlink(entry->d_inode);
1001 err = 0;
1002 badentry:
1003 mutex_unlock(&entry->d_inode->i_mutex);
1004 if (!err)
1005 d_delete(entry);
1006 } else {
1007 err = 0;
1008 }
3b463ae0 1009 dput(entry);
3b463ae0
JM
1010
1011 unlock:
1012 mutex_unlock(&parent->i_mutex);
1013 iput(parent);
1014 return err;
1015}
1016
87729a55
MS
1017/*
1018 * Calling into a user-controlled filesystem gives the filesystem
c2132c1b 1019 * daemon ptrace-like capabilities over the current process. This
87729a55
MS
1020 * means, that the filesystem daemon is able to record the exact
1021 * filesystem operations performed, and can also control the behavior
1022 * of the requester process in otherwise impossible ways. For example
1023 * it can delay the operation for arbitrary length of time allowing
1024 * DoS against the requester.
1025 *
1026 * For this reason only those processes can call into the filesystem,
1027 * for which the owner of the mount has ptrace privilege. This
1028 * excludes processes started by other users, suid or sgid processes.
1029 */
c2132c1b 1030int fuse_allow_current_process(struct fuse_conn *fc)
87729a55 1031{
c69e8d9c 1032 const struct cred *cred;
87729a55 1033
c69e8d9c 1034 if (fc->flags & FUSE_ALLOW_OTHER)
87729a55
MS
1035 return 1;
1036
c2132c1b 1037 cred = current_cred();
499dcf20
EB
1038 if (uid_eq(cred->euid, fc->user_id) &&
1039 uid_eq(cred->suid, fc->user_id) &&
1040 uid_eq(cred->uid, fc->user_id) &&
1041 gid_eq(cred->egid, fc->group_id) &&
1042 gid_eq(cred->sgid, fc->group_id) &&
1043 gid_eq(cred->gid, fc->group_id))
c2132c1b 1044 return 1;
c69e8d9c 1045
c2132c1b 1046 return 0;
87729a55
MS
1047}
1048
31d40d74
MS
1049static int fuse_access(struct inode *inode, int mask)
1050{
1051 struct fuse_conn *fc = get_fuse_conn(inode);
1052 struct fuse_req *req;
1053 struct fuse_access_in inarg;
1054 int err;
1055
698fa1d1
MS
1056 BUG_ON(mask & MAY_NOT_BLOCK);
1057
31d40d74
MS
1058 if (fc->no_access)
1059 return 0;
1060
b111c8c0 1061 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1062 if (IS_ERR(req))
1063 return PTR_ERR(req);
31d40d74
MS
1064
1065 memset(&inarg, 0, sizeof(inarg));
e6305c43 1066 inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
31d40d74
MS
1067 req->in.h.opcode = FUSE_ACCESS;
1068 req->in.h.nodeid = get_node_id(inode);
31d40d74
MS
1069 req->in.numargs = 1;
1070 req->in.args[0].size = sizeof(inarg);
1071 req->in.args[0].value = &inarg;
b93f858a 1072 fuse_request_send(fc, req);
31d40d74
MS
1073 err = req->out.h.error;
1074 fuse_put_request(fc, req);
1075 if (err == -ENOSYS) {
1076 fc->no_access = 1;
1077 err = 0;
1078 }
1079 return err;
1080}
1081
10556cb2 1082static int fuse_perm_getattr(struct inode *inode, int mask)
19690ddb 1083{
10556cb2 1084 if (mask & MAY_NOT_BLOCK)
19690ddb
MS
1085 return -ECHILD;
1086
1087 return fuse_do_getattr(inode, NULL, NULL);
1088}
1089
6f9f1180
MS
1090/*
1091 * Check permission. The two basic access models of FUSE are:
1092 *
1093 * 1) Local access checking ('default_permissions' mount option) based
1094 * on file mode. This is the plain old disk filesystem permission
1095 * modell.
1096 *
1097 * 2) "Remote" access checking, where server is responsible for
1098 * checking permission in each inode operation. An exception to this
1099 * is if ->permission() was invoked from sys_access() in which case an
1100 * access request is sent. Execute permission is still checked
1101 * locally based on file mode.
1102 */
10556cb2 1103static int fuse_permission(struct inode *inode, int mask)
e5e5558e
MS
1104{
1105 struct fuse_conn *fc = get_fuse_conn(inode);
244f6385
MS
1106 bool refreshed = false;
1107 int err = 0;
e5e5558e 1108
c2132c1b 1109 if (!fuse_allow_current_process(fc))
e5e5558e 1110 return -EACCES;
244f6385
MS
1111
1112 /*
e8e96157 1113 * If attributes are needed, refresh them before proceeding
244f6385 1114 */
e8e96157
MS
1115 if ((fc->flags & FUSE_DEFAULT_PERMISSIONS) ||
1116 ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
19690ddb
MS
1117 struct fuse_inode *fi = get_fuse_inode(inode);
1118
1119 if (fi->i_time < get_jiffies_64()) {
1120 refreshed = true;
1121
10556cb2 1122 err = fuse_perm_getattr(inode, mask);
19690ddb
MS
1123 if (err)
1124 return err;
1125 }
244f6385
MS
1126 }
1127
1128 if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
2830ba7f 1129 err = generic_permission(inode, mask);
1e9a4ed9
MS
1130
1131 /* If permission is denied, try to refresh file
1132 attributes. This is also needed, because the root
1133 node will at first have no permissions */
244f6385 1134 if (err == -EACCES && !refreshed) {
10556cb2 1135 err = fuse_perm_getattr(inode, mask);
1e9a4ed9 1136 if (!err)
2830ba7f 1137 err = generic_permission(inode, mask);
1e9a4ed9
MS
1138 }
1139
6f9f1180
MS
1140 /* Note: the opposite of the above test does not
1141 exist. So if permissions are revoked this won't be
1142 noticed immediately, only after the attribute
1143 timeout has expired */
9cfcac81 1144 } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
e8e96157
MS
1145 err = fuse_access(inode, mask);
1146 } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1147 if (!(inode->i_mode & S_IXUGO)) {
1148 if (refreshed)
1149 return -EACCES;
1150
10556cb2 1151 err = fuse_perm_getattr(inode, mask);
e8e96157
MS
1152 if (!err && !(inode->i_mode & S_IXUGO))
1153 return -EACCES;
1154 }
e5e5558e 1155 }
244f6385 1156 return err;
e5e5558e
MS
1157}
1158
1159static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
8d3af7f3 1160 struct dir_context *ctx)
e5e5558e
MS
1161{
1162 while (nbytes >= FUSE_NAME_OFFSET) {
1163 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
1164 size_t reclen = FUSE_DIRENT_SIZE(dirent);
e5e5558e
MS
1165 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1166 return -EIO;
1167 if (reclen > nbytes)
1168 break;
efeb9e60
MS
1169 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
1170 return -EIO;
e5e5558e 1171
8d3af7f3
AV
1172 if (!dir_emit(ctx, dirent->name, dirent->namelen,
1173 dirent->ino, dirent->type))
e5e5558e
MS
1174 break;
1175
1176 buf += reclen;
1177 nbytes -= reclen;
8d3af7f3 1178 ctx->pos = dirent->off;
e5e5558e
MS
1179 }
1180
1181 return 0;
1182}
1183
0b05b183
AA
1184static int fuse_direntplus_link(struct file *file,
1185 struct fuse_direntplus *direntplus,
1186 u64 attr_version)
1187{
1188 int err;
1189 struct fuse_entry_out *o = &direntplus->entry_out;
1190 struct fuse_dirent *dirent = &direntplus->dirent;
1191 struct dentry *parent = file->f_path.dentry;
1192 struct qstr name = QSTR_INIT(dirent->name, dirent->namelen);
1193 struct dentry *dentry;
1194 struct dentry *alias;
1195 struct inode *dir = parent->d_inode;
1196 struct fuse_conn *fc;
1197 struct inode *inode;
1198
1199 if (!o->nodeid) {
1200 /*
1201 * Unlike in the case of fuse_lookup, zero nodeid does not mean
1202 * ENOENT. Instead, it only means the userspace filesystem did
1203 * not want to return attributes/handle for this entry.
1204 *
1205 * So do nothing.
1206 */
1207 return 0;
1208 }
1209
1210 if (name.name[0] == '.') {
1211 /*
1212 * We could potentially refresh the attributes of the directory
1213 * and its parent?
1214 */
1215 if (name.len == 1)
1216 return 0;
1217 if (name.name[1] == '.' && name.len == 2)
1218 return 0;
1219 }
a28ef45c
MS
1220
1221 if (invalid_nodeid(o->nodeid))
1222 return -EIO;
1223 if (!fuse_valid_type(o->attr.mode))
1224 return -EIO;
1225
0b05b183
AA
1226 fc = get_fuse_conn(dir);
1227
1228 name.hash = full_name_hash(name.name, name.len);
1229 dentry = d_lookup(parent, &name);
53ce9a33 1230 if (dentry) {
0b05b183 1231 inode = dentry->d_inode;
53ce9a33
NV
1232 if (!inode) {
1233 d_drop(dentry);
a28ef45c
MS
1234 } else if (get_node_id(inode) != o->nodeid ||
1235 ((o->attr.mode ^ inode->i_mode) & S_IFMT)) {
53ce9a33
NV
1236 err = d_invalidate(dentry);
1237 if (err)
1238 goto out;
a28ef45c
MS
1239 } else if (is_bad_inode(inode)) {
1240 err = -EIO;
1241 goto out;
53ce9a33 1242 } else {
0b05b183
AA
1243 struct fuse_inode *fi;
1244 fi = get_fuse_inode(inode);
1245 spin_lock(&fc->lock);
1246 fi->nlookup++;
1247 spin_unlock(&fc->lock);
1248
fa2b7213
MS
1249 fuse_change_attributes(inode, &o->attr,
1250 entry_attr_timeout(o),
1251 attr_version);
1252
0b05b183
AA
1253 /*
1254 * The other branch to 'found' comes via fuse_iget()
1255 * which bumps nlookup inside
1256 */
1257 goto found;
1258 }
0b05b183 1259 dput(dentry);
0b05b183
AA
1260 }
1261
1262 dentry = d_alloc(parent, &name);
1263 err = -ENOMEM;
1264 if (!dentry)
1265 goto out;
1266
1267 inode = fuse_iget(dir->i_sb, o->nodeid, o->generation,
1268 &o->attr, entry_attr_timeout(o), attr_version);
1269 if (!inode)
1270 goto out;
1271
b70a80e7 1272 alias = d_materialise_unique(dentry, inode);
5835f339
MS
1273 err = PTR_ERR(alias);
1274 if (IS_ERR(alias))
1275 goto out;
2914941e 1276
0b05b183
AA
1277 if (alias) {
1278 dput(dentry);
1279 dentry = alias;
1280 }
1281
1282found:
6314efee
MS
1283 if (fc->readdirplus_auto)
1284 set_bit(FUSE_I_INIT_RDPLUS, &get_fuse_inode(inode)->state);
0b05b183
AA
1285 fuse_change_entry_timeout(dentry, o);
1286
1287 err = 0;
1288out:
c7263bcd 1289 dput(dentry);
0b05b183
AA
1290 return err;
1291}
1292
1293static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file,
8d3af7f3 1294 struct dir_context *ctx, u64 attr_version)
0b05b183
AA
1295{
1296 struct fuse_direntplus *direntplus;
1297 struct fuse_dirent *dirent;
1298 size_t reclen;
1299 int over = 0;
1300 int ret;
1301
1302 while (nbytes >= FUSE_NAME_OFFSET_DIRENTPLUS) {
1303 direntplus = (struct fuse_direntplus *) buf;
1304 dirent = &direntplus->dirent;
1305 reclen = FUSE_DIRENTPLUS_SIZE(direntplus);
1306
1307 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1308 return -EIO;
1309 if (reclen > nbytes)
1310 break;
efeb9e60
MS
1311 if (memchr(dirent->name, '/', dirent->namelen) != NULL)
1312 return -EIO;
0b05b183
AA
1313
1314 if (!over) {
1315 /* We fill entries into dstbuf only as much as
1316 it can hold. But we still continue iterating
1317 over remaining entries to link them. If not,
1318 we need to send a FORGET for each of those
1319 which we did not link.
1320 */
8d3af7f3
AV
1321 over = !dir_emit(ctx, dirent->name, dirent->namelen,
1322 dirent->ino, dirent->type);
1323 ctx->pos = dirent->off;
0b05b183
AA
1324 }
1325
1326 buf += reclen;
1327 nbytes -= reclen;
1328
1329 ret = fuse_direntplus_link(file, direntplus, attr_version);
1330 if (ret)
1331 fuse_force_forget(file, direntplus->entry_out.nodeid);
1332 }
1333
1334 return 0;
1335}
1336
8d3af7f3 1337static int fuse_readdir(struct file *file, struct dir_context *ctx)
e5e5558e 1338{
4582a4ab 1339 int plus, err;
04730fef
MS
1340 size_t nbytes;
1341 struct page *page;
496ad9aa 1342 struct inode *inode = file_inode(file);
e5e5558e 1343 struct fuse_conn *fc = get_fuse_conn(inode);
248d86e8 1344 struct fuse_req *req;
0b05b183 1345 u64 attr_version = 0;
248d86e8
MS
1346
1347 if (is_bad_inode(inode))
1348 return -EIO;
1349
b111c8c0 1350 req = fuse_get_req(fc, 1);
ce1d5a49
MS
1351 if (IS_ERR(req))
1352 return PTR_ERR(req);
e5e5558e 1353
04730fef
MS
1354 page = alloc_page(GFP_KERNEL);
1355 if (!page) {
1356 fuse_put_request(fc, req);
1357 return -ENOMEM;
1358 }
4582a4ab 1359
8d3af7f3 1360 plus = fuse_use_readdirplus(inode, ctx);
f4975c67 1361 req->out.argpages = 1;
04730fef
MS
1362 req->num_pages = 1;
1363 req->pages[0] = page;
85f40aec 1364 req->page_descs[0].length = PAGE_SIZE;
4582a4ab 1365 if (plus) {
0b05b183 1366 attr_version = fuse_get_attr_version(fc);
8d3af7f3 1367 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
0b05b183
AA
1368 FUSE_READDIRPLUS);
1369 } else {
8d3af7f3 1370 fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
0b05b183
AA
1371 FUSE_READDIR);
1372 }
b93f858a 1373 fuse_request_send(fc, req);
361b1eb5 1374 nbytes = req->out.args[0].size;
e5e5558e
MS
1375 err = req->out.h.error;
1376 fuse_put_request(fc, req);
0b05b183 1377 if (!err) {
4582a4ab 1378 if (plus) {
0b05b183 1379 err = parse_dirplusfile(page_address(page), nbytes,
8d3af7f3 1380 file, ctx,
0b05b183
AA
1381 attr_version);
1382 } else {
1383 err = parse_dirfile(page_address(page), nbytes, file,
8d3af7f3 1384 ctx);
0b05b183
AA
1385 }
1386 }
e5e5558e 1387
04730fef 1388 __free_page(page);
451418fc 1389 fuse_invalidate_atime(inode);
04730fef 1390 return err;
e5e5558e
MS
1391}
1392
1393static char *read_link(struct dentry *dentry)
1394{
1395 struct inode *inode = dentry->d_inode;
1396 struct fuse_conn *fc = get_fuse_conn(inode);
b111c8c0 1397 struct fuse_req *req = fuse_get_req_nopages(fc);
e5e5558e
MS
1398 char *link;
1399
ce1d5a49 1400 if (IS_ERR(req))
e231c2ee 1401 return ERR_CAST(req);
e5e5558e
MS
1402
1403 link = (char *) __get_free_page(GFP_KERNEL);
1404 if (!link) {
1405 link = ERR_PTR(-ENOMEM);
1406 goto out;
1407 }
1408 req->in.h.opcode = FUSE_READLINK;
1409 req->in.h.nodeid = get_node_id(inode);
e5e5558e
MS
1410 req->out.argvar = 1;
1411 req->out.numargs = 1;
1412 req->out.args[0].size = PAGE_SIZE - 1;
1413 req->out.args[0].value = link;
b93f858a 1414 fuse_request_send(fc, req);
e5e5558e
MS
1415 if (req->out.h.error) {
1416 free_page((unsigned long) link);
1417 link = ERR_PTR(req->out.h.error);
1418 } else
1419 link[req->out.args[0].size] = '\0';
1420 out:
1421 fuse_put_request(fc, req);
451418fc 1422 fuse_invalidate_atime(inode);
e5e5558e
MS
1423 return link;
1424}
1425
1426static void free_link(char *link)
1427{
1428 if (!IS_ERR(link))
1429 free_page((unsigned long) link);
1430}
1431
1432static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd)
1433{
1434 nd_set_link(nd, read_link(dentry));
1435 return NULL;
1436}
1437
1438static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
1439{
1440 free_link(nd_get_link(nd));
1441}
1442
1443static int fuse_dir_open(struct inode *inode, struct file *file)
1444{
91fe96b4 1445 return fuse_open_common(inode, file, true);
e5e5558e
MS
1446}
1447
1448static int fuse_dir_release(struct inode *inode, struct file *file)
1449{
8b0797a4
MS
1450 fuse_release_common(file, FUSE_RELEASEDIR);
1451
1452 return 0;
e5e5558e
MS
1453}
1454
02c24a82
JB
1455static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1456 int datasync)
82547981 1457{
02c24a82 1458 return fuse_fsync_common(file, start, end, datasync, 1);
82547981
MS
1459}
1460
b18da0c5
MS
1461static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1462 unsigned long arg)
1463{
1464 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1465
1466 /* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1467 if (fc->minor < 18)
1468 return -ENOTTY;
1469
1470 return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1471}
1472
1473static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1474 unsigned long arg)
1475{
1476 struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1477
1478 if (fc->minor < 18)
1479 return -ENOTTY;
1480
1481 return fuse_ioctl_common(file, cmd, arg,
1482 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1483}
1484
17637cba
MS
1485static bool update_mtime(unsigned ivalid)
1486{
1487 /* Always update if mtime is explicitly set */
1488 if (ivalid & ATTR_MTIME_SET)
1489 return true;
1490
1491 /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1492 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1493 return false;
1494
1495 /* In all other cases update */
1496 return true;
1497}
1498
befc649c 1499static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg)
9e6268db
MS
1500{
1501 unsigned ivalid = iattr->ia_valid;
9e6268db
MS
1502
1503 if (ivalid & ATTR_MODE)
befc649c 1504 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
9e6268db 1505 if (ivalid & ATTR_UID)
499dcf20 1506 arg->valid |= FATTR_UID, arg->uid = from_kuid(&init_user_ns, iattr->ia_uid);
9e6268db 1507 if (ivalid & ATTR_GID)
499dcf20 1508 arg->valid |= FATTR_GID, arg->gid = from_kgid(&init_user_ns, iattr->ia_gid);
9e6268db 1509 if (ivalid & ATTR_SIZE)
befc649c 1510 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
17637cba
MS
1511 if (ivalid & ATTR_ATIME) {
1512 arg->valid |= FATTR_ATIME;
befc649c 1513 arg->atime = iattr->ia_atime.tv_sec;
17637cba
MS
1514 arg->atimensec = iattr->ia_atime.tv_nsec;
1515 if (!(ivalid & ATTR_ATIME_SET))
1516 arg->valid |= FATTR_ATIME_NOW;
1517 }
1518 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid)) {
1519 arg->valid |= FATTR_MTIME;
befc649c 1520 arg->mtime = iattr->ia_mtime.tv_sec;
17637cba
MS
1521 arg->mtimensec = iattr->ia_mtime.tv_nsec;
1522 if (!(ivalid & ATTR_MTIME_SET))
1523 arg->valid |= FATTR_MTIME_NOW;
befc649c 1524 }
9e6268db
MS
1525}
1526
3be5a52b
MS
1527/*
1528 * Prevent concurrent writepages on inode
1529 *
1530 * This is done by adding a negative bias to the inode write counter
1531 * and waiting for all pending writes to finish.
1532 */
1533void fuse_set_nowrite(struct inode *inode)
1534{
1535 struct fuse_conn *fc = get_fuse_conn(inode);
1536 struct fuse_inode *fi = get_fuse_inode(inode);
1537
1538 BUG_ON(!mutex_is_locked(&inode->i_mutex));
1539
1540 spin_lock(&fc->lock);
1541 BUG_ON(fi->writectr < 0);
1542 fi->writectr += FUSE_NOWRITE;
1543 spin_unlock(&fc->lock);
1544 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1545}
1546
1547/*
1548 * Allow writepages on inode
1549 *
1550 * Remove the bias from the writecounter and send any queued
1551 * writepages.
1552 */
1553static void __fuse_release_nowrite(struct inode *inode)
1554{
1555 struct fuse_inode *fi = get_fuse_inode(inode);
1556
1557 BUG_ON(fi->writectr != FUSE_NOWRITE);
1558 fi->writectr = 0;
1559 fuse_flush_writepages(inode);
1560}
1561
1562void fuse_release_nowrite(struct inode *inode)
1563{
1564 struct fuse_conn *fc = get_fuse_conn(inode);
1565
1566 spin_lock(&fc->lock);
1567 __fuse_release_nowrite(inode);
1568 spin_unlock(&fc->lock);
1569}
1570
6f9f1180
MS
1571/*
1572 * Set attributes, and at the same time refresh them.
1573 *
1574 * Truncation is slightly complicated, because the 'truncate' request
1575 * may fail, in which case we don't want to touch the mapping.
9ffbb916
MS
1576 * vmtruncate() doesn't allow for this case, so do the rlimit checking
1577 * and the actual truncation by hand.
6f9f1180 1578 */
efb9fa9e
MP
1579int fuse_do_setattr(struct inode *inode, struct iattr *attr,
1580 struct file *file)
9e6268db 1581{
9e6268db 1582 struct fuse_conn *fc = get_fuse_conn(inode);
06a7c3c2 1583 struct fuse_inode *fi = get_fuse_inode(inode);
9e6268db
MS
1584 struct fuse_req *req;
1585 struct fuse_setattr_in inarg;
1586 struct fuse_attr_out outarg;
3be5a52b 1587 bool is_truncate = false;
8373200b 1588 bool is_wb = fc->writeback_cache;
3be5a52b 1589 loff_t oldsize;
9e6268db 1590 int err;
9e6268db 1591
db78b877
CH
1592 if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
1593 attr->ia_valid |= ATTR_FORCE;
1594
1595 err = inode_change_ok(inode, attr);
1596 if (err)
1597 return err;
1e9a4ed9 1598
8d56addd
MS
1599 if (attr->ia_valid & ATTR_OPEN) {
1600 if (fc->atomic_o_trunc)
1601 return 0;
1602 file = NULL;
1603 }
6ff958ed 1604
2c27c65e 1605 if (attr->ia_valid & ATTR_SIZE)
3be5a52b 1606 is_truncate = true;
9e6268db 1607
b111c8c0 1608 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1609 if (IS_ERR(req))
1610 return PTR_ERR(req);
9e6268db 1611
06a7c3c2 1612 if (is_truncate) {
3be5a52b 1613 fuse_set_nowrite(inode);
06a7c3c2
MP
1614 set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
1615 }
3be5a52b 1616
9e6268db 1617 memset(&inarg, 0, sizeof(inarg));
0e9663ee 1618 memset(&outarg, 0, sizeof(outarg));
befc649c 1619 iattr_to_fattr(attr, &inarg);
49d4914f
MS
1620 if (file) {
1621 struct fuse_file *ff = file->private_data;
1622 inarg.valid |= FATTR_FH;
1623 inarg.fh = ff->fh;
1624 }
f3332114
MS
1625 if (attr->ia_valid & ATTR_SIZE) {
1626 /* For mandatory locking in truncate */
1627 inarg.valid |= FATTR_LOCKOWNER;
1628 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1629 }
9e6268db
MS
1630 req->in.h.opcode = FUSE_SETATTR;
1631 req->in.h.nodeid = get_node_id(inode);
9e6268db
MS
1632 req->in.numargs = 1;
1633 req->in.args[0].size = sizeof(inarg);
1634 req->in.args[0].value = &inarg;
1635 req->out.numargs = 1;
0e9663ee
MS
1636 if (fc->minor < 9)
1637 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
1638 else
1639 req->out.args[0].size = sizeof(outarg);
9e6268db 1640 req->out.args[0].value = &outarg;
b93f858a 1641 fuse_request_send(fc, req);
9e6268db
MS
1642 err = req->out.h.error;
1643 fuse_put_request(fc, req);
e00d2c2d
MS
1644 if (err) {
1645 if (err == -EINTR)
1646 fuse_invalidate_attr(inode);
3be5a52b 1647 goto error;
e00d2c2d 1648 }
9e6268db 1649
e00d2c2d
MS
1650 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1651 make_bad_inode(inode);
3be5a52b
MS
1652 err = -EIO;
1653 goto error;
1654 }
1655
1656 spin_lock(&fc->lock);
1657 fuse_change_attributes_common(inode, &outarg.attr,
1658 attr_timeout(&outarg));
1659 oldsize = inode->i_size;
8373200b
PE
1660 /* see the comment in fuse_change_attributes() */
1661 if (!is_wb || is_truncate || !S_ISREG(inode->i_mode))
1662 i_size_write(inode, outarg.attr.size);
3be5a52b
MS
1663
1664 if (is_truncate) {
1665 /* NOTE: this may release/reacquire fc->lock */
1666 __fuse_release_nowrite(inode);
1667 }
1668 spin_unlock(&fc->lock);
1669
1670 /*
1671 * Only call invalidate_inode_pages2() after removing
1672 * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1673 */
8373200b
PE
1674 if ((is_truncate || !is_wb) &&
1675 S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
7caef267 1676 truncate_pagecache(inode, outarg.attr.size);
3be5a52b 1677 invalidate_inode_pages2(inode->i_mapping);
e00d2c2d
MS
1678 }
1679
06a7c3c2 1680 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
e00d2c2d 1681 return 0;
3be5a52b
MS
1682
1683error:
1684 if (is_truncate)
1685 fuse_release_nowrite(inode);
1686
06a7c3c2 1687 clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
3be5a52b 1688 return err;
9e6268db
MS
1689}
1690
49d4914f
MS
1691static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1692{
efb9fa9e
MP
1693 struct inode *inode = entry->d_inode;
1694
1695 if (!fuse_allow_current_process(get_fuse_conn(inode)))
1696 return -EACCES;
1697
49d4914f 1698 if (attr->ia_valid & ATTR_FILE)
efb9fa9e 1699 return fuse_do_setattr(inode, attr, attr->ia_file);
49d4914f 1700 else
efb9fa9e 1701 return fuse_do_setattr(inode, attr, NULL);
49d4914f
MS
1702}
1703
e5e5558e
MS
1704static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
1705 struct kstat *stat)
1706{
1707 struct inode *inode = entry->d_inode;
244f6385 1708 struct fuse_conn *fc = get_fuse_conn(inode);
244f6385 1709
c2132c1b 1710 if (!fuse_allow_current_process(fc))
244f6385
MS
1711 return -EACCES;
1712
bcb4be80 1713 return fuse_update_attributes(inode, stat, NULL, NULL);
e5e5558e
MS
1714}
1715
92a8780e
MS
1716static int fuse_setxattr(struct dentry *entry, const char *name,
1717 const void *value, size_t size, int flags)
1718{
1719 struct inode *inode = entry->d_inode;
1720 struct fuse_conn *fc = get_fuse_conn(inode);
1721 struct fuse_req *req;
1722 struct fuse_setxattr_in inarg;
1723 int err;
1724
92a8780e
MS
1725 if (fc->no_setxattr)
1726 return -EOPNOTSUPP;
1727
b111c8c0 1728 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1729 if (IS_ERR(req))
1730 return PTR_ERR(req);
92a8780e
MS
1731
1732 memset(&inarg, 0, sizeof(inarg));
1733 inarg.size = size;
1734 inarg.flags = flags;
1735 req->in.h.opcode = FUSE_SETXATTR;
1736 req->in.h.nodeid = get_node_id(inode);
92a8780e
MS
1737 req->in.numargs = 3;
1738 req->in.args[0].size = sizeof(inarg);
1739 req->in.args[0].value = &inarg;
1740 req->in.args[1].size = strlen(name) + 1;
1741 req->in.args[1].value = name;
1742 req->in.args[2].size = size;
1743 req->in.args[2].value = value;
b93f858a 1744 fuse_request_send(fc, req);
92a8780e
MS
1745 err = req->out.h.error;
1746 fuse_put_request(fc, req);
1747 if (err == -ENOSYS) {
1748 fc->no_setxattr = 1;
1749 err = -EOPNOTSUPP;
1750 }
d331a415
AA
1751 if (!err)
1752 fuse_invalidate_attr(inode);
92a8780e
MS
1753 return err;
1754}
1755
1756static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
1757 void *value, size_t size)
1758{
1759 struct inode *inode = entry->d_inode;
1760 struct fuse_conn *fc = get_fuse_conn(inode);
1761 struct fuse_req *req;
1762 struct fuse_getxattr_in inarg;
1763 struct fuse_getxattr_out outarg;
1764 ssize_t ret;
1765
1766 if (fc->no_getxattr)
1767 return -EOPNOTSUPP;
1768
b111c8c0 1769 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1770 if (IS_ERR(req))
1771 return PTR_ERR(req);
92a8780e
MS
1772
1773 memset(&inarg, 0, sizeof(inarg));
1774 inarg.size = size;
1775 req->in.h.opcode = FUSE_GETXATTR;
1776 req->in.h.nodeid = get_node_id(inode);
92a8780e
MS
1777 req->in.numargs = 2;
1778 req->in.args[0].size = sizeof(inarg);
1779 req->in.args[0].value = &inarg;
1780 req->in.args[1].size = strlen(name) + 1;
1781 req->in.args[1].value = name;
1782 /* This is really two different operations rolled into one */
1783 req->out.numargs = 1;
1784 if (size) {
1785 req->out.argvar = 1;
1786 req->out.args[0].size = size;
1787 req->out.args[0].value = value;
1788 } else {
1789 req->out.args[0].size = sizeof(outarg);
1790 req->out.args[0].value = &outarg;
1791 }
b93f858a 1792 fuse_request_send(fc, req);
92a8780e
MS
1793 ret = req->out.h.error;
1794 if (!ret)
1795 ret = size ? req->out.args[0].size : outarg.size;
1796 else {
1797 if (ret == -ENOSYS) {
1798 fc->no_getxattr = 1;
1799 ret = -EOPNOTSUPP;
1800 }
1801 }
1802 fuse_put_request(fc, req);
1803 return ret;
1804}
1805
1806static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
1807{
1808 struct inode *inode = entry->d_inode;
1809 struct fuse_conn *fc = get_fuse_conn(inode);
1810 struct fuse_req *req;
1811 struct fuse_getxattr_in inarg;
1812 struct fuse_getxattr_out outarg;
1813 ssize_t ret;
1814
c2132c1b 1815 if (!fuse_allow_current_process(fc))
e57ac683
MS
1816 return -EACCES;
1817
92a8780e
MS
1818 if (fc->no_listxattr)
1819 return -EOPNOTSUPP;
1820
b111c8c0 1821 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1822 if (IS_ERR(req))
1823 return PTR_ERR(req);
92a8780e
MS
1824
1825 memset(&inarg, 0, sizeof(inarg));
1826 inarg.size = size;
1827 req->in.h.opcode = FUSE_LISTXATTR;
1828 req->in.h.nodeid = get_node_id(inode);
92a8780e
MS
1829 req->in.numargs = 1;
1830 req->in.args[0].size = sizeof(inarg);
1831 req->in.args[0].value = &inarg;
1832 /* This is really two different operations rolled into one */
1833 req->out.numargs = 1;
1834 if (size) {
1835 req->out.argvar = 1;
1836 req->out.args[0].size = size;
1837 req->out.args[0].value = list;
1838 } else {
1839 req->out.args[0].size = sizeof(outarg);
1840 req->out.args[0].value = &outarg;
1841 }
b93f858a 1842 fuse_request_send(fc, req);
92a8780e
MS
1843 ret = req->out.h.error;
1844 if (!ret)
1845 ret = size ? req->out.args[0].size : outarg.size;
1846 else {
1847 if (ret == -ENOSYS) {
1848 fc->no_listxattr = 1;
1849 ret = -EOPNOTSUPP;
1850 }
1851 }
1852 fuse_put_request(fc, req);
1853 return ret;
1854}
1855
1856static int fuse_removexattr(struct dentry *entry, const char *name)
1857{
1858 struct inode *inode = entry->d_inode;
1859 struct fuse_conn *fc = get_fuse_conn(inode);
1860 struct fuse_req *req;
1861 int err;
1862
1863 if (fc->no_removexattr)
1864 return -EOPNOTSUPP;
1865
b111c8c0 1866 req = fuse_get_req_nopages(fc);
ce1d5a49
MS
1867 if (IS_ERR(req))
1868 return PTR_ERR(req);
92a8780e
MS
1869
1870 req->in.h.opcode = FUSE_REMOVEXATTR;
1871 req->in.h.nodeid = get_node_id(inode);
92a8780e
MS
1872 req->in.numargs = 1;
1873 req->in.args[0].size = strlen(name) + 1;
1874 req->in.args[0].value = name;
b93f858a 1875 fuse_request_send(fc, req);
92a8780e
MS
1876 err = req->out.h.error;
1877 fuse_put_request(fc, req);
1878 if (err == -ENOSYS) {
1879 fc->no_removexattr = 1;
1880 err = -EOPNOTSUPP;
1881 }
d331a415
AA
1882 if (!err)
1883 fuse_invalidate_attr(inode);
92a8780e
MS
1884 return err;
1885}
1886
754661f1 1887static const struct inode_operations fuse_dir_inode_operations = {
e5e5558e 1888 .lookup = fuse_lookup,
9e6268db
MS
1889 .mkdir = fuse_mkdir,
1890 .symlink = fuse_symlink,
1891 .unlink = fuse_unlink,
1892 .rmdir = fuse_rmdir,
1893 .rename = fuse_rename,
1894 .link = fuse_link,
1895 .setattr = fuse_setattr,
1896 .create = fuse_create,
c8ccbe03 1897 .atomic_open = fuse_atomic_open,
9e6268db 1898 .mknod = fuse_mknod,
e5e5558e
MS
1899 .permission = fuse_permission,
1900 .getattr = fuse_getattr,
92a8780e
MS
1901 .setxattr = fuse_setxattr,
1902 .getxattr = fuse_getxattr,
1903 .listxattr = fuse_listxattr,
1904 .removexattr = fuse_removexattr,
e5e5558e
MS
1905};
1906
4b6f5d20 1907static const struct file_operations fuse_dir_operations = {
b6aeaded 1908 .llseek = generic_file_llseek,
e5e5558e 1909 .read = generic_read_dir,
8d3af7f3 1910 .iterate = fuse_readdir,
e5e5558e
MS
1911 .open = fuse_dir_open,
1912 .release = fuse_dir_release,
82547981 1913 .fsync = fuse_dir_fsync,
b18da0c5
MS
1914 .unlocked_ioctl = fuse_dir_ioctl,
1915 .compat_ioctl = fuse_dir_compat_ioctl,
e5e5558e
MS
1916};
1917
754661f1 1918static const struct inode_operations fuse_common_inode_operations = {
9e6268db 1919 .setattr = fuse_setattr,
e5e5558e
MS
1920 .permission = fuse_permission,
1921 .getattr = fuse_getattr,
92a8780e
MS
1922 .setxattr = fuse_setxattr,
1923 .getxattr = fuse_getxattr,
1924 .listxattr = fuse_listxattr,
1925 .removexattr = fuse_removexattr,
e5e5558e
MS
1926};
1927
754661f1 1928static const struct inode_operations fuse_symlink_inode_operations = {
9e6268db 1929 .setattr = fuse_setattr,
e5e5558e
MS
1930 .follow_link = fuse_follow_link,
1931 .put_link = fuse_put_link,
1932 .readlink = generic_readlink,
1933 .getattr = fuse_getattr,
92a8780e
MS
1934 .setxattr = fuse_setxattr,
1935 .getxattr = fuse_getxattr,
1936 .listxattr = fuse_listxattr,
1937 .removexattr = fuse_removexattr,
e5e5558e
MS
1938};
1939
1940void fuse_init_common(struct inode *inode)
1941{
1942 inode->i_op = &fuse_common_inode_operations;
1943}
1944
1945void fuse_init_dir(struct inode *inode)
1946{
1947 inode->i_op = &fuse_dir_inode_operations;
1948 inode->i_fop = &fuse_dir_operations;
1949}
1950
1951void fuse_init_symlink(struct inode *inode)
1952{
1953 inode->i_op = &fuse_symlink_inode_operations;
1954}
This page took 0.771168 seconds and 5 git commands to generate.