aboutsummaryrefslogtreecommitdiff
path: root/sys/nfsclient
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2012-01-25 00:22:53 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2012-01-25 00:22:53 +0000
commit640372388086834e56fe505e287c42ff1580bbd6 (patch)
treec530b4124fc83044c9646391fafc6de00b247fc5 /sys/nfsclient
parentf17b67e14b0c51fb287c2f1964f50e039f14851e (diff)
downloadsrc-640372388086834e56fe505e287c42ff1580bbd6.tar.gz
src-640372388086834e56fe505e287c42ff1580bbd6.zip
If a mount -u is done to either NFS client that switches it
from TCP to UDP and the rsize/wsize/readdirsize is greater than NFS_MAXDGRAMDATA, it is possible for a thread doing an I/O RPC to get stuck repeatedly doing retries. This happens because the RPC will use a resize/wsize/readdirsize that won't work for UDP and, as such, it will keep failing indefinitely. This patch returns an error for this case, to avoid the problem. A discussion on freebsd-fs@ seemed to indicate that returning an error was preferable to silently ignoring the "udp"/"mntudp" option. This problem was discovered while investigating a problem reported by pjd@ via email. MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=230516
Diffstat (limited to 'sys/nfsclient')
-rw-r--r--sys/nfsclient/nfs_vfsops.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c
index fafc2537ba6f..e43c048f517b 100644
--- a/sys/nfsclient/nfs_vfsops.c
+++ b/sys/nfsclient/nfs_vfsops.c
@@ -1106,6 +1106,23 @@ nfs_mount(struct mount *mp)
error = EIO;
goto out;
}
+
+ /*
+ * Cannot switch to UDP if current rsize/wsize/readdirsize is
+ * too large, since there may be an I/O RPC in progress that
+ * will get retried after the switch to the UDP socket. These
+ * retries will fail over and over and over again.
+ */
+ if (args.sotype == SOCK_DGRAM &&
+ (nmp->nm_rsize > NFS_MAXDGRAMDATA ||
+ nmp->nm_wsize > NFS_MAXDGRAMDATA ||
+ nmp->nm_readdirsize > NFS_MAXDGRAMDATA)) {
+ vfs_mount_error(mp,
+ "old rsize/wsize/readdirsize greater than UDP max");
+ error = EINVAL;
+ goto out;
+ }
+
/*
* When doing an update, we can't change from or to
* v3, switch lockd strategies or change cookie translation