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? > +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? > + 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. > +}; > + > +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. > 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, -- Trond Myklebust Linux NFS client maintainer NetApp Trond.Myklebust@xxxxxxxxxx www.netapp.com ��.n��������+%������w��{.n�����{��w���jg��������ݢj����G�������j:+v���w�m������w�������h�����٥