diff options
author | Rick Macklem <rmacklem@FreeBSD.org> | 2022-07-01 21:43:17 +0000 |
---|---|---|
committer | Rick Macklem <rmacklem@FreeBSD.org> | 2022-07-15 01:45:43 +0000 |
commit | 02915e5ff91f45bf7454c35a24a54bcda83d47ac (patch) | |
tree | 0f9731354f56318e24ac0f026578fcd37ba02cc5 | |
parent | 831c6b8edda6c8d25db43e4d4bbf5120651bd1ec (diff) | |
download | src-02915e5ff91f45bf7454c35a24a54bcda83d47ac.tar.gz src-02915e5ff91f45bf7454c35a24a54bcda83d47ac.zip |
mount_nfs: Warn that intr, soft are not safe for NFSv4
If the "intr" and/or "soft" mount options are used for
NFSv4 mounts, the protocol can be broken when the
operation returns without waiting for the RPC reply.
The likelyhood of failure increases for NFSv4.1/4.2
mounts, since the session slot will be broken when
an RPC reply is not processed.
This is mentioned in the BUGS section of "man mount_nfs",
but more needs to be done. This patch adds code that
generates a warning message when the mount is done.
PR: 260011
(cherry picked from commit c0d14b0220ae22d25462cef191f20e9f04c5e87e)
-rw-r--r-- | sbin/mount_nfs/mount_nfs.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/sbin/mount_nfs/mount_nfs.c b/sbin/mount_nfs/mount_nfs.c index 6ea861193df8..284b34323885 100644 --- a/sbin/mount_nfs/mount_nfs.c +++ b/sbin/mount_nfs/mount_nfs.c @@ -73,6 +73,7 @@ __FBSDID("$FreeBSD$"); #include <errno.h> #include <fcntl.h> #include <netdb.h> +#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -160,7 +161,9 @@ main(int argc, char *argv[]) char mntpath[MAXPATHLEN], errmsg[255]; char hostname[MAXHOSTNAMELEN + 1], gssn[MAXHOSTNAMELEN + 50]; const char *gssname, *nmount_errstr; + bool softintr; + softintr = false; iov = NULL; iovlen = 0; memset(errmsg, 0, sizeof(errmsg)); @@ -210,6 +213,7 @@ main(int argc, char *argv[]) case 'i': printf("-i deprecated, use -o intr\n"); build_iovec(&iov, &iovlen, "intr", NULL, 0); + softintr = true; break; case 'L': printf("-L deprecated, use -o nolockd\n"); @@ -366,6 +370,10 @@ main(int argc, char *argv[]) "value -- %s", val); } pass_flag_to_nmount=0; + } else if (strcmp(opt, "soft") == 0) { + softintr = true; + } else if (strcmp(opt, "intr") == 0) { + softintr = true; } if (pass_flag_to_nmount) { build_iovec(&iov, &iovlen, opt, @@ -395,6 +403,7 @@ main(int argc, char *argv[]) case 's': printf("-s deprecated, use -o soft\n"); build_iovec(&iov, &iovlen, "soft", NULL, 0); + softintr = true; break; case 'T': nfsproto = IPPROTO_TCP; @@ -433,6 +442,11 @@ main(int argc, char *argv[]) /* NOTREACHED */ } + /* Warn that NFSv4 mounts only work correctly as hard mounts. */ + if (mountmode == V4 && softintr) + warnx("Warning, options soft and/or intr cannot be safely used" + " for NFSv4. See the BUGS section of mount_nfs(8)"); + spec = *argv++; mntname = *argv; |