[PATCH 5/6] NFS: "proto=tcp" implies "mountproto=tcp"

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

 



If a user specifies "proto=tcp" via the legacy mount API, the mount command
also uses TCP to contact the server's mount daemon.  Ditto for "proto=udp".
This makes it easier to mount through firewalls that block one or the other
transport protocol.

Make the in-kernel NFS mount option parser emulate this behavior.

Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
---

 fs/nfs/super.c |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 1f3fa91..e2cadd9 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -749,6 +749,7 @@ static int nfs_parse_mount_options(char *raw,
 {
 	char *p, *string, *secdata;
 	int timeo = 0, retrans = 0;
+	unsigned short mount_protocol = 0;
 	int rc;
 
 	if (!raw) {
@@ -821,6 +822,8 @@ static int nfs_parse_mount_options(char *raw,
 		case Opt_udp:
 			mnt->flags &= ~NFS_MOUNT_TCP;
 			mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP;
+			if (mount_protocol == 0)
+				mount_protocol = XPRT_TRANSPORT_UDP;
 			if (timeo == 0)
 				timeo = NFS_DEF_UDP_TIMEO;
 			if (retrans == 0)
@@ -829,6 +832,8 @@ static int nfs_parse_mount_options(char *raw,
 		case Opt_tcp:
 			mnt->flags |= NFS_MOUNT_TCP;
 			mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
+			if (mount_protocol == 0)
+				mount_protocol = XPRT_TRANSPORT_TCP;
 			if (timeo == 0)
 				timeo = NFS_DEF_TCP_TIMEO;
 			if (retrans == 0)
@@ -1040,6 +1045,8 @@ static int nfs_parse_mount_options(char *raw,
 			case Opt_xprt_udp:
 				mnt->flags &= ~NFS_MOUNT_TCP;
 				mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP;
+				if (mount_protocol == 0)
+					mount_protocol = XPRT_TRANSPORT_UDP;
 				if (timeo == 0)
 					timeo = NFS_DEF_UDP_TIMEO;
 				if (retrans == 0)
@@ -1048,6 +1055,8 @@ static int nfs_parse_mount_options(char *raw,
 			case Opt_xprt_tcp:
 				mnt->flags |= NFS_MOUNT_TCP;
 				mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
+				if (mount_protocol == 0)
+					mount_protocol = XPRT_TRANSPORT_TCP;
 				if (timeo == 0)
 					timeo = NFS_DEF_TCP_TIMEO;
 				if (retrans == 0)
@@ -1076,10 +1085,10 @@ static int nfs_parse_mount_options(char *raw,
 
 			switch (token) {
 			case Opt_xprt_udp:
-				mnt->mount_server.protocol = XPRT_TRANSPORT_UDP;
+				mount_protocol = XPRT_TRANSPORT_UDP;
 				break;
 			case Opt_xprt_tcp:
-				mnt->mount_server.protocol = XPRT_TRANSPORT_TCP;
+				mount_protocol = XPRT_TRANSPORT_TCP;
 				break;
 			case Opt_xprt_rdma: /* not used for side protocols */
 			default:
@@ -1137,6 +1146,9 @@ static int nfs_parse_mount_options(char *raw,
 	if (retrans != 0)
 		mnt->retrans = retrans;
 
+	if (mount_protocol)
+		mnt->mount_server.protocol = mount_protocol;
+
 	return 1;
 
 out_nomem:

--
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