diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2010-07-26 08:17:55 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-10-29 04:17:18 -0400 |
commit | a7f9fb205a88ab9af675a68fc554cf51dafc8b60 (patch) | |
tree | 0aaa2ad1b345f46fc96d3e00592f9d106a269836 /fs/ceph/super.c | |
parent | 8bcbbf0009dd467afd6bed1fedfcb1d2463f55a7 (diff) |
convert ceph
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ceph/super.c')
-rw-r--r-- | fs/ceph/super.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index d6e0e0421891..08b460ae0539 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c | |||
@@ -635,7 +635,7 @@ static struct dentry *open_root_dentry(struct ceph_fs_client *fsc, | |||
635 | /* | 635 | /* |
636 | * mount: join the ceph cluster, and open root directory. | 636 | * mount: join the ceph cluster, and open root directory. |
637 | */ | 637 | */ |
638 | static int ceph_mount(struct ceph_fs_client *fsc, struct vfsmount *mnt, | 638 | static struct dentry *ceph_real_mount(struct ceph_fs_client *fsc, |
639 | const char *path) | 639 | const char *path) |
640 | { | 640 | { |
641 | int err; | 641 | int err; |
@@ -678,16 +678,14 @@ static int ceph_mount(struct ceph_fs_client *fsc, struct vfsmount *mnt, | |||
678 | } | 678 | } |
679 | } | 679 | } |
680 | 680 | ||
681 | mnt->mnt_root = root; | ||
682 | mnt->mnt_sb = fsc->sb; | ||
683 | |||
684 | fsc->mount_state = CEPH_MOUNT_MOUNTED; | 681 | fsc->mount_state = CEPH_MOUNT_MOUNTED; |
685 | dout("mount success\n"); | 682 | dout("mount success\n"); |
686 | err = 0; | 683 | mutex_unlock(&fsc->client->mount_mutex); |
684 | return root; | ||
687 | 685 | ||
688 | out: | 686 | out: |
689 | mutex_unlock(&fsc->client->mount_mutex); | 687 | mutex_unlock(&fsc->client->mount_mutex); |
690 | return err; | 688 | return ERR_PTR(err); |
691 | 689 | ||
692 | fail: | 690 | fail: |
693 | if (first) { | 691 | if (first) { |
@@ -777,41 +775,45 @@ static int ceph_register_bdi(struct super_block *sb, | |||
777 | return err; | 775 | return err; |
778 | } | 776 | } |
779 | 777 | ||
780 | static int ceph_get_sb(struct file_system_type *fs_type, | 778 | static struct dentry *ceph_mount(struct file_system_type *fs_type, |
781 | int flags, const char *dev_name, void *data, | 779 | int flags, const char *dev_name, void *data) |
782 | struct vfsmount *mnt) | ||
783 | { | 780 | { |
784 | struct super_block *sb; | 781 | struct super_block *sb; |
785 | struct ceph_fs_client *fsc; | 782 | struct ceph_fs_client *fsc; |
783 | struct dentry *res; | ||
786 | int err; | 784 | int err; |
787 | int (*compare_super)(struct super_block *, void *) = ceph_compare_super; | 785 | int (*compare_super)(struct super_block *, void *) = ceph_compare_super; |
788 | const char *path = NULL; | 786 | const char *path = NULL; |
789 | struct ceph_mount_options *fsopt = NULL; | 787 | struct ceph_mount_options *fsopt = NULL; |
790 | struct ceph_options *opt = NULL; | 788 | struct ceph_options *opt = NULL; |
791 | 789 | ||
792 | dout("ceph_get_sb\n"); | 790 | dout("ceph_mount\n"); |
793 | err = parse_mount_options(&fsopt, &opt, flags, data, dev_name, &path); | 791 | err = parse_mount_options(&fsopt, &opt, flags, data, dev_name, &path); |
794 | if (err < 0) | 792 | if (err < 0) { |
793 | res = ERR_PTR(err); | ||
795 | goto out_final; | 794 | goto out_final; |
795 | } | ||
796 | 796 | ||
797 | /* create client (which we may/may not use) */ | 797 | /* create client (which we may/may not use) */ |
798 | fsc = create_fs_client(fsopt, opt); | 798 | fsc = create_fs_client(fsopt, opt); |
799 | if (IS_ERR(fsc)) { | 799 | if (IS_ERR(fsc)) { |
800 | err = PTR_ERR(fsc); | 800 | res = ERR_CAST(fsc); |
801 | kfree(fsopt); | 801 | kfree(fsopt); |
802 | kfree(opt); | 802 | kfree(opt); |
803 | goto out_final; | 803 | goto out_final; |
804 | } | 804 | } |
805 | 805 | ||
806 | err = ceph_mdsc_init(fsc); | 806 | err = ceph_mdsc_init(fsc); |
807 | if (err < 0) | 807 | if (err < 0) { |
808 | res = ERR_PTR(err); | ||
808 | goto out; | 809 | goto out; |
810 | } | ||
809 | 811 | ||
810 | if (ceph_test_opt(fsc->client, NOSHARE)) | 812 | if (ceph_test_opt(fsc->client, NOSHARE)) |
811 | compare_super = NULL; | 813 | compare_super = NULL; |
812 | sb = sget(fs_type, compare_super, ceph_set_super, fsc); | 814 | sb = sget(fs_type, compare_super, ceph_set_super, fsc); |
813 | if (IS_ERR(sb)) { | 815 | if (IS_ERR(sb)) { |
814 | err = PTR_ERR(sb); | 816 | res = ERR_CAST(sb); |
815 | goto out; | 817 | goto out; |
816 | } | 818 | } |
817 | 819 | ||
@@ -823,16 +825,18 @@ static int ceph_get_sb(struct file_system_type *fs_type, | |||
823 | } else { | 825 | } else { |
824 | dout("get_sb using new client %p\n", fsc); | 826 | dout("get_sb using new client %p\n", fsc); |
825 | err = ceph_register_bdi(sb, fsc); | 827 | err = ceph_register_bdi(sb, fsc); |
826 | if (err < 0) | 828 | if (err < 0) { |
829 | res = ERR_PTR(err); | ||
827 | goto out_splat; | 830 | goto out_splat; |
831 | } | ||
828 | } | 832 | } |
829 | 833 | ||
830 | err = ceph_mount(fsc, mnt, path); | 834 | res = ceph_real_mount(fsc, path); |
831 | if (err < 0) | 835 | if (IS_ERR(res)) |
832 | goto out_splat; | 836 | goto out_splat; |
833 | dout("root %p inode %p ino %llx.%llx\n", mnt->mnt_root, | 837 | dout("root %p inode %p ino %llx.%llx\n", res, |
834 | mnt->mnt_root->d_inode, ceph_vinop(mnt->mnt_root->d_inode)); | 838 | res->d_inode, ceph_vinop(res->d_inode)); |
835 | return 0; | 839 | return res; |
836 | 840 | ||
837 | out_splat: | 841 | out_splat: |
838 | ceph_mdsc_close_sessions(fsc->mdsc); | 842 | ceph_mdsc_close_sessions(fsc->mdsc); |
@@ -843,8 +847,8 @@ out: | |||
843 | ceph_mdsc_destroy(fsc); | 847 | ceph_mdsc_destroy(fsc); |
844 | destroy_fs_client(fsc); | 848 | destroy_fs_client(fsc); |
845 | out_final: | 849 | out_final: |
846 | dout("ceph_get_sb fail %d\n", err); | 850 | dout("ceph_mount fail %ld\n", PTR_ERR(res)); |
847 | return err; | 851 | return res; |
848 | } | 852 | } |
849 | 853 | ||
850 | static void ceph_kill_sb(struct super_block *s) | 854 | static void ceph_kill_sb(struct super_block *s) |
@@ -860,7 +864,7 @@ static void ceph_kill_sb(struct super_block *s) | |||
860 | static struct file_system_type ceph_fs_type = { | 864 | static struct file_system_type ceph_fs_type = { |
861 | .owner = THIS_MODULE, | 865 | .owner = THIS_MODULE, |
862 | .name = "ceph", | 866 | .name = "ceph", |
863 | .get_sb = ceph_get_sb, | 867 | .mount = ceph_mount, |
864 | .kill_sb = ceph_kill_sb, | 868 | .kill_sb = ceph_kill_sb, |
865 | .fs_flags = FS_RENAME_DOES_D_MOVE, | 869 | .fs_flags = FS_RENAME_DOES_D_MOVE, |
866 | }; | 870 | }; |