fuse: add list of writable files to fuse_inode
[safe/jmp/linux-2.6] / fs / fuse / inode.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/slab.h>
13 #include <linux/file.h>
14 #include <linux/seq_file.h>
15 #include <linux/init.h>
16 #include <linux/module.h>
17 #include <linux/parser.h>
18 #include <linux/statfs.h>
19 #include <linux/random.h>
20 #include <linux/sched.h>
21
22 MODULE_AUTHOR("Miklos Szeredi <miklos@szeredi.hu>");
23 MODULE_DESCRIPTION("Filesystem in Userspace");
24 MODULE_LICENSE("GPL");
25
26 static struct kmem_cache *fuse_inode_cachep;
27 struct list_head fuse_conn_list;
28 DEFINE_MUTEX(fuse_mutex);
29
30 #define FUSE_SUPER_MAGIC 0x65735546
31
32 struct fuse_mount_data {
33         int fd;
34         unsigned rootmode;
35         unsigned user_id;
36         unsigned group_id;
37         unsigned fd_present : 1;
38         unsigned rootmode_present : 1;
39         unsigned user_id_present : 1;
40         unsigned group_id_present : 1;
41         unsigned flags;
42         unsigned max_read;
43         unsigned blksize;
44 };
45
46 static struct inode *fuse_alloc_inode(struct super_block *sb)
47 {
48         struct inode *inode;
49         struct fuse_inode *fi;
50
51         inode = kmem_cache_alloc(fuse_inode_cachep, GFP_KERNEL);
52         if (!inode)
53                 return NULL;
54
55         fi = get_fuse_inode(inode);
56         fi->i_time = 0;
57         fi->nodeid = 0;
58         fi->nlookup = 0;
59         INIT_LIST_HEAD(&fi->write_files);
60         fi->forget_req = fuse_request_alloc();
61         if (!fi->forget_req) {
62                 kmem_cache_free(fuse_inode_cachep, inode);
63                 return NULL;
64         }
65
66         return inode;
67 }
68
69 static void fuse_destroy_inode(struct inode *inode)
70 {
71         struct fuse_inode *fi = get_fuse_inode(inode);
72         BUG_ON(!list_empty(&fi->write_files));
73         if (fi->forget_req)
74                 fuse_request_free(fi->forget_req);
75         kmem_cache_free(fuse_inode_cachep, inode);
76 }
77
78 static void fuse_read_inode(struct inode *inode)
79 {
80         /* No op */
81 }
82
83 void fuse_send_forget(struct fuse_conn *fc, struct fuse_req *req,
84                       unsigned long nodeid, u64 nlookup)
85 {
86         struct fuse_forget_in *inarg = &req->misc.forget_in;
87         inarg->nlookup = nlookup;
88         req->in.h.opcode = FUSE_FORGET;
89         req->in.h.nodeid = nodeid;
90         req->in.numargs = 1;
91         req->in.args[0].size = sizeof(struct fuse_forget_in);
92         req->in.args[0].value = inarg;
93         request_send_noreply(fc, req);
94 }
95
96 static void fuse_clear_inode(struct inode *inode)
97 {
98         if (inode->i_sb->s_flags & MS_ACTIVE) {
99                 struct fuse_conn *fc = get_fuse_conn(inode);
100                 struct fuse_inode *fi = get_fuse_inode(inode);
101                 fuse_send_forget(fc, fi->forget_req, fi->nodeid, fi->nlookup);
102                 fi->forget_req = NULL;
103         }
104 }
105
106 static int fuse_remount_fs(struct super_block *sb, int *flags, char *data)
107 {
108         if (*flags & MS_MANDLOCK)
109                 return -EINVAL;
110
111         return 0;
112 }
113
114 static void fuse_truncate(struct address_space *mapping, loff_t offset)
115 {
116         /* See vmtruncate() */
117         unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1);
118         truncate_inode_pages(mapping, offset);
119         unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1);
120 }
121
122
123 void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
124                             u64 attr_valid, u64 attr_version)
125 {
126         struct fuse_conn *fc = get_fuse_conn(inode);
127         struct fuse_inode *fi = get_fuse_inode(inode);
128         loff_t oldsize;
129
130         spin_lock(&fc->lock);
131         if (attr_version != 0 && fi->attr_version > attr_version) {
132                 spin_unlock(&fc->lock);
133                 return;
134         }
135         fi->attr_version = ++fc->attr_version;
136         fi->i_time = attr_valid;
137
138         inode->i_ino     = attr->ino;
139         inode->i_mode    = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
140         inode->i_nlink   = attr->nlink;
141         inode->i_uid     = attr->uid;
142         inode->i_gid     = attr->gid;
143         inode->i_blocks  = attr->blocks;
144         inode->i_atime.tv_sec   = attr->atime;
145         inode->i_atime.tv_nsec  = attr->atimensec;
146         inode->i_mtime.tv_sec   = attr->mtime;
147         inode->i_mtime.tv_nsec  = attr->mtimensec;
148         inode->i_ctime.tv_sec   = attr->ctime;
149         inode->i_ctime.tv_nsec  = attr->ctimensec;
150
151         /*
152          * Don't set the sticky bit in i_mode, unless we want the VFS
153          * to check permissions.  This prevents failures due to the
154          * check in may_delete().
155          */
156         fi->orig_i_mode = inode->i_mode;
157         if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
158                 inode->i_mode &= ~S_ISVTX;
159
160         oldsize = inode->i_size;
161         i_size_write(inode, attr->size);
162         spin_unlock(&fc->lock);
163
164         if (S_ISREG(inode->i_mode) && oldsize != attr->size) {
165                 if (attr->size < oldsize)
166                         fuse_truncate(inode->i_mapping, attr->size);
167                 invalidate_inode_pages2(inode->i_mapping);
168         }
169 }
170
171 static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr)
172 {
173         inode->i_mode = attr->mode & S_IFMT;
174         inode->i_size = attr->size;
175         if (S_ISREG(inode->i_mode)) {
176                 fuse_init_common(inode);
177                 fuse_init_file_inode(inode);
178         } else if (S_ISDIR(inode->i_mode))
179                 fuse_init_dir(inode);
180         else if (S_ISLNK(inode->i_mode))
181                 fuse_init_symlink(inode);
182         else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
183                  S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
184                 fuse_init_common(inode);
185                 init_special_inode(inode, inode->i_mode,
186                                    new_decode_dev(attr->rdev));
187         } else
188                 BUG();
189 }
190
191 static int fuse_inode_eq(struct inode *inode, void *_nodeidp)
192 {
193         unsigned long nodeid = *(unsigned long *) _nodeidp;
194         if (get_node_id(inode) == nodeid)
195                 return 1;
196         else
197                 return 0;
198 }
199
200 static int fuse_inode_set(struct inode *inode, void *_nodeidp)
201 {
202         unsigned long nodeid = *(unsigned long *) _nodeidp;
203         get_fuse_inode(inode)->nodeid = nodeid;
204         return 0;
205 }
206
207 struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid,
208                         int generation, struct fuse_attr *attr,
209                         u64 attr_valid, u64 attr_version)
210 {
211         struct inode *inode;
212         struct fuse_inode *fi;
213         struct fuse_conn *fc = get_fuse_conn_super(sb);
214
215  retry:
216         inode = iget5_locked(sb, nodeid, fuse_inode_eq, fuse_inode_set, &nodeid);
217         if (!inode)
218                 return NULL;
219
220         if ((inode->i_state & I_NEW)) {
221                 inode->i_flags |= S_NOATIME|S_NOCMTIME;
222                 inode->i_generation = generation;
223                 inode->i_data.backing_dev_info = &fc->bdi;
224                 fuse_init_inode(inode, attr);
225                 unlock_new_inode(inode);
226         } else if ((inode->i_mode ^ attr->mode) & S_IFMT) {
227                 /* Inode has changed type, any I/O on the old should fail */
228                 make_bad_inode(inode);
229                 iput(inode);
230                 goto retry;
231         }
232
233         fi = get_fuse_inode(inode);
234         spin_lock(&fc->lock);
235         fi->nlookup ++;
236         spin_unlock(&fc->lock);
237         fuse_change_attributes(inode, attr, attr_valid, attr_version);
238
239         return inode;
240 }
241
242 static void fuse_umount_begin(struct vfsmount *vfsmnt, int flags)
243 {
244         if (flags & MNT_FORCE)
245                 fuse_abort_conn(get_fuse_conn_super(vfsmnt->mnt_sb));
246 }
247
248 static void fuse_send_destroy(struct fuse_conn *fc)
249 {
250         struct fuse_req *req = fc->destroy_req;
251         if (req && fc->conn_init) {
252                 fc->destroy_req = NULL;
253                 req->in.h.opcode = FUSE_DESTROY;
254                 req->force = 1;
255                 request_send(fc, req);
256                 fuse_put_request(fc, req);
257         }
258 }
259
260 static void fuse_put_super(struct super_block *sb)
261 {
262         struct fuse_conn *fc = get_fuse_conn_super(sb);
263
264         fuse_send_destroy(fc);
265         spin_lock(&fc->lock);
266         fc->connected = 0;
267         fc->blocked = 0;
268         spin_unlock(&fc->lock);
269         /* Flush all readers on this fs */
270         kill_fasync(&fc->fasync, SIGIO, POLL_IN);
271         wake_up_all(&fc->waitq);
272         wake_up_all(&fc->blocked_waitq);
273         wake_up_all(&fc->reserved_req_waitq);
274         mutex_lock(&fuse_mutex);
275         list_del(&fc->entry);
276         fuse_ctl_remove_conn(fc);
277         mutex_unlock(&fuse_mutex);
278         fuse_conn_put(fc);
279 }
280
281 static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr)
282 {
283         stbuf->f_type    = FUSE_SUPER_MAGIC;
284         stbuf->f_bsize   = attr->bsize;
285         stbuf->f_frsize  = attr->frsize;
286         stbuf->f_blocks  = attr->blocks;
287         stbuf->f_bfree   = attr->bfree;
288         stbuf->f_bavail  = attr->bavail;
289         stbuf->f_files   = attr->files;
290         stbuf->f_ffree   = attr->ffree;
291         stbuf->f_namelen = attr->namelen;
292         /* fsid is left zero */
293 }
294
295 static int fuse_statfs(struct dentry *dentry, struct kstatfs *buf)
296 {
297         struct super_block *sb = dentry->d_sb;
298         struct fuse_conn *fc = get_fuse_conn_super(sb);
299         struct fuse_req *req;
300         struct fuse_statfs_out outarg;
301         int err;
302
303         if (!fuse_allow_task(fc, current)) {
304                 buf->f_type = FUSE_SUPER_MAGIC;
305                 return 0;
306         }
307
308         req = fuse_get_req(fc);
309         if (IS_ERR(req))
310                 return PTR_ERR(req);
311
312         memset(&outarg, 0, sizeof(outarg));
313         req->in.numargs = 0;
314         req->in.h.opcode = FUSE_STATFS;
315         req->in.h.nodeid = get_node_id(dentry->d_inode);
316         req->out.numargs = 1;
317         req->out.args[0].size =
318                 fc->minor < 4 ? FUSE_COMPAT_STATFS_SIZE : sizeof(outarg);
319         req->out.args[0].value = &outarg;
320         request_send(fc, req);
321         err = req->out.h.error;
322         if (!err)
323                 convert_fuse_statfs(buf, &outarg.st);
324         fuse_put_request(fc, req);
325         return err;
326 }
327
328 enum {
329         OPT_FD,
330         OPT_ROOTMODE,
331         OPT_USER_ID,
332         OPT_GROUP_ID,
333         OPT_DEFAULT_PERMISSIONS,
334         OPT_ALLOW_OTHER,
335         OPT_MAX_READ,
336         OPT_BLKSIZE,
337         OPT_ERR
338 };
339
340 static match_table_t tokens = {
341         {OPT_FD,                        "fd=%u"},
342         {OPT_ROOTMODE,                  "rootmode=%o"},
343         {OPT_USER_ID,                   "user_id=%u"},
344         {OPT_GROUP_ID,                  "group_id=%u"},
345         {OPT_DEFAULT_PERMISSIONS,       "default_permissions"},
346         {OPT_ALLOW_OTHER,               "allow_other"},
347         {OPT_MAX_READ,                  "max_read=%u"},
348         {OPT_BLKSIZE,                   "blksize=%u"},
349         {OPT_ERR,                       NULL}
350 };
351
352 static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev)
353 {
354         char *p;
355         memset(d, 0, sizeof(struct fuse_mount_data));
356         d->max_read = ~0;
357         d->blksize = 512;
358
359         while ((p = strsep(&opt, ",")) != NULL) {
360                 int token;
361                 int value;
362                 substring_t args[MAX_OPT_ARGS];
363                 if (!*p)
364                         continue;
365
366                 token = match_token(p, tokens, args);
367                 switch (token) {
368                 case OPT_FD:
369                         if (match_int(&args[0], &value))
370                                 return 0;
371                         d->fd = value;
372                         d->fd_present = 1;
373                         break;
374
375                 case OPT_ROOTMODE:
376                         if (match_octal(&args[0], &value))
377                                 return 0;
378                         if (!fuse_valid_type(value))
379                                 return 0;
380                         d->rootmode = value;
381                         d->rootmode_present = 1;
382                         break;
383
384                 case OPT_USER_ID:
385                         if (match_int(&args[0], &value))
386                                 return 0;
387                         d->user_id = value;
388                         d->user_id_present = 1;
389                         break;
390
391                 case OPT_GROUP_ID:
392                         if (match_int(&args[0], &value))
393                                 return 0;
394                         d->group_id = value;
395                         d->group_id_present = 1;
396                         break;
397
398                 case OPT_DEFAULT_PERMISSIONS:
399                         d->flags |= FUSE_DEFAULT_PERMISSIONS;
400                         break;
401
402                 case OPT_ALLOW_OTHER:
403                         d->flags |= FUSE_ALLOW_OTHER;
404                         break;
405
406                 case OPT_MAX_READ:
407                         if (match_int(&args[0], &value))
408                                 return 0;
409                         d->max_read = value;
410                         break;
411
412                 case OPT_BLKSIZE:
413                         if (!is_bdev || match_int(&args[0], &value))
414                                 return 0;
415                         d->blksize = value;
416                         break;
417
418                 default:
419                         return 0;
420                 }
421         }
422
423         if (!d->fd_present || !d->rootmode_present ||
424             !d->user_id_present || !d->group_id_present)
425                 return 0;
426
427         return 1;
428 }
429
430 static int fuse_show_options(struct seq_file *m, struct vfsmount *mnt)
431 {
432         struct fuse_conn *fc = get_fuse_conn_super(mnt->mnt_sb);
433
434         seq_printf(m, ",user_id=%u", fc->user_id);
435         seq_printf(m, ",group_id=%u", fc->group_id);
436         if (fc->flags & FUSE_DEFAULT_PERMISSIONS)
437                 seq_puts(m, ",default_permissions");
438         if (fc->flags & FUSE_ALLOW_OTHER)
439                 seq_puts(m, ",allow_other");
440         if (fc->max_read != ~0)
441                 seq_printf(m, ",max_read=%u", fc->max_read);
442         return 0;
443 }
444
445 static struct fuse_conn *new_conn(void)
446 {
447         struct fuse_conn *fc;
448         int err;
449
450         fc = kzalloc(sizeof(*fc), GFP_KERNEL);
451         if (fc) {
452                 spin_lock_init(&fc->lock);
453                 mutex_init(&fc->inst_mutex);
454                 atomic_set(&fc->count, 1);
455                 init_waitqueue_head(&fc->waitq);
456                 init_waitqueue_head(&fc->blocked_waitq);
457                 init_waitqueue_head(&fc->reserved_req_waitq);
458                 INIT_LIST_HEAD(&fc->pending);
459                 INIT_LIST_HEAD(&fc->processing);
460                 INIT_LIST_HEAD(&fc->io);
461                 INIT_LIST_HEAD(&fc->interrupts);
462                 atomic_set(&fc->num_waiting, 0);
463                 fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;
464                 fc->bdi.unplug_io_fn = default_unplug_io_fn;
465                 err = bdi_init(&fc->bdi);
466                 if (err) {
467                         kfree(fc);
468                         fc = NULL;
469                         goto out;
470                 }
471                 fc->reqctr = 0;
472                 fc->blocked = 1;
473                 fc->attr_version = 1;
474                 get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key));
475         }
476 out:
477         return fc;
478 }
479
480 void fuse_conn_put(struct fuse_conn *fc)
481 {
482         if (atomic_dec_and_test(&fc->count)) {
483                 if (fc->destroy_req)
484                         fuse_request_free(fc->destroy_req);
485                 mutex_destroy(&fc->inst_mutex);
486                 bdi_destroy(&fc->bdi);
487                 kfree(fc);
488         }
489 }
490
491 struct fuse_conn *fuse_conn_get(struct fuse_conn *fc)
492 {
493         atomic_inc(&fc->count);
494         return fc;
495 }
496
497 static struct inode *get_root_inode(struct super_block *sb, unsigned mode)
498 {
499         struct fuse_attr attr;
500         memset(&attr, 0, sizeof(attr));
501
502         attr.mode = mode;
503         attr.ino = FUSE_ROOT_ID;
504         attr.nlink = 1;
505         return fuse_iget(sb, 1, 0, &attr, 0, 0);
506 }
507
508 static const struct super_operations fuse_super_operations = {
509         .alloc_inode    = fuse_alloc_inode,
510         .destroy_inode  = fuse_destroy_inode,
511         .read_inode     = fuse_read_inode,
512         .clear_inode    = fuse_clear_inode,
513         .drop_inode     = generic_delete_inode,
514         .remount_fs     = fuse_remount_fs,
515         .put_super      = fuse_put_super,
516         .umount_begin   = fuse_umount_begin,
517         .statfs         = fuse_statfs,
518         .show_options   = fuse_show_options,
519 };
520
521 static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
522 {
523         struct fuse_init_out *arg = &req->misc.init_out;
524
525         if (req->out.h.error || arg->major != FUSE_KERNEL_VERSION)
526                 fc->conn_error = 1;
527         else {
528                 unsigned long ra_pages;
529
530                 if (arg->minor >= 6) {
531                         ra_pages = arg->max_readahead / PAGE_CACHE_SIZE;
532                         if (arg->flags & FUSE_ASYNC_READ)
533                                 fc->async_read = 1;
534                         if (!(arg->flags & FUSE_POSIX_LOCKS))
535                                 fc->no_lock = 1;
536                         if (arg->flags & FUSE_ATOMIC_O_TRUNC)
537                                 fc->atomic_o_trunc = 1;
538                 } else {
539                         ra_pages = fc->max_read / PAGE_CACHE_SIZE;
540                         fc->no_lock = 1;
541                 }
542
543                 fc->bdi.ra_pages = min(fc->bdi.ra_pages, ra_pages);
544                 fc->minor = arg->minor;
545                 fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
546                 fc->conn_init = 1;
547         }
548         fuse_put_request(fc, req);
549         fc->blocked = 0;
550         wake_up_all(&fc->blocked_waitq);
551 }
552
553 static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req)
554 {
555         struct fuse_init_in *arg = &req->misc.init_in;
556
557         arg->major = FUSE_KERNEL_VERSION;
558         arg->minor = FUSE_KERNEL_MINOR_VERSION;
559         arg->max_readahead = fc->bdi.ra_pages * PAGE_CACHE_SIZE;
560         arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_FILE_OPS |
561                 FUSE_ATOMIC_O_TRUNC;
562         req->in.h.opcode = FUSE_INIT;
563         req->in.numargs = 1;
564         req->in.args[0].size = sizeof(*arg);
565         req->in.args[0].value = arg;
566         req->out.numargs = 1;
567         /* Variable length arguement used for backward compatibility
568            with interface version < 7.5.  Rest of init_out is zeroed
569            by do_get_request(), so a short reply is not a problem */
570         req->out.argvar = 1;
571         req->out.args[0].size = sizeof(struct fuse_init_out);
572         req->out.args[0].value = &req->misc.init_out;
573         req->end = process_init_reply;
574         request_send_background(fc, req);
575 }
576
577 static u64 conn_id(void)
578 {
579         static u64 ctr = 1;
580         return ctr++;
581 }
582
583 static int fuse_fill_super(struct super_block *sb, void *data, int silent)
584 {
585         struct fuse_conn *fc;
586         struct inode *root;
587         struct fuse_mount_data d;
588         struct file *file;
589         struct dentry *root_dentry;
590         struct fuse_req *init_req;
591         int err;
592         int is_bdev = sb->s_bdev != NULL;
593
594         if (sb->s_flags & MS_MANDLOCK)
595                 return -EINVAL;
596
597         if (!parse_fuse_opt((char *) data, &d, is_bdev))
598                 return -EINVAL;
599
600         if (is_bdev) {
601 #ifdef CONFIG_BLOCK
602                 if (!sb_set_blocksize(sb, d.blksize))
603                         return -EINVAL;
604 #endif
605         } else {
606                 sb->s_blocksize = PAGE_CACHE_SIZE;
607                 sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
608         }
609         sb->s_magic = FUSE_SUPER_MAGIC;
610         sb->s_op = &fuse_super_operations;
611         sb->s_maxbytes = MAX_LFS_FILESIZE;
612
613         file = fget(d.fd);
614         if (!file)
615                 return -EINVAL;
616
617         if (file->f_op != &fuse_dev_operations)
618                 return -EINVAL;
619
620         fc = new_conn();
621         if (!fc)
622                 return -ENOMEM;
623
624         fc->flags = d.flags;
625         fc->user_id = d.user_id;
626         fc->group_id = d.group_id;
627         fc->max_read = d.max_read;
628
629         /* Used by get_root_inode() */
630         sb->s_fs_info = fc;
631
632         err = -ENOMEM;
633         root = get_root_inode(sb, d.rootmode);
634         if (!root)
635                 goto err;
636
637         root_dentry = d_alloc_root(root);
638         if (!root_dentry) {
639                 iput(root);
640                 goto err;
641         }
642
643         init_req = fuse_request_alloc();
644         if (!init_req)
645                 goto err_put_root;
646
647         if (is_bdev) {
648                 fc->destroy_req = fuse_request_alloc();
649                 if (!fc->destroy_req)
650                         goto err_put_root;
651         }
652
653         mutex_lock(&fuse_mutex);
654         err = -EINVAL;
655         if (file->private_data)
656                 goto err_unlock;
657
658         fc->id = conn_id();
659         err = fuse_ctl_add_conn(fc);
660         if (err)
661                 goto err_unlock;
662
663         list_add_tail(&fc->entry, &fuse_conn_list);
664         sb->s_root = root_dentry;
665         fc->connected = 1;
666         file->private_data = fuse_conn_get(fc);
667         mutex_unlock(&fuse_mutex);
668         /*
669          * atomic_dec_and_test() in fput() provides the necessary
670          * memory barrier for file->private_data to be visible on all
671          * CPUs after this
672          */
673         fput(file);
674
675         fuse_send_init(fc, init_req);
676
677         return 0;
678
679  err_unlock:
680         mutex_unlock(&fuse_mutex);
681         fuse_request_free(init_req);
682  err_put_root:
683         dput(root_dentry);
684  err:
685         fput(file);
686         fuse_conn_put(fc);
687         return err;
688 }
689
690 static int fuse_get_sb(struct file_system_type *fs_type,
691                        int flags, const char *dev_name,
692                        void *raw_data, struct vfsmount *mnt)
693 {
694         return get_sb_nodev(fs_type, flags, raw_data, fuse_fill_super, mnt);
695 }
696
697 static struct file_system_type fuse_fs_type = {
698         .owner          = THIS_MODULE,
699         .name           = "fuse",
700         .fs_flags       = FS_HAS_SUBTYPE,
701         .get_sb         = fuse_get_sb,
702         .kill_sb        = kill_anon_super,
703 };
704
705 #ifdef CONFIG_BLOCK
706 static int fuse_get_sb_blk(struct file_system_type *fs_type,
707                            int flags, const char *dev_name,
708                            void *raw_data, struct vfsmount *mnt)
709 {
710         return get_sb_bdev(fs_type, flags, dev_name, raw_data, fuse_fill_super,
711                            mnt);
712 }
713
714 static struct file_system_type fuseblk_fs_type = {
715         .owner          = THIS_MODULE,
716         .name           = "fuseblk",
717         .get_sb         = fuse_get_sb_blk,
718         .kill_sb        = kill_block_super,
719         .fs_flags       = FS_REQUIRES_DEV | FS_HAS_SUBTYPE,
720 };
721
722 static inline int register_fuseblk(void)
723 {
724         return register_filesystem(&fuseblk_fs_type);
725 }
726
727 static inline void unregister_fuseblk(void)
728 {
729         unregister_filesystem(&fuseblk_fs_type);
730 }
731 #else
732 static inline int register_fuseblk(void)
733 {
734         return 0;
735 }
736
737 static inline void unregister_fuseblk(void)
738 {
739 }
740 #endif
741
742 static decl_subsys(fuse, NULL, NULL);
743 static decl_subsys(connections, NULL, NULL);
744
745 static void fuse_inode_init_once(struct kmem_cache *cachep, void *foo)
746 {
747         struct inode * inode = foo;
748
749         inode_init_once(inode);
750 }
751
752 static int __init fuse_fs_init(void)
753 {
754         int err;
755
756         err = register_filesystem(&fuse_fs_type);
757         if (err)
758                 goto out;
759
760         err = register_fuseblk();
761         if (err)
762                 goto out_unreg;
763
764         fuse_inode_cachep = kmem_cache_create("fuse_inode",
765                                               sizeof(struct fuse_inode),
766                                               0, SLAB_HWCACHE_ALIGN,
767                                               fuse_inode_init_once);
768         err = -ENOMEM;
769         if (!fuse_inode_cachep)
770                 goto out_unreg2;
771
772         return 0;
773
774  out_unreg2:
775         unregister_fuseblk();
776  out_unreg:
777         unregister_filesystem(&fuse_fs_type);
778  out:
779         return err;
780 }
781
782 static void fuse_fs_cleanup(void)
783 {
784         unregister_filesystem(&fuse_fs_type);
785         unregister_fuseblk();
786         kmem_cache_destroy(fuse_inode_cachep);
787 }
788
789 static int fuse_sysfs_init(void)
790 {
791         int err;
792
793         kobj_set_kset_s(&fuse_subsys, fs_subsys);
794         err = subsystem_register(&fuse_subsys);
795         if (err)
796                 goto out_err;
797
798         kobj_set_kset_s(&connections_subsys, fuse_subsys);
799         err = subsystem_register(&connections_subsys);
800         if (err)
801                 goto out_fuse_unregister;
802
803         return 0;
804
805  out_fuse_unregister:
806         subsystem_unregister(&fuse_subsys);
807  out_err:
808         return err;
809 }
810
811 static void fuse_sysfs_cleanup(void)
812 {
813         subsystem_unregister(&connections_subsys);
814         subsystem_unregister(&fuse_subsys);
815 }
816
817 static int __init fuse_init(void)
818 {
819         int res;
820
821         printk("fuse init (API version %i.%i)\n",
822                FUSE_KERNEL_VERSION, FUSE_KERNEL_MINOR_VERSION);
823
824         INIT_LIST_HEAD(&fuse_conn_list);
825         res = fuse_fs_init();
826         if (res)
827                 goto err;
828
829         res = fuse_dev_init();
830         if (res)
831                 goto err_fs_cleanup;
832
833         res = fuse_sysfs_init();
834         if (res)
835                 goto err_dev_cleanup;
836
837         res = fuse_ctl_init();
838         if (res)
839                 goto err_sysfs_cleanup;
840
841         return 0;
842
843  err_sysfs_cleanup:
844         fuse_sysfs_cleanup();
845  err_dev_cleanup:
846         fuse_dev_cleanup();
847  err_fs_cleanup:
848         fuse_fs_cleanup();
849  err:
850         return res;
851 }
852
853 static void __exit fuse_exit(void)
854 {
855         printk(KERN_DEBUG "fuse exit\n");
856
857         fuse_ctl_cleanup();
858         fuse_sysfs_cleanup();
859         fuse_fs_cleanup();
860         fuse_dev_cleanup();
861 }
862
863 module_init(fuse_init);
864 module_exit(fuse_exit);