diff options
-rw-r--r-- | Documentation/filesystems/fuse.txt | 16 | ||||
-rw-r--r-- | fs/fuse/inode.c | 48 |
2 files changed, 53 insertions, 11 deletions
diff --git a/Documentation/filesystems/fuse.txt b/Documentation/filesystems/fuse.txt index 3d7447738958..fd17dce15a96 100644 --- a/Documentation/filesystems/fuse.txt +++ b/Documentation/filesystems/fuse.txt | |||
@@ -51,6 +51,22 @@ homepage: | |||
51 | 51 | ||
52 | http://fuse.sourceforge.net/ | 52 | http://fuse.sourceforge.net/ |
53 | 53 | ||
54 | Filesystem type | ||
55 | ~~~~~~~~~~~~~~~ | ||
56 | |||
57 | The filesystem type given to mount(2) can be one of the following: | ||
58 | |||
59 | 'fuse' | ||
60 | |||
61 | This is the usual way to mount a FUSE filesystem. The first | ||
62 | argument of the mount system call may contain an arbitrary string, | ||
63 | which is not interpreted by the kernel. | ||
64 | |||
65 | 'fuseblk' | ||
66 | |||
67 | The filesystem is block device based. The first argument of the | ||
68 | mount system call is interpreted as the name of the device. | ||
69 | |||
54 | Mount options | 70 | Mount options |
55 | ~~~~~~~~~~~~~ | 71 | ~~~~~~~~~~~~~ |
56 | 72 | ||
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 2bdc652b8b46..38cf97d6469c 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -591,6 +591,14 @@ static int fuse_get_sb(struct file_system_type *fs_type, | |||
591 | return get_sb_nodev(fs_type, flags, raw_data, fuse_fill_super, mnt); | 591 | return get_sb_nodev(fs_type, flags, raw_data, fuse_fill_super, mnt); |
592 | } | 592 | } |
593 | 593 | ||
594 | static int fuse_get_sb_blk(struct file_system_type *fs_type, | ||
595 | int flags, const char *dev_name, | ||
596 | void *raw_data, struct vfsmount *mnt) | ||
597 | { | ||
598 | return get_sb_bdev(fs_type, flags, dev_name, raw_data, fuse_fill_super, | ||
599 | mnt); | ||
600 | } | ||
601 | |||
594 | static struct file_system_type fuse_fs_type = { | 602 | static struct file_system_type fuse_fs_type = { |
595 | .owner = THIS_MODULE, | 603 | .owner = THIS_MODULE, |
596 | .name = "fuse", | 604 | .name = "fuse", |
@@ -598,6 +606,14 @@ static struct file_system_type fuse_fs_type = { | |||
598 | .kill_sb = kill_anon_super, | 606 | .kill_sb = kill_anon_super, |
599 | }; | 607 | }; |
600 | 608 | ||
609 | static struct file_system_type fuseblk_fs_type = { | ||
610 | .owner = THIS_MODULE, | ||
611 | .name = "fuseblk", | ||
612 | .get_sb = fuse_get_sb_blk, | ||
613 | .kill_sb = kill_block_super, | ||
614 | .fs_flags = FS_REQUIRES_DEV, | ||
615 | }; | ||
616 | |||
601 | static decl_subsys(fuse, NULL, NULL); | 617 | static decl_subsys(fuse, NULL, NULL); |
602 | static decl_subsys(connections, NULL, NULL); | 618 | static decl_subsys(connections, NULL, NULL); |
603 | 619 | ||
@@ -617,24 +633,34 @@ static int __init fuse_fs_init(void) | |||
617 | 633 | ||
618 | err = register_filesystem(&fuse_fs_type); | 634 | err = register_filesystem(&fuse_fs_type); |
619 | if (err) | 635 | if (err) |
620 | printk("fuse: failed to register filesystem\n"); | 636 | goto out; |
621 | else { | 637 | |
622 | fuse_inode_cachep = kmem_cache_create("fuse_inode", | 638 | err = register_filesystem(&fuseblk_fs_type); |
623 | sizeof(struct fuse_inode), | 639 | if (err) |
624 | 0, SLAB_HWCACHE_ALIGN, | 640 | goto out_unreg; |
625 | fuse_inode_init_once, NULL); | 641 | |
626 | if (!fuse_inode_cachep) { | 642 | fuse_inode_cachep = kmem_cache_create("fuse_inode", |
627 | unregister_filesystem(&fuse_fs_type); | 643 | sizeof(struct fuse_inode), |
628 | err = -ENOMEM; | 644 | 0, SLAB_HWCACHE_ALIGN, |
629 | } | 645 | fuse_inode_init_once, NULL); |
630 | } | 646 | err = -ENOMEM; |
647 | if (!fuse_inode_cachep) | ||
648 | goto out_unreg2; | ||
649 | |||
650 | return 0; | ||
631 | 651 | ||
652 | out_unreg2: | ||
653 | unregister_filesystem(&fuseblk_fs_type); | ||
654 | out_unreg: | ||
655 | unregister_filesystem(&fuse_fs_type); | ||
656 | out: | ||
632 | return err; | 657 | return err; |
633 | } | 658 | } |
634 | 659 | ||
635 | static void fuse_fs_cleanup(void) | 660 | static void fuse_fs_cleanup(void) |
636 | { | 661 | { |
637 | unregister_filesystem(&fuse_fs_type); | 662 | unregister_filesystem(&fuse_fs_type); |
663 | unregister_filesystem(&fuseblk_fs_type); | ||
638 | kmem_cache_destroy(fuse_inode_cachep); | 664 | kmem_cache_destroy(fuse_inode_cachep); |
639 | } | 665 | } |
640 | 666 | ||