diff options
Diffstat (limited to 'fs/nfs/super.c')
-rw-r--r-- | fs/nfs/super.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 470b761839a5..cea9f124ceb0 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -102,6 +102,8 @@ enum { Opt_mountport, Opt_mountvers, Opt_minorversion, + Opt_mountprog, + Opt_nfsprog, /* Mount options that take string arguments */ Opt_nfsvers, @@ -167,6 +169,8 @@ static const match_table_t nfs_mount_option_tokens = { { Opt_mountport, "mountport=%s" }, { Opt_mountvers, "mountvers=%s" }, { Opt_minorversion, "minorversion=%s" }, + { Opt_mountprog, "mountprog=%s" }, + { Opt_nfsprog, "nfsprog=%s" }, { Opt_nfsvers, "nfsvers=%s" }, { Opt_nfsvers, "vers=%s" }, @@ -922,6 +926,8 @@ static struct nfs_parsed_mount_data *nfs_alloc_parsed_mount_data(void) 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; @@ -1389,6 +1395,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 = kstrtoul(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 = kstrtoul(string, 10, &option); + kfree(string); + if (rc != 0) + goto out_invalid_value; + mnt->nfs_prog = option; + break; case Opt_actimeo: if (nfs_get_option_ul(args, &option)) goto out_invalid_value; @@ -1784,7 +1810,7 @@ static int nfs_request_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); @@ -2095,6 +2121,9 @@ static int nfs23_validate_mount_data(void *options, } break; + case 7: + args->nfs_prog = (data->version >= 7) ? data->nfs_prog : NFS_PROGRAM; + break; default: return NFS_TEXT_DATA; } @@ -2157,6 +2186,7 @@ static int nfs_validate_text_mount_data(void *options, int max_namelen = PAGE_SIZE; int max_pathlen = NFS_MAXPATHLEN; struct sockaddr *sap = (struct sockaddr *)&args->nfs_server.address; + args->nfs_prog = NFS_PROGRAM; if (nfs_parse_mount_options((char *)options, args) == 0) return -EINVAL; @@ -2775,6 +2805,8 @@ static int nfs4_validate_mount_data(void *options, args->version = 4; + args->nfs_prog = NFS_PROGRAM; + switch (data->version) { case 1: if (data->host_addrlen > sizeof(args->nfs_server.address)) |