aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-imx/NFS-allow-nfs-root-mount-to-use-alternate-rpc-ports.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-imx/NFS-allow-nfs-root-mount-to-use-alternate-rpc-ports.patch')
-rw-r--r--recipes-kernel/linux/linux-imx/NFS-allow-nfs-root-mount-to-use-alternate-rpc-ports.patch241
1 files changed, 241 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-imx/NFS-allow-nfs-root-mount-to-use-alternate-rpc-ports.patch b/recipes-kernel/linux/linux-imx/NFS-allow-nfs-root-mount-to-use-alternate-rpc-ports.patch
new file mode 100644
index 00000000..7597fa1c
--- /dev/null
+++ b/recipes-kernel/linux/linux-imx/NFS-allow-nfs-root-mount-to-use-alternate-rpc-ports.patch
@@ -0,0 +1,241 @@
+From e85103e27b7591337d3240cf0ab2670d0ab73d52 Mon Sep 17 00:00:00 2001
+From: Jason Wessel <jason.wessel@windriver.com>
+Date: Wed, 7 Jan 2009 00:59:33 -0500
+Subject: [PATCH] NFS: allow nfs root mount to use alternate rpc ports
+
+Allow an nfs root mount to use alternate RPC ports for mountd and nfsd.
+
+Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
+[forward port to 2.6.33+]
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+---
+ fs/nfs/client.c | 10 ++++++++++
+ fs/nfs/internal.h | 4 +++-
+ fs/nfs/mount_clnt.c | 3 ++-
+ fs/nfs/super.c | 33 ++++++++++++++++++++++++++++++++-
+ include/linux/nfs_fs_sb.h | 1 +
+ include/linux/nfs_mount.h | 4 +++-
+ 6 files changed, 51 insertions(+), 4 deletions(-)
+
+diff --git a/fs/nfs/client.c b/fs/nfs/client.c
+index d25b525..b706c02 100644
+--- a/fs/nfs/client.c
++++ b/fs/nfs/client.c
+@@ -105,6 +105,7 @@ struct nfs_client_initdata {
+ const struct nfs_rpc_ops *rpc_ops;
+ int proto;
+ u32 minorversion;
++ int nfs_prog;
+ };
+
+ /*
+@@ -123,6 +124,7 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_
+ goto error_0;
+
+ clp->rpc_ops = cl_init->rpc_ops;
++ clp->nfs_prog = cl_init->nfs_prog;
+
+ atomic_set(&clp->cl_count, 1);
+ clp->cl_cons_state = NFS_CS_INITING;
+@@ -448,6 +450,9 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat
+ /* Match nfsv4 minorversion */
+ if (clp->cl_minorversion != data->minorversion)
+ continue;
++ if (clp->nfs_prog != data->nfs_prog)
++ continue;
++
+ /* Match the full socket address */
+ if (!nfs_sockaddr_cmp(sap, clap))
+ continue;
+@@ -618,6 +623,10 @@ static int nfs_create_rpc_client(struct nfs_client *clp,
+ if (!IS_ERR(clp->cl_rpcclient))
+ return 0;
+
++ if (clp->nfs_prog)
++ nfs_program.number = clp->nfs_prog;
++ else
++ nfs_program.number = NFS_PROGRAM;
+ clnt = rpc_create(&args);
+ if (IS_ERR(clnt)) {
+ dprintk("%s: cannot create RPC client. Error = %ld\n",
+@@ -786,6 +795,7 @@ static int nfs_init_server(struct nfs_server *server,
+ .addrlen = data->nfs_server.addrlen,
+ .rpc_ops = &nfs_v2_clientops,
+ .proto = data->nfs_server.protocol,
++ .nfs_prog = data->nfs_prog,
+ };
+ struct rpc_timeout timeparms;
+ struct nfs_client *clp;
+diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
+index e70f44b..3e2649f 100644
+--- a/fs/nfs/internal.h
++++ b/fs/nfs/internal.h
+@@ -71,6 +71,8 @@ struct nfs_parsed_mount_data {
+ int timeo, retrans;
+ int acregmin, acregmax,
+ acdirmin, acdirmax;
++ int nfs_prog;
++ int mount_prog;
+ int namlen;
+ unsigned int options;
+ unsigned int bsize;
+@@ -116,7 +118,7 @@ struct nfs_mount_request {
+ rpc_authflavor_t *auth_flavs;
+ };
+
+-extern int nfs_mount(struct nfs_mount_request *info);
++extern int nfs_mount(struct nfs_mount_request *info, int prog);
+ extern void nfs_umount(const struct nfs_mount_request *info);
+
+ /* client.c */
+diff --git a/fs/nfs/mount_clnt.c b/fs/nfs/mount_clnt.c
+index 59047f8..0a2bd63 100644
+--- a/fs/nfs/mount_clnt.c
++++ b/fs/nfs/mount_clnt.c
+@@ -141,7 +141,7 @@ struct mnt_fhstatus {
+ *
+ * Uses default timeout parameters specified by underlying transport.
+ */
+-int nfs_mount(struct nfs_mount_request *info)
++int nfs_mount(struct nfs_mount_request *info, int m_prog)
+ {
+ struct mountres result = {
+ .fh = info->fh,
+@@ -171,6 +171,7 @@ int nfs_mount(struct nfs_mount_request *info)
+ if (info->noresvport)
+ args.flags |= RPC_CLNT_CREATE_NONPRIVPORT;
+
++ mnt_program.number = m_prog;
+ mnt_clnt = rpc_create(&args);
+ if (IS_ERR(mnt_clnt))
+ goto out_clnt_err;
+diff --git a/fs/nfs/super.c b/fs/nfs/super.c
+index f9df16d..0b3bbf8 100644
+--- a/fs/nfs/super.c
++++ b/fs/nfs/super.c
+@@ -94,6 +94,8 @@ enum {
+ Opt_mountvers,
+ Opt_nfsvers,
+ Opt_minorversion,
++ Opt_mountprog,
++ Opt_nfsprog,
+
+ /* Mount options that take string arguments */
+ Opt_sec, Opt_proto, Opt_mountproto, Opt_mounthost,
+@@ -160,6 +162,8 @@ static const match_table_t nfs_mount_option_tokens = {
+ { Opt_nfsvers, "nfsvers=%s" },
+ { Opt_nfsvers, "vers=%s" },
+ { Opt_minorversion, "minorversion=%s" },
++ { Opt_mountprog, "mountprog=%s" },
++ { Opt_nfsprog, "nfsprog=%s" },
+
+ { Opt_sec, "sec=%s" },
+ { Opt_proto, "proto=%s" },
+@@ -787,6 +791,8 @@ static struct nfs_parsed_mount_data *nfs_alloc_parsed_mount_data(unsigned int ve
+ data->acregmax = NFS_DEF_ACREGMAX;
+ data->acdirmin = NFS_DEF_ACDIRMIN;
+ data->acdirmax = NFS_DEF_ACDIRMAX;
++ data->nfs_prog = NFS_PROGRAM;
++ data->mount_prog = NFS_MNT_PROGRAM;
+ data->mount_server.port = NFS_UNSPEC_PORT;
+ data->nfs_server.port = NFS_UNSPEC_PORT;
+ data->nfs_server.protocol = XPRT_TRANSPORT_TCP;
+@@ -1168,6 +1174,26 @@ static int nfs_parse_mount_options(char *raw,
+ goto out_invalid_value;
+ mnt->acdirmax = option;
+ break;
++ case Opt_mountprog:
++ string = match_strdup(args);
++ if (string == NULL)
++ goto out_nomem;
++ rc = strict_strtoul(string, 10, &option);
++ kfree(string);
++ if (rc != 0)
++ goto out_invalid_value;
++ mnt->mount_prog = option;
++ break;
++ case Opt_nfsprog:
++ string = match_strdup(args);
++ if (string == NULL)
++ goto out_nomem;
++ rc = strict_strtoul(string, 10, &option);
++ kfree(string);
++ if (rc != 0)
++ goto out_invalid_value;
++ mnt->nfs_prog = option;
++ break;
+ case Opt_actimeo:
+ string = match_strdup(args);
+ if (string == NULL)
+@@ -1566,7 +1592,7 @@ static int nfs_try_mount(struct nfs_parsed_mount_data *args,
+ * Now ask the mount server to map our export path
+ * to a file handle.
+ */
+- status = nfs_mount(&request);
++ status = nfs_mount(&request,args->mount_prog);
+ if (status != 0) {
+ dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n",
+ request.hostname, status);
+@@ -1739,6 +1765,7 @@ static int nfs_validate_mount_data(void *options,
+ {
+ struct nfs_mount_data *data = (struct nfs_mount_data *)options;
+ struct sockaddr *sap = (struct sockaddr *)&args->nfs_server.address;
++ args->nfs_prog = NFS_PROGRAM;
+
+ if (data == NULL)
+ goto out_no_data;
+@@ -1758,6 +1785,8 @@ static int nfs_validate_mount_data(void *options,
+ goto out_no_sec;
+ case 5:
+ memset(data->context, 0, sizeof(data->context));
++ case 7:
++ args->nfs_prog = (data->version >= 7) ? data->nfs_prog : NFS_PROGRAM;
+ case 6:
+ if (data->flags & NFS_MOUNT_VER3) {
+ if (data->root.size > NFS3_FHSIZE || data->root.size == 0)
+@@ -2476,6 +2505,8 @@ static int nfs4_validate_mount_data(void *options,
+ if (data == NULL)
+ goto out_no_data;
+
++ args->nfs_prog = NFS_PROGRAM;
++
+ switch (data->version) {
+ case 1:
+ if (data->host_addrlen > sizeof(args->nfs_server.address))
+diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
+index d6e10a4..585cba4 100644
+--- a/include/linux/nfs_fs_sb.h
++++ b/include/linux/nfs_fs_sb.h
+@@ -41,6 +41,7 @@ struct nfs_client {
+
+ u32 cl_minorversion;/* NFSv4 minorversion */
+ struct rpc_cred *cl_machine_cred;
++ int nfs_prog;
+
+ #ifdef CONFIG_NFS_V4
+ u64 cl_clientid; /* constant */
+diff --git a/include/linux/nfs_mount.h b/include/linux/nfs_mount.h
+index 4499016..86beb0c 100644
+--- a/include/linux/nfs_mount.h
++++ b/include/linux/nfs_mount.h
+@@ -20,7 +20,7 @@
+ * mount-to-kernel version compatibility. Some of these aren't used yet
+ * but here they are anyway.
+ */
+-#define NFS_MOUNT_VERSION 6
++#define NFS_MOUNT_VERSION 7
+ #define NFS_MAX_CONTEXT_LEN 256
+
+ struct nfs_mount_data {
+@@ -43,6 +43,8 @@ struct nfs_mount_data {
+ struct nfs3_fh root; /* 4 */
+ int pseudoflavor; /* 5 */
+ char context[NFS_MAX_CONTEXT_LEN + 1]; /* 6 */
++ int nfs_prog; /* 7 */
++ int mount_prog; /* 7 */
+ };
+
+ /* bits in the flags field visible to user space */
+--
+1.7.9.1
+