From 7435939a76a8fe102570603cc9f5118e372dd7e2 Mon Sep 17 00:00:00 2001 From: smh Date: Wed, 6 Jan 2016 09:56:06 +0000 Subject: [PATCH] MFC: r292266 & r292947 Add flag to disable inital reboot(8) userland sync Sponsored by: Multiplay git-svn-id: svn://svn.freebsd.org/base/stable/10@293232 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sbin/reboot/reboot.8 | 19 +++++++++++++++---- sbin/reboot/reboot.c | 12 +++++++++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/sbin/reboot/reboot.8 b/sbin/reboot/reboot.8 index 13d7098ae..84dd887aa 100644 --- a/sbin/reboot/reboot.8 +++ b/sbin/reboot/reboot.8 @@ -29,6 +29,7 @@ .\" $FreeBSD$ .\" .Dd October 11, 2010 +.Dd Jan 06, 2016 .Dt REBOOT 8 .Os .Sh NAME @@ -39,16 +40,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 dlnpq +.Op Fl dlNnpq .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 +95,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. diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c index d927db03c..6d590ac1b 100644 --- a/sbin/reboot/reboot.c +++ b/sbin/reboot/reboot.c @@ -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; @@ -76,8 +76,8 @@ main(int argc, char *argv[]) howto = RB_HALT; } else howto = 0; - lflag = nflag = qflag = 0; - while ((ch = getopt(argc, argv, "dk:lnpq")) != -1) + lflag = nflag = qflag = Nflag = 0; + while ((ch = getopt(argc, argv, "dk:lNnpq")) != -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; @@ -107,6 +111,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 (geteuid()) { errno = EPERM; err(1, NULL); -- 2.45.0