Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[pandora-kernel.git] / 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 /*
18  * FUSE caches dentries and attributes with separate timeout.  The
19  * time in jiffies until the dentry/attributes are valid is stored in
20  * dentry->d_time and fuse_inode->i_time respectively.
21  */
22
23 /*
24  * Calculate the time in jiffies until a dentry/attributes are valid
25  */
26 static unsigned long time_to_jiffies(unsigned long sec, unsigned long nsec)
27 {
28         struct timespec ts = {sec, nsec};
29         return jiffies + timespec_to_jiffies(&ts);
30 }
31
32 /*
33  * Set dentry and possibly attribute timeouts from the lookup/mk*
34  * replies
35  */
36 static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o)
37 {
38         entry->d_time = time_to_jiffies(o->entry_valid, o->entry_valid_nsec);
39         if (entry->d_inode)
40                 get_fuse_inode(entry->d_inode)->i_time =
41                         time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
42 }
43
44 /*
45  * Mark the attributes as stale, so that at the next call to
46  * ->getattr() they will be fetched from userspace
47  */
48 void fuse_invalidate_attr(struct inode *inode)
49 {
50         get_fuse_inode(inode)->i_time = jiffies - 1;
51 }
52
53 /*
54  * Just mark the entry as stale, so that a next attempt to look it up
55  * will result in a new lookup call to userspace
56  *
57  * This is called when a dentry is about to become negative and the
58  * timeout is unknown (unlink, rmdir, rename and in some cases
59  * lookup)
60  */
61 static void fuse_invalidate_entry_cache(struct dentry *entry)
62 {
63         entry->d_time = jiffies - 1;
64 }
65
66 /*
67  * Same as fuse_invalidate_entry_cache(), but also try to remove the
68  * dentry from the hash
69  */
70 static void fuse_invalidate_entry(struct dentry *entry)
71 {
72         d_invalidate(entry);
73         fuse_invalidate_entry_cache(entry);
74 }
75
76 static void fuse_lookup_init(struct fuse_req *req, struct inode *dir,
77                              struct dentry *entry,
78                              struct fuse_entry_out *outarg)
79 {
80         req->in.h.opcode = FUSE_LOOKUP;
81         req->in.h.nodeid = get_node_id(dir);
82         req->in.numargs = 1;
83         req->in.args[0].size = entry->d_name.len + 1;
84         req->in.args[0].value = entry->d_name.name;
85         req->out.numargs = 1;
86         req->out.args[0].size = sizeof(struct fuse_entry_out);
87         req->out.args[0].value = outarg;
88 }
89
90 /*
91  * Check whether the dentry is still valid
92  *
93  * If the entry validity timeout has expired and the dentry is
94  * positive, try to redo the lookup.  If the lookup results in a
95  * different inode, then let the VFS invalidate the dentry and redo
96  * the lookup once more.  If the lookup results in the same inode,
97  * then refresh the attributes, timeouts and mark the dentry valid.
98  */
99 static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
100 {
101         struct inode *inode = entry->d_inode;
102
103         if (inode && is_bad_inode(inode))
104                 return 0;
105         else if (time_after(jiffies, entry->d_time)) {
106                 int err;
107                 struct fuse_entry_out outarg;
108                 struct fuse_conn *fc;
109                 struct fuse_req *req;
110
111                 /* Doesn't hurt to "reset" the validity timeout */
112                 fuse_invalidate_entry_cache(entry);
113
114                 /* For negative dentries, always do a fresh lookup */
115                 if (!inode)
116                         return 0;
117
118                 fc = get_fuse_conn(inode);
119                 req = fuse_get_req(fc);
120                 if (IS_ERR(req))
121                         return 0;
122
123                 fuse_lookup_init(req, entry->d_parent->d_inode, entry, &outarg);
124                 request_send(fc, req);
125                 err = req->out.h.error;
126                 /* Zero nodeid is same as -ENOENT */
127                 if (!err && !outarg.nodeid)
128                         err = -ENOENT;
129                 if (!err) {
130                         struct fuse_inode *fi = get_fuse_inode(inode);
131                         if (outarg.nodeid != get_node_id(inode)) {
132                                 fuse_send_forget(fc, req, outarg.nodeid, 1);
133                                 return 0;
134                         }
135                         fi->nlookup ++;
136                 }
137                 fuse_put_request(fc, req);
138                 if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
139                         return 0;
140
141                 fuse_change_attributes(inode, &outarg.attr);
142                 fuse_change_timeout(entry, &outarg);
143         }
144         return 1;
145 }
146
147 /*
148  * Check if there's already a hashed alias of this directory inode.
149  * If yes, then lookup and mkdir must not create a new alias.
150  */
151 static int dir_alias(struct inode *inode)
152 {
153         if (S_ISDIR(inode->i_mode)) {
154                 struct dentry *alias = d_find_alias(inode);
155                 if (alias) {
156                         dput(alias);
157                         return 1;
158                 }
159         }
160         return 0;
161 }
162
163 static int invalid_nodeid(u64 nodeid)
164 {
165         return !nodeid || nodeid == FUSE_ROOT_ID;
166 }
167
168 static struct dentry_operations fuse_dentry_operations = {
169         .d_revalidate   = fuse_dentry_revalidate,
170 };
171
172 static int valid_mode(int m)
173 {
174         return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
175                 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
176 }
177
178 static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
179                                   struct nameidata *nd)
180 {
181         int err;
182         struct fuse_entry_out outarg;
183         struct inode *inode = NULL;
184         struct fuse_conn *fc = get_fuse_conn(dir);
185         struct fuse_req *req;
186
187         if (entry->d_name.len > FUSE_NAME_MAX)
188                 return ERR_PTR(-ENAMETOOLONG);
189
190         req = fuse_get_req(fc);
191         if (IS_ERR(req))
192                 return ERR_PTR(PTR_ERR(req));
193
194         fuse_lookup_init(req, dir, entry, &outarg);
195         request_send(fc, req);
196         err = req->out.h.error;
197         /* Zero nodeid is same as -ENOENT, but with valid timeout */
198         if (!err && outarg.nodeid &&
199             (invalid_nodeid(outarg.nodeid) || !valid_mode(outarg.attr.mode)))
200                 err = -EIO;
201         if (!err && outarg.nodeid) {
202                 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
203                                   &outarg.attr);
204                 if (!inode) {
205                         fuse_send_forget(fc, req, outarg.nodeid, 1);
206                         return ERR_PTR(-ENOMEM);
207                 }
208         }
209         fuse_put_request(fc, req);
210         if (err && err != -ENOENT)
211                 return ERR_PTR(err);
212
213         if (inode && dir_alias(inode)) {
214                 iput(inode);
215                 return ERR_PTR(-EIO);
216         }
217         d_add(entry, inode);
218         entry->d_op = &fuse_dentry_operations;
219         if (!err)
220                 fuse_change_timeout(entry, &outarg);
221         else
222                 fuse_invalidate_entry_cache(entry);
223         return NULL;
224 }
225
226 /*
227  * Synchronous release for the case when something goes wrong in CREATE_OPEN
228  */
229 static void fuse_sync_release(struct fuse_conn *fc, struct fuse_file *ff,
230                               u64 nodeid, int flags)
231 {
232         struct fuse_req *req;
233
234         req = fuse_release_fill(ff, nodeid, flags, FUSE_RELEASE);
235         req->force = 1;
236         request_send(fc, req);
237         fuse_put_request(fc, req);
238 }
239
240 /*
241  * Atomic create+open operation
242  *
243  * If the filesystem doesn't support this, then fall back to separate
244  * 'mknod' + 'open' requests.
245  */
246 static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
247                             struct nameidata *nd)
248 {
249         int err;
250         struct inode *inode;
251         struct fuse_conn *fc = get_fuse_conn(dir);
252         struct fuse_req *req;
253         struct fuse_req *forget_req;
254         struct fuse_open_in inarg;
255         struct fuse_open_out outopen;
256         struct fuse_entry_out outentry;
257         struct fuse_file *ff;
258         struct file *file;
259         int flags = nd->intent.open.flags - 1;
260
261         if (fc->no_create)
262                 return -ENOSYS;
263
264         forget_req = fuse_get_req(fc);
265         if (IS_ERR(forget_req))
266                 return PTR_ERR(forget_req);
267
268         req = fuse_get_req(fc);
269         err = PTR_ERR(req);
270         if (IS_ERR(req))
271                 goto out_put_forget_req;
272
273         err = -ENOMEM;
274         ff = fuse_file_alloc();
275         if (!ff)
276                 goto out_put_request;
277
278         flags &= ~O_NOCTTY;
279         memset(&inarg, 0, sizeof(inarg));
280         inarg.flags = flags;
281         inarg.mode = mode;
282         req->in.h.opcode = FUSE_CREATE;
283         req->in.h.nodeid = get_node_id(dir);
284         req->in.numargs = 2;
285         req->in.args[0].size = sizeof(inarg);
286         req->in.args[0].value = &inarg;
287         req->in.args[1].size = entry->d_name.len + 1;
288         req->in.args[1].value = entry->d_name.name;
289         req->out.numargs = 2;
290         req->out.args[0].size = sizeof(outentry);
291         req->out.args[0].value = &outentry;
292         req->out.args[1].size = sizeof(outopen);
293         req->out.args[1].value = &outopen;
294         request_send(fc, req);
295         err = req->out.h.error;
296         if (err) {
297                 if (err == -ENOSYS)
298                         fc->no_create = 1;
299                 goto out_free_ff;
300         }
301
302         err = -EIO;
303         if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
304                 goto out_free_ff;
305
306         fuse_put_request(fc, req);
307         inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
308                           &outentry.attr);
309         if (!inode) {
310                 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
311                 ff->fh = outopen.fh;
312                 fuse_sync_release(fc, ff, outentry.nodeid, flags);
313                 fuse_send_forget(fc, forget_req, outentry.nodeid, 1);
314                 return -ENOMEM;
315         }
316         fuse_put_request(fc, forget_req);
317         d_instantiate(entry, inode);
318         fuse_change_timeout(entry, &outentry);
319         file = lookup_instantiate_filp(nd, entry, generic_file_open);
320         if (IS_ERR(file)) {
321                 ff->fh = outopen.fh;
322                 fuse_sync_release(fc, ff, outentry.nodeid, flags);
323                 return PTR_ERR(file);
324         }
325         fuse_finish_open(inode, file, ff, &outopen);
326         return 0;
327
328  out_free_ff:
329         fuse_file_free(ff);
330  out_put_request:
331         fuse_put_request(fc, req);
332  out_put_forget_req:
333         fuse_put_request(fc, forget_req);
334         return err;
335 }
336
337 /*
338  * Code shared between mknod, mkdir, symlink and link
339  */
340 static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
341                             struct inode *dir, struct dentry *entry,
342                             int mode)
343 {
344         struct fuse_entry_out outarg;
345         struct inode *inode;
346         int err;
347
348         req->in.h.nodeid = get_node_id(dir);
349         req->out.numargs = 1;
350         req->out.args[0].size = sizeof(outarg);
351         req->out.args[0].value = &outarg;
352         request_send(fc, req);
353         err = req->out.h.error;
354         if (err) {
355                 fuse_put_request(fc, req);
356                 return err;
357         }
358         err = -EIO;
359         if (invalid_nodeid(outarg.nodeid))
360                 goto out_put_request;
361
362         if ((outarg.attr.mode ^ mode) & S_IFMT)
363                 goto out_put_request;
364
365         inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
366                           &outarg.attr);
367         if (!inode) {
368                 fuse_send_forget(fc, req, outarg.nodeid, 1);
369                 return -ENOMEM;
370         }
371         fuse_put_request(fc, req);
372
373         if (dir_alias(inode)) {
374                 iput(inode);
375                 return -EIO;
376         }
377
378         d_instantiate(entry, inode);
379         fuse_change_timeout(entry, &outarg);
380         fuse_invalidate_attr(dir);
381         return 0;
382
383  out_put_request:
384         fuse_put_request(fc, req);
385         return err;
386 }
387
388 static int fuse_mknod(struct inode *dir, struct dentry *entry, int mode,
389                       dev_t rdev)
390 {
391         struct fuse_mknod_in inarg;
392         struct fuse_conn *fc = get_fuse_conn(dir);
393         struct fuse_req *req = fuse_get_req(fc);
394         if (IS_ERR(req))
395                 return PTR_ERR(req);
396
397         memset(&inarg, 0, sizeof(inarg));
398         inarg.mode = mode;
399         inarg.rdev = new_encode_dev(rdev);
400         req->in.h.opcode = FUSE_MKNOD;
401         req->in.numargs = 2;
402         req->in.args[0].size = sizeof(inarg);
403         req->in.args[0].value = &inarg;
404         req->in.args[1].size = entry->d_name.len + 1;
405         req->in.args[1].value = entry->d_name.name;
406         return create_new_entry(fc, req, dir, entry, mode);
407 }
408
409 static int fuse_create(struct inode *dir, struct dentry *entry, int mode,
410                        struct nameidata *nd)
411 {
412         if (nd && (nd->flags & LOOKUP_CREATE)) {
413                 int err = fuse_create_open(dir, entry, mode, nd);
414                 if (err != -ENOSYS)
415                         return err;
416                 /* Fall back on mknod */
417         }
418         return fuse_mknod(dir, entry, mode, 0);
419 }
420
421 static int fuse_mkdir(struct inode *dir, struct dentry *entry, int mode)
422 {
423         struct fuse_mkdir_in inarg;
424         struct fuse_conn *fc = get_fuse_conn(dir);
425         struct fuse_req *req = fuse_get_req(fc);
426         if (IS_ERR(req))
427                 return PTR_ERR(req);
428
429         memset(&inarg, 0, sizeof(inarg));
430         inarg.mode = mode;
431         req->in.h.opcode = FUSE_MKDIR;
432         req->in.numargs = 2;
433         req->in.args[0].size = sizeof(inarg);
434         req->in.args[0].value = &inarg;
435         req->in.args[1].size = entry->d_name.len + 1;
436         req->in.args[1].value = entry->d_name.name;
437         return create_new_entry(fc, req, dir, entry, S_IFDIR);
438 }
439
440 static int fuse_symlink(struct inode *dir, struct dentry *entry,
441                         const char *link)
442 {
443         struct fuse_conn *fc = get_fuse_conn(dir);
444         unsigned len = strlen(link) + 1;
445         struct fuse_req *req = fuse_get_req(fc);
446         if (IS_ERR(req))
447                 return PTR_ERR(req);
448
449         req->in.h.opcode = FUSE_SYMLINK;
450         req->in.numargs = 2;
451         req->in.args[0].size = entry->d_name.len + 1;
452         req->in.args[0].value = entry->d_name.name;
453         req->in.args[1].size = len;
454         req->in.args[1].value = link;
455         return create_new_entry(fc, req, dir, entry, S_IFLNK);
456 }
457
458 static int fuse_unlink(struct inode *dir, struct dentry *entry)
459 {
460         int err;
461         struct fuse_conn *fc = get_fuse_conn(dir);
462         struct fuse_req *req = fuse_get_req(fc);
463         if (IS_ERR(req))
464                 return PTR_ERR(req);
465
466         req->in.h.opcode = FUSE_UNLINK;
467         req->in.h.nodeid = get_node_id(dir);
468         req->in.numargs = 1;
469         req->in.args[0].size = entry->d_name.len + 1;
470         req->in.args[0].value = entry->d_name.name;
471         request_send(fc, req);
472         err = req->out.h.error;
473         fuse_put_request(fc, req);
474         if (!err) {
475                 struct inode *inode = entry->d_inode;
476
477                 /* Set nlink to zero so the inode can be cleared, if
478                    the inode does have more links this will be
479                    discovered at the next lookup/getattr */
480                 inode->i_nlink = 0;
481                 fuse_invalidate_attr(inode);
482                 fuse_invalidate_attr(dir);
483                 fuse_invalidate_entry_cache(entry);
484         } else if (err == -EINTR)
485                 fuse_invalidate_entry(entry);
486         return err;
487 }
488
489 static int fuse_rmdir(struct inode *dir, struct dentry *entry)
490 {
491         int err;
492         struct fuse_conn *fc = get_fuse_conn(dir);
493         struct fuse_req *req = fuse_get_req(fc);
494         if (IS_ERR(req))
495                 return PTR_ERR(req);
496
497         req->in.h.opcode = FUSE_RMDIR;
498         req->in.h.nodeid = get_node_id(dir);
499         req->in.numargs = 1;
500         req->in.args[0].size = entry->d_name.len + 1;
501         req->in.args[0].value = entry->d_name.name;
502         request_send(fc, req);
503         err = req->out.h.error;
504         fuse_put_request(fc, req);
505         if (!err) {
506                 entry->d_inode->i_nlink = 0;
507                 fuse_invalidate_attr(dir);
508                 fuse_invalidate_entry_cache(entry);
509         } else if (err == -EINTR)
510                 fuse_invalidate_entry(entry);
511         return err;
512 }
513
514 static int fuse_rename(struct inode *olddir, struct dentry *oldent,
515                        struct inode *newdir, struct dentry *newent)
516 {
517         int err;
518         struct fuse_rename_in inarg;
519         struct fuse_conn *fc = get_fuse_conn(olddir);
520         struct fuse_req *req = fuse_get_req(fc);
521         if (IS_ERR(req))
522                 return PTR_ERR(req);
523
524         memset(&inarg, 0, sizeof(inarg));
525         inarg.newdir = get_node_id(newdir);
526         req->in.h.opcode = FUSE_RENAME;
527         req->in.h.nodeid = get_node_id(olddir);
528         req->in.numargs = 3;
529         req->in.args[0].size = sizeof(inarg);
530         req->in.args[0].value = &inarg;
531         req->in.args[1].size = oldent->d_name.len + 1;
532         req->in.args[1].value = oldent->d_name.name;
533         req->in.args[2].size = newent->d_name.len + 1;
534         req->in.args[2].value = newent->d_name.name;
535         request_send(fc, req);
536         err = req->out.h.error;
537         fuse_put_request(fc, req);
538         if (!err) {
539                 fuse_invalidate_attr(olddir);
540                 if (olddir != newdir)
541                         fuse_invalidate_attr(newdir);
542
543                 /* newent will end up negative */
544                 if (newent->d_inode)
545                         fuse_invalidate_entry_cache(newent);
546         } else if (err == -EINTR) {
547                 /* If request was interrupted, DEITY only knows if the
548                    rename actually took place.  If the invalidation
549                    fails (e.g. some process has CWD under the renamed
550                    directory), then there can be inconsistency between
551                    the dcache and the real filesystem.  Tough luck. */
552                 fuse_invalidate_entry(oldent);
553                 if (newent->d_inode)
554                         fuse_invalidate_entry(newent);
555         }
556
557         return err;
558 }
559
560 static int fuse_link(struct dentry *entry, struct inode *newdir,
561                      struct dentry *newent)
562 {
563         int err;
564         struct fuse_link_in inarg;
565         struct inode *inode = entry->d_inode;
566         struct fuse_conn *fc = get_fuse_conn(inode);
567         struct fuse_req *req = fuse_get_req(fc);
568         if (IS_ERR(req))
569                 return PTR_ERR(req);
570
571         memset(&inarg, 0, sizeof(inarg));
572         inarg.oldnodeid = get_node_id(inode);
573         req->in.h.opcode = FUSE_LINK;
574         req->in.numargs = 2;
575         req->in.args[0].size = sizeof(inarg);
576         req->in.args[0].value = &inarg;
577         req->in.args[1].size = newent->d_name.len + 1;
578         req->in.args[1].value = newent->d_name.name;
579         err = create_new_entry(fc, req, newdir, newent, inode->i_mode);
580         /* Contrary to "normal" filesystems it can happen that link
581            makes two "logical" inodes point to the same "physical"
582            inode.  We invalidate the attributes of the old one, so it
583            will reflect changes in the backing inode (link count,
584            etc.)
585         */
586         if (!err || err == -EINTR)
587                 fuse_invalidate_attr(inode);
588         return err;
589 }
590
591 int fuse_do_getattr(struct inode *inode)
592 {
593         int err;
594         struct fuse_attr_out arg;
595         struct fuse_conn *fc = get_fuse_conn(inode);
596         struct fuse_req *req = fuse_get_req(fc);
597         if (IS_ERR(req))
598                 return PTR_ERR(req);
599
600         req->in.h.opcode = FUSE_GETATTR;
601         req->in.h.nodeid = get_node_id(inode);
602         req->out.numargs = 1;
603         req->out.args[0].size = sizeof(arg);
604         req->out.args[0].value = &arg;
605         request_send(fc, req);
606         err = req->out.h.error;
607         fuse_put_request(fc, req);
608         if (!err) {
609                 if ((inode->i_mode ^ arg.attr.mode) & S_IFMT) {
610                         make_bad_inode(inode);
611                         err = -EIO;
612                 } else {
613                         struct fuse_inode *fi = get_fuse_inode(inode);
614                         fuse_change_attributes(inode, &arg.attr);
615                         fi->i_time = time_to_jiffies(arg.attr_valid,
616                                                      arg.attr_valid_nsec);
617                 }
618         }
619         return err;
620 }
621
622 /*
623  * Calling into a user-controlled filesystem gives the filesystem
624  * daemon ptrace-like capabilities over the requester process.  This
625  * means, that the filesystem daemon is able to record the exact
626  * filesystem operations performed, and can also control the behavior
627  * of the requester process in otherwise impossible ways.  For example
628  * it can delay the operation for arbitrary length of time allowing
629  * DoS against the requester.
630  *
631  * For this reason only those processes can call into the filesystem,
632  * for which the owner of the mount has ptrace privilege.  This
633  * excludes processes started by other users, suid or sgid processes.
634  */
635 static int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task)
636 {
637         if (fc->flags & FUSE_ALLOW_OTHER)
638                 return 1;
639
640         if (task->euid == fc->user_id &&
641             task->suid == fc->user_id &&
642             task->uid == fc->user_id &&
643             task->egid == fc->group_id &&
644             task->sgid == fc->group_id &&
645             task->gid == fc->group_id)
646                 return 1;
647
648         return 0;
649 }
650
651 /*
652  * Check whether the inode attributes are still valid
653  *
654  * If the attribute validity timeout has expired, then fetch the fresh
655  * attributes with a 'getattr' request
656  *
657  * I'm not sure why cached attributes are never returned for the root
658  * inode, this is probably being too cautious.
659  */
660 static int fuse_revalidate(struct dentry *entry)
661 {
662         struct inode *inode = entry->d_inode;
663         struct fuse_inode *fi = get_fuse_inode(inode);
664         struct fuse_conn *fc = get_fuse_conn(inode);
665
666         if (!fuse_allow_task(fc, current))
667                 return -EACCES;
668         if (get_node_id(inode) != FUSE_ROOT_ID &&
669             time_before_eq(jiffies, fi->i_time))
670                 return 0;
671
672         return fuse_do_getattr(inode);
673 }
674
675 static int fuse_access(struct inode *inode, int mask)
676 {
677         struct fuse_conn *fc = get_fuse_conn(inode);
678         struct fuse_req *req;
679         struct fuse_access_in inarg;
680         int err;
681
682         if (fc->no_access)
683                 return 0;
684
685         req = fuse_get_req(fc);
686         if (IS_ERR(req))
687                 return PTR_ERR(req);
688
689         memset(&inarg, 0, sizeof(inarg));
690         inarg.mask = mask;
691         req->in.h.opcode = FUSE_ACCESS;
692         req->in.h.nodeid = get_node_id(inode);
693         req->in.numargs = 1;
694         req->in.args[0].size = sizeof(inarg);
695         req->in.args[0].value = &inarg;
696         request_send(fc, req);
697         err = req->out.h.error;
698         fuse_put_request(fc, req);
699         if (err == -ENOSYS) {
700                 fc->no_access = 1;
701                 err = 0;
702         }
703         return err;
704 }
705
706 /*
707  * Check permission.  The two basic access models of FUSE are:
708  *
709  * 1) Local access checking ('default_permissions' mount option) based
710  * on file mode.  This is the plain old disk filesystem permission
711  * modell.
712  *
713  * 2) "Remote" access checking, where server is responsible for
714  * checking permission in each inode operation.  An exception to this
715  * is if ->permission() was invoked from sys_access() in which case an
716  * access request is sent.  Execute permission is still checked
717  * locally based on file mode.
718  */
719 static int fuse_permission(struct inode *inode, int mask, struct nameidata *nd)
720 {
721         struct fuse_conn *fc = get_fuse_conn(inode);
722
723         if (!fuse_allow_task(fc, current))
724                 return -EACCES;
725         else if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
726                 int err = generic_permission(inode, mask, NULL);
727
728                 /* If permission is denied, try to refresh file
729                    attributes.  This is also needed, because the root
730                    node will at first have no permissions */
731                 if (err == -EACCES) {
732                         err = fuse_do_getattr(inode);
733                         if (!err)
734                                 err = generic_permission(inode, mask, NULL);
735                 }
736
737                 /* Note: the opposite of the above test does not
738                    exist.  So if permissions are revoked this won't be
739                    noticed immediately, only after the attribute
740                    timeout has expired */
741
742                 return err;
743         } else {
744                 int mode = inode->i_mode;
745                 if ((mask & MAY_EXEC) && !S_ISDIR(mode) && !(mode & S_IXUGO))
746                         return -EACCES;
747
748                 if (nd && (nd->flags & LOOKUP_ACCESS))
749                         return fuse_access(inode, mask);
750                 return 0;
751         }
752 }
753
754 static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
755                          void *dstbuf, filldir_t filldir)
756 {
757         while (nbytes >= FUSE_NAME_OFFSET) {
758                 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
759                 size_t reclen = FUSE_DIRENT_SIZE(dirent);
760                 int over;
761                 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
762                         return -EIO;
763                 if (reclen > nbytes)
764                         break;
765
766                 over = filldir(dstbuf, dirent->name, dirent->namelen,
767                                file->f_pos, dirent->ino, dirent->type);
768                 if (over)
769                         break;
770
771                 buf += reclen;
772                 nbytes -= reclen;
773                 file->f_pos = dirent->off;
774         }
775
776         return 0;
777 }
778
779 static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
780 {
781         int err;
782         size_t nbytes;
783         struct page *page;
784         struct inode *inode = file->f_dentry->d_inode;
785         struct fuse_conn *fc = get_fuse_conn(inode);
786         struct fuse_req *req;
787
788         if (is_bad_inode(inode))
789                 return -EIO;
790
791         req = fuse_get_req(fc);
792         if (IS_ERR(req))
793                 return PTR_ERR(req);
794
795         page = alloc_page(GFP_KERNEL);
796         if (!page) {
797                 fuse_put_request(fc, req);
798                 return -ENOMEM;
799         }
800         req->num_pages = 1;
801         req->pages[0] = page;
802         fuse_read_fill(req, file, inode, file->f_pos, PAGE_SIZE, FUSE_READDIR);
803         request_send(fc, req);
804         nbytes = req->out.args[0].size;
805         err = req->out.h.error;
806         fuse_put_request(fc, req);
807         if (!err)
808                 err = parse_dirfile(page_address(page), nbytes, file, dstbuf,
809                                     filldir);
810
811         __free_page(page);
812         fuse_invalidate_attr(inode); /* atime changed */
813         return err;
814 }
815
816 static char *read_link(struct dentry *dentry)
817 {
818         struct inode *inode = dentry->d_inode;
819         struct fuse_conn *fc = get_fuse_conn(inode);
820         struct fuse_req *req = fuse_get_req(fc);
821         char *link;
822
823         if (IS_ERR(req))
824                 return ERR_PTR(PTR_ERR(req));
825
826         link = (char *) __get_free_page(GFP_KERNEL);
827         if (!link) {
828                 link = ERR_PTR(-ENOMEM);
829                 goto out;
830         }
831         req->in.h.opcode = FUSE_READLINK;
832         req->in.h.nodeid = get_node_id(inode);
833         req->out.argvar = 1;
834         req->out.numargs = 1;
835         req->out.args[0].size = PAGE_SIZE - 1;
836         req->out.args[0].value = link;
837         request_send(fc, req);
838         if (req->out.h.error) {
839                 free_page((unsigned long) link);
840                 link = ERR_PTR(req->out.h.error);
841         } else
842                 link[req->out.args[0].size] = '\0';
843  out:
844         fuse_put_request(fc, req);
845         fuse_invalidate_attr(inode); /* atime changed */
846         return link;
847 }
848
849 static void free_link(char *link)
850 {
851         if (!IS_ERR(link))
852                 free_page((unsigned long) link);
853 }
854
855 static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd)
856 {
857         nd_set_link(nd, read_link(dentry));
858         return NULL;
859 }
860
861 static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
862 {
863         free_link(nd_get_link(nd));
864 }
865
866 static int fuse_dir_open(struct inode *inode, struct file *file)
867 {
868         return fuse_open_common(inode, file, 1);
869 }
870
871 static int fuse_dir_release(struct inode *inode, struct file *file)
872 {
873         return fuse_release_common(inode, file, 1);
874 }
875
876 static int fuse_dir_fsync(struct file *file, struct dentry *de, int datasync)
877 {
878         /* nfsd can call this with no file */
879         return file ? fuse_fsync_common(file, de, datasync, 1) : 0;
880 }
881
882 static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg)
883 {
884         unsigned ivalid = iattr->ia_valid;
885
886         if (ivalid & ATTR_MODE)
887                 arg->valid |= FATTR_MODE,   arg->mode = iattr->ia_mode;
888         if (ivalid & ATTR_UID)
889                 arg->valid |= FATTR_UID,    arg->uid = iattr->ia_uid;
890         if (ivalid & ATTR_GID)
891                 arg->valid |= FATTR_GID,    arg->gid = iattr->ia_gid;
892         if (ivalid & ATTR_SIZE)
893                 arg->valid |= FATTR_SIZE,   arg->size = iattr->ia_size;
894         /* You can only _set_ these together (they may change by themselves) */
895         if ((ivalid & (ATTR_ATIME | ATTR_MTIME)) == (ATTR_ATIME | ATTR_MTIME)) {
896                 arg->valid |= FATTR_ATIME | FATTR_MTIME;
897                 arg->atime = iattr->ia_atime.tv_sec;
898                 arg->mtime = iattr->ia_mtime.tv_sec;
899         }
900         if (ivalid & ATTR_FILE) {
901                 struct fuse_file *ff = iattr->ia_file->private_data;
902                 arg->valid |= FATTR_FH;
903                 arg->fh = ff->fh;
904         }
905 }
906
907 /*
908  * Set attributes, and at the same time refresh them.
909  *
910  * Truncation is slightly complicated, because the 'truncate' request
911  * may fail, in which case we don't want to touch the mapping.
912  * vmtruncate() doesn't allow for this case.  So do the rlimit
913  * checking by hand and call vmtruncate() only after the file has
914  * actually been truncated.
915  */
916 static int fuse_setattr(struct dentry *entry, struct iattr *attr)
917 {
918         struct inode *inode = entry->d_inode;
919         struct fuse_conn *fc = get_fuse_conn(inode);
920         struct fuse_inode *fi = get_fuse_inode(inode);
921         struct fuse_req *req;
922         struct fuse_setattr_in inarg;
923         struct fuse_attr_out outarg;
924         int err;
925         int is_truncate = 0;
926
927         if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
928                 err = inode_change_ok(inode, attr);
929                 if (err)
930                         return err;
931         }
932
933         if (attr->ia_valid & ATTR_SIZE) {
934                 unsigned long limit;
935                 is_truncate = 1;
936                 limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
937                 if (limit != RLIM_INFINITY && attr->ia_size > (loff_t) limit) {
938                         send_sig(SIGXFSZ, current, 0);
939                         return -EFBIG;
940                 }
941         }
942
943         req = fuse_get_req(fc);
944         if (IS_ERR(req))
945                 return PTR_ERR(req);
946
947         memset(&inarg, 0, sizeof(inarg));
948         iattr_to_fattr(attr, &inarg);
949         req->in.h.opcode = FUSE_SETATTR;
950         req->in.h.nodeid = get_node_id(inode);
951         req->in.numargs = 1;
952         req->in.args[0].size = sizeof(inarg);
953         req->in.args[0].value = &inarg;
954         req->out.numargs = 1;
955         req->out.args[0].size = sizeof(outarg);
956         req->out.args[0].value = &outarg;
957         request_send(fc, req);
958         err = req->out.h.error;
959         fuse_put_request(fc, req);
960         if (!err) {
961                 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
962                         make_bad_inode(inode);
963                         err = -EIO;
964                 } else {
965                         if (is_truncate) {
966                                 loff_t origsize = i_size_read(inode);
967                                 i_size_write(inode, outarg.attr.size);
968                                 if (origsize > outarg.attr.size)
969                                         vmtruncate(inode, outarg.attr.size);
970                         }
971                         fuse_change_attributes(inode, &outarg.attr);
972                         fi->i_time = time_to_jiffies(outarg.attr_valid,
973                                                      outarg.attr_valid_nsec);
974                 }
975         } else if (err == -EINTR)
976                 fuse_invalidate_attr(inode);
977
978         return err;
979 }
980
981 static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
982                         struct kstat *stat)
983 {
984         struct inode *inode = entry->d_inode;
985         int err = fuse_revalidate(entry);
986         if (!err)
987                 generic_fillattr(inode, stat);
988
989         return err;
990 }
991
992 static int fuse_setxattr(struct dentry *entry, const char *name,
993                          const void *value, size_t size, int flags)
994 {
995         struct inode *inode = entry->d_inode;
996         struct fuse_conn *fc = get_fuse_conn(inode);
997         struct fuse_req *req;
998         struct fuse_setxattr_in inarg;
999         int err;
1000
1001         if (fc->no_setxattr)
1002                 return -EOPNOTSUPP;
1003
1004         req = fuse_get_req(fc);
1005         if (IS_ERR(req))
1006                 return PTR_ERR(req);
1007
1008         memset(&inarg, 0, sizeof(inarg));
1009         inarg.size = size;
1010         inarg.flags = flags;
1011         req->in.h.opcode = FUSE_SETXATTR;
1012         req->in.h.nodeid = get_node_id(inode);
1013         req->in.numargs = 3;
1014         req->in.args[0].size = sizeof(inarg);
1015         req->in.args[0].value = &inarg;
1016         req->in.args[1].size = strlen(name) + 1;
1017         req->in.args[1].value = name;
1018         req->in.args[2].size = size;
1019         req->in.args[2].value = value;
1020         request_send(fc, req);
1021         err = req->out.h.error;
1022         fuse_put_request(fc, req);
1023         if (err == -ENOSYS) {
1024                 fc->no_setxattr = 1;
1025                 err = -EOPNOTSUPP;
1026         }
1027         return err;
1028 }
1029
1030 static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
1031                              void *value, size_t size)
1032 {
1033         struct inode *inode = entry->d_inode;
1034         struct fuse_conn *fc = get_fuse_conn(inode);
1035         struct fuse_req *req;
1036         struct fuse_getxattr_in inarg;
1037         struct fuse_getxattr_out outarg;
1038         ssize_t ret;
1039
1040         if (fc->no_getxattr)
1041                 return -EOPNOTSUPP;
1042
1043         req = fuse_get_req(fc);
1044         if (IS_ERR(req))
1045                 return PTR_ERR(req);
1046
1047         memset(&inarg, 0, sizeof(inarg));
1048         inarg.size = size;
1049         req->in.h.opcode = FUSE_GETXATTR;
1050         req->in.h.nodeid = get_node_id(inode);
1051         req->in.numargs = 2;
1052         req->in.args[0].size = sizeof(inarg);
1053         req->in.args[0].value = &inarg;
1054         req->in.args[1].size = strlen(name) + 1;
1055         req->in.args[1].value = name;
1056         /* This is really two different operations rolled into one */
1057         req->out.numargs = 1;
1058         if (size) {
1059                 req->out.argvar = 1;
1060                 req->out.args[0].size = size;
1061                 req->out.args[0].value = value;
1062         } else {
1063                 req->out.args[0].size = sizeof(outarg);
1064                 req->out.args[0].value = &outarg;
1065         }
1066         request_send(fc, req);
1067         ret = req->out.h.error;
1068         if (!ret)
1069                 ret = size ? req->out.args[0].size : outarg.size;
1070         else {
1071                 if (ret == -ENOSYS) {
1072                         fc->no_getxattr = 1;
1073                         ret = -EOPNOTSUPP;
1074                 }
1075         }
1076         fuse_put_request(fc, req);
1077         return ret;
1078 }
1079
1080 static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
1081 {
1082         struct inode *inode = entry->d_inode;
1083         struct fuse_conn *fc = get_fuse_conn(inode);
1084         struct fuse_req *req;
1085         struct fuse_getxattr_in inarg;
1086         struct fuse_getxattr_out outarg;
1087         ssize_t ret;
1088
1089         if (fc->no_listxattr)
1090                 return -EOPNOTSUPP;
1091
1092         req = fuse_get_req(fc);
1093         if (IS_ERR(req))
1094                 return PTR_ERR(req);
1095
1096         memset(&inarg, 0, sizeof(inarg));
1097         inarg.size = size;
1098         req->in.h.opcode = FUSE_LISTXATTR;
1099         req->in.h.nodeid = get_node_id(inode);
1100         req->in.numargs = 1;
1101         req->in.args[0].size = sizeof(inarg);
1102         req->in.args[0].value = &inarg;
1103         /* This is really two different operations rolled into one */
1104         req->out.numargs = 1;
1105         if (size) {
1106                 req->out.argvar = 1;
1107                 req->out.args[0].size = size;
1108                 req->out.args[0].value = list;
1109         } else {
1110                 req->out.args[0].size = sizeof(outarg);
1111                 req->out.args[0].value = &outarg;
1112         }
1113         request_send(fc, req);
1114         ret = req->out.h.error;
1115         if (!ret)
1116                 ret = size ? req->out.args[0].size : outarg.size;
1117         else {
1118                 if (ret == -ENOSYS) {
1119                         fc->no_listxattr = 1;
1120                         ret = -EOPNOTSUPP;
1121                 }
1122         }
1123         fuse_put_request(fc, req);
1124         return ret;
1125 }
1126
1127 static int fuse_removexattr(struct dentry *entry, const char *name)
1128 {
1129         struct inode *inode = entry->d_inode;
1130         struct fuse_conn *fc = get_fuse_conn(inode);
1131         struct fuse_req *req;
1132         int err;
1133
1134         if (fc->no_removexattr)
1135                 return -EOPNOTSUPP;
1136
1137         req = fuse_get_req(fc);
1138         if (IS_ERR(req))
1139                 return PTR_ERR(req);
1140
1141         req->in.h.opcode = FUSE_REMOVEXATTR;
1142         req->in.h.nodeid = get_node_id(inode);
1143         req->in.numargs = 1;
1144         req->in.args[0].size = strlen(name) + 1;
1145         req->in.args[0].value = name;
1146         request_send(fc, req);
1147         err = req->out.h.error;
1148         fuse_put_request(fc, req);
1149         if (err == -ENOSYS) {
1150                 fc->no_removexattr = 1;
1151                 err = -EOPNOTSUPP;
1152         }
1153         return err;
1154 }
1155
1156 static struct inode_operations fuse_dir_inode_operations = {
1157         .lookup         = fuse_lookup,
1158         .mkdir          = fuse_mkdir,
1159         .symlink        = fuse_symlink,
1160         .unlink         = fuse_unlink,
1161         .rmdir          = fuse_rmdir,
1162         .rename         = fuse_rename,
1163         .link           = fuse_link,
1164         .setattr        = fuse_setattr,
1165         .create         = fuse_create,
1166         .mknod          = fuse_mknod,
1167         .permission     = fuse_permission,
1168         .getattr        = fuse_getattr,
1169         .setxattr       = fuse_setxattr,
1170         .getxattr       = fuse_getxattr,
1171         .listxattr      = fuse_listxattr,
1172         .removexattr    = fuse_removexattr,
1173 };
1174
1175 static const struct file_operations fuse_dir_operations = {
1176         .llseek         = generic_file_llseek,
1177         .read           = generic_read_dir,
1178         .readdir        = fuse_readdir,
1179         .open           = fuse_dir_open,
1180         .release        = fuse_dir_release,
1181         .fsync          = fuse_dir_fsync,
1182 };
1183
1184 static struct inode_operations fuse_common_inode_operations = {
1185         .setattr        = fuse_setattr,
1186         .permission     = fuse_permission,
1187         .getattr        = fuse_getattr,
1188         .setxattr       = fuse_setxattr,
1189         .getxattr       = fuse_getxattr,
1190         .listxattr      = fuse_listxattr,
1191         .removexattr    = fuse_removexattr,
1192 };
1193
1194 static struct inode_operations fuse_symlink_inode_operations = {
1195         .setattr        = fuse_setattr,
1196         .follow_link    = fuse_follow_link,
1197         .put_link       = fuse_put_link,
1198         .readlink       = generic_readlink,
1199         .getattr        = fuse_getattr,
1200         .setxattr       = fuse_setxattr,
1201         .getxattr       = fuse_getxattr,
1202         .listxattr      = fuse_listxattr,
1203         .removexattr    = fuse_removexattr,
1204 };
1205
1206 void fuse_init_common(struct inode *inode)
1207 {
1208         inode->i_op = &fuse_common_inode_operations;
1209 }
1210
1211 void fuse_init_dir(struct inode *inode)
1212 {
1213         inode->i_op = &fuse_dir_inode_operations;
1214         inode->i_fop = &fuse_dir_operations;
1215 }
1216
1217 void fuse_init_symlink(struct inode *inode)
1218 {
1219         inode->i_op = &fuse_symlink_inode_operations;
1220 }