diff options
Diffstat (limited to 'fs/fuse')
-rw-r--r-- | fs/fuse/inode.c | 48 |
1 files changed, 37 insertions, 11 deletions
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 | ||