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