diff options
| -rw-r--r-- | fs/nfs/super.c | 96 |
1 files changed, 46 insertions, 50 deletions
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 3600ec700d58..0a42e8f4adcb 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
| @@ -260,8 +260,8 @@ static int nfs_statfs(struct dentry *, struct kstatfs *); | |||
| 260 | static int nfs_show_options(struct seq_file *, struct vfsmount *); | 260 | static int nfs_show_options(struct seq_file *, struct vfsmount *); |
| 261 | static int nfs_show_stats(struct seq_file *, struct vfsmount *); | 261 | static int nfs_show_stats(struct seq_file *, struct vfsmount *); |
| 262 | static int nfs_get_sb(struct file_system_type *, int, const char *, void *, struct vfsmount *); | 262 | static int nfs_get_sb(struct file_system_type *, int, const char *, void *, struct vfsmount *); |
| 263 | static int nfs_xdev_get_sb(struct file_system_type *fs_type, | 263 | static struct dentry *nfs_xdev_mount(struct file_system_type *fs_type, |
| 264 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); | 264 | int flags, const char *dev_name, void *raw_data); |
| 265 | static void nfs_put_super(struct super_block *); | 265 | static void nfs_put_super(struct super_block *); |
| 266 | static void nfs_kill_super(struct super_block *); | 266 | static void nfs_kill_super(struct super_block *); |
| 267 | static int nfs_remount(struct super_block *sb, int *flags, char *raw_data); | 267 | static int nfs_remount(struct super_block *sb, int *flags, char *raw_data); |
| @@ -277,7 +277,7 @@ static struct file_system_type nfs_fs_type = { | |||
| 277 | struct file_system_type nfs_xdev_fs_type = { | 277 | struct file_system_type nfs_xdev_fs_type = { |
| 278 | .owner = THIS_MODULE, | 278 | .owner = THIS_MODULE, |
| 279 | .name = "nfs", | 279 | .name = "nfs", |
| 280 | .get_sb = nfs_xdev_get_sb, | 280 | .mount = nfs_xdev_mount, |
| 281 | .kill_sb = nfs_kill_super, | 281 | .kill_sb = nfs_kill_super, |
| 282 | .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, | 282 | .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, |
| 283 | }; | 283 | }; |
| @@ -302,14 +302,14 @@ static int nfs4_try_mount(int flags, const char *dev_name, | |||
| 302 | struct nfs_parsed_mount_data *data, struct vfsmount *mnt); | 302 | struct nfs_parsed_mount_data *data, struct vfsmount *mnt); |
| 303 | static int nfs4_get_sb(struct file_system_type *fs_type, | 303 | static int nfs4_get_sb(struct file_system_type *fs_type, |
| 304 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); | 304 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); |
| 305 | static int nfs4_remote_get_sb(struct file_system_type *fs_type, | 305 | static struct dentry *nfs4_remote_mount(struct file_system_type *fs_type, |
| 306 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); | 306 | int flags, const char *dev_name, void *raw_data); |
| 307 | static int nfs4_xdev_get_sb(struct file_system_type *fs_type, | 307 | static struct dentry *nfs4_xdev_mount(struct file_system_type *fs_type, |
| 308 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); | 308 | int flags, const char *dev_name, void *raw_data); |
| 309 | static int nfs4_referral_get_sb(struct file_system_type *fs_type, | 309 | static int nfs4_referral_get_sb(struct file_system_type *fs_type, |
| 310 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); | 310 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); |
| 311 | static int nfs4_remote_referral_get_sb(struct file_system_type *fs_type, | 311 | static struct dentry *nfs4_remote_referral_mount(struct file_system_type *fs_type, |
| 312 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); | 312 | int flags, const char *dev_name, void *raw_data); |
| 313 | static void nfs4_kill_super(struct super_block *sb); | 313 | static void nfs4_kill_super(struct super_block *sb); |
| 314 | 314 | ||
| 315 | static struct file_system_type nfs4_fs_type = { | 315 | static struct file_system_type nfs4_fs_type = { |
| @@ -323,7 +323,7 @@ static struct file_system_type nfs4_fs_type = { | |||
| 323 | static struct file_system_type nfs4_remote_fs_type = { | 323 | static struct file_system_type nfs4_remote_fs_type = { |
| 324 | .owner = THIS_MODULE, | 324 | .owner = THIS_MODULE, |
| 325 | .name = "nfs4", | 325 | .name = "nfs4", |
| 326 | .get_sb = nfs4_remote_get_sb, | 326 | .mount = nfs4_remote_mount, |
| 327 | .kill_sb = nfs4_kill_super, | 327 | .kill_sb = nfs4_kill_super, |
| 328 | .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, | 328 | .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, |
| 329 | }; | 329 | }; |
| @@ -331,7 +331,7 @@ static struct file_system_type nfs4_remote_fs_type = { | |||
| 331 | struct file_system_type nfs4_xdev_fs_type = { | 331 | struct file_system_type nfs4_xdev_fs_type = { |
| 332 | .owner = THIS_MODULE, | 332 | .owner = THIS_MODULE, |
| 333 | .name = "nfs4", | 333 | .name = "nfs4", |
| 334 | .get_sb = nfs4_xdev_get_sb, | 334 | .mount = nfs4_xdev_mount, |
| 335 | .kill_sb = nfs4_kill_super, | 335 | .kill_sb = nfs4_kill_super, |
| 336 | .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, | 336 | .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, |
| 337 | }; | 337 | }; |
| @@ -339,7 +339,7 @@ struct file_system_type nfs4_xdev_fs_type = { | |||
| 339 | static struct file_system_type nfs4_remote_referral_fs_type = { | 339 | static struct file_system_type nfs4_remote_referral_fs_type = { |
| 340 | .owner = THIS_MODULE, | 340 | .owner = THIS_MODULE, |
| 341 | .name = "nfs4", | 341 | .name = "nfs4", |
| 342 | .get_sb = nfs4_remote_referral_get_sb, | 342 | .mount = nfs4_remote_referral_mount, |
| 343 | .kill_sb = nfs4_kill_super, | 343 | .kill_sb = nfs4_kill_super, |
| 344 | .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, | 344 | .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, |
| 345 | }; | 345 | }; |
| @@ -2397,9 +2397,9 @@ static void nfs_kill_super(struct super_block *s) | |||
| 2397 | /* | 2397 | /* |
| 2398 | * Clone an NFS2/3 server record on xdev traversal (FSID-change) | 2398 | * Clone an NFS2/3 server record on xdev traversal (FSID-change) |
| 2399 | */ | 2399 | */ |
| 2400 | static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, | 2400 | static struct dentry * |
| 2401 | const char *dev_name, void *raw_data, | 2401 | nfs_xdev_mount(struct file_system_type *fs_type, int flags, |
| 2402 | struct vfsmount *mnt) | 2402 | const char *dev_name, void *raw_data) |
| 2403 | { | 2403 | { |
| 2404 | struct nfs_clone_mount *data = raw_data; | 2404 | struct nfs_clone_mount *data = raw_data; |
| 2405 | struct super_block *s; | 2405 | struct super_block *s; |
| @@ -2411,7 +2411,7 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
| 2411 | }; | 2411 | }; |
| 2412 | int error; | 2412 | int error; |
| 2413 | 2413 | ||
| 2414 | dprintk("--> nfs_xdev_get_sb()\n"); | 2414 | dprintk("--> nfs_xdev_mount()\n"); |
| 2415 | 2415 | ||
| 2416 | /* create a new volume representation */ | 2416 | /* create a new volume representation */ |
| 2417 | server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr); | 2417 | server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr); |
| @@ -2458,28 +2458,26 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
| 2458 | } | 2458 | } |
| 2459 | 2459 | ||
| 2460 | s->s_flags |= MS_ACTIVE; | 2460 | s->s_flags |= MS_ACTIVE; |
| 2461 | mnt->mnt_sb = s; | ||
| 2462 | mnt->mnt_root = mntroot; | ||
| 2463 | 2461 | ||
| 2464 | /* clone any lsm security options from the parent to the new sb */ | 2462 | /* clone any lsm security options from the parent to the new sb */ |
| 2465 | security_sb_clone_mnt_opts(data->sb, s); | 2463 | security_sb_clone_mnt_opts(data->sb, s); |
| 2466 | 2464 | ||
| 2467 | dprintk("<-- nfs_xdev_get_sb() = 0\n"); | 2465 | dprintk("<-- nfs_xdev_mount() = 0\n"); |
| 2468 | return 0; | 2466 | return mntroot; |
| 2469 | 2467 | ||
| 2470 | out_err_nosb: | 2468 | out_err_nosb: |
| 2471 | nfs_free_server(server); | 2469 | nfs_free_server(server); |
| 2472 | out_err_noserver: | 2470 | out_err_noserver: |
| 2473 | dprintk("<-- nfs_xdev_get_sb() = %d [error]\n", error); | 2471 | dprintk("<-- nfs_xdev_mount() = %d [error]\n", error); |
| 2474 | return error; | 2472 | return ERR_PTR(error); |
| 2475 | 2473 | ||
| 2476 | error_splat_super: | 2474 | error_splat_super: |
| 2477 | if (server && !s->s_root) | 2475 | if (server && !s->s_root) |
| 2478 | bdi_unregister(&server->backing_dev_info); | 2476 | bdi_unregister(&server->backing_dev_info); |
| 2479 | error_splat_bdi: | 2477 | error_splat_bdi: |
| 2480 | deactivate_locked_super(s); | 2478 | deactivate_locked_super(s); |
| 2481 | dprintk("<-- nfs_xdev_get_sb() = %d [splat]\n", error); | 2479 | dprintk("<-- nfs_xdev_mount() = %d [splat]\n", error); |
| 2482 | return error; | 2480 | return ERR_PTR(error); |
| 2483 | } | 2481 | } |
| 2484 | 2482 | ||
| 2485 | #ifdef CONFIG_NFS_V4 | 2483 | #ifdef CONFIG_NFS_V4 |
| @@ -2649,8 +2647,9 @@ out_no_address: | |||
| 2649 | /* | 2647 | /* |
| 2650 | * Get the superblock for the NFS4 root partition | 2648 | * Get the superblock for the NFS4 root partition |
| 2651 | */ | 2649 | */ |
| 2652 | static int nfs4_remote_get_sb(struct file_system_type *fs_type, | 2650 | static struct dentry * |
| 2653 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt) | 2651 | nfs4_remote_mount(struct file_system_type *fs_type, int flags, |
| 2652 | const char *dev_name, void *raw_data) | ||
| 2654 | { | 2653 | { |
| 2655 | struct nfs_parsed_mount_data *data = raw_data; | 2654 | struct nfs_parsed_mount_data *data = raw_data; |
| 2656 | struct super_block *s; | 2655 | struct super_block *s; |
| @@ -2714,15 +2713,16 @@ static int nfs4_remote_get_sb(struct file_system_type *fs_type, | |||
| 2714 | goto error_splat_root; | 2713 | goto error_splat_root; |
| 2715 | 2714 | ||
| 2716 | s->s_flags |= MS_ACTIVE; | 2715 | s->s_flags |= MS_ACTIVE; |
| 2717 | mnt->mnt_sb = s; | 2716 | |
| 2718 | mnt->mnt_root = mntroot; | 2717 | security_free_mnt_opts(&data->lsm_opts); |
| 2719 | error = 0; | 2718 | nfs_free_fhandle(mntfh); |
| 2719 | return mntroot; | ||
| 2720 | 2720 | ||
| 2721 | out: | 2721 | out: |
| 2722 | security_free_mnt_opts(&data->lsm_opts); | 2722 | security_free_mnt_opts(&data->lsm_opts); |
| 2723 | out_free_fh: | 2723 | out_free_fh: |
| 2724 | nfs_free_fhandle(mntfh); | 2724 | nfs_free_fhandle(mntfh); |
| 2725 | return error; | 2725 | return ERR_PTR(error); |
| 2726 | 2726 | ||
| 2727 | out_free: | 2727 | out_free: |
| 2728 | nfs_free_server(server); | 2728 | nfs_free_server(server); |
| @@ -2968,9 +2968,9 @@ static void nfs4_kill_super(struct super_block *sb) | |||
| 2968 | /* | 2968 | /* |
| 2969 | * Clone an NFS4 server record on xdev traversal (FSID-change) | 2969 | * Clone an NFS4 server record on xdev traversal (FSID-change) |
| 2970 | */ | 2970 | */ |
| 2971 | static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags, | 2971 | static struct dentry * |
| 2972 | const char *dev_name, void *raw_data, | 2972 | nfs4_xdev_mount(struct file_system_type *fs_type, int flags, |
| 2973 | struct vfsmount *mnt) | 2973 | const char *dev_name, void *raw_data) |
| 2974 | { | 2974 | { |
| 2975 | struct nfs_clone_mount *data = raw_data; | 2975 | struct nfs_clone_mount *data = raw_data; |
| 2976 | struct super_block *s; | 2976 | struct super_block *s; |
| @@ -2982,7 +2982,7 @@ static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
| 2982 | }; | 2982 | }; |
| 2983 | int error; | 2983 | int error; |
| 2984 | 2984 | ||
| 2985 | dprintk("--> nfs4_xdev_get_sb()\n"); | 2985 | dprintk("--> nfs4_xdev_mount()\n"); |
| 2986 | 2986 | ||
| 2987 | /* create a new volume representation */ | 2987 | /* create a new volume representation */ |
| 2988 | server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr); | 2988 | server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr); |
| @@ -3029,32 +3029,30 @@ static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
| 3029 | } | 3029 | } |
| 3030 | 3030 | ||
| 3031 | s->s_flags |= MS_ACTIVE; | 3031 | s->s_flags |= MS_ACTIVE; |
| 3032 | mnt->mnt_sb = s; | ||
| 3033 | mnt->mnt_root = mntroot; | ||
| 3034 | 3032 | ||
| 3035 | security_sb_clone_mnt_opts(data->sb, s); | 3033 | security_sb_clone_mnt_opts(data->sb, s); |
| 3036 | 3034 | ||
| 3037 | dprintk("<-- nfs4_xdev_get_sb() = 0\n"); | 3035 | dprintk("<-- nfs4_xdev_mount() = 0\n"); |
| 3038 | return 0; | 3036 | return mntroot; |
| 3039 | 3037 | ||
| 3040 | out_err_nosb: | 3038 | out_err_nosb: |
| 3041 | nfs_free_server(server); | 3039 | nfs_free_server(server); |
| 3042 | out_err_noserver: | 3040 | out_err_noserver: |
| 3043 | dprintk("<-- nfs4_xdev_get_sb() = %d [error]\n", error); | 3041 | dprintk("<-- nfs4_xdev_mount() = %d [error]\n", error); |
| 3044 | return error; | 3042 | return ERR_PTR(error); |
| 3045 | 3043 | ||
| 3046 | error_splat_super: | 3044 | error_splat_super: |
| 3047 | if (server && !s->s_root) | 3045 | if (server && !s->s_root) |
| 3048 | bdi_unregister(&server->backing_dev_info); | 3046 | bdi_unregister(&server->backing_dev_info); |
| 3049 | error_splat_bdi: | 3047 | error_splat_bdi: |
| 3050 | deactivate_locked_super(s); | 3048 | deactivate_locked_super(s); |
| 3051 | dprintk("<-- nfs4_xdev_get_sb() = %d [splat]\n", error); | 3049 | dprintk("<-- nfs4_xdev_mount() = %d [splat]\n", error); |
| 3052 | return error; | 3050 | return ERR_PTR(error); |
| 3053 | } | 3051 | } |
| 3054 | 3052 | ||
| 3055 | static int nfs4_remote_referral_get_sb(struct file_system_type *fs_type, | 3053 | static struct dentry * |
| 3056 | int flags, const char *dev_name, void *raw_data, | 3054 | nfs4_remote_referral_mount(struct file_system_type *fs_type, int flags, |
| 3057 | struct vfsmount *mnt) | 3055 | const char *dev_name, void *raw_data) |
| 3058 | { | 3056 | { |
| 3059 | struct nfs_clone_mount *data = raw_data; | 3057 | struct nfs_clone_mount *data = raw_data; |
| 3060 | struct super_block *s; | 3058 | struct super_block *s; |
| @@ -3118,14 +3116,12 @@ static int nfs4_remote_referral_get_sb(struct file_system_type *fs_type, | |||
| 3118 | } | 3116 | } |
| 3119 | 3117 | ||
| 3120 | s->s_flags |= MS_ACTIVE; | 3118 | s->s_flags |= MS_ACTIVE; |
| 3121 | mnt->mnt_sb = s; | ||
| 3122 | mnt->mnt_root = mntroot; | ||
| 3123 | 3119 | ||
| 3124 | security_sb_clone_mnt_opts(data->sb, s); | 3120 | security_sb_clone_mnt_opts(data->sb, s); |
| 3125 | 3121 | ||
| 3126 | nfs_free_fhandle(mntfh); | 3122 | nfs_free_fhandle(mntfh); |
| 3127 | dprintk("<-- nfs4_referral_get_sb() = 0\n"); | 3123 | dprintk("<-- nfs4_referral_get_sb() = 0\n"); |
| 3128 | return 0; | 3124 | return mntroot; |
| 3129 | 3125 | ||
| 3130 | out_err_nosb: | 3126 | out_err_nosb: |
| 3131 | nfs_free_server(server); | 3127 | nfs_free_server(server); |
| @@ -3133,7 +3129,7 @@ out_err_noserver: | |||
| 3133 | nfs_free_fhandle(mntfh); | 3129 | nfs_free_fhandle(mntfh); |
| 3134 | out_err_nofh: | 3130 | out_err_nofh: |
| 3135 | dprintk("<-- nfs4_referral_get_sb() = %d [error]\n", error); | 3131 | dprintk("<-- nfs4_referral_get_sb() = %d [error]\n", error); |
| 3136 | return error; | 3132 | return ERR_PTR(error); |
| 3137 | 3133 | ||
| 3138 | error_splat_super: | 3134 | error_splat_super: |
| 3139 | if (server && !s->s_root) | 3135 | if (server && !s->s_root) |
| @@ -3142,7 +3138,7 @@ error_splat_bdi: | |||
| 3142 | deactivate_locked_super(s); | 3138 | deactivate_locked_super(s); |
| 3143 | nfs_free_fhandle(mntfh); | 3139 | nfs_free_fhandle(mntfh); |
| 3144 | dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error); | 3140 | dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error); |
| 3145 | return error; | 3141 | return ERR_PTR(error); |
| 3146 | } | 3142 | } |
| 3147 | 3143 | ||
| 3148 | /* | 3144 | /* |
