aboutsummaryrefslogtreecommitdiff
path: root/sbin/mount_nfs
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2022-01-11 16:20:01 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2022-01-11 16:21:35 +0000
commit08a8d16cbb269d4c2be02eb67351c59d16f4ecb9 (patch)
tree9d44caafafed67a493023d4a2b66cd7d8b53ca0a /sbin/mount_nfs
parent8778e54cabe90acb07a574833155c7a6b4d9a4ea (diff)
downloadsrc-08a8d16cbb269d4c2be02eb67351c59d16f4ecb9.tar.gz
src-08a8d16cbb269d4c2be02eb67351c59d16f4ecb9.zip
Diffstat (limited to 'sbin/mount_nfs')
-rw-r--r--sbin/mount_nfs/mount_nfs.814
-rw-r--r--sbin/mount_nfs/mount_nfs.c23
2 files changed, 32 insertions, 5 deletions
diff --git a/sbin/mount_nfs/mount_nfs.8 b/sbin/mount_nfs/mount_nfs.8
index 648cb2128e90..5725b6eccf65 100644
--- a/sbin/mount_nfs/mount_nfs.8
+++ b/sbin/mount_nfs/mount_nfs.8
@@ -28,7 +28,7 @@
.\" @(#)mount_nfs.8 8.3 (Berkeley) 3/29/95
.\" $FreeBSD$
.\"
-.Dd July 10, 2021
+.Dd January 11, 2022
.Dt MOUNT_NFS 8
.Os
.Sh NAME
@@ -129,6 +129,18 @@ trying the mount in the background.
Useful for
.Xr fstab 5 ,
where the file system mount is not critical to multiuser operation.
+.It Cm bgnow
+Like
+.Cm bg ,
+fork off a child to keep trying the mount in the background,
+but do not attempt to mount in the foreground first.
+This eliminates a
+60+ second timeout when the server is not responding.
+Useful for speeding up the boot process of a client when the server is
+likely to be unavailable.
+This is often the case for interdependent servers
+such as cross-mounted servers (each of two servers is an NFS client of
+the other) and for cluster nodes that must boot before the file servers.
.It Cm deadthresh Ns = Ns Aq Ar value
Set the
.Dq "dead server threshold"
diff --git a/sbin/mount_nfs/mount_nfs.c b/sbin/mount_nfs/mount_nfs.c
index e1eaf206e982..898a6dc9d724 100644
--- a/sbin/mount_nfs/mount_nfs.c
+++ b/sbin/mount_nfs/mount_nfs.c
@@ -103,10 +103,11 @@ struct nfhret {
long fhsize;
u_char nfh[NFS3_FHSIZE];
};
-#define BGRND 1
-#define ISBGRND 2
-#define OF_NOINET4 4
-#define OF_NOINET6 8
+#define BGRND 0x01
+#define ISBGRND 0x02
+#define OF_NOINET4 0x04
+#define OF_NOINET6 0x08
+#define BGRNDNOW 0x10
static int retrycnt = -1;
static int opflags = 0;
static int nfsproto = IPPROTO_TCP;
@@ -242,6 +243,9 @@ main(int argc, char *argv[])
if (strcmp(opt, "bg") == 0) {
opflags |= BGRND;
pass_flag_to_nmount=0;
+ } else if (strcmp(opt, "bgnow") == 0) {
+ opflags |= BGRNDNOW;
+ pass_flag_to_nmount=0;
} else if (strcmp(opt, "fg") == 0) {
/* same as not specifying -o bg */
pass_flag_to_nmount=0;
@@ -421,6 +425,9 @@ main(int argc, char *argv[])
argc -= optind;
argv += optind;
+ if ((opflags & (BGRND | BGRNDNOW)) == (BGRND | BGRNDNOW))
+ errx(1, "Options bg and bgnow are mutually exclusive");
+
if (argc != 2) {
usage();
/* NOTREACHED */
@@ -649,6 +656,14 @@ getnfsargs(char *spec, struct iovec **iov, int *iovlen)
}
}
+ if ((opflags & (BGRNDNOW | ISBGRND)) == BGRNDNOW) {
+ warnx("Mount %s:%s, backgrounding",
+ hostp, spec);
+ opflags |= ISBGRND;
+ if (daemon(0, 0) != 0)
+ err(1, "daemon");
+ }
+
ret = TRYRET_LOCALERR;
for (;;) {
/*