Re: [PATCH v4 03/23] NFS: Add version registering framework

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 03/21/2012 11:57 AM, Myklebust, Trond wrote:

> On Wed, 2012-03-21 at 11:20 -0400, bjschuma@xxxxxxxxxx wrote:
>> From: Bryan Schumaker <bjschuma@xxxxxxxxxx>
>>
>> This patch adds in the code to track multiple versions of the NFS
>> protocol.  I created default structures for v2, v3 and v4 so that each
>> version can continue to work while I convert them into kernel modules.
>> I also removed the const parameter from the rpc_version array so that I
>> can change it at runtime.
>>
>> Signed-off-by: Bryan Schumaker <bjschuma@xxxxxxxxxx>
>> ---
>>  fs/lockd/clnt4xdr.c         |    2 +-
>>  fs/lockd/clntxdr.c          |    6 +--
>>  fs/lockd/mon.c              |    4 +-
>>  fs/nfs/Makefile             |    6 +--
>>  fs/nfs/client.c             |  111 ++++++++++++++++++++++++++++++++++---------
>>  fs/nfs/inode.c              |    2 +
>>  fs/nfs/mount_clnt.c         |    6 +--
>>  fs/nfs/nfs.h                |   35 ++++++++++++++
>>  fs/nfs/nfs2super.c          |   31 ++++++++++++
>>  fs/nfs/nfs2xdr.c            |    2 +-
>>  fs/nfs/nfs3super.c          |   31 ++++++++++++
>>  fs/nfs/nfs3xdr.c            |    4 +-
>>  fs/nfs/nfs4super.c          |   31 ++++++++++++
>>  fs/nfs/nfs4xdr.c            |    2 +-
>>  fs/nfs/super.c              |   48 ++++++++++++++-----
>>  fs/nfsd/nfs4callback.c      |    2 +-
>>  include/linux/lockd/xdr4.h  |    2 +-
>>  include/linux/nfs_xdr.h     |    8 ++--
>>  include/linux/sunrpc/clnt.h |    2 +-
>>  net/sunrpc/rpcb_clnt.c      |    8 ++--
>>  20 files changed, 280 insertions(+), 63 deletions(-)
>>  create mode 100644 fs/nfs/nfs.h
>>  create mode 100644 fs/nfs/nfs2super.c
>>  create mode 100644 fs/nfs/nfs3super.c
>>  create mode 100644 fs/nfs/nfs4super.c
>>
>> diff --git a/fs/lockd/clnt4xdr.c b/fs/lockd/clnt4xdr.c
>> index 3ddcbb1..580dbe2 100644
>> --- a/fs/lockd/clnt4xdr.c
>> +++ b/fs/lockd/clnt4xdr.c
>> @@ -598,7 +598,7 @@ static struct rpc_procinfo	nlm4_procedures[] = {
>>  	PROC(GRANTED_RES,	res,		norep),
>>  };
>>  
>> -const struct rpc_version nlm_version4 = {
>> +struct rpc_version nlm_version4 = {
>>  	.number		= 4,
>>  	.nrprocs	= ARRAY_SIZE(nlm4_procedures),
>>  	.procs		= nlm4_procedures,
>> diff --git a/fs/lockd/clntxdr.c b/fs/lockd/clntxdr.c
>> index 3d35e3e..78e80c4 100644
>> --- a/fs/lockd/clntxdr.c
>> +++ b/fs/lockd/clntxdr.c
>> @@ -596,19 +596,19 @@ static struct rpc_procinfo	nlm_procedures[] = {
>>  	PROC(GRANTED_RES,	res,		norep),
>>  };
>>  
>> -static const struct rpc_version	nlm_version1 = {
> 
> Why shouldn't these (and the mount protocol equivalents etc) still be
> declared constant?


I didn't think I'd be allowed to change them if they were const.  I removed it from the rpc_ops structure first, and then followed the compiler errors to change the rest.

> 
>> +static struct rpc_version	nlm_version1 = {
>>  		.number		= 1,
>>  		.nrprocs	= ARRAY_SIZE(nlm_procedures),
>>  		.procs		= nlm_procedures,
>>  };
>>  
>> -static const struct rpc_version	nlm_version3 = {
>> +static struct rpc_version	nlm_version3 = {
>>  		.number		= 3,
>>  		.nrprocs	= ARRAY_SIZE(nlm_procedures),
>>  		.procs		= nlm_procedures,
>>  };
>>  
>> -static const struct rpc_version	*nlm_versions[] = {
>> +static struct rpc_version	*nlm_versions[] = {
>>  	[1] = &nlm_version1,
>>  	[3] = &nlm_version3,
>>  #ifdef CONFIG_LOCKD_V4
>> diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c
>> index 7ef14b3..888d1ef 100644
>> --- a/fs/lockd/mon.c
>> +++ b/fs/lockd/mon.c
>> @@ -535,13 +535,13 @@ static struct rpc_procinfo	nsm_procedures[] = {
>>  	},
>>  };
>>  
>> -static const struct rpc_version nsm_version1 = {
>> +static struct rpc_version nsm_version1 = {
>>  		.number		= 1,
>>  		.nrprocs	= ARRAY_SIZE(nsm_procedures),
>>  		.procs		= nsm_procedures
>>  };
>>  
>> -static const struct rpc_version *nsm_version[] = {
>> +static struct rpc_version *nsm_version[] = {
>>  	[1] = &nsm_version1,
>>  };
>>  
>> diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile
>> index 7ddd45d..c6e7844 100644
>> --- a/fs/nfs/Makefile
>> +++ b/fs/nfs/Makefile
>> @@ -9,11 +9,11 @@ nfs-y 			:= client.o dir.o file.o getroot.o inode.o super.o \
>>  			   write.o namespace.o mount_clnt.o \
>>  			   dns_resolve.o cache_lib.o
>>  nfs-$(CONFIG_ROOT_NFS)	+= nfsroot.o
>> -nfs-$(CONFIG_NFS_V2)	+= proc.o nfs2xdr.o
>> -nfs-$(CONFIG_NFS_V3)	+= nfs3proc.o nfs3xdr.o
>> +nfs-$(CONFIG_NFS_V2)	+= nfs2super.o proc.o nfs2xdr.o
>> +nfs-$(CONFIG_NFS_V3)	+= nfs3super.o nfs3proc.o nfs3xdr.o
>>  nfs-$(CONFIG_NFS_V3_ACL)	+= nfs3acl.o
>>  nfs-$(CONFIG_NFS_V4)	+= nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o \
>> -			   delegation.o idmap.o \
>> +			   nfs4super.o delegation.o idmap.o \
>>  			   callback.o callback_xdr.o callback_proc.o \
>>  			   nfs4namespace.o
>>  nfs-$(CONFIG_NFS_V4_1)	+= pnfs.o pnfs_dev.o
>> diff --git a/fs/nfs/client.c b/fs/nfs/client.c
>> index 4d793b2..0fafedd 100644
>> --- a/fs/nfs/client.c
>> +++ b/fs/nfs/client.c
>> @@ -51,11 +51,14 @@
>>  #include "internal.h"
>>  #include "fscache.h"
>>  #include "pnfs.h"
>> +#include "nfs.h"
>>  #include "netns.h"
>>  
>>  #define NFSDBG_FACILITY		NFSDBG_CLIENT
>>  
>>  static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq);
>> +static DEFINE_SPINLOCK(nfs_version_lock);
>> +static LIST_HEAD(nfs_versions);
>>  #ifdef CONFIG_NFS_V4
>>  
>>  /*
>> @@ -89,16 +92,10 @@ static bool nfs4_disable_idmapping = true;
>>  /*
>>   * RPC cruft for NFS
>>   */
>> -static const struct rpc_version *nfs_version[5] = {
>> -#ifdef CONFIG_NFS_V2
>> -	[2]			= &nfs_version2,
>> -#endif
>> -#ifdef CONFIG_NFS_V3
>> -	[3]			= &nfs_version3,
>> -#endif
>> -#ifdef CONFIG_NFS_V4
>> -	[4]			= &nfs_version4,
>> -#endif
>> +static struct rpc_version *nfs_version[5] = {
>> +	[2] = NULL,
>> +	[3] = NULL,
>> +	[4] = NULL,
>>  };
>>  
>>  const struct rpc_program nfs_program = {
>> @@ -114,10 +111,9 @@ struct rpc_stat nfs_rpcstat = {
>>  	.program		= &nfs_program
>>  };
>>  
>> -
>>  #ifdef CONFIG_NFS_V3_ACL
>>  static struct rpc_stat		nfsacl_rpcstat = { &nfsacl_program };
>> -static const struct rpc_version *nfsacl_version[] = {
>> +static struct rpc_version *nfsacl_version[] = {
>>  	[3]			= &nfsacl_version3,
>>  };
>>  
>> @@ -140,6 +136,81 @@ struct nfs_client_initdata {
>>  	struct net *net;
>>  };
>>  
>> +static int find_nfs_version(struct nfs_subversion **nfs, unsigned int version)
>> +{
>> +	struct nfs_subversion *tmp;
>> +	spin_lock(&nfs_version_lock);
>> +
>> +	list_for_each_entry_safe((*nfs), tmp, &nfs_versions, list) {
>> +		if ((*nfs)->version == version) {
>> +			spin_unlock(&nfs_version_lock);
>> +			return 1;
>> +		}
>> +	};
>> +
>> +	spin_unlock(&nfs_version_lock);
>> +	return 0;
>> +}
>> +
>> +struct nfs_subversion *get_nfs_version(unsigned int version)
>> +{
>> +	struct nfs_subversion *nfs;
>> +
>> +	if (try_then_request_module(find_nfs_version(&nfs, version), "nfs%d", version))
>> +		return nfs;
>> +	return ERR_PTR(-EPROTONOSUPPORT);
>> +}
>> +
>> +inline struct nfs_subversion *get_nfs_client_version(struct nfs_client *clp)
>> +{
>> +	return get_nfs_version(clp->rpc_ops->version);
>> +}
>> +
>> +inline struct nfs_subversion *get_nfs_server_version(struct nfs_server *srv)
>> +{
>> +	return get_nfs_client_version(srv->nfs_client);
>> +}
>> +
>> +void register_nfs_version(struct nfs_subversion *nfs)
>> +{
>> +	spin_lock(&nfs_version_lock);
>> +
>> +	list_add(&nfs->list, &nfs_versions);
>> +	nfs_version[nfs->version] = nfs->rpc_vers;
>> +
>> +	spin_unlock(&nfs_version_lock);
>> +}
>> +EXPORT_SYMBOL_GPL(register_nfs_version);
>> +
>> +void unregister_nfs_version(struct nfs_subversion *nfs)
>> +{
>> +	spin_lock(&nfs_version_lock);
>> +
>> +	nfs_version[nfs->version] = NULL;
>> +	list_del(&nfs->list);
>> +
>> +	spin_unlock(&nfs_version_lock);
>> +}
>> +EXPORT_SYMBOL_GPL(unregister_nfs_version);
>> +
>> +/*
>> + * Preload all configured NFS versions during module init.
>> + * This function should be edited after each protocol is converted,
>> + * and eventually removed.
>> + */
>> +void __init nfs_register_versions(void)
>> +{
>> +#ifdef CONFIG_NFS_V2
>> +	init_nfs_v2();
>> +#endif
>> +#ifdef CONFIG_NFS_V3
>> +	init_nfs_v3();
>> +#endif
>> +#ifdef CONFIG_NFS_V4
>> +	init_nfs_v4();
>> +#endif
>> +}
>> +
>>  /*
>>   * Allocate a shared client record
>>   *
>> @@ -855,21 +926,15 @@ static int nfs_init_server(struct nfs_server *server,
>>  	};
>>  	struct rpc_timeout timeparms;
>>  	struct nfs_client *clp;
>> +	struct nfs_subversion *nfs_mod;
>>  	int error;
>>  
>>  	dprintk("--> nfs_init_server()\n");
>>  
>> -
>> -#ifdef CONFIG_NFS_V2
>> -	if (data->version == 2)
>> -		cl_init.rpc_ops = &nfs_v2_clientops;
>> -#endif
>> -#ifdef CONFIG_NFS_V3
>> -	if (data->version == 3)
>> -		cl_init.rpc_ops = &nfs_v3_clientops;
>> -#endif
>> -	if (cl_init.rpc_ops == NULL)
>> -		return -EPROTONOSUPPORT;
>> +	nfs_mod = get_nfs_version(data->version);
>> +	if (IS_ERR(nfs_mod))
>> +		return PTR_ERR(nfs_mod);
>> +	cl_init.rpc_ops = nfs_mod->rpc_ops;
>>  
>>  	nfs_init_timeout_values(&timeparms, data->nfs_server.protocol,
>>  			data->timeo, data->retrans);
>> diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
>> index 7bb4d13..02a1c43 100644
>> --- a/fs/nfs/inode.c
>> +++ b/fs/nfs/inode.c
>> @@ -52,6 +52,7 @@
>>  #include "fscache.h"
>>  #include "dns_resolve.h"
>>  #include "pnfs.h"
>> +#include "nfs.h"
>>  #include "netns.h"
>>  
>>  #define NFSDBG_FACILITY		NFSDBG_VFS
>> @@ -1695,6 +1696,7 @@ static int __init init_nfs_fs(void)
>>  #endif
>>  	if ((err = register_nfs_fs()) != 0)
>>  		goto out;
>> +	nfs_register_versions();
>>  	return 0;
>>  out:
>>  #ifdef CONFIG_PROC_FS
>> diff --git a/fs/nfs/mount_clnt.c b/fs/nfs/mount_clnt.c
>> index 8e65c7f..ddc7d19 100644
>> --- a/fs/nfs/mount_clnt.c
>> +++ b/fs/nfs/mount_clnt.c
>> @@ -488,19 +488,19 @@ static struct rpc_procinfo mnt3_procedures[] = {
>>  };
>>  
>>
>> -static const struct rpc_version mnt_version1 = {
>> +static struct rpc_version mnt_version1 = {
>>  	.number		= 1,
>>  	.nrprocs	= ARRAY_SIZE(mnt_procedures),
>>  	.procs		= mnt_procedures,
>>  };
>>  
>> -static const struct rpc_version mnt_version3 = {
>> +static struct rpc_version mnt_version3 = {
>>  	.number		= 3,
>>  	.nrprocs	= ARRAY_SIZE(mnt3_procedures),
>>  	.procs		= mnt3_procedures,
>>  };
>>  
>> -static const struct rpc_version *mnt_version[] = {
>> +static struct rpc_version *mnt_version[] = {
>>  	NULL,
>>  	&mnt_version1,
>>  	NULL,
>> diff --git a/fs/nfs/nfs.h b/fs/nfs/nfs.h
>> new file mode 100644
>> index 0000000..05f6849
>> --- /dev/null
>> +++ b/fs/nfs/nfs.h
>> @@ -0,0 +1,35 @@
>> +/*
>> + * Copyright (c) 2012 Netapp, Inc. All rights reserved.
>> + *
>> + * Function and structures exported by the NFS module
>> + * for use by NFS version-specific modules.
>> + */
>> +#ifndef __LINUX_INTERNAL_NFS_H
>> +#define __LINUX_INTERNAL_NFS_H
>> +
>> +#include <linux/fs.h>
>> +#include <linux/sunrpc/sched.h>
>> +#include <linux/nfs_xdr.h>
>> +
>> +struct nfs_subversion {
>> +	unsigned int version;		/* Protocol number */
> Won't this be a duplicate of what we already have in the rpc_ops?


Yeah, it would.  I can change the register() / unregister() functions to take an int in addition to the subversion pointer.

> 
>> +	struct rpc_version *rpc_vers;	/* NFS version information */
>> +	const struct nfs_rpc_ops *rpc_ops;	/* NFS operations */
>> +	struct list_head list;		/* List of NFS versions */
>> +
>> +	void (*reference)(void);	/* For reference counting */
>> +	void (*unreference)(void);	/* Also for reference counting */
> 
> You are always just going to pin and unpin the module, so why do they
> need to be function pointers? Just have each module store a pointer to
> THIS_MODULE in the above structure instead.


That makes sense, I'll change it.

> 
>> +};
>> +
>> +void nfs_register_versions(void);
>> +int init_nfs_v2(void);
>> +int init_nfs_v3(void);
>> +int init_nfs_v4(void);
>> +
>> +struct nfs_subversion *get_nfs_version(unsigned int);
>> +struct nfs_subversion *get_nfs_client_version(struct nfs_client *);
>> +struct nfs_subversion *get_nfs_server_version(struct nfs_server *);
>> +void register_nfs_version(struct nfs_subversion *);
>> +void unregister_nfs_version(struct nfs_subversion *);
>> +
>> +#endif /* __LINUX_INTERNAL_NFS_H */
>> diff --git a/fs/nfs/nfs2super.c b/fs/nfs/nfs2super.c
>> new file mode 100644
>> index 0000000..12fa906
>> --- /dev/null
>> +++ b/fs/nfs/nfs2super.c
>> @@ -0,0 +1,31 @@
>> +/*
>> + * Copyright (c) 2012 Netapp, Inc. All rights reserved.
>> + */
>> +#include <linux/module.h>
>> +#include <linux/nfs_fs.h>
>> +#include "nfs.h"
>> +
>> +static void nfs2_reference(void)
>> +{
>> +	try_module_get(THIS_MODULE);
>> +}
>> +
>> +static void nfs2_unreference(void)
>> +{
>> +	module_put(THIS_MODULE);
>> +}
>> +
>> +static struct nfs_subversion nfs_v2 = {
>> +	.version  = 2,
>> +	.rpc_vers = &nfs_version2,
>> +	.rpc_ops  = &nfs_v2_clientops,
>> +
>> +	.reference = nfs2_reference,
>> +	.unreference = nfs2_unreference,
>> +};
>> +
>> +int __init init_nfs_v2(void)
>> +{
>> +	register_nfs_version(&nfs_v2);
>> +	return 0;
>> +}
>> diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c
>> index a01084d..5d9ec8b 100644
>> --- a/fs/nfs/nfs2xdr.c
>> +++ b/fs/nfs/nfs2xdr.c
>> @@ -1086,7 +1086,7 @@ struct rpc_procinfo	nfs_procedures[] = {
>>  	PROC(STATFS,	fhandle,	statfsres,	0),
>>  };
>>  
>> -const struct rpc_version nfs_version2 = {
>> +struct rpc_version nfs_version2 = {
>>  	.number			= 2,
>>  	.nrprocs		= ARRAY_SIZE(nfs_procedures),
>>  	.procs			= nfs_procedures
>> diff --git a/fs/nfs/nfs3super.c b/fs/nfs/nfs3super.c
>> new file mode 100644
>> index 0000000..a02c815
>> --- /dev/null
>> +++ b/fs/nfs/nfs3super.c
>> @@ -0,0 +1,31 @@
>> +/*
>> + * Copyright (c) 2012 Netapp, Inc. All rights reserved.
>> + */
>> +#include <linux/module.h>
>> +#include <linux/nfs_fs.h>
>> +#include "nfs.h"
>> +
>> +static void nfs3_reference(void)
>> +{
>> +	try_module_get(THIS_MODULE);
>> +}
>> +
>> +static void nfs3_unreference(void)
>> +{
>> +	module_put(THIS_MODULE);
>> +}
>> +
>> +static struct nfs_subversion nfs_v3 = {
>> +	.version  = 3,
>> +	.rpc_vers = &nfs_version3,
>> +	.rpc_ops  = &nfs_v3_clientops,
>> +
>> +	.reference = nfs3_reference,
>> +	.unreference = nfs3_unreference,
>> +};
>> +
>> +int __init init_nfs_v3(void)
>> +{
>> +	register_nfs_version(&nfs_v3);
>> +	return 0;
>> +}
>> diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
>> index a77cc9a..5f9aabd 100644
>> --- a/fs/nfs/nfs3xdr.c
>> +++ b/fs/nfs/nfs3xdr.c
>> @@ -2461,7 +2461,7 @@ struct rpc_procinfo	nfs3_procedures[] = {
>>  	PROC(COMMIT,		commit,		commit,		5),
>>  };
>>  
>> -const struct rpc_version nfs_version3 = {
>> +struct rpc_version nfs_version3 = {
>>  	.number			= 3,
>>  	.nrprocs		= ARRAY_SIZE(nfs3_procedures),
>>  	.procs			= nfs3_procedures
>> @@ -2489,7 +2489,7 @@ static struct rpc_procinfo	nfs3_acl_procedures[] = {
>>  	},
>>  };
>>  
>> -const struct rpc_version nfsacl_version3 = {
>> +struct rpc_version nfsacl_version3 = {
>>  	.number			= 3,
>>  	.nrprocs		= sizeof(nfs3_acl_procedures)/
>>  				  sizeof(nfs3_acl_procedures[0]),
>> diff --git a/fs/nfs/nfs4super.c b/fs/nfs/nfs4super.c
>> new file mode 100644
>> index 0000000..9b2a679
>> --- /dev/null
>> +++ b/fs/nfs/nfs4super.c
>> @@ -0,0 +1,31 @@
>> +/*
>> + * Copyright (c) 2012 Netapp, Inc. All rights reserved.
>> + */
>> +#include <linux/module.h>
>> +#include <linux/nfs_fs.h>
>> +#include "nfs.h"
>> +
>> +static void nfs4_reference(void)
>> +{
>> +	try_module_get(THIS_MODULE);
>> +}
>> +
>> +static void nfs4_unreference(void)
>> +{
>> +	module_put(THIS_MODULE);
>> +}
>> +
>> +static struct nfs_subversion nfs_v4 = {
>> +	.version  = 4,
>> +	.rpc_vers = &nfs_version4,
>> +	.rpc_ops  = &nfs_v4_clientops,
>> +
>> +	.reference = nfs4_reference,
>> +	.unreference = nfs4_unreference,
>> +};
>> +
>> +int __init init_nfs_v4(void)
>> +{
>> +	register_nfs_version(&nfs_v4);
>> +	return 0;
>> +}
>> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
>> index c74fdb1..cfd333c 100644
>> --- a/fs/nfs/nfs4xdr.c
>> +++ b/fs/nfs/nfs4xdr.c
>> @@ -7071,7 +7071,7 @@ struct rpc_procinfo	nfs4_procedures[] = {
>>  #endif /* CONFIG_NFS_V4_1 */
>>  };
>>  
>> -const struct rpc_version nfs_version4 = {
>> +struct rpc_version nfs_version4 = {
>>  	.number			= 4,
>>  	.nrprocs		= ARRAY_SIZE(nfs4_procedures),
>>  	.procs			= nfs4_procedures
>> diff --git a/fs/nfs/super.c b/fs/nfs/super.c
>> index aac4030..5ab7c0d 100644
>> --- a/fs/nfs/super.c
>> +++ b/fs/nfs/super.c
>> @@ -65,6 +65,7 @@
>>  #include "internal.h"
>>  #include "fscache.h"
>>  #include "pnfs.h"
>> +#include "nfs.h"
>>  
>>  #define NFSDBG_FACILITY		NFSDBG_VFS
>>  
>> @@ -2284,6 +2285,22 @@ static int nfs_bdi_register(struct nfs_server *server)
>>  	return bdi_register_dev(&server->backing_dev_info, server->s_dev);
>>  }
>>  
>> +static int nfs_register(struct nfs_server *server)
>> +{
>> +	struct nfs_subversion *nfs_mod = get_nfs_server_version(server);
>> +	int err = nfs_bdi_register(server);
>> +	if (!err)
>> +		nfs_mod->reference();
>> +	return err;
>> +}
>> +
>> +static void nfs_unregister(struct nfs_server *server)
>> +{
>> +	struct nfs_subversion *nfs_mod = get_nfs_server_version(server);
>> +	bdi_unregister(&server->backing_dev_info);
>> +	nfs_mod->unreference();
>> +}
>> +
>>  static struct dentry *nfs_fs_mount(struct file_system_type *fs_type,
>>  	int flags, const char *dev_name, void *raw_data)
>>  {
>> @@ -2296,6 +2313,7 @@ static struct dentry *nfs_fs_mount(struct file_system_type *fs_type,
>>  	struct nfs_sb_mountdata sb_mntdata = {
>>  		.mntflags = flags,
>>  	};
>> +	struct nfs_subversion *nfs_mod;
>>  	int error;
>>  
>>  	data = nfs_alloc_parsed_mount_data(NFS_DEFAULT_VERSION);
>> @@ -2310,6 +2328,12 @@ static struct dentry *nfs_fs_mount(struct file_system_type *fs_type,
>>  		goto out;
>>  	}
>>  
>> +	nfs_mod = get_nfs_version(data->version);
>> +	if (IS_ERR(nfs_mod)) {
>> +		mntroot = (struct dentry *)nfs_mod;
>> +		goto out;
>> +	}
>> +
>>  #ifdef CONFIG_NFS_V4
>>  	if (data->version == 4) {
>>  		mntroot = nfs4_try_mount(flags, dev_name, data);
>> @@ -2343,7 +2367,7 @@ static struct dentry *nfs_fs_mount(struct file_system_type *fs_type,
>>  		nfs_free_server(server);
>>  		server = NULL;
>>  	} else {
>> -		error = nfs_bdi_register(server);
>> +		error = nfs_register(server);
>>  		if (error) {
>>  			mntroot = ERR_PTR(error);
>>  			goto error_splat_bdi;
>> @@ -2380,7 +2404,7 @@ error_splat_root:
>>  	mntroot = ERR_PTR(error);
>>  error_splat_super:
>>  	if (server && !s->s_root)
>> -		bdi_unregister(&server->backing_dev_info);
>> +		nfs_unregister(server);
>>  error_splat_bdi:
>>  	deactivate_locked_super(s);
>>  	goto out;
>> @@ -2392,9 +2416,7 @@ error_splat_bdi:
>>   */
>>  static void nfs_put_super(struct super_block *s)
>>  {
>> -	struct nfs_server *server = NFS_SB(s);
>> -
>> -	bdi_unregister(&server->backing_dev_info);
>> +	nfs_unregister(NFS_SB(s));
>>  }
>>  
>>  /*
>> @@ -2454,7 +2476,7 @@ nfs_xdev_mount(struct file_system_type *fs_type, int flags,
>>  		nfs_free_server(server);
>>  		server = NULL;
>>  	} else {
>> -		error = nfs_bdi_register(server);
>> +		error = nfs_register(server);
>>  		if (error)
>>  			goto error_splat_bdi;
>>  	}
>> @@ -2492,7 +2514,7 @@ out_err_noserver:
>>  
>>  error_splat_super:
>>  	if (server && !s->s_root)
>> -		bdi_unregister(&server->backing_dev_info);
>> +		nfs_unregister(server);
>>  error_splat_bdi:
>>  	deactivate_locked_super(s);
>>  	dprintk("<-- nfs_xdev_mount() = %d [splat]\n", error);
>> @@ -2717,7 +2739,7 @@ nfs4_remote_mount(struct file_system_type *fs_type, int flags,
>>  		nfs_free_server(server);
>>  		server = NULL;
>>  	} else {
>> -		error = nfs_bdi_register(server);
>> +		error = nfs_register(server);
>>  		if (error)
>>  			goto error_splat_bdi;
>>  	}
>> @@ -2755,7 +2777,7 @@ error_splat_root:
>>  	dput(mntroot);
>>  error_splat_super:
>>  	if (server && !s->s_root)
>> -		bdi_unregister(&server->backing_dev_info);
>> +		nfs_unregister(server);
>>  error_splat_bdi:
>>  	deactivate_locked_super(s);
>>  	goto out;
>> @@ -2977,7 +2999,7 @@ nfs4_xdev_mount(struct file_system_type *fs_type, int flags,
>>  		nfs_free_server(server);
>>  		server = NULL;
>>  	} else {
>> -		error = nfs_bdi_register(server);
>> +		error = nfs_register(server);
>>  		if (error)
>>  			goto error_splat_bdi;
>>  	}
>> @@ -3014,7 +3036,7 @@ out_err_noserver:
>>  
>>  error_splat_super:
>>  	if (server && !s->s_root)
>> -		bdi_unregister(&server->backing_dev_info);
>> +		nfs_unregister(server);
>>  error_splat_bdi:
>>  	deactivate_locked_super(s);
>>  	dprintk("<-- nfs4_xdev_mount() = %d [splat]\n", error);
>> @@ -3068,7 +3090,7 @@ nfs4_remote_referral_mount(struct file_system_type *fs_type, int flags,
>>  		nfs_free_server(server);
>>  		server = NULL;
>>  	} else {
>> -		error = nfs_bdi_register(server);
>> +		error = nfs_register(server);
>>  		if (error)
>>  			goto error_splat_bdi;
>>  	}
>> @@ -3108,7 +3130,7 @@ out_err_nofh:
>>  
>>  error_splat_super:
>>  	if (server && !s->s_root)
>> -		bdi_unregister(&server->backing_dev_info);
>> +		nfs_unregister(server);
>>  error_splat_bdi:
>>  	deactivate_locked_super(s);
>>  	nfs_free_fhandle(mntfh);
>> diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
>> index 0e262f3..74d19d4 100644
>> --- a/fs/nfsd/nfs4callback.c
>> +++ b/fs/nfsd/nfs4callback.c
>> @@ -605,7 +605,7 @@ static struct rpc_version nfs_cb_version4 = {
>>  	.procs			= nfs4_cb_procedures
>>  };
>>  
>> -static const struct rpc_version *nfs_cb_version[] = {
>> +static struct rpc_version *nfs_cb_version[] = {
>>  	&nfs_cb_version4,
>>  };
>>  
>> diff --git a/include/linux/lockd/xdr4.h b/include/linux/lockd/xdr4.h
>> index e58c88b..7353821 100644
>> --- a/include/linux/lockd/xdr4.h
>> +++ b/include/linux/lockd/xdr4.h
>> @@ -42,6 +42,6 @@ int	nlmclt_encode_lockargs(struct rpc_rqst *, u32 *, struct nlm_args *);
>>  int	nlmclt_encode_cancargs(struct rpc_rqst *, u32 *, struct nlm_args *);
>>  int	nlmclt_encode_unlockargs(struct rpc_rqst *, u32 *, struct nlm_args *);
>>   */
>> -extern const struct rpc_version nlm_version4;
>> +extern struct rpc_version nlm_version4;
>>  
>>  #endif /* LOCKD_XDR4_H */
>> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
>> index bfd0d1b..a52ddd5 100644
>> --- a/include/linux/nfs_xdr.h
>> +++ b/include/linux/nfs_xdr.h
>> @@ -1300,11 +1300,11 @@ struct nfs_rpc_ops {
>>  extern const struct nfs_rpc_ops	nfs_v2_clientops;
>>  extern const struct nfs_rpc_ops	nfs_v3_clientops;
>>  extern const struct nfs_rpc_ops	nfs_v4_clientops;
>> -extern const struct rpc_version nfs_version2;
>> -extern const struct rpc_version nfs_version3;
>> -extern const struct rpc_version nfs_version4;
>> +extern struct rpc_version nfs_version2;
>> +extern struct rpc_version nfs_version3;
>> +extern struct rpc_version nfs_version4;
>>  
>> -extern const struct rpc_version nfsacl_version3;
>> +extern struct rpc_version nfsacl_version3;
>>  extern const struct rpc_program nfsacl_program;
>>  
>>  #endif
>> diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h
>> index 523547e..624d8e3 100644
>> --- a/include/linux/sunrpc/clnt.h
>> +++ b/include/linux/sunrpc/clnt.h
>> @@ -72,7 +72,7 @@ struct rpc_program {
>>  	const char *		name;		/* protocol name */
>>  	u32			number;		/* program number */
>>  	unsigned int		nrvers;		/* number of versions */
>> -	const struct rpc_version **	version;	/* version array */
>> +	struct rpc_version **	version;	/* version array */
> 
> This shouldn't be necessary.


Ok, I'll take it out (probably with the rest of the const changes).

- Bryan

> 
>>  	struct rpc_stat *	stats;		/* statistics */
>>  	const char *		pipe_dir_name;	/* path to rpc_pipefs dir */
>>  };
>> diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c
>> index 207a746..227b5fb 100644
>> --- a/net/sunrpc/rpcb_clnt.c
>> +++ b/net/sunrpc/rpcb_clnt.c
>> @@ -1081,25 +1081,25 @@ static const struct rpcb_info rpcb_next_version6[] = {
>>  	},
>>  };
>>  
>> -static const struct rpc_version rpcb_version2 = {
>> +static struct rpc_version rpcb_version2 = {
>>  	.number		= RPCBVERS_2,
>>  	.nrprocs	= ARRAY_SIZE(rpcb_procedures2),
>>  	.procs		= rpcb_procedures2
>>  };
>>  
>> -static const struct rpc_version rpcb_version3 = {
>> +static struct rpc_version rpcb_version3 = {
>>  	.number		= RPCBVERS_3,
>>  	.nrprocs	= ARRAY_SIZE(rpcb_procedures3),
>>  	.procs		= rpcb_procedures3
>>  };
>>  
>> -static const struct rpc_version rpcb_version4 = {
>> +static struct rpc_version rpcb_version4 = {
>>  	.number		= RPCBVERS_4,
>>  	.nrprocs	= ARRAY_SIZE(rpcb_procedures4),
>>  	.procs		= rpcb_procedures4
>>  };
>>  
>> -static const struct rpc_version *rpcb_version[] = {
>> +static struct rpc_version *rpcb_version[] = {
>>  	NULL,
>>  	NULL,
>>  	&rpcb_version2,
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux