Skip to content

Commit 3165a30

Browse files
neilbrownsmb49
authored andcommitted
NFSv3: only use NFS timeout for MOUNT when protocols are compatible
BugLink: https://bugs.launchpad.net/bugs/2100292 [ Upstream commit 6e2a10343ecb71c4457bc16be05758f9c7aae7d9 ] If a timeout is specified in the mount options, it currently applies to both the NFS protocol and (with v3) the MOUNT protocol. This is sensible when they both use the same underlying protocol, or those protocols are compatible w.r.t timeouts as RDMA and TCP are. However if, for example, NFS is using TCP and MOUNT is using UDP then using the same timeout doesn't make much sense. If you mount -o vers=3,proto=tcp,mountproto=udp,timeo=600,retrans=5 \ server:/path /mountpoint then the timeo=600 which was intended for the NFS/TCP request will apply to the MOUNT/UDP requests with the result that there will only be one request sent (because UDP has a maximum timeout of 60 seconds). This is not what a reasonable person might expect. This patch disables the sharing of timeout information in cases where the underlying protocols are not compatible. Fixes: c9301cb ("nfs: hornor timeo and retrans option when mounting NFSv3") Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Koichiro Den <koichiro.den@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
1 parent 17cdba5 commit 3165a30

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

fs/nfs/super.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,15 @@ static int nfs_request_mount(struct fs_context *fc,
874874
* Now ask the mount server to map our export path
875875
* to a file handle.
876876
*/
877-
status = nfs_mount(&request, ctx->timeo, ctx->retrans);
877+
if ((request.protocol == XPRT_TRANSPORT_UDP) ==
878+
!(ctx->flags & NFS_MOUNT_TCP))
879+
/*
880+
* NFS protocol and mount protocol are both UDP or neither UDP
881+
* so timeouts are compatible. Use NFS timeouts for MOUNT
882+
*/
883+
status = nfs_mount(&request, ctx->timeo, ctx->retrans);
884+
else
885+
status = nfs_mount(&request, NFS_UNSPEC_TIMEO, NFS_UNSPEC_RETRANS);
878886
if (status != 0) {
879887
dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n",
880888
request.hostname, status);

0 commit comments

Comments
 (0)