提交 ff9099f2 编写于 作者: B Bryan Schumaker 提交者: Trond Myklebust

NFS: Create a try_mount rpc op

I'm already looking up the nfs subversion in nfs_fs_mount(), so I have
easy access to rpc_ops that used to be difficult to reach.  This allows
me to set up a different mount path for NFS v2/3 and NFS v4.
Signed-off-by: NBryan Schumaker <bjschuma@netapp.com>
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 e8f25e6d
...@@ -328,6 +328,8 @@ extern struct file_system_type nfs_xdev_fs_type; ...@@ -328,6 +328,8 @@ extern struct file_system_type nfs_xdev_fs_type;
extern struct file_system_type nfs4_xdev_fs_type; extern struct file_system_type nfs4_xdev_fs_type;
extern struct file_system_type nfs4_referral_fs_type; extern struct file_system_type nfs4_referral_fs_type;
#endif #endif
struct dentry *nfs_try_mount(int, const char *, struct nfs_mount_info *,
struct nfs_subversion *);
void nfs_initialise_sb(struct super_block *); void nfs_initialise_sb(struct super_block *);
int nfs_set_sb_security(struct super_block *, struct dentry *, struct nfs_mount_info *); int nfs_set_sb_security(struct super_block *, struct dentry *, struct nfs_mount_info *);
int nfs_clone_sb_security(struct super_block *, struct dentry *, struct nfs_mount_info *); int nfs_clone_sb_security(struct super_block *, struct dentry *, struct nfs_mount_info *);
......
...@@ -925,6 +925,7 @@ const struct nfs_rpc_ops nfs_v3_clientops = { ...@@ -925,6 +925,7 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
.file_ops = &nfs_file_operations, .file_ops = &nfs_file_operations,
.getroot = nfs3_proc_get_root, .getroot = nfs3_proc_get_root,
.submount = nfs_submount, .submount = nfs_submount,
.try_mount = nfs_try_mount,
.getattr = nfs3_proc_getattr, .getattr = nfs3_proc_getattr,
.setattr = nfs3_proc_setattr, .setattr = nfs3_proc_setattr,
.lookup = nfs3_proc_lookup, .lookup = nfs3_proc_lookup,
......
...@@ -367,7 +367,7 @@ extern const nfs4_stateid zero_stateid; ...@@ -367,7 +367,7 @@ extern const nfs4_stateid zero_stateid;
/* nfs4super.c */ /* nfs4super.c */
struct nfs_mount_info; struct nfs_mount_info;
extern struct nfs_subversion nfs_v4; extern struct nfs_subversion nfs_v4;
struct dentry *nfs4_try_mount(int, const char *, struct nfs_mount_info *); struct dentry *nfs4_try_mount(int, const char *, struct nfs_mount_info *, struct nfs_subversion *);
int init_nfs_v4(void); int init_nfs_v4(void);
void exit_nfs_v4(void); void exit_nfs_v4(void);
......
...@@ -6870,6 +6870,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = { ...@@ -6870,6 +6870,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
.file_ops = &nfs4_file_operations, .file_ops = &nfs4_file_operations,
.getroot = nfs4_proc_get_root, .getroot = nfs4_proc_get_root,
.submount = nfs4_submount, .submount = nfs4_submount,
.try_mount = nfs4_try_mount,
.getattr = nfs4_proc_getattr, .getattr = nfs4_proc_getattr,
.setattr = nfs4_proc_setattr, .setattr = nfs4_proc_setattr,
.lookup = nfs4_proc_lookup, .lookup = nfs4_proc_lookup,
......
...@@ -226,7 +226,8 @@ static struct dentry *nfs_follow_remote_path(struct vfsmount *root_mnt, ...@@ -226,7 +226,8 @@ static struct dentry *nfs_follow_remote_path(struct vfsmount *root_mnt,
} }
struct dentry *nfs4_try_mount(int flags, const char *dev_name, struct dentry *nfs4_try_mount(int flags, const char *dev_name,
struct nfs_mount_info *mount_info) struct nfs_mount_info *mount_info,
struct nfs_subversion *nfs_mod)
{ {
char *export_path; char *export_path;
struct vfsmount *root_mnt; struct vfsmount *root_mnt;
......
...@@ -774,6 +774,7 @@ const struct nfs_rpc_ops nfs_v2_clientops = { ...@@ -774,6 +774,7 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
.file_ops = &nfs_file_operations, .file_ops = &nfs_file_operations,
.getroot = nfs_proc_get_root, .getroot = nfs_proc_get_root,
.submount = nfs_submount, .submount = nfs_submount,
.try_mount = nfs_try_mount,
.getattr = nfs_proc_getattr, .getattr = nfs_proc_getattr,
.setattr = nfs_proc_setattr, .setattr = nfs_proc_setattr,
.lookup = nfs_proc_lookup, .lookup = nfs_proc_lookup,
......
...@@ -1650,9 +1650,9 @@ static int nfs_request_mount(struct nfs_parsed_mount_data *args, ...@@ -1650,9 +1650,9 @@ static int nfs_request_mount(struct nfs_parsed_mount_data *args,
return nfs_walk_authlist(args, &request); return nfs_walk_authlist(args, &request);
} }
static struct dentry *nfs_try_mount(int flags, const char *dev_name, struct dentry *nfs_try_mount(int flags, const char *dev_name,
struct nfs_mount_info *mount_info, struct nfs_mount_info *mount_info,
struct nfs_subversion *nfs_mod) struct nfs_subversion *nfs_mod)
{ {
int status; int status;
struct nfs_server *server; struct nfs_server *server;
...@@ -2403,15 +2403,9 @@ struct dentry *nfs_fs_mount(struct file_system_type *fs_type, ...@@ -2403,15 +2403,9 @@ struct dentry *nfs_fs_mount(struct file_system_type *fs_type,
goto out; goto out;
} }
#ifdef CONFIG_NFS_V4 mntroot = nfs_mod->rpc_ops->try_mount(flags, dev_name, &mount_info, nfs_mod);
if (mount_info.parsed->version == 4)
mntroot = nfs4_try_mount(flags, dev_name, &mount_info);
else
#endif /* CONFIG_NFS_V4 */
mntroot = nfs_try_mount(flags, dev_name, &mount_info, nfs_mod);
put_nfs_version(nfs_mod); put_nfs_version(nfs_mod);
out: out:
nfs_free_parsed_mount_data(mount_info.parsed); nfs_free_parsed_mount_data(mount_info.parsed);
nfs_free_fhandle(mount_info.mntfh); nfs_free_fhandle(mount_info.mntfh);
......
...@@ -1353,6 +1353,8 @@ struct nfs_renamedata { ...@@ -1353,6 +1353,8 @@ struct nfs_renamedata {
struct nfs_access_entry; struct nfs_access_entry;
struct nfs_client; struct nfs_client;
struct rpc_timeout; struct rpc_timeout;
struct nfs_subversion;
struct nfs_mount_info;
struct nfs_client_initdata; struct nfs_client_initdata;
struct nfs_pageio_descriptor; struct nfs_pageio_descriptor;
...@@ -1370,6 +1372,8 @@ struct nfs_rpc_ops { ...@@ -1370,6 +1372,8 @@ struct nfs_rpc_ops {
struct nfs_fsinfo *); struct nfs_fsinfo *);
struct vfsmount *(*submount) (struct nfs_server *, struct dentry *, struct vfsmount *(*submount) (struct nfs_server *, struct dentry *,
struct nfs_fh *, struct nfs_fattr *); struct nfs_fh *, struct nfs_fattr *);
struct dentry *(*try_mount) (int, const char *, struct nfs_mount_info *,
struct nfs_subversion *);
int (*getattr) (struct nfs_server *, struct nfs_fh *, int (*getattr) (struct nfs_server *, struct nfs_fh *,
struct nfs_fattr *); struct nfs_fattr *);
int (*setattr) (struct dentry *, struct nfs_fattr *, int (*setattr) (struct dentry *, struct nfs_fattr *,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册