fuse: don't use inode in fuse_sync_release()
[safe/jmp/linux-2.6] / 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_open_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         forget_req = fuse_get_req(fc);
389         if (IS_ERR(forget_req))
390                 return PTR_ERR(forget_req);
391
392         req = fuse_get_req(fc);
393         err = PTR_ERR(req);
394         if (IS_ERR(req))
395                 goto out_put_forget_req;
396
397         err = -ENOMEM;
398         ff = fuse_file_alloc(fc);
399         if (!ff)
400                 goto out_put_request;
401
402         flags &= ~O_NOCTTY;
403         memset(&inarg, 0, sizeof(inarg));
404         memset(&outentry, 0, sizeof(outentry));
405         inarg.flags = flags;
406         inarg.mode = mode;
407         req->in.h.opcode = FUSE_CREATE;
408         req->in.h.nodeid = get_node_id(dir);
409         req->in.numargs = 2;
410         req->in.args[0].size = sizeof(inarg);
411         req->in.args[0].value = &inarg;
412         req->in.args[1].size = entry->d_name.len + 1;
413         req->in.args[1].value = entry->d_name.name;
414         req->out.numargs = 2;
415         if (fc->minor < 9)
416                 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
417         else
418                 req->out.args[0].size = sizeof(outentry);
419         req->out.args[0].value = &outentry;
420         req->out.args[1].size = sizeof(outopen);
421         req->out.args[1].value = &outopen;
422         fuse_request_send(fc, req);
423         err = req->out.h.error;
424         if (err) {
425                 if (err == -ENOSYS)
426                         fc->no_create = 1;
427                 goto out_free_ff;
428         }
429
430         err = -EIO;
431         if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
432                 goto out_free_ff;
433
434         fuse_put_request(fc, req);
435         ff->fh = outopen.fh;
436         ff->nodeid = outentry.nodeid;
437         ff->open_flags = outopen.open_flags;
438         inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
439                           &outentry.attr, entry_attr_timeout(&outentry), 0);
440         if (!inode) {
441                 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
442                 fuse_sync_release(ff, flags);
443                 fuse_send_forget(fc, forget_req, outentry.nodeid, 1);
444                 return -ENOMEM;
445         }
446         fuse_put_request(fc, forget_req);
447         d_instantiate(entry, inode);
448         fuse_change_entry_timeout(entry, &outentry);
449         fuse_invalidate_attr(dir);
450         file = lookup_instantiate_filp(nd, entry, generic_file_open);
451         if (IS_ERR(file)) {
452                 fuse_sync_release(ff, flags);
453                 return PTR_ERR(file);
454         }
455         file->private_data = fuse_file_get(ff);
456         fuse_finish_open(inode, file);
457         return 0;
458
459  out_free_ff:
460         fuse_file_free(ff);
461  out_put_request:
462         fuse_put_request(fc, req);
463  out_put_forget_req:
464         fuse_put_request(fc, forget_req);
465         return err;
466 }
467
468 /*
469  * Code shared between mknod, mkdir, symlink and link
470  */
471 static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
472                             struct inode *dir, struct dentry *entry,
473                             int mode)
474 {
475         struct fuse_entry_out outarg;
476         struct inode *inode;
477         int err;
478         struct fuse_req *forget_req;
479
480         forget_req = fuse_get_req(fc);
481         if (IS_ERR(forget_req)) {
482                 fuse_put_request(fc, req);
483                 return PTR_ERR(forget_req);
484         }
485
486         memset(&outarg, 0, sizeof(outarg));
487         req->in.h.nodeid = get_node_id(dir);
488         req->out.numargs = 1;
489         if (fc->minor < 9)
490                 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
491         else
492                 req->out.args[0].size = sizeof(outarg);
493         req->out.args[0].value = &outarg;
494         fuse_request_send(fc, req);
495         err = req->out.h.error;
496         fuse_put_request(fc, req);
497         if (err)
498                 goto out_put_forget_req;
499
500         err = -EIO;
501         if (invalid_nodeid(outarg.nodeid))
502                 goto out_put_forget_req;
503
504         if ((outarg.attr.mode ^ mode) & S_IFMT)
505                 goto out_put_forget_req;
506
507         inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
508                           &outarg.attr, entry_attr_timeout(&outarg), 0);
509         if (!inode) {
510                 fuse_send_forget(fc, forget_req, outarg.nodeid, 1);
511                 return -ENOMEM;
512         }
513         fuse_put_request(fc, forget_req);
514
515         if (S_ISDIR(inode->i_mode)) {
516                 struct dentry *alias;
517                 mutex_lock(&fc->inst_mutex);
518                 alias = d_find_alias(inode);
519                 if (alias) {
520                         /* New directory must have moved since mkdir */
521                         mutex_unlock(&fc->inst_mutex);
522                         dput(alias);
523                         iput(inode);
524                         return -EBUSY;
525                 }
526                 d_instantiate(entry, inode);
527                 mutex_unlock(&fc->inst_mutex);
528         } else
529                 d_instantiate(entry, inode);
530
531         fuse_change_entry_timeout(entry, &outarg);
532         fuse_invalidate_attr(dir);
533         return 0;
534
535  out_put_forget_req:
536         fuse_put_request(fc, forget_req);
537         return err;
538 }
539
540 static int fuse_mknod(struct inode *dir, struct dentry *entry, int mode,
541                       dev_t rdev)
542 {
543         struct fuse_mknod_in inarg;
544         struct fuse_conn *fc = get_fuse_conn(dir);
545         struct fuse_req *req = fuse_get_req(fc);
546         if (IS_ERR(req))
547                 return PTR_ERR(req);
548
549         memset(&inarg, 0, sizeof(inarg));
550         inarg.mode = mode;
551         inarg.rdev = new_encode_dev(rdev);
552         req->in.h.opcode = FUSE_MKNOD;
553         req->in.numargs = 2;
554         req->in.args[0].size = sizeof(inarg);
555         req->in.args[0].value = &inarg;
556         req->in.args[1].size = entry->d_name.len + 1;
557         req->in.args[1].value = entry->d_name.name;
558         return create_new_entry(fc, req, dir, entry, mode);
559 }
560
561 static int fuse_create(struct inode *dir, struct dentry *entry, int mode,
562                        struct nameidata *nd)
563 {
564         if (nd && (nd->flags & LOOKUP_OPEN)) {
565                 int err = fuse_create_open(dir, entry, mode, nd);
566                 if (err != -ENOSYS)
567                         return err;
568                 /* Fall back on mknod */
569         }
570         return fuse_mknod(dir, entry, mode, 0);
571 }
572
573 static int fuse_mkdir(struct inode *dir, struct dentry *entry, int mode)
574 {
575         struct fuse_mkdir_in inarg;
576         struct fuse_conn *fc = get_fuse_conn(dir);
577         struct fuse_req *req = fuse_get_req(fc);
578         if (IS_ERR(req))
579                 return PTR_ERR(req);
580
581         memset(&inarg, 0, sizeof(inarg));
582         inarg.mode = mode;
583         req->in.h.opcode = FUSE_MKDIR;
584         req->in.numargs = 2;
585         req->in.args[0].size = sizeof(inarg);
586         req->in.args[0].value = &inarg;
587         req->in.args[1].size = entry->d_name.len + 1;
588         req->in.args[1].value = entry->d_name.name;
589         return create_new_entry(fc, req, dir, entry, S_IFDIR);
590 }
591
592 static int fuse_symlink(struct inode *dir, struct dentry *entry,
593                         const char *link)
594 {
595         struct fuse_conn *fc = get_fuse_conn(dir);
596         unsigned len = strlen(link) + 1;
597         struct fuse_req *req = fuse_get_req(fc);
598         if (IS_ERR(req))
599                 return PTR_ERR(req);
600
601         req->in.h.opcode = FUSE_SYMLINK;
602         req->in.numargs = 2;
603         req->in.args[0].size = entry->d_name.len + 1;
604         req->in.args[0].value = entry->d_name.name;
605         req->in.args[1].size = len;
606         req->in.args[1].value = link;
607         return create_new_entry(fc, req, dir, entry, S_IFLNK);
608 }
609
610 static int fuse_unlink(struct inode *dir, struct dentry *entry)
611 {
612         int err;
613         struct fuse_conn *fc = get_fuse_conn(dir);
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_UNLINK;
619         req->in.h.nodeid = get_node_id(dir);
620         req->in.numargs = 1;
621         req->in.args[0].size = entry->d_name.len + 1;
622         req->in.args[0].value = entry->d_name.name;
623         fuse_request_send(fc, req);
624         err = req->out.h.error;
625         fuse_put_request(fc, req);
626         if (!err) {
627                 struct inode *inode = entry->d_inode;
628
629                 /*
630                  * Set nlink to zero so the inode can be cleared, if the inode
631                  * does have more links this will be discovered at the next
632                  * lookup/getattr.
633                  */
634                 clear_nlink(inode);
635                 fuse_invalidate_attr(inode);
636                 fuse_invalidate_attr(dir);
637                 fuse_invalidate_entry_cache(entry);
638         } else if (err == -EINTR)
639                 fuse_invalidate_entry(entry);
640         return err;
641 }
642
643 static int fuse_rmdir(struct inode *dir, struct dentry *entry)
644 {
645         int err;
646         struct fuse_conn *fc = get_fuse_conn(dir);
647         struct fuse_req *req = fuse_get_req(fc);
648         if (IS_ERR(req))
649                 return PTR_ERR(req);
650
651         req->in.h.opcode = FUSE_RMDIR;
652         req->in.h.nodeid = get_node_id(dir);
653         req->in.numargs = 1;
654         req->in.args[0].size = entry->d_name.len + 1;
655         req->in.args[0].value = entry->d_name.name;
656         fuse_request_send(fc, req);
657         err = req->out.h.error;
658         fuse_put_request(fc, req);
659         if (!err) {
660                 clear_nlink(entry->d_inode);
661                 fuse_invalidate_attr(dir);
662                 fuse_invalidate_entry_cache(entry);
663         } else if (err == -EINTR)
664                 fuse_invalidate_entry(entry);
665         return err;
666 }
667
668 static int fuse_rename(struct inode *olddir, struct dentry *oldent,
669                        struct inode *newdir, struct dentry *newent)
670 {
671         int err;
672         struct fuse_rename_in inarg;
673         struct fuse_conn *fc = get_fuse_conn(olddir);
674         struct fuse_req *req = fuse_get_req(fc);
675         if (IS_ERR(req))
676                 return PTR_ERR(req);
677
678         memset(&inarg, 0, sizeof(inarg));
679         inarg.newdir = get_node_id(newdir);
680         req->in.h.opcode = FUSE_RENAME;
681         req->in.h.nodeid = get_node_id(olddir);
682         req->in.numargs = 3;
683         req->in.args[0].size = sizeof(inarg);
684         req->in.args[0].value = &inarg;
685         req->in.args[1].size = oldent->d_name.len + 1;
686         req->in.args[1].value = oldent->d_name.name;
687         req->in.args[2].size = newent->d_name.len + 1;
688         req->in.args[2].value = newent->d_name.name;
689         fuse_request_send(fc, req);
690         err = req->out.h.error;
691         fuse_put_request(fc, req);
692         if (!err) {
693                 /* ctime changes */
694                 fuse_invalidate_attr(oldent->d_inode);
695
696                 fuse_invalidate_attr(olddir);
697                 if (olddir != newdir)
698                         fuse_invalidate_attr(newdir);
699
700                 /* newent will end up negative */
701                 if (newent->d_inode)
702                         fuse_invalidate_entry_cache(newent);
703         } else if (err == -EINTR) {
704                 /* If request was interrupted, DEITY only knows if the
705                    rename actually took place.  If the invalidation
706                    fails (e.g. some process has CWD under the renamed
707                    directory), then there can be inconsistency between
708                    the dcache and the real filesystem.  Tough luck. */
709                 fuse_invalidate_entry(oldent);
710                 if (newent->d_inode)
711                         fuse_invalidate_entry(newent);
712         }
713
714         return err;
715 }
716
717 static int fuse_link(struct dentry *entry, struct inode *newdir,
718                      struct dentry *newent)
719 {
720         int err;
721         struct fuse_link_in inarg;
722         struct inode *inode = entry->d_inode;
723         struct fuse_conn *fc = get_fuse_conn(inode);
724         struct fuse_req *req = fuse_get_req(fc);
725         if (IS_ERR(req))
726                 return PTR_ERR(req);
727
728         memset(&inarg, 0, sizeof(inarg));
729         inarg.oldnodeid = get_node_id(inode);
730         req->in.h.opcode = FUSE_LINK;
731         req->in.numargs = 2;
732         req->in.args[0].size = sizeof(inarg);
733         req->in.args[0].value = &inarg;
734         req->in.args[1].size = newent->d_name.len + 1;
735         req->in.args[1].value = newent->d_name.name;
736         err = create_new_entry(fc, req, newdir, newent, inode->i_mode);
737         /* Contrary to "normal" filesystems it can happen that link
738            makes two "logical" inodes point to the same "physical"
739            inode.  We invalidate the attributes of the old one, so it
740            will reflect changes in the backing inode (link count,
741            etc.)
742         */
743         if (!err || err == -EINTR)
744                 fuse_invalidate_attr(inode);
745         return err;
746 }
747
748 static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
749                           struct kstat *stat)
750 {
751         stat->dev = inode->i_sb->s_dev;
752         stat->ino = attr->ino;
753         stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
754         stat->nlink = attr->nlink;
755         stat->uid = attr->uid;
756         stat->gid = attr->gid;
757         stat->rdev = inode->i_rdev;
758         stat->atime.tv_sec = attr->atime;
759         stat->atime.tv_nsec = attr->atimensec;
760         stat->mtime.tv_sec = attr->mtime;
761         stat->mtime.tv_nsec = attr->mtimensec;
762         stat->ctime.tv_sec = attr->ctime;
763         stat->ctime.tv_nsec = attr->ctimensec;
764         stat->size = attr->size;
765         stat->blocks = attr->blocks;
766         stat->blksize = (1 << inode->i_blkbits);
767 }
768
769 static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
770                            struct file *file)
771 {
772         int err;
773         struct fuse_getattr_in inarg;
774         struct fuse_attr_out outarg;
775         struct fuse_conn *fc = get_fuse_conn(inode);
776         struct fuse_req *req;
777         u64 attr_version;
778
779         req = fuse_get_req(fc);
780         if (IS_ERR(req))
781                 return PTR_ERR(req);
782
783         attr_version = fuse_get_attr_version(fc);
784
785         memset(&inarg, 0, sizeof(inarg));
786         memset(&outarg, 0, sizeof(outarg));
787         /* Directories have separate file-handle space */
788         if (file && S_ISREG(inode->i_mode)) {
789                 struct fuse_file *ff = file->private_data;
790
791                 inarg.getattr_flags |= FUSE_GETATTR_FH;
792                 inarg.fh = ff->fh;
793         }
794         req->in.h.opcode = FUSE_GETATTR;
795         req->in.h.nodeid = get_node_id(inode);
796         req->in.numargs = 1;
797         req->in.args[0].size = sizeof(inarg);
798         req->in.args[0].value = &inarg;
799         req->out.numargs = 1;
800         if (fc->minor < 9)
801                 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
802         else
803                 req->out.args[0].size = sizeof(outarg);
804         req->out.args[0].value = &outarg;
805         fuse_request_send(fc, req);
806         err = req->out.h.error;
807         fuse_put_request(fc, req);
808         if (!err) {
809                 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
810                         make_bad_inode(inode);
811                         err = -EIO;
812                 } else {
813                         fuse_change_attributes(inode, &outarg.attr,
814                                                attr_timeout(&outarg),
815                                                attr_version);
816                         if (stat)
817                                 fuse_fillattr(inode, &outarg.attr, stat);
818                 }
819         }
820         return err;
821 }
822
823 int fuse_update_attributes(struct inode *inode, struct kstat *stat,
824                            struct file *file, bool *refreshed)
825 {
826         struct fuse_inode *fi = get_fuse_inode(inode);
827         int err;
828         bool r;
829
830         if (fi->i_time < get_jiffies_64()) {
831                 r = true;
832                 err = fuse_do_getattr(inode, stat, file);
833         } else {
834                 r = false;
835                 err = 0;
836                 if (stat) {
837                         generic_fillattr(inode, stat);
838                         stat->mode = fi->orig_i_mode;
839                 }
840         }
841
842         if (refreshed != NULL)
843                 *refreshed = r;
844
845         return err;
846 }
847
848 /*
849  * Calling into a user-controlled filesystem gives the filesystem
850  * daemon ptrace-like capabilities over the requester process.  This
851  * means, that the filesystem daemon is able to record the exact
852  * filesystem operations performed, and can also control the behavior
853  * of the requester process in otherwise impossible ways.  For example
854  * it can delay the operation for arbitrary length of time allowing
855  * DoS against the requester.
856  *
857  * For this reason only those processes can call into the filesystem,
858  * for which the owner of the mount has ptrace privilege.  This
859  * excludes processes started by other users, suid or sgid processes.
860  */
861 int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task)
862 {
863         const struct cred *cred;
864         int ret;
865
866         if (fc->flags & FUSE_ALLOW_OTHER)
867                 return 1;
868
869         rcu_read_lock();
870         ret = 0;
871         cred = __task_cred(task);
872         if (cred->euid == fc->user_id &&
873             cred->suid == fc->user_id &&
874             cred->uid  == fc->user_id &&
875             cred->egid == fc->group_id &&
876             cred->sgid == fc->group_id &&
877             cred->gid  == fc->group_id)
878                 ret = 1;
879         rcu_read_unlock();
880
881         return ret;
882 }
883
884 static int fuse_access(struct inode *inode, int mask)
885 {
886         struct fuse_conn *fc = get_fuse_conn(inode);
887         struct fuse_req *req;
888         struct fuse_access_in inarg;
889         int err;
890
891         if (fc->no_access)
892                 return 0;
893
894         req = fuse_get_req(fc);
895         if (IS_ERR(req))
896                 return PTR_ERR(req);
897
898         memset(&inarg, 0, sizeof(inarg));
899         inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
900         req->in.h.opcode = FUSE_ACCESS;
901         req->in.h.nodeid = get_node_id(inode);
902         req->in.numargs = 1;
903         req->in.args[0].size = sizeof(inarg);
904         req->in.args[0].value = &inarg;
905         fuse_request_send(fc, req);
906         err = req->out.h.error;
907         fuse_put_request(fc, req);
908         if (err == -ENOSYS) {
909                 fc->no_access = 1;
910                 err = 0;
911         }
912         return err;
913 }
914
915 /*
916  * Check permission.  The two basic access models of FUSE are:
917  *
918  * 1) Local access checking ('default_permissions' mount option) based
919  * on file mode.  This is the plain old disk filesystem permission
920  * modell.
921  *
922  * 2) "Remote" access checking, where server is responsible for
923  * checking permission in each inode operation.  An exception to this
924  * is if ->permission() was invoked from sys_access() in which case an
925  * access request is sent.  Execute permission is still checked
926  * locally based on file mode.
927  */
928 static int fuse_permission(struct inode *inode, int mask)
929 {
930         struct fuse_conn *fc = get_fuse_conn(inode);
931         bool refreshed = false;
932         int err = 0;
933
934         if (!fuse_allow_task(fc, current))
935                 return -EACCES;
936
937         /*
938          * If attributes are needed, refresh them before proceeding
939          */
940         if ((fc->flags & FUSE_DEFAULT_PERMISSIONS) ||
941             ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
942                 err = fuse_update_attributes(inode, NULL, NULL, &refreshed);
943                 if (err)
944                         return err;
945         }
946
947         if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
948                 err = generic_permission(inode, mask, NULL);
949
950                 /* If permission is denied, try to refresh file
951                    attributes.  This is also needed, because the root
952                    node will at first have no permissions */
953                 if (err == -EACCES && !refreshed) {
954                         err = fuse_do_getattr(inode, NULL, NULL);
955                         if (!err)
956                                 err = generic_permission(inode, mask, NULL);
957                 }
958
959                 /* Note: the opposite of the above test does not
960                    exist.  So if permissions are revoked this won't be
961                    noticed immediately, only after the attribute
962                    timeout has expired */
963         } else if (mask & MAY_ACCESS) {
964                 err = fuse_access(inode, mask);
965         } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
966                 if (!(inode->i_mode & S_IXUGO)) {
967                         if (refreshed)
968                                 return -EACCES;
969
970                         err = fuse_do_getattr(inode, NULL, NULL);
971                         if (!err && !(inode->i_mode & S_IXUGO))
972                                 return -EACCES;
973                 }
974         }
975         return err;
976 }
977
978 static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
979                          void *dstbuf, filldir_t filldir)
980 {
981         while (nbytes >= FUSE_NAME_OFFSET) {
982                 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
983                 size_t reclen = FUSE_DIRENT_SIZE(dirent);
984                 int over;
985                 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
986                         return -EIO;
987                 if (reclen > nbytes)
988                         break;
989
990                 over = filldir(dstbuf, dirent->name, dirent->namelen,
991                                file->f_pos, dirent->ino, dirent->type);
992                 if (over)
993                         break;
994
995                 buf += reclen;
996                 nbytes -= reclen;
997                 file->f_pos = dirent->off;
998         }
999
1000         return 0;
1001 }
1002
1003 static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
1004 {
1005         int err;
1006         size_t nbytes;
1007         struct page *page;
1008         struct inode *inode = file->f_path.dentry->d_inode;
1009         struct fuse_conn *fc = get_fuse_conn(inode);
1010         struct fuse_req *req;
1011
1012         if (is_bad_inode(inode))
1013                 return -EIO;
1014
1015         req = fuse_get_req(fc);
1016         if (IS_ERR(req))
1017                 return PTR_ERR(req);
1018
1019         page = alloc_page(GFP_KERNEL);
1020         if (!page) {
1021                 fuse_put_request(fc, req);
1022                 return -ENOMEM;
1023         }
1024         req->out.argpages = 1;
1025         req->num_pages = 1;
1026         req->pages[0] = page;
1027         fuse_read_fill(req, file, file->f_pos, PAGE_SIZE, FUSE_READDIR);
1028         fuse_request_send(fc, req);
1029         nbytes = req->out.args[0].size;
1030         err = req->out.h.error;
1031         fuse_put_request(fc, req);
1032         if (!err)
1033                 err = parse_dirfile(page_address(page), nbytes, file, dstbuf,
1034                                     filldir);
1035
1036         __free_page(page);
1037         fuse_invalidate_attr(inode); /* atime changed */
1038         return err;
1039 }
1040
1041 static char *read_link(struct dentry *dentry)
1042 {
1043         struct inode *inode = dentry->d_inode;
1044         struct fuse_conn *fc = get_fuse_conn(inode);
1045         struct fuse_req *req = fuse_get_req(fc);
1046         char *link;
1047
1048         if (IS_ERR(req))
1049                 return ERR_CAST(req);
1050
1051         link = (char *) __get_free_page(GFP_KERNEL);
1052         if (!link) {
1053                 link = ERR_PTR(-ENOMEM);
1054                 goto out;
1055         }
1056         req->in.h.opcode = FUSE_READLINK;
1057         req->in.h.nodeid = get_node_id(inode);
1058         req->out.argvar = 1;
1059         req->out.numargs = 1;
1060         req->out.args[0].size = PAGE_SIZE - 1;
1061         req->out.args[0].value = link;
1062         fuse_request_send(fc, req);
1063         if (req->out.h.error) {
1064                 free_page((unsigned long) link);
1065                 link = ERR_PTR(req->out.h.error);
1066         } else
1067                 link[req->out.args[0].size] = '\0';
1068  out:
1069         fuse_put_request(fc, req);
1070         fuse_invalidate_attr(inode); /* atime changed */
1071         return link;
1072 }
1073
1074 static void free_link(char *link)
1075 {
1076         if (!IS_ERR(link))
1077                 free_page((unsigned long) link);
1078 }
1079
1080 static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd)
1081 {
1082         nd_set_link(nd, read_link(dentry));
1083         return NULL;
1084 }
1085
1086 static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
1087 {
1088         free_link(nd_get_link(nd));
1089 }
1090
1091 static int fuse_dir_open(struct inode *inode, struct file *file)
1092 {
1093         return fuse_open_common(inode, file, true);
1094 }
1095
1096 static int fuse_dir_release(struct inode *inode, struct file *file)
1097 {
1098         fuse_release_common(file, FUSE_RELEASEDIR);
1099
1100         return 0;
1101 }
1102
1103 static int fuse_dir_fsync(struct file *file, struct dentry *de, int datasync)
1104 {
1105         /* nfsd can call this with no file */
1106         return file ? fuse_fsync_common(file, de, datasync, 1) : 0;
1107 }
1108
1109 static bool update_mtime(unsigned ivalid)
1110 {
1111         /* Always update if mtime is explicitly set  */
1112         if (ivalid & ATTR_MTIME_SET)
1113                 return true;
1114
1115         /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1116         if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1117                 return false;
1118
1119         /* In all other cases update */
1120         return true;
1121 }
1122
1123 static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg)
1124 {
1125         unsigned ivalid = iattr->ia_valid;
1126
1127         if (ivalid & ATTR_MODE)
1128                 arg->valid |= FATTR_MODE,   arg->mode = iattr->ia_mode;
1129         if (ivalid & ATTR_UID)
1130                 arg->valid |= FATTR_UID,    arg->uid = iattr->ia_uid;
1131         if (ivalid & ATTR_GID)
1132                 arg->valid |= FATTR_GID,    arg->gid = iattr->ia_gid;
1133         if (ivalid & ATTR_SIZE)
1134                 arg->valid |= FATTR_SIZE,   arg->size = iattr->ia_size;
1135         if (ivalid & ATTR_ATIME) {
1136                 arg->valid |= FATTR_ATIME;
1137                 arg->atime = iattr->ia_atime.tv_sec;
1138                 arg->atimensec = iattr->ia_atime.tv_nsec;
1139                 if (!(ivalid & ATTR_ATIME_SET))
1140                         arg->valid |= FATTR_ATIME_NOW;
1141         }
1142         if ((ivalid & ATTR_MTIME) && update_mtime(ivalid)) {
1143                 arg->valid |= FATTR_MTIME;
1144                 arg->mtime = iattr->ia_mtime.tv_sec;
1145                 arg->mtimensec = iattr->ia_mtime.tv_nsec;
1146                 if (!(ivalid & ATTR_MTIME_SET))
1147                         arg->valid |= FATTR_MTIME_NOW;
1148         }
1149 }
1150
1151 /*
1152  * Prevent concurrent writepages on inode
1153  *
1154  * This is done by adding a negative bias to the inode write counter
1155  * and waiting for all pending writes to finish.
1156  */
1157 void fuse_set_nowrite(struct inode *inode)
1158 {
1159         struct fuse_conn *fc = get_fuse_conn(inode);
1160         struct fuse_inode *fi = get_fuse_inode(inode);
1161
1162         BUG_ON(!mutex_is_locked(&inode->i_mutex));
1163
1164         spin_lock(&fc->lock);
1165         BUG_ON(fi->writectr < 0);
1166         fi->writectr += FUSE_NOWRITE;
1167         spin_unlock(&fc->lock);
1168         wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1169 }
1170
1171 /*
1172  * Allow writepages on inode
1173  *
1174  * Remove the bias from the writecounter and send any queued
1175  * writepages.
1176  */
1177 static void __fuse_release_nowrite(struct inode *inode)
1178 {
1179         struct fuse_inode *fi = get_fuse_inode(inode);
1180
1181         BUG_ON(fi->writectr != FUSE_NOWRITE);
1182         fi->writectr = 0;
1183         fuse_flush_writepages(inode);
1184 }
1185
1186 void fuse_release_nowrite(struct inode *inode)
1187 {
1188         struct fuse_conn *fc = get_fuse_conn(inode);
1189
1190         spin_lock(&fc->lock);
1191         __fuse_release_nowrite(inode);
1192         spin_unlock(&fc->lock);
1193 }
1194
1195 /*
1196  * Set attributes, and at the same time refresh them.
1197  *
1198  * Truncation is slightly complicated, because the 'truncate' request
1199  * may fail, in which case we don't want to touch the mapping.
1200  * vmtruncate() doesn't allow for this case, so do the rlimit checking
1201  * and the actual truncation by hand.
1202  */
1203 static int fuse_do_setattr(struct dentry *entry, struct iattr *attr,
1204                            struct file *file)
1205 {
1206         struct inode *inode = entry->d_inode;
1207         struct fuse_conn *fc = get_fuse_conn(inode);
1208         struct fuse_req *req;
1209         struct fuse_setattr_in inarg;
1210         struct fuse_attr_out outarg;
1211         bool is_truncate = false;
1212         loff_t oldsize;
1213         int err;
1214
1215         if (!fuse_allow_task(fc, current))
1216                 return -EACCES;
1217
1218         if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
1219                 err = inode_change_ok(inode, attr);
1220                 if (err)
1221                         return err;
1222         }
1223
1224         if ((attr->ia_valid & ATTR_OPEN) && fc->atomic_o_trunc)
1225                 return 0;
1226
1227         if (attr->ia_valid & ATTR_SIZE) {
1228                 unsigned long limit;
1229                 if (IS_SWAPFILE(inode))
1230                         return -ETXTBSY;
1231                 limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
1232                 if (limit != RLIM_INFINITY && attr->ia_size > (loff_t) limit) {
1233                         send_sig(SIGXFSZ, current, 0);
1234                         return -EFBIG;
1235                 }
1236                 is_truncate = true;
1237         }
1238
1239         req = fuse_get_req(fc);
1240         if (IS_ERR(req))
1241                 return PTR_ERR(req);
1242
1243         if (is_truncate)
1244                 fuse_set_nowrite(inode);
1245
1246         memset(&inarg, 0, sizeof(inarg));
1247         memset(&outarg, 0, sizeof(outarg));
1248         iattr_to_fattr(attr, &inarg);
1249         if (file) {
1250                 struct fuse_file *ff = file->private_data;
1251                 inarg.valid |= FATTR_FH;
1252                 inarg.fh = ff->fh;
1253         }
1254         if (attr->ia_valid & ATTR_SIZE) {
1255                 /* For mandatory locking in truncate */
1256                 inarg.valid |= FATTR_LOCKOWNER;
1257                 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1258         }
1259         req->in.h.opcode = FUSE_SETATTR;
1260         req->in.h.nodeid = get_node_id(inode);
1261         req->in.numargs = 1;
1262         req->in.args[0].size = sizeof(inarg);
1263         req->in.args[0].value = &inarg;
1264         req->out.numargs = 1;
1265         if (fc->minor < 9)
1266                 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
1267         else
1268                 req->out.args[0].size = sizeof(outarg);
1269         req->out.args[0].value = &outarg;
1270         fuse_request_send(fc, req);
1271         err = req->out.h.error;
1272         fuse_put_request(fc, req);
1273         if (err) {
1274                 if (err == -EINTR)
1275                         fuse_invalidate_attr(inode);
1276                 goto error;
1277         }
1278
1279         if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1280                 make_bad_inode(inode);
1281                 err = -EIO;
1282                 goto error;
1283         }
1284
1285         spin_lock(&fc->lock);
1286         fuse_change_attributes_common(inode, &outarg.attr,
1287                                       attr_timeout(&outarg));
1288         oldsize = inode->i_size;
1289         i_size_write(inode, outarg.attr.size);
1290
1291         if (is_truncate) {
1292                 /* NOTE: this may release/reacquire fc->lock */
1293                 __fuse_release_nowrite(inode);
1294         }
1295         spin_unlock(&fc->lock);
1296
1297         /*
1298          * Only call invalidate_inode_pages2() after removing
1299          * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1300          */
1301         if (S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
1302                 if (outarg.attr.size < oldsize)
1303                         fuse_truncate(inode->i_mapping, outarg.attr.size);
1304                 invalidate_inode_pages2(inode->i_mapping);
1305         }
1306
1307         return 0;
1308
1309 error:
1310         if (is_truncate)
1311                 fuse_release_nowrite(inode);
1312
1313         return err;
1314 }
1315
1316 static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1317 {
1318         if (attr->ia_valid & ATTR_FILE)
1319                 return fuse_do_setattr(entry, attr, attr->ia_file);
1320         else
1321                 return fuse_do_setattr(entry, attr, NULL);
1322 }
1323
1324 static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
1325                         struct kstat *stat)
1326 {
1327         struct inode *inode = entry->d_inode;
1328         struct fuse_conn *fc = get_fuse_conn(inode);
1329
1330         if (!fuse_allow_task(fc, current))
1331                 return -EACCES;
1332
1333         return fuse_update_attributes(inode, stat, NULL, NULL);
1334 }
1335
1336 static int fuse_setxattr(struct dentry *entry, const char *name,
1337                          const void *value, size_t size, int flags)
1338 {
1339         struct inode *inode = entry->d_inode;
1340         struct fuse_conn *fc = get_fuse_conn(inode);
1341         struct fuse_req *req;
1342         struct fuse_setxattr_in inarg;
1343         int err;
1344
1345         if (fc->no_setxattr)
1346                 return -EOPNOTSUPP;
1347
1348         req = fuse_get_req(fc);
1349         if (IS_ERR(req))
1350                 return PTR_ERR(req);
1351
1352         memset(&inarg, 0, sizeof(inarg));
1353         inarg.size = size;
1354         inarg.flags = flags;
1355         req->in.h.opcode = FUSE_SETXATTR;
1356         req->in.h.nodeid = get_node_id(inode);
1357         req->in.numargs = 3;
1358         req->in.args[0].size = sizeof(inarg);
1359         req->in.args[0].value = &inarg;
1360         req->in.args[1].size = strlen(name) + 1;
1361         req->in.args[1].value = name;
1362         req->in.args[2].size = size;
1363         req->in.args[2].value = value;
1364         fuse_request_send(fc, req);
1365         err = req->out.h.error;
1366         fuse_put_request(fc, req);
1367         if (err == -ENOSYS) {
1368                 fc->no_setxattr = 1;
1369                 err = -EOPNOTSUPP;
1370         }
1371         return err;
1372 }
1373
1374 static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
1375                              void *value, size_t size)
1376 {
1377         struct inode *inode = entry->d_inode;
1378         struct fuse_conn *fc = get_fuse_conn(inode);
1379         struct fuse_req *req;
1380         struct fuse_getxattr_in inarg;
1381         struct fuse_getxattr_out outarg;
1382         ssize_t ret;
1383
1384         if (fc->no_getxattr)
1385                 return -EOPNOTSUPP;
1386
1387         req = fuse_get_req(fc);
1388         if (IS_ERR(req))
1389                 return PTR_ERR(req);
1390
1391         memset(&inarg, 0, sizeof(inarg));
1392         inarg.size = size;
1393         req->in.h.opcode = FUSE_GETXATTR;
1394         req->in.h.nodeid = get_node_id(inode);
1395         req->in.numargs = 2;
1396         req->in.args[0].size = sizeof(inarg);
1397         req->in.args[0].value = &inarg;
1398         req->in.args[1].size = strlen(name) + 1;
1399         req->in.args[1].value = name;
1400         /* This is really two different operations rolled into one */
1401         req->out.numargs = 1;
1402         if (size) {
1403                 req->out.argvar = 1;
1404                 req->out.args[0].size = size;
1405                 req->out.args[0].value = value;
1406         } else {
1407                 req->out.args[0].size = sizeof(outarg);
1408                 req->out.args[0].value = &outarg;
1409         }
1410         fuse_request_send(fc, req);
1411         ret = req->out.h.error;
1412         if (!ret)
1413                 ret = size ? req->out.args[0].size : outarg.size;
1414         else {
1415                 if (ret == -ENOSYS) {
1416                         fc->no_getxattr = 1;
1417                         ret = -EOPNOTSUPP;
1418                 }
1419         }
1420         fuse_put_request(fc, req);
1421         return ret;
1422 }
1423
1424 static ssize_t fuse_listxattr(struct dentry *entry, char *list, 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 (!fuse_allow_task(fc, current))
1434                 return -EACCES;
1435
1436         if (fc->no_listxattr)
1437                 return -EOPNOTSUPP;
1438
1439         req = fuse_get_req(fc);
1440         if (IS_ERR(req))
1441                 return PTR_ERR(req);
1442
1443         memset(&inarg, 0, sizeof(inarg));
1444         inarg.size = size;
1445         req->in.h.opcode = FUSE_LISTXATTR;
1446         req->in.h.nodeid = get_node_id(inode);
1447         req->in.numargs = 1;
1448         req->in.args[0].size = sizeof(inarg);
1449         req->in.args[0].value = &inarg;
1450         /* This is really two different operations rolled into one */
1451         req->out.numargs = 1;
1452         if (size) {
1453                 req->out.argvar = 1;
1454                 req->out.args[0].size = size;
1455                 req->out.args[0].value = list;
1456         } else {
1457                 req->out.args[0].size = sizeof(outarg);
1458                 req->out.args[0].value = &outarg;
1459         }
1460         fuse_request_send(fc, req);
1461         ret = req->out.h.error;
1462         if (!ret)
1463                 ret = size ? req->out.args[0].size : outarg.size;
1464         else {
1465                 if (ret == -ENOSYS) {
1466                         fc->no_listxattr = 1;
1467                         ret = -EOPNOTSUPP;
1468                 }
1469         }
1470         fuse_put_request(fc, req);
1471         return ret;
1472 }
1473
1474 static int fuse_removexattr(struct dentry *entry, const char *name)
1475 {
1476         struct inode *inode = entry->d_inode;
1477         struct fuse_conn *fc = get_fuse_conn(inode);
1478         struct fuse_req *req;
1479         int err;
1480
1481         if (fc->no_removexattr)
1482                 return -EOPNOTSUPP;
1483
1484         req = fuse_get_req(fc);
1485         if (IS_ERR(req))
1486                 return PTR_ERR(req);
1487
1488         req->in.h.opcode = FUSE_REMOVEXATTR;
1489         req->in.h.nodeid = get_node_id(inode);
1490         req->in.numargs = 1;
1491         req->in.args[0].size = strlen(name) + 1;
1492         req->in.args[0].value = name;
1493         fuse_request_send(fc, req);
1494         err = req->out.h.error;
1495         fuse_put_request(fc, req);
1496         if (err == -ENOSYS) {
1497                 fc->no_removexattr = 1;
1498                 err = -EOPNOTSUPP;
1499         }
1500         return err;
1501 }
1502
1503 static const struct inode_operations fuse_dir_inode_operations = {
1504         .lookup         = fuse_lookup,
1505         .mkdir          = fuse_mkdir,
1506         .symlink        = fuse_symlink,
1507         .unlink         = fuse_unlink,
1508         .rmdir          = fuse_rmdir,
1509         .rename         = fuse_rename,
1510         .link           = fuse_link,
1511         .setattr        = fuse_setattr,
1512         .create         = fuse_create,
1513         .mknod          = fuse_mknod,
1514         .permission     = fuse_permission,
1515         .getattr        = fuse_getattr,
1516         .setxattr       = fuse_setxattr,
1517         .getxattr       = fuse_getxattr,
1518         .listxattr      = fuse_listxattr,
1519         .removexattr    = fuse_removexattr,
1520 };
1521
1522 static const struct file_operations fuse_dir_operations = {
1523         .llseek         = generic_file_llseek,
1524         .read           = generic_read_dir,
1525         .readdir        = fuse_readdir,
1526         .open           = fuse_dir_open,
1527         .release        = fuse_dir_release,
1528         .fsync          = fuse_dir_fsync,
1529 };
1530
1531 static const struct inode_operations fuse_common_inode_operations = {
1532         .setattr        = fuse_setattr,
1533         .permission     = fuse_permission,
1534         .getattr        = fuse_getattr,
1535         .setxattr       = fuse_setxattr,
1536         .getxattr       = fuse_getxattr,
1537         .listxattr      = fuse_listxattr,
1538         .removexattr    = fuse_removexattr,
1539 };
1540
1541 static const struct inode_operations fuse_symlink_inode_operations = {
1542         .setattr        = fuse_setattr,
1543         .follow_link    = fuse_follow_link,
1544         .put_link       = fuse_put_link,
1545         .readlink       = generic_readlink,
1546         .getattr        = fuse_getattr,
1547         .setxattr       = fuse_setxattr,
1548         .getxattr       = fuse_getxattr,
1549         .listxattr      = fuse_listxattr,
1550         .removexattr    = fuse_removexattr,
1551 };
1552
1553 void fuse_init_common(struct inode *inode)
1554 {
1555         inode->i_op = &fuse_common_inode_operations;
1556 }
1557
1558 void fuse_init_dir(struct inode *inode)
1559 {
1560         inode->i_op = &fuse_dir_inode_operations;
1561         inode->i_fop = &fuse_dir_operations;
1562 }
1563
1564 void fuse_init_symlink(struct inode *inode)
1565 {
1566         inode->i_op = &fuse_symlink_inode_operations;
1567 }