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