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