summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/fs/nfsclient/nfs_clvfsops.c17
-rw-r--r--sys/nfsclient/nfs_vfsops.c17
2 files changed, 34 insertions, 0 deletions
diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c
index ccb35f1..5ddfa27 100644
--- a/sys/fs/nfsclient/nfs_clvfsops.c
+++ b/sys/fs/nfsclient/nfs_clvfsops.c
@@ -989,6 +989,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 version,
* security, switch lockd strategies or change cookie
diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c
index fafc253..e43c048 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
OpenPOWER on IntegriCloud