Call nfs_options2pmap() in nfs_rewrite_mount_options() instead of open-coding the logic to convert mount options to a pmap struct. The new nfs_options2pmap() function is more careful about avoiding invalid mount option values, and handles multiply-specified transport protocol options correctly. Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> --- utils/mount/stropts.c | 68 ++++--------------------------------------------- 1 files changed, 5 insertions(+), 63 deletions(-) diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index bd127ab..99be0f3 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -322,19 +322,12 @@ static int nfs_is_permanent_error(int error) * Returns a new group of mount options if successful; otherwise * NULL is returned if some failure occurred. */ -static const char *nfs_transport_opttbl[] = { - "udp", - "tcp", - NULL, -}; - static struct mount_options *nfs_rewrite_mount_options(char *str) { struct mount_options *options; char *option, new_option[64]; clnt_addr_t mnt_server = { }; clnt_addr_t nfs_server = { }; - int p; options = po_split(str); if (!options) { @@ -360,64 +353,13 @@ static struct mount_options *nfs_rewrite_mount_options(char *str) memcpy(&mnt_server.saddr, &nfs_server.saddr, sizeof(mnt_server.saddr)); - option = po_get(options, "mountport"); - if (option) - mnt_server.pmap.pm_port = atoi(option); - mnt_server.pmap.pm_prog = MOUNTPROG; - option = po_get(options, "mountvers"); - if (option) - mnt_server.pmap.pm_vers = atoi(option); - option = po_get(options, "mountproto"); - if (option) { - if (strcmp(option, "tcp") == 0) { - mnt_server.pmap.pm_prot = IPPROTO_TCP; - po_remove_all(options, "mountproto"); - } - if (strcmp(option, "udp") == 0) { - mnt_server.pmap.pm_prot = IPPROTO_UDP; - po_remove_all(options, "mountproto"); - } - } + nfs_options2pmap(options, &nfs_server.pmap, &mnt_server.pmap); - option = po_get(options, "port"); - if (option) { - nfs_server.pmap.pm_port = atoi(option); - po_remove_all(options, "port"); - } + /* The kernel NFS client doesn't support changing the RPC program + * number for these services, so reset these fields before probing + * the server's ports. */ nfs_server.pmap.pm_prog = NFS_PROGRAM; - - option = po_get(options, "nfsvers"); - if (option) { - nfs_server.pmap.pm_vers = atoi(option); - po_remove_all(options, "nfsvers"); - } - option = po_get(options, "vers"); - if (option) { - nfs_server.pmap.pm_vers = atoi(option); - po_remove_all(options, "vers"); - } - option = po_get(options, "proto"); - if (option) { - if (strcmp(option, "tcp") == 0) { - nfs_server.pmap.pm_prot = IPPROTO_TCP; - po_remove_all(options, "proto"); - } - if (strcmp(option, "udp") == 0) { - nfs_server.pmap.pm_prot = IPPROTO_UDP; - po_remove_all(options, "proto"); - } - } - p = po_rightmost(options, nfs_transport_opttbl); - switch (p) { - case 1: - nfs_server.pmap.pm_prot = IPPROTO_UDP; - break; - case 2: - nfs_server.pmap.pm_prot = IPPROTO_TCP; - break; - } - po_remove_all(options, "tcp"); - po_remove_all(options, "udp"); + mnt_server.pmap.pm_prog = MOUNTPROG; if (!probe_bothports(&mnt_server, &nfs_server)) { errno = ESPIPE; -- 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