Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6
[pandora-kernel.git] / fs / fuse / dir.c
1 /*
2   FUSE: Filesystem in Userspace
3   Copyright (C) 2001-2008  Miklos Szeredi <miklos@szeredi.hu>
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>
13 #include <linux/gfp.h>
14 #include <linux/sched.h>
15 #include <linux/namei.h>
16
17 #if BITS_PER_LONG >= 64
18 static inline void fuse_dentry_settime(struct dentry *entry, u64 time)
19 {
20         entry->d_time = time;
21 }
22
23 static inline u64 fuse_dentry_time(struct dentry *entry)
24 {
25         return entry->d_time;
26 }
27 #else
28 /*
29  * On 32 bit archs store the high 32 bits of time in d_fsdata
30  */
31 static void fuse_dentry_settime(struct dentry *entry, u64 time)
32 {
33         entry->d_time = time;
34         entry->d_fsdata = (void *) (unsigned long) (time >> 32);
35 }
36
37 static u64 fuse_dentry_time(struct dentry *entry)
38 {
39         return (u64) entry->d_time +
40                 ((u64) (unsigned long) entry->d_fsdata << 32);
41 }
42 #endif
43
44 /*
45  * FUSE caches dentries and attributes with separate timeout.  The
46  * time in jiffies until the dentry/attributes are valid is stored in
47  * dentry->d_time and fuse_inode->i_time respectively.
48  */
49
50 /*
51  * Calculate the time in jiffies until a dentry/attributes are valid
52  */
53 static u64 time_to_jiffies(unsigned long sec, unsigned long nsec)
54 {
55         if (sec || nsec) {
56                 struct timespec ts = {sec, nsec};
57                 return get_jiffies_64() + timespec_to_jiffies(&ts);
58         } else
59                 return 0;
60 }
61
62 /*
63  * Set dentry and possibly attribute timeouts from the lookup/mk*
64  * replies
65  */
66 static void fuse_change_entry_timeout(struct dentry *entry,
67                                       struct fuse_entry_out *o)
68 {
69         fuse_dentry_settime(entry,
70                 time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
71 }
72
73 static u64 attr_timeout(struct fuse_attr_out *o)
74 {
75         return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
76 }
77
78 static u64 entry_attr_timeout(struct fuse_entry_out *o)
79 {
80         return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
81 }
82
83 /*
84  * Mark the attributes as stale, so that at the next call to
85  * ->getattr() they will be fetched from userspace
86  */
87 void fuse_invalidate_attr(struct inode *inode)
88 {
89         get_fuse_inode(inode)->i_time = 0;
90 }
91
92 /*
93  * Just mark the entry as stale, so that a next attempt to look it up
94  * will result in a new lookup call to userspace
95  *
96  * This is called when a dentry is about to become negative and the
97  * timeout is unknown (unlink, rmdir, rename and in some cases
98  * lookup)
99  */
100 void fuse_invalidate_entry_cache(struct dentry *entry)
101 {
102         fuse_dentry_settime(entry, 0);
103 }
104
105 /*
106  * Same as fuse_invalidate_entry_cache(), but also try to remove the
107  * dentry from the hash
108  */
109 static void fuse_invalidate_entry(struct dentry *entry)
110 {
111         d_invalidate(entry);
112         fuse_invalidate_entry_cache(entry);
113 }
114
115 static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_req *req,
116                              u64 nodeid, struct qstr *name,
117                              struct fuse_entry_out *outarg)
118 {
119         memset(outarg, 0, sizeof(struct fuse_entry_out));
120         req->in.h.opcode = FUSE_LOOKUP;
121         req->in.h.nodeid = nodeid;
122         req->in.numargs = 1;
123         req->in.args[0].size = name->len + 1;
124         req->in.args[0].value = name->name;
125         req->out.numargs = 1;
126         if (fc->minor < 9)
127                 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
128         else
129                 req->out.args[0].size = sizeof(struct fuse_entry_out);
130         req->out.args[0].value = outarg;
131 }
132
133 u64 fuse_get_attr_version(struct fuse_conn *fc)
134 {
135         u64 curr_version;
136
137         /*
138          * The spin lock isn't actually needed on 64bit archs, but we
139          * don't yet care too much about such optimizations.
140          */
141         spin_lock(&fc->lock);
142         curr_version = fc->attr_version;
143         spin_unlock(&fc->lock);
144
145         return curr_version;
146 }
147
148 /*
149  * Check whether the dentry is still valid
150  *
151  * If the entry validity timeout has expired and the dentry is
152  * positive, try to redo the lookup.  If the lookup results in a
153  * different inode, then let the VFS invalidate the dentry and redo
154  * the lookup once more.  If the lookup results in the same inode,
155  * then refresh the attributes, timeouts and mark the dentry valid.
156  */
157 static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
158 {
159         struct inode *inode = entry->d_inode;
160
161         if (inode && is_bad_inode(inode))
162                 return 0;
163         else if (fuse_dentry_time(entry) < get_jiffies_64()) {
164                 int err;
165                 struct fuse_entry_out outarg;
166                 struct fuse_conn *fc;
167                 struct fuse_req *req;
168                 struct fuse_req *forget_req;
169                 struct dentry *parent;
170                 u64 attr_version;
171
172                 /* For negative dentries, always do a fresh lookup */
173                 if (!inode)
174                         return 0;
175
176                 fc = get_fuse_conn(inode);
177                 req = fuse_get_req(fc);
178                 if (IS_ERR(req))
179                         return 0;
180
181                 forget_req = fuse_get_req(fc);
182                 if (IS_ERR(forget_req)) {
183                         fuse_put_request(fc, req);
184                         return 0;
185                 }
186
187                 attr_version = fuse_get_attr_version(fc);
188
189                 parent = dget_parent(entry);
190                 fuse_lookup_init(fc, req, get_node_id(parent->d_inode),
191                                  &entry->d_name, &outarg);
192                 fuse_request_send(fc, req);
193                 dput(parent);
194                 err = req->out.h.error;
195                 fuse_put_request(fc, req);
196                 /* Zero nodeid is same as -ENOENT */
197                 if (!err && !outarg.nodeid)
198                         err = -ENOENT;
199                 if (!err) {
200                         struct fuse_inode *fi = get_fuse_inode(inode);
201                         if (outarg.nodeid != get_node_id(inode)) {
202                                 fuse_send_forget(fc, forget_req,
203                                                  outarg.nodeid, 1);
204                                 return 0;
205                         }
206                         spin_lock(&fc->lock);
207                         fi->nlookup++;
208                         spin_unlock(&fc->lock);
209                 }
210                 fuse_put_request(fc, forget_req);
211                 if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
212                         return 0;
213
214                 fuse_change_attributes(inode, &outarg.attr,
215                                        entry_attr_timeout(&outarg),
216                                        attr_version);
217                 fuse_change_entry_timeout(entry, &outarg);
218         }
219         return 1;
220 }
221
222 static int invalid_nodeid(u64 nodeid)
223 {
224         return !nodeid || nodeid == FUSE_ROOT_ID;
225 }
226
227 const struct dentry_operations fuse_dentry_operations = {
228         .d_revalidate   = fuse_dentry_revalidate,
229 };
230
231 int fuse_valid_type(int m)
232 {
233         return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
234                 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
235 }
236
237 /*
238  * Add a directory inode to a dentry, ensuring that no other dentry
239  * refers to this inode.  Called with fc->inst_mutex.
240  */
241 static struct dentry *fuse_d_add_directory(struct dentry *entry,
242                                            struct inode *inode)
243 {
244         struct dentry *alias = d_find_alias(inode);
245         if (alias && !(alias->d_flags & DCACHE_DISCONNECTED)) {
246                 /* This tries to shrink the subtree below alias */
247                 fuse_invalidate_entry(alias);
248                 dput(alias);
249                 if (!list_empty(&inode->i_dentry))
250                         return ERR_PTR(-EBUSY);
251         } else {
252                 dput(alias);
253         }
254         return d_splice_alias(inode, entry);
255 }
256
257 int fuse_lookup_name(struct super_block *sb, u64 nodeid, struct qstr *name,
258                      struct fuse_entry_out *outarg, struct inode **inode)
259 {
260         struct fuse_conn *fc = get_fuse_conn_super(sb);
261         struct fuse_req *req;
262         struct fuse_req *forget_req;
263         u64 attr_version;
264         int err;
265
266         *inode = NULL;
267         err = -ENAMETOOLONG;
268         if (name->len > FUSE_NAME_MAX)
269                 goto out;
270
271         req = fuse_get_req(fc);
272         err = PTR_ERR(req);
273         if (IS_ERR(req))
274                 goto out;
275
276         forget_req = fuse_get_req(fc);
277         err = PTR_ERR(forget_req);
278         if (IS_ERR(forget_req)) {
279                 fuse_put_request(fc, req);
280                 goto out;
281         }
282
283         attr_version = fuse_get_attr_version(fc);
284
285         fuse_lookup_init(fc, req, nodeid, name, outarg);
286         fuse_request_send(fc, req);
287         err = req->out.h.error;
288         fuse_put_request(fc, req);
289         /* Zero nodeid is same as -ENOENT, but with valid timeout */
290         if (err || !outarg->nodeid)
291                 goto out_put_forget;
292
293         err = -EIO;
294         if (!outarg->nodeid)
295                 goto out_put_forget;
296         if (!fuse_valid_type(outarg->attr.mode))
297                 goto out_put_forget;
298
299         *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
300                            &outarg->attr, entry_attr_timeout(outarg),
301                            attr_version);
302         err = -ENOMEM;
303         if (!*inode) {
304                 fuse_send_forget(fc, forget_req, outarg->nodeid, 1);
305                 goto out;
306         }
307         err = 0;
308
309  out_put_forget:
310         fuse_put_request(fc, forget_req);
311  out:
312         return err;
313 }
314
315 static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
316                                   struct nameidata *nd)
317 {
318         int err;
319         struct fuse_entry_out outarg;
320         struct inode *inode;
321         struct dentry *newent;
322         struct fuse_conn *fc = get_fuse_conn(dir);
323         bool outarg_valid = true;
324
325         err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
326                                &outarg, &inode);
327         if (err == -ENOENT) {
328                 outarg_valid = false;
329                 err = 0;
330         }
331         if (err)
332                 goto out_err;
333
334         err = -EIO;
335         if (inode && get_node_id(inode) == FUSE_ROOT_ID)
336                 goto out_iput;
337
338         if (inode && S_ISDIR(inode->i_mode)) {
339                 mutex_lock(&fc->inst_mutex);
340                 newent = fuse_d_add_directory(entry, inode);
341                 mutex_unlock(&fc->inst_mutex);
342                 err = PTR_ERR(newent);
343                 if (IS_ERR(newent))
344                         goto out_iput;
345         } else {
346                 newent = d_splice_alias(inode, entry);
347         }
348
349         entry = newent ? newent : entry;
350         entry->d_op = &fuse_dentry_operations;
351         if (outarg_valid)
352                 fuse_change_entry_timeout(entry, &outarg);
353         else
354                 fuse_invalidate_entry_cache(entry);
355
356         return newent;
357
358  out_iput:
359         iput(inode);
360  out_err:
361         return ERR_PTR(err);
362 }
363
364 /*
365  * Atomic create+open operation
366  *
367  * If the filesystem doesn't support this, then fall back to separate
368  * 'mknod' + 'open' requests.
369  */
370 static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
371                             struct nameidata *nd)
372 {
373         int err;
374         struct inode *inode;
375         struct fuse_conn *fc = get_fuse_conn(dir);
376         struct fuse_req *req;
377         struct fuse_req *forget_req;
378         struct fuse_create_in inarg;
379         struct fuse_open_out outopen;
380         struct fuse_entry_out outentry;
381         struct fuse_file *ff;
382         struct file *file;
383         int flags = nd->intent.open.flags - 1;
384
385         if (fc->no_create)
386                 return -ENOSYS;
387
388         if (flags & O_DIRECT)
389                 return -EINVAL;
390
391         forget_req = fuse_get_req(fc);
392         if (IS_ERR(forget_req))
393                 return PTR_ERR(forget_req);
394
395         req = fuse_get_req(fc);
396         err = PTR_ERR(req);
397         if (IS_ERR(req))
398                 goto out_put_forget_req;
399
400         err = -ENOMEM;
401         ff = fuse_file_alloc(fc);
402         if (!ff)
403                 goto out_put_request;
404
405         if (!fc->dont_mask)
406                 mode &= ~current_umask();
407
408         flags &= ~O_NOCTTY;
409         memset(&inarg, 0, sizeof(inarg));
410         memset(&outentry, 0, sizeof(outentry));
411         inarg.flags = flags;
412         inarg.mode = mode;
413         inarg.umask = current_umask();
414         req->in.h.opcode = FUSE_CREATE;
415         req->in.h.nodeid = get_node_id(dir);
416         req->in.numargs = 2;
417         req->in.args[0].size = fc->minor < 12 ? sizeof(struct fuse_open_in) :
418                                                 sizeof(inarg);
419         req->in.args[0].value = &inarg;
420         req->in.args[1].size = entry->d_name.len + 1;
421         req->in.args[1].value = entry->d_name.name;
422         req->out.numargs = 2;
423         if (fc->minor < 9)
424                 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
425         else
426                 req->out.args[0].size = sizeof(outentry);
427         req->out.args[0].value = &outentry;
428         req->out.args[1].size = sizeof(outopen);
429         req->out.args[1].value = &outopen;
430         fuse_request_send(fc, req);
431         err = req->out.h.error;
432         if (err) {
433                 if (err == -ENOSYS)
434                         fc->no_create = 1;
435                 goto out_free_ff;
436         }
437
438         err = -EIO;
439         if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
440                 goto out_free_ff;
441
442         fuse_put_request(fc, req);
443         ff->fh = outopen.fh;
444         ff->nodeid = outentry.nodeid;
445         ff->open_flags = outopen.open_flags;
446         inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
447                           &outentry.attr, entry_attr_timeout(&outentry), 0);
448         if (!inode) {
449                 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
450                 fuse_sync_release(ff, flags);
451                 fuse_send_forget(fc, forget_req, outentry.nodeid, 1);
452                 return -ENOMEM;
453         }
454         fuse_put_request(fc, forget_req);
455         d_instantiate(entry, inode);
456         fuse_change_entry_timeout(entry, &outentry);
457         fuse_invalidate_attr(dir);
458         file = lookup_instantiate_filp(nd, entry, generic_file_open);
459         if (IS_ERR(file)) {
460                 fuse_sync_release(ff, flags);
461                 return PTR_ERR(file);
462         }
463         file->private_data = fuse_file_get(ff);
464         fuse_finish_open(inode, file);
465         return 0;
466
467  out_free_ff:
468         fuse_file_free(ff);
469  out_put_request:
470         fuse_put_request(fc, req);
471  out_put_forget_req:
472         fuse_put_request(fc, forget_req);
473         return err;
474 }
475
476 /*
477  * Code shared between mknod, mkdir, symlink and link
478  */
479 static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
480                             struct inode *dir, struct dentry *entry,
481                             int mode)
482 {
483         struct fuse_entry_out outarg;
484         struct inode *inode;
485         int err;
486         struct fuse_req *forget_req;
487
488         forget_req = fuse_get_req(fc);
489         if (IS_ERR(forget_req)) {
490                 fuse_put_request(fc, req);
491                 return PTR_ERR(forget_req);
492         }
493
494         memset(&outarg, 0, sizeof(outarg));
495         req->in.h.nodeid = get_node_id(dir);
496         req->out.numargs = 1;
497         if (fc->minor < 9)
498                 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
499         else
500                 req->out.args[0].size = sizeof(outarg);
501         req->out.args[0].value = &outarg;
502         fuse_request_send(fc, req);
503         err = req->out.h.error;
504         fuse_put_request(fc, req);
505         if (err)
506                 goto out_put_forget_req;
507
508         err = -EIO;
509         if (invalid_nodeid(outarg.nodeid))
510                 goto out_put_forget_req;
511
512         if ((outarg.attr.mode ^ mode) & S_IFMT)
513                 goto out_put_forget_req;
514
515         inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
516                           &outarg.attr, entry_attr_timeout(&outarg), 0);
517         if (!inode) {
518                 fuse_send_forget(fc, forget_req, outarg.nodeid, 1);
519                 return -ENOMEM;
520         }
521         fuse_put_request(fc, forget_req);
522
523         if (S_ISDIR(inode->i_mode)) {
524                 struct dentry *alias;
525                 mutex_lock(&fc->inst_mutex);
526                 alias = d_find_alias(inode);
527                 if (alias) {
528                         /* New directory must have moved since mkdir */
529                         mutex_unlock(&fc->inst_mutex);
530                         dput(alias);
531                         iput(inode);
532                         return -EBUSY;
533                 }
534                 d_instantiate(entry, inode);
535                 mutex_unlock(&fc->inst_mutex);
536         } else
537                 d_instantiate(entry, inode);
538
539         fuse_change_entry_timeout(entry, &outarg);
540         fuse_invalidate_attr(dir);
541         return 0;
542
543  out_put_forget_req:
544         fuse_put_request(fc, forget_req);
545         return err;
546 }
547
548 static int fuse_mknod(struct inode *dir, struct dentry *entry, int mode,
549                       dev_t rdev)
550 {
551         struct fuse_mknod_in inarg;
552         struct fuse_conn *fc = get_fuse_conn(dir);
553         struct fuse_req *req = fuse_get_req(fc);
554         if (IS_ERR(req))
555                 return PTR_ERR(req);
556
557         if (!fc->dont_mask)
558                 mode &= ~current_umask();
559
560         memset(&inarg, 0, sizeof(inarg));
561         inarg.mode = mode;
562         inarg.rdev = new_encode_dev(rdev);
563         inarg.umask = current_umask();
564         req->in.h.opcode = FUSE_MKNOD;
565         req->in.numargs = 2;
566         req->in.args[0].size = fc->minor < 12 ? FUSE_COMPAT_MKNOD_IN_SIZE :
567                                                 sizeof(inarg);
568         req->in.args[0].value = &inarg;
569         req->in.args[1].size = entry->d_name.len + 1;
570         req->in.args[1].value = entry->d_name.name;
571         return create_new_entry(fc, req, dir, entry, mode);
572 }
573
574 static int fuse_create(struct inode *dir, struct dentry *entry, int mode,
575                        struct nameidata *nd)
576 {
577         if (nd && (nd->flags & LOOKUP_OPEN)) {
578                 int err = fuse_create_open(dir, entry, mode, nd);
579                 if (err != -ENOSYS)
580                         return err;
581                 /* Fall back on mknod */
582         }
583         return fuse_mknod(dir, entry, mode, 0);
584 }
585
586 static int fuse_mkdir(struct inode *dir, struct dentry *entry, int mode)
587 {
588         struct fuse_mkdir_in inarg;
589         struct fuse_conn *fc = get_fuse_conn(dir);
590         struct fuse_req *req = fuse_get_req(fc);
591         if (IS_ERR(req))
592                 return PTR_ERR(req);
593
594         if (!fc->dont_mask)
595                 mode &= ~current_umask();
596
597         memset(&inarg, 0, sizeof(inarg));
598         inarg.mode = mode;
599         inarg.umask = current_umask();
600         req->in.h.opcode = FUSE_MKDIR;
601         req->in.numargs = 2;
602         req->in.args[0].size = sizeof(inarg);
603         req->in.args[0].value = &inarg;
604         req->in.args[1].size = entry->d_name.len + 1;
605         req->in.args[1].value = entry->d_name.name;
606         return create_new_entry(fc, req, dir, entry, S_IFDIR);
607 }
608
609 static int fuse_symlink(struct inode *dir, struct dentry *entry,
610                         const char *link)
611 {
612         struct fuse_conn *fc = get_fuse_conn(dir);
613         unsigned len = strlen(link) + 1;
614         struct fuse_req *req = fuse_get_req(fc);
615         if (IS_ERR(req))
616                 return PTR_ERR(req);
617
618         req->in.h.opcode = FUSE_SYMLINK;
619         req->in.numargs = 2;
620         req->in.args[0].size = entry->d_name.len + 1;
621         req->in.args[0].value = entry->d_name.name;
622         req->in.args[1].size = len;
623         req->in.args[1].value = link;
624         return create_new_entry(fc, req, dir, entry, S_IFLNK);
625 }
626
627 static int fuse_unlink(struct inode *dir, struct dentry *entry)
628 {
629         int err;
630         struct fuse_conn *fc = get_fuse_conn(dir);
631         struct fuse_req *req = fuse_get_req(fc);
632         if (IS_ERR(req))
633                 return PTR_ERR(req);
634
635         req->in.h.opcode = FUSE_UNLINK;
636         req->in.h.nodeid = get_node_id(dir);
637         req->in.numargs = 1;
638         req->in.args[0].size = entry->d_name.len + 1;
639         req->in.args[0].value = entry->d_name.name;
640         fuse_request_send(fc, req);
641         err = req->out.h.error;
642         fuse_put_request(fc, req);
643         if (!err) {
644                 struct inode *inode = entry->d_inode;
645
646                 /*
647                  * Set nlink to zero so the inode can be cleared, if the inode
648                  * does have more links this will be discovered at the next
649                  * lookup/getattr.
650                  */
651                 clear_nlink(inode);
652                 fuse_invalidate_attr(inode);
653                 fuse_invalidate_attr(dir);
654                 fuse_invalidate_entry_cache(entry);
655         } else if (err == -EINTR)
656                 fuse_invalidate_entry(entry);
657         return err;
658 }
659
660 static int fuse_rmdir(struct inode *dir, struct dentry *entry)
661 {
662         int err;
663         struct fuse_conn *fc = get_fuse_conn(dir);
664         struct fuse_req *req = fuse_get_req(fc);
665         if (IS_ERR(req))
666                 return PTR_ERR(req);
667
668         req->in.h.opcode = FUSE_RMDIR;
669         req->in.h.nodeid = get_node_id(dir);
670         req->in.numargs = 1;
671         req->in.args[0].size = entry->d_name.len + 1;
672         req->in.args[0].value = entry->d_name.name;
673         fuse_request_send(fc, req);
674         err = req->out.h.error;
675         fuse_put_request(fc, req);
676         if (!err) {
677                 clear_nlink(entry->d_inode);
678                 fuse_invalidate_attr(dir);
679                 fuse_invalidate_entry_cache(entry);
680         } else if (err == -EINTR)
681                 fuse_invalidate_entry(entry);
682         return err;
683 }
684
685 static int fuse_rename(struct inode *olddir, struct dentry *oldent,
686                        struct inode *newdir, struct dentry *newent)
687 {
688         int err;
689         struct fuse_rename_in inarg;
690         struct fuse_conn *fc = get_fuse_conn(olddir);
691         struct fuse_req *req = fuse_get_req(fc);
692         if (IS_ERR(req))
693                 return PTR_ERR(req);
694
695         memset(&inarg, 0, sizeof(inarg));
696         inarg.newdir = get_node_id(newdir);
697         req->in.h.opcode = FUSE_RENAME;
698         req->in.h.nodeid = get_node_id(olddir);
699         req->in.numargs = 3;
700         req->in.args[0].size = sizeof(inarg);
701         req->in.args[0].value = &inarg;
702         req->in.args[1].size = oldent->d_name.len + 1;
703         req->in.args[1].value = oldent->d_name.name;
704         req->in.args[2].size = newent->d_name.len + 1;
705         req->in.args[2].value = newent->d_name.name;
706         fuse_request_send(fc, req);
707         err = req->out.h.error;
708         fuse_put_request(fc, req);
709         if (!err) {
710                 /* ctime changes */
711                 fuse_invalidate_attr(oldent->d_inode);
712
713                 fuse_invalidate_attr(olddir);
714                 if (olddir != newdir)
715                         fuse_invalidate_attr(newdir);
716
717                 /* newent will end up negative */
718                 if (newent->d_inode) {
719                         fuse_invalidate_attr(newent->d_inode);
720                         fuse_invalidate_entry_cache(newent);
721                 }
722         } else if (err == -EINTR) {
723                 /* If request was interrupted, DEITY only knows if the
724                    rename actually took place.  If the invalidation
725                    fails (e.g. some process has CWD under the renamed
726                    directory), then there can be inconsistency between
727                    the dcache and the real filesystem.  Tough luck. */
728                 fuse_invalidate_entry(oldent);
729                 if (newent->d_inode)
730                         fuse_invalidate_entry(newent);
731         }
732
733         return err;
734 }
735
736 static int fuse_link(struct dentry *entry, struct inode *newdir,
737                      struct dentry *newent)
738 {
739         int err;
740         struct fuse_link_in inarg;
741         struct inode *inode = entry->d_inode;
742         struct fuse_conn *fc = get_fuse_conn(inode);
743         struct fuse_req *req = fuse_get_req(fc);
744         if (IS_ERR(req))
745                 return PTR_ERR(req);
746
747         memset(&inarg, 0, sizeof(inarg));
748         inarg.oldnodeid = get_node_id(inode);
749         req->in.h.opcode = FUSE_LINK;
750         req->in.numargs = 2;
751         req->in.args[0].size = sizeof(inarg);
752         req->in.args[0].value = &inarg;
753         req->in.args[1].size = newent->d_name.len + 1;
754         req->in.args[1].value = newent->d_name.name;
755         err = create_new_entry(fc, req, newdir, newent, inode->i_mode);
756         /* Contrary to "normal" filesystems it can happen that link
757            makes two "logical" inodes point to the same "physical"
758            inode.  We invalidate the attributes of the old one, so it
759            will reflect changes in the backing inode (link count,
760            etc.)
761         */
762         if (!err || err == -EINTR)
763                 fuse_invalidate_attr(inode);
764         return err;
765 }
766
767 static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
768                           struct kstat *stat)
769 {
770         stat->dev = inode->i_sb->s_dev;
771         stat->ino = attr->ino;
772         stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
773         stat->nlink = attr->nlink;
774         stat->uid = attr->uid;
775         stat->gid = attr->gid;
776         stat->rdev = inode->i_rdev;
777         stat->atime.tv_sec = attr->atime;
778         stat->atime.tv_nsec = attr->atimensec;
779         stat->mtime.tv_sec = attr->mtime;
780         stat->mtime.tv_nsec = attr->mtimensec;
781         stat->ctime.tv_sec = attr->ctime;
782         stat->ctime.tv_nsec = attr->ctimensec;
783         stat->size = attr->size;
784         stat->blocks = attr->blocks;
785         stat->blksize = (1 << inode->i_blkbits);
786 }
787
788 static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
789                            struct file *file)
790 {
791         int err;
792         struct fuse_getattr_in inarg;
793         struct fuse_attr_out outarg;
794         struct fuse_conn *fc = get_fuse_conn(inode);
795         struct fuse_req *req;
796         u64 attr_version;
797
798         req = fuse_get_req(fc);
799         if (IS_ERR(req))
800                 return PTR_ERR(req);
801
802         attr_version = fuse_get_attr_version(fc);
803
804         memset(&inarg, 0, sizeof(inarg));
805         memset(&outarg, 0, sizeof(outarg));
806         /* Directories have separate file-handle space */
807         if (file && S_ISREG(inode->i_mode)) {
808                 struct fuse_file *ff = file->private_data;
809
810                 inarg.getattr_flags |= FUSE_GETATTR_FH;
811                 inarg.fh = ff->fh;
812         }
813         req->in.h.opcode = FUSE_GETATTR;
814         req->in.h.nodeid = get_node_id(inode);
815         req->in.numargs = 1;
816         req->in.args[0].size = sizeof(inarg);
817         req->in.args[0].value = &inarg;
818         req->out.numargs = 1;
819         if (fc->minor < 9)
820                 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
821         else
822                 req->out.args[0].size = sizeof(outarg);
823         req->out.args[0].value = &outarg;
824         fuse_request_send(fc, req);
825         err = req->out.h.error;
826         fuse_put_request(fc, req);
827         if (!err) {
828                 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
829                         make_bad_inode(inode);
830                         err = -EIO;
831                 } else {
832                         fuse_change_attributes(inode, &outarg.attr,
833                                                attr_timeout(&outarg),
834                                                attr_version);
835                         if (stat)
836                                 fuse_fillattr(inode, &outarg.attr, stat);
837                 }
838         }
839         return err;
840 }
841
842 int fuse_update_attributes(struct inode *inode, struct kstat *stat,
843                            struct file *file, bool *refreshed)
844 {
845         struct fuse_inode *fi = get_fuse_inode(inode);
846         int err;
847         bool r;
848
849         if (fi->i_time < get_jiffies_64()) {
850                 r = true;
851                 err = fuse_do_getattr(inode, stat, file);
852         } else {
853                 r = false;
854                 err = 0;
855                 if (stat) {
856                         generic_fillattr(inode, stat);
857                         stat->mode = fi->orig_i_mode;
858                 }
859         }
860
861         if (refreshed != NULL)
862                 *refreshed = r;
863
864         return err;
865 }
866
867 int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
868                              struct qstr *name)
869 {
870         int err = -ENOTDIR;
871         struct inode *parent;
872         struct dentry *dir;
873         struct dentry *entry;
874
875         parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
876         if (!parent)
877                 return -ENOENT;
878
879         mutex_lock(&parent->i_mutex);
880         if (!S_ISDIR(parent->i_mode))
881                 goto unlock;
882
883         err = -ENOENT;
884         dir = d_find_alias(parent);
885         if (!dir)
886                 goto unlock;
887
888         entry = d_lookup(dir, name);
889         dput(dir);
890         if (!entry)
891                 goto unlock;
892
893         fuse_invalidate_attr(parent);
894         fuse_invalidate_entry(entry);
895         dput(entry);
896         err = 0;
897
898  unlock:
899         mutex_unlock(&parent->i_mutex);
900         iput(parent);
901         return err;
902 }
903
904 /*
905  * Calling into a user-controlled filesystem gives the filesystem
906  * daemon ptrace-like capabilities over the requester process.  This
907  * means, that the filesystem daemon is able to record the exact
908  * filesystem operations performed, and can also control the behavior
909  * of the requester process in otherwise impossible ways.  For example
910  * it can delay the operation for arbitrary length of time allowing
911  * DoS against the requester.
912  *
913  * For this reason only those processes can call into the filesystem,
914  * for which the owner of the mount has ptrace privilege.  This
915  * excludes processes started by other users, suid or sgid processes.
916  */
917 int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task)
918 {
919         const struct cred *cred;
920         int ret;
921
922         if (fc->flags & FUSE_ALLOW_OTHER)
923                 return 1;
924
925         rcu_read_lock();
926         ret = 0;
927         cred = __task_cred(task);
928         if (cred->euid == fc->user_id &&
929             cred->suid == fc->user_id &&
930             cred->uid  == fc->user_id &&
931             cred->egid == fc->group_id &&
932             cred->sgid == fc->group_id &&
933             cred->gid  == fc->group_id)
934                 ret = 1;
935         rcu_read_unlock();
936
937         return ret;
938 }
939
940 static int fuse_access(struct inode *inode, int mask)
941 {
942         struct fuse_conn *fc = get_fuse_conn(inode);
943         struct fuse_req *req;
944         struct fuse_access_in inarg;
945         int err;
946
947         if (fc->no_access)
948                 return 0;
949
950         req = fuse_get_req(fc);
951         if (IS_ERR(req))
952                 return PTR_ERR(req);
953
954         memset(&inarg, 0, sizeof(inarg));
955         inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
956         req->in.h.opcode = FUSE_ACCESS;
957         req->in.h.nodeid = get_node_id(inode);
958         req->in.numargs = 1;
959         req->in.args[0].size = sizeof(inarg);
960         req->in.args[0].value = &inarg;
961         fuse_request_send(fc, req);
962         err = req->out.h.error;
963         fuse_put_request(fc, req);
964         if (err == -ENOSYS) {
965                 fc->no_access = 1;
966                 err = 0;
967         }
968         return err;
969 }
970
971 /*
972  * Check permission.  The two basic access models of FUSE are:
973  *
974  * 1) Local access checking ('default_permissions' mount option) based
975  * on file mode.  This is the plain old disk filesystem permission
976  * modell.
977  *
978  * 2) "Remote" access checking, where server is responsible for
979  * checking permission in each inode operation.  An exception to this
980  * is if ->permission() was invoked from sys_access() in which case an
981  * access request is sent.  Execute permission is still checked
982  * locally based on file mode.
983  */
984 static int fuse_permission(struct inode *inode, int mask)
985 {
986         struct fuse_conn *fc = get_fuse_conn(inode);
987         bool refreshed = false;
988         int err = 0;
989
990         if (!fuse_allow_task(fc, current))
991                 return -EACCES;
992
993         /*
994          * If attributes are needed, refresh them before proceeding
995          */
996         if ((fc->flags & FUSE_DEFAULT_PERMISSIONS) ||
997             ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
998                 err = fuse_update_attributes(inode, NULL, NULL, &refreshed);
999                 if (err)
1000                         return err;
1001         }
1002
1003         if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
1004                 err = generic_permission(inode, mask, NULL);
1005
1006                 /* If permission is denied, try to refresh file
1007                    attributes.  This is also needed, because the root
1008                    node will at first have no permissions */
1009                 if (err == -EACCES && !refreshed) {
1010                         err = fuse_do_getattr(inode, NULL, NULL);
1011                         if (!err)
1012                                 err = generic_permission(inode, mask, NULL);
1013                 }
1014
1015                 /* Note: the opposite of the above test does not
1016                    exist.  So if permissions are revoked this won't be
1017                    noticed immediately, only after the attribute
1018                    timeout has expired */
1019         } else if (mask & MAY_ACCESS) {
1020                 err = fuse_access(inode, mask);
1021         } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1022                 if (!(inode->i_mode & S_IXUGO)) {
1023                         if (refreshed)
1024                                 return -EACCES;
1025
1026                         err = fuse_do_getattr(inode, NULL, NULL);
1027                         if (!err && !(inode->i_mode & S_IXUGO))
1028                                 return -EACCES;
1029                 }
1030         }
1031         return err;
1032 }
1033
1034 static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
1035                          void *dstbuf, filldir_t filldir)
1036 {
1037         while (nbytes >= FUSE_NAME_OFFSET) {
1038                 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
1039                 size_t reclen = FUSE_DIRENT_SIZE(dirent);
1040                 int over;
1041                 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1042                         return -EIO;
1043                 if (reclen > nbytes)
1044                         break;
1045
1046                 over = filldir(dstbuf, dirent->name, dirent->namelen,
1047                                file->f_pos, dirent->ino, dirent->type);
1048                 if (over)
1049                         break;
1050
1051                 buf += reclen;
1052                 nbytes -= reclen;
1053                 file->f_pos = dirent->off;
1054         }
1055
1056         return 0;
1057 }
1058
1059 static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
1060 {
1061         int err;
1062         size_t nbytes;
1063         struct page *page;
1064         struct inode *inode = file->f_path.dentry->d_inode;
1065         struct fuse_conn *fc = get_fuse_conn(inode);
1066         struct fuse_req *req;
1067
1068         if (is_bad_inode(inode))
1069                 return -EIO;
1070
1071         req = fuse_get_req(fc);
1072         if (IS_ERR(req))
1073                 return PTR_ERR(req);
1074
1075         page = alloc_page(GFP_KERNEL);
1076         if (!page) {
1077                 fuse_put_request(fc, req);
1078                 return -ENOMEM;
1079         }
1080         req->out.argpages = 1;
1081         req->num_pages = 1;
1082         req->pages[0] = page;
1083         fuse_read_fill(req, file, file->f_pos, PAGE_SIZE, FUSE_READDIR);
1084         fuse_request_send(fc, req);
1085         nbytes = req->out.args[0].size;
1086         err = req->out.h.error;
1087         fuse_put_request(fc, req);
1088         if (!err)
1089                 err = parse_dirfile(page_address(page), nbytes, file, dstbuf,
1090                                     filldir);
1091
1092         __free_page(page);
1093         fuse_invalidate_attr(inode); /* atime changed */
1094         return err;
1095 }
1096
1097 static char *read_link(struct dentry *dentry)
1098 {
1099         struct inode *inode = dentry->d_inode;
1100         struct fuse_conn *fc = get_fuse_conn(inode);
1101         struct fuse_req *req = fuse_get_req(fc);
1102         char *link;
1103
1104         if (IS_ERR(req))
1105                 return ERR_CAST(req);
1106
1107         link = (char *) __get_free_page(GFP_KERNEL);
1108         if (!link) {
1109                 link = ERR_PTR(-ENOMEM);
1110                 goto out;
1111         }
1112         req->in.h.opcode = FUSE_READLINK;
1113         req->in.h.nodeid = get_node_id(inode);
1114         req->out.argvar = 1;
1115         req->out.numargs = 1;
1116         req->out.args[0].size = PAGE_SIZE - 1;
1117         req->out.args[0].value = link;
1118         fuse_request_send(fc, req);
1119         if (req->out.h.error) {
1120                 free_page((unsigned long) link);
1121                 link = ERR_PTR(req->out.h.error);
1122         } else
1123                 link[req->out.args[0].size] = '\0';
1124  out:
1125         fuse_put_request(fc, req);
1126         fuse_invalidate_attr(inode); /* atime changed */
1127         return link;
1128 }
1129
1130 static void free_link(char *link)
1131 {
1132         if (!IS_ERR(link))
1133                 free_page((unsigned long) link);
1134 }
1135
1136 static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd)
1137 {
1138         nd_set_link(nd, read_link(dentry));
1139         return NULL;
1140 }
1141
1142 static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
1143 {
1144         free_link(nd_get_link(nd));
1145 }
1146
1147 static int fuse_dir_open(struct inode *inode, struct file *file)
1148 {
1149         return fuse_open_common(inode, file, true);
1150 }
1151
1152 static int fuse_dir_release(struct inode *inode, struct file *file)
1153 {
1154         fuse_release_common(file, FUSE_RELEASEDIR);
1155
1156         return 0;
1157 }
1158
1159 static int fuse_dir_fsync(struct file *file, int datasync)
1160 {
1161         return fuse_fsync_common(file, datasync, 1);
1162 }
1163
1164 static bool update_mtime(unsigned ivalid)
1165 {
1166         /* Always update if mtime is explicitly set  */
1167         if (ivalid & ATTR_MTIME_SET)
1168                 return true;
1169
1170         /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1171         if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1172                 return false;
1173
1174         /* In all other cases update */
1175         return true;
1176 }
1177
1178 static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg)
1179 {
1180         unsigned ivalid = iattr->ia_valid;
1181
1182         if (ivalid & ATTR_MODE)
1183                 arg->valid |= FATTR_MODE,   arg->mode = iattr->ia_mode;
1184         if (ivalid & ATTR_UID)
1185                 arg->valid |= FATTR_UID,    arg->uid = iattr->ia_uid;
1186         if (ivalid & ATTR_GID)
1187                 arg->valid |= FATTR_GID,    arg->gid = iattr->ia_gid;
1188         if (ivalid & ATTR_SIZE)
1189                 arg->valid |= FATTR_SIZE,   arg->size = iattr->ia_size;
1190         if (ivalid & ATTR_ATIME) {
1191                 arg->valid |= FATTR_ATIME;
1192                 arg->atime = iattr->ia_atime.tv_sec;
1193                 arg->atimensec = iattr->ia_atime.tv_nsec;
1194                 if (!(ivalid & ATTR_ATIME_SET))
1195                         arg->valid |= FATTR_ATIME_NOW;
1196         }
1197         if ((ivalid & ATTR_MTIME) && update_mtime(ivalid)) {
1198                 arg->valid |= FATTR_MTIME;
1199                 arg->mtime = iattr->ia_mtime.tv_sec;
1200                 arg->mtimensec = iattr->ia_mtime.tv_nsec;
1201                 if (!(ivalid & ATTR_MTIME_SET))
1202                         arg->valid |= FATTR_MTIME_NOW;
1203         }
1204 }
1205
1206 /*
1207  * Prevent concurrent writepages on inode
1208  *
1209  * This is done by adding a negative bias to the inode write counter
1210  * and waiting for all pending writes to finish.
1211  */
1212 void fuse_set_nowrite(struct inode *inode)
1213 {
1214         struct fuse_conn *fc = get_fuse_conn(inode);
1215         struct fuse_inode *fi = get_fuse_inode(inode);
1216
1217         BUG_ON(!mutex_is_locked(&inode->i_mutex));
1218
1219         spin_lock(&fc->lock);
1220         BUG_ON(fi->writectr < 0);
1221         fi->writectr += FUSE_NOWRITE;
1222         spin_unlock(&fc->lock);
1223         wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1224 }
1225
1226 /*
1227  * Allow writepages on inode
1228  *
1229  * Remove the bias from the writecounter and send any queued
1230  * writepages.
1231  */
1232 static void __fuse_release_nowrite(struct inode *inode)
1233 {
1234         struct fuse_inode *fi = get_fuse_inode(inode);
1235
1236         BUG_ON(fi->writectr != FUSE_NOWRITE);
1237         fi->writectr = 0;
1238         fuse_flush_writepages(inode);
1239 }
1240
1241 void fuse_release_nowrite(struct inode *inode)
1242 {
1243         struct fuse_conn *fc = get_fuse_conn(inode);
1244
1245         spin_lock(&fc->lock);
1246         __fuse_release_nowrite(inode);
1247         spin_unlock(&fc->lock);
1248 }
1249
1250 /*
1251  * Set attributes, and at the same time refresh them.
1252  *
1253  * Truncation is slightly complicated, because the 'truncate' request
1254  * may fail, in which case we don't want to touch the mapping.
1255  * vmtruncate() doesn't allow for this case, so do the rlimit checking
1256  * and the actual truncation by hand.
1257  */
1258 static int fuse_do_setattr(struct dentry *entry, struct iattr *attr,
1259                            struct file *file)
1260 {
1261         struct inode *inode = entry->d_inode;
1262         struct fuse_conn *fc = get_fuse_conn(inode);
1263         struct fuse_req *req;
1264         struct fuse_setattr_in inarg;
1265         struct fuse_attr_out outarg;
1266         bool is_truncate = false;
1267         loff_t oldsize;
1268         int err;
1269
1270         if (!fuse_allow_task(fc, current))
1271                 return -EACCES;
1272
1273         if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
1274                 err = inode_change_ok(inode, attr);
1275                 if (err)
1276                         return err;
1277         }
1278
1279         if ((attr->ia_valid & ATTR_OPEN) && fc->atomic_o_trunc)
1280                 return 0;
1281
1282         if (attr->ia_valid & ATTR_SIZE) {
1283                 err = inode_newsize_ok(inode, attr->ia_size);
1284                 if (err)
1285                         return err;
1286                 is_truncate = true;
1287         }
1288
1289         req = fuse_get_req(fc);
1290         if (IS_ERR(req))
1291                 return PTR_ERR(req);
1292
1293         if (is_truncate)
1294                 fuse_set_nowrite(inode);
1295
1296         memset(&inarg, 0, sizeof(inarg));
1297         memset(&outarg, 0, sizeof(outarg));
1298         iattr_to_fattr(attr, &inarg);
1299         if (file) {
1300                 struct fuse_file *ff = file->private_data;
1301                 inarg.valid |= FATTR_FH;
1302                 inarg.fh = ff->fh;
1303         }
1304         if (attr->ia_valid & ATTR_SIZE) {
1305                 /* For mandatory locking in truncate */
1306                 inarg.valid |= FATTR_LOCKOWNER;
1307                 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1308         }
1309         req->in.h.opcode = FUSE_SETATTR;
1310         req->in.h.nodeid = get_node_id(inode);
1311         req->in.numargs = 1;
1312         req->in.args[0].size = sizeof(inarg);
1313         req->in.args[0].value = &inarg;
1314         req->out.numargs = 1;
1315         if (fc->minor < 9)
1316                 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
1317         else
1318                 req->out.args[0].size = sizeof(outarg);
1319         req->out.args[0].value = &outarg;
1320         fuse_request_send(fc, req);
1321         err = req->out.h.error;
1322         fuse_put_request(fc, req);
1323         if (err) {
1324                 if (err == -EINTR)
1325                         fuse_invalidate_attr(inode);
1326                 goto error;
1327         }
1328
1329         if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1330                 make_bad_inode(inode);
1331                 err = -EIO;
1332                 goto error;
1333         }
1334
1335         spin_lock(&fc->lock);
1336         fuse_change_attributes_common(inode, &outarg.attr,
1337                                       attr_timeout(&outarg));
1338         oldsize = inode->i_size;
1339         i_size_write(inode, outarg.attr.size);
1340
1341         if (is_truncate) {
1342                 /* NOTE: this may release/reacquire fc->lock */
1343                 __fuse_release_nowrite(inode);
1344         }
1345         spin_unlock(&fc->lock);
1346
1347         /*
1348          * Only call invalidate_inode_pages2() after removing
1349          * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1350          */
1351         if (S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
1352                 truncate_pagecache(inode, oldsize, outarg.attr.size);
1353                 invalidate_inode_pages2(inode->i_mapping);
1354         }
1355
1356         return 0;
1357
1358 error:
1359         if (is_truncate)
1360                 fuse_release_nowrite(inode);
1361
1362         return err;
1363 }
1364
1365 static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1366 {
1367         if (attr->ia_valid & ATTR_FILE)
1368                 return fuse_do_setattr(entry, attr, attr->ia_file);
1369         else
1370                 return fuse_do_setattr(entry, attr, NULL);
1371 }
1372
1373 static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
1374                         struct kstat *stat)
1375 {
1376         struct inode *inode = entry->d_inode;
1377         struct fuse_conn *fc = get_fuse_conn(inode);
1378
1379         if (!fuse_allow_task(fc, current))
1380                 return -EACCES;
1381
1382         return fuse_update_attributes(inode, stat, NULL, NULL);
1383 }
1384
1385 static int fuse_setxattr(struct dentry *entry, const char *name,
1386                          const void *value, size_t size, int flags)
1387 {
1388         struct inode *inode = entry->d_inode;
1389         struct fuse_conn *fc = get_fuse_conn(inode);
1390         struct fuse_req *req;
1391         struct fuse_setxattr_in inarg;
1392         int err;
1393
1394         if (fc->no_setxattr)
1395                 return -EOPNOTSUPP;
1396
1397         req = fuse_get_req(fc);
1398         if (IS_ERR(req))
1399                 return PTR_ERR(req);
1400
1401         memset(&inarg, 0, sizeof(inarg));
1402         inarg.size = size;
1403         inarg.flags = flags;
1404         req->in.h.opcode = FUSE_SETXATTR;
1405         req->in.h.nodeid = get_node_id(inode);
1406         req->in.numargs = 3;
1407         req->in.args[0].size = sizeof(inarg);
1408         req->in.args[0].value = &inarg;
1409         req->in.args[1].size = strlen(name) + 1;
1410         req->in.args[1].value = name;
1411         req->in.args[2].size = size;
1412         req->in.args[2].value = value;
1413         fuse_request_send(fc, req);
1414         err = req->out.h.error;
1415         fuse_put_request(fc, req);
1416         if (err == -ENOSYS) {
1417                 fc->no_setxattr = 1;
1418                 err = -EOPNOTSUPP;
1419         }
1420         return err;
1421 }
1422
1423 static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
1424                              void *value, size_t size)
1425 {
1426         struct inode *inode = entry->d_inode;
1427         struct fuse_conn *fc = get_fuse_conn(inode);
1428         struct fuse_req *req;
1429         struct fuse_getxattr_in inarg;
1430         struct fuse_getxattr_out outarg;
1431         ssize_t ret;
1432
1433         if (fc->no_getxattr)
1434                 return -EOPNOTSUPP;
1435
1436         req = fuse_get_req(fc);
1437         if (IS_ERR(req))
1438                 return PTR_ERR(req);
1439
1440         memset(&inarg, 0, sizeof(inarg));
1441         inarg.size = size;
1442         req->in.h.opcode = FUSE_GETXATTR;
1443         req->in.h.nodeid = get_node_id(inode);
1444         req->in.numargs = 2;
1445         req->in.args[0].size = sizeof(inarg);
1446         req->in.args[0].value = &inarg;
1447         req->in.args[1].size = strlen(name) + 1;
1448         req->in.args[1].value = name;
1449         /* This is really two different operations rolled into one */
1450         req->out.numargs = 1;
1451         if (size) {
1452                 req->out.argvar = 1;
1453                 req->out.args[0].size = size;
1454                 req->out.args[0].value = value;
1455         } else {
1456                 req->out.args[0].size = sizeof(outarg);
1457                 req->out.args[0].value = &outarg;
1458         }
1459         fuse_request_send(fc, req);
1460         ret = req->out.h.error;
1461         if (!ret)
1462                 ret = size ? req->out.args[0].size : outarg.size;
1463         else {
1464                 if (ret == -ENOSYS) {
1465                         fc->no_getxattr = 1;
1466                         ret = -EOPNOTSUPP;
1467                 }
1468         }
1469         fuse_put_request(fc, req);
1470         return ret;
1471 }
1472
1473 static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
1474 {
1475         struct inode *inode = entry->d_inode;
1476         struct fuse_conn *fc = get_fuse_conn(inode);
1477         struct fuse_req *req;
1478         struct fuse_getxattr_in inarg;
1479         struct fuse_getxattr_out outarg;
1480         ssize_t ret;
1481
1482         if (!fuse_allow_task(fc, current))
1483                 return -EACCES;
1484
1485         if (fc->no_listxattr)
1486                 return -EOPNOTSUPP;
1487
1488         req = fuse_get_req(fc);
1489         if (IS_ERR(req))
1490                 return PTR_ERR(req);
1491
1492         memset(&inarg, 0, sizeof(inarg));
1493         inarg.size = size;
1494         req->in.h.opcode = FUSE_LISTXATTR;
1495         req->in.h.nodeid = get_node_id(inode);
1496         req->in.numargs = 1;
1497         req->in.args[0].size = sizeof(inarg);
1498         req->in.args[0].value = &inarg;
1499         /* This is really two different operations rolled into one */
1500         req->out.numargs = 1;
1501         if (size) {
1502                 req->out.argvar = 1;
1503                 req->out.args[0].size = size;
1504                 req->out.args[0].value = list;
1505         } else {
1506                 req->out.args[0].size = sizeof(outarg);
1507                 req->out.args[0].value = &outarg;
1508         }
1509         fuse_request_send(fc, req);
1510         ret = req->out.h.error;
1511         if (!ret)
1512                 ret = size ? req->out.args[0].size : outarg.size;
1513         else {
1514                 if (ret == -ENOSYS) {
1515                         fc->no_listxattr = 1;
1516                         ret = -EOPNOTSUPP;
1517                 }
1518         }
1519         fuse_put_request(fc, req);
1520         return ret;
1521 }
1522
1523 static int fuse_removexattr(struct dentry *entry, const char *name)
1524 {
1525         struct inode *inode = entry->d_inode;
1526         struct fuse_conn *fc = get_fuse_conn(inode);
1527         struct fuse_req *req;
1528         int err;
1529
1530         if (fc->no_removexattr)
1531                 return -EOPNOTSUPP;
1532
1533         req = fuse_get_req(fc);
1534         if (IS_ERR(req))
1535                 return PTR_ERR(req);
1536
1537         req->in.h.opcode = FUSE_REMOVEXATTR;
1538         req->in.h.nodeid = get_node_id(inode);
1539         req->in.numargs = 1;
1540         req->in.args[0].size = strlen(name) + 1;
1541         req->in.args[0].value = name;
1542         fuse_request_send(fc, req);
1543         err = req->out.h.error;
1544         fuse_put_request(fc, req);
1545         if (err == -ENOSYS) {
1546                 fc->no_removexattr = 1;
1547                 err = -EOPNOTSUPP;
1548         }
1549         return err;
1550 }
1551
1552 static const struct inode_operations fuse_dir_inode_operations = {
1553         .lookup         = fuse_lookup,
1554         .mkdir          = fuse_mkdir,
1555         .symlink        = fuse_symlink,
1556         .unlink         = fuse_unlink,
1557         .rmdir          = fuse_rmdir,
1558         .rename         = fuse_rename,
1559         .link           = fuse_link,
1560         .setattr        = fuse_setattr,
1561         .create         = fuse_create,
1562         .mknod          = fuse_mknod,
1563         .permission     = fuse_permission,
1564         .getattr        = fuse_getattr,
1565         .setxattr       = fuse_setxattr,
1566         .getxattr       = fuse_getxattr,
1567         .listxattr      = fuse_listxattr,
1568         .removexattr    = fuse_removexattr,
1569 };
1570
1571 static const struct file_operations fuse_dir_operations = {
1572         .llseek         = generic_file_llseek,
1573         .read           = generic_read_dir,
1574         .readdir        = fuse_readdir,
1575         .open           = fuse_dir_open,
1576         .release        = fuse_dir_release,
1577         .fsync          = fuse_dir_fsync,
1578 };
1579
1580 static const struct inode_operations fuse_common_inode_operations = {
1581         .setattr        = fuse_setattr,
1582         .permission     = fuse_permission,
1583         .getattr        = fuse_getattr,
1584         .setxattr       = fuse_setxattr,
1585         .getxattr       = fuse_getxattr,
1586         .listxattr      = fuse_listxattr,
1587         .removexattr    = fuse_removexattr,
1588 };
1589
1590 static const struct inode_operations fuse_symlink_inode_operations = {
1591         .setattr        = fuse_setattr,
1592         .follow_link    = fuse_follow_link,
1593         .put_link       = fuse_put_link,
1594         .readlink       = generic_readlink,
1595         .getattr        = fuse_getattr,
1596         .setxattr       = fuse_setxattr,
1597         .getxattr       = fuse_getxattr,
1598         .listxattr      = fuse_listxattr,
1599         .removexattr    = fuse_removexattr,
1600 };
1601
1602 void fuse_init_common(struct inode *inode)
1603 {
1604         inode->i_op = &fuse_common_inode_operations;
1605 }
1606
1607 void fuse_init_dir(struct inode *inode)
1608 {
1609         inode->i_op = &fuse_dir_inode_operations;
1610         inode->i_fop = &fuse_dir_operations;
1611 }
1612
1613 void fuse_init_symlink(struct inode *inode)
1614 {
1615         inode->i_op = &fuse_symlink_inode_operations;
1616 }