Add flag to disable inital reboot(8) userland sync

Add -N flag to reboot(8) which bypasses the userland sync(2) during
reboot(8) while still allow the kernel sync during the reboot(2) syscall
to occur.

An example use of this is when rebooting with disconnected iSCSI sessions
which would otherwise cause the reboot to hang on BIOs that will never
complete.

Reviewed by:	bjk
MFC after:	2 weeks
Sponsored by:	Multiplay
Differential Revision:	https://reviews.freebsd.org/D4449
This commit is contained in:
Steven Hartland 2015-12-15 14:17:07 +00:00
parent af1e9f5a46
commit 6237ce0841
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=292266
2 changed files with 23 additions and 7 deletions

View file

@ -28,7 +28,7 @@
.\" @(#)reboot.8 8.1 (Berkeley) 6/9/93
.\" $FreeBSD$
.\"
.Dd May 22, 2015
.Dd Dec 12, 2015
.Dt REBOOT 8
.Os
.Sh NAME
@ -39,16 +39,16 @@
.Nd stopping and restarting the system
.Sh SYNOPSIS
.Nm halt
.Op Fl lnpq
.Op Fl lNnpq
.Op Fl k Ar kernel
.Nm
.Op Fl dlnpqr
.Op Fl dlNnpqr
.Op Fl k Ar kernel
.Nm fasthalt
.Op Fl lnpq
.Op Fl lNnpq
.Op Fl k Ar kernel
.Nm fastboot
.Op Fl dlnpq
.Op Fl dlNnpq
.Op Fl k Ar kernel
.Sh DESCRIPTION
The
@ -94,6 +94,16 @@ that call
or
.Nm halt
and log this themselves.
.It Fl N
The file system cache is not flushed during the initial process clean-up,
however the kernel level
.Xr reboot 2
is still processed with a sync.
This option can be useful for performing a
.Dq best-effort
reboot when devices might be unavailable.
This can happen when devices have been disconnected, such as with
.Xr iscsi 4 .
.It Fl n
The file system cache is not flushed.
This option should probably not be used.

View file

@ -67,7 +67,7 @@ main(int argc, char *argv[])
{
struct utmpx utx;
const struct passwd *pw;
int ch, howto, i, fd, lflag, nflag, qflag, sverrno;
int ch, howto, i, fd, lflag, nflag, qflag, sverrno, Nflag;
u_int pageins;
const char *user, *kernel = NULL;
@ -77,7 +77,7 @@ main(int argc, char *argv[])
} else
howto = 0;
lflag = nflag = qflag = 0;
while ((ch = getopt(argc, argv, "dk:lnpqr")) != -1)
while ((ch = getopt(argc, argv, "dk:lNnpqr")) != -1)
switch(ch) {
case 'd':
howto |= RB_DUMP;
@ -92,6 +92,10 @@ main(int argc, char *argv[])
nflag = 1;
howto |= RB_NOSYNC;
break;
case 'N':
nflag = 1;
Nflag = 1;
break;
case 'p':
howto |= RB_POWEROFF;
break;
@ -110,6 +114,8 @@ main(int argc, char *argv[])
if ((howto & (RB_DUMP | RB_HALT)) == (RB_DUMP | RB_HALT))
errx(1, "cannot dump (-d) when halting; must reboot instead");
if (Nflag && (howto & RB_NOSYNC) != 0)
errx(1, "-N cannot be used with -n");
if ((howto & RB_REROOT) != 0 && howto != RB_REROOT)
errx(1, "-r cannot be used with -d, -n, or -p");
if (geteuid()) {