mount_nfs: Add a "bgnow" NFS mount option

The "bg" option does not go background until the initial mount
attempt fails, which can take 60+ seconds.

This new "bgnow" option goes background immediately, avoiding
the 60+ second delay, if the NFS server is not yet available.

The man page update is a content change.

Tested by:	jwb
Reviewed by:	debdrup, emaste
PR:		260764
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D33733
This commit is contained in:
Rick Macklem 2022-01-11 08:20:01 -08:00
parent 8778e54cab
commit 08a8d16cbb
2 changed files with 32 additions and 5 deletions

View File

@ -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"

View File

@ -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 (;;) {
/*