From 2babb8b200df9d28c6dbbd022dacf30086039e29 Mon Sep 17 00:00:00 2001 From: claudio Date: Sun, 13 Jul 2014 12:03:48 +0000 Subject: [PATCH] Intorduce the same -N flag that mount(8) just got to do the same selection of file systems with option 'net'. Again this will be used by the rc script to fsck iscsi file systems before mounting them. Again by default file systems with the net option are ignored when scanning fstab. "Get it in" deraadt@ --- sbin/fsck/fsck.8 | 13 +++++++++++-- sbin/fsck/fsck.c | 42 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/sbin/fsck/fsck.8 b/sbin/fsck/fsck.8 index 4e98e4b5839..b94b2e0ec0f 100644 --- a/sbin/fsck/fsck.8 +++ b/sbin/fsck/fsck.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: fsck.8,v 1.32 2013/02/11 17:35:46 jmc Exp $ +.\" $OpenBSD: fsck.8,v 1.33 2014/07/13 12:03:48 claudio Exp $ .\" $NetBSD: fsck.8,v 1.14 1996/10/03 20:08:29 christos Exp $ .\" .\" Copyright (c) 1996 Christos Zoulas. All rights reserved. @@ -28,7 +28,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: February 11 2013 $ +.Dd $Mdocdate: July 13 2014 $ .Dt FSCK 8 .Os .Sh NAME @@ -100,6 +100,15 @@ By default, the limit is the number of disks, running one process per disk. If a smaller limit is given, the disks are checked round-robin, one file system at a time. +.It Fl N +When using +.Xr fstab 5 , +only check filesystems that have the +.Ar net +mount option set. +By default file systems with the +.Dq net +option are ignored. .It Fl n Assume a .Dq no diff --git a/sbin/fsck/fsck.c b/sbin/fsck/fsck.c index ed02336d9ce..9b7366ef325 100644 --- a/sbin/fsck/fsck.c +++ b/sbin/fsck/fsck.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fsck.c,v 1.28 2010/11/17 11:22:42 jsing Exp $ */ +/* $OpenBSD: fsck.c,v 1.29 2014/07/13 12:03:48 claudio Exp $ */ /* $NetBSD: fsck.c,v 1.7 1996/10/03 20:06:30 christos Exp $ */ /* @@ -55,6 +55,7 @@ #include "fsutil.h" static enum { IN_LIST, NOT_IN_LIST } which = NOT_IN_LIST; +static enum { NONET_FILTER, NET_FILTER } filter = NONET_FILTER; TAILQ_HEAD(fstypelist, entry) opthead, selhead; @@ -64,9 +65,9 @@ struct entry { TAILQ_ENTRY(entry) entries; }; -static int maxrun = 0; -static char *options = NULL; -static int flags = 0; +static int maxrun; +static char *options; +static int flags; int main(int, char *[]); @@ -80,6 +81,7 @@ static char *catopt(char *, const char *, int); static void mangle(char *, int *, const char ***, int *); static void usage(void); static void *isok(struct fstab *); +static int hasopt(const char *, const char *); int @@ -108,7 +110,7 @@ main(int argc, char *argv[]) TAILQ_INIT(&selhead); TAILQ_INIT(&opthead); - while ((i = getopt(argc, argv, "dvpfnyb:l:T:t:")) != -1) + while ((i = getopt(argc, argv, "b:dfl:nNpT:t:vy")) != -1) switch (i) { case 'd': flags |= CHECK_DEBUG; @@ -152,6 +154,10 @@ main(int argc, char *argv[]) vfstype = optarg; break; + case 'N': + filter = NET_FILTER; + break; + case '?': default: usage(); @@ -207,6 +213,16 @@ isok(struct fstab *fs) if (BADTYPE(fs->fs_type)) return NULL; + switch (filter) { + case NET_FILTER: + if (!hasopt(fs->fs_mntops, "net")) + return NULL; + break; + case NONET_FILTER: + if (hasopt(fs->fs_mntops, "net")) + return NULL; + break; + } if (!selected(fs->fs_vfstype)) return NULL; @@ -463,6 +479,22 @@ mangle(char *opts, int *argcp, const char ***argvp, int *maxargcp) *maxargcp = maxargc; } +static int +hasopt(const char *mntopts, const char *option) +{ + int found; + char *opt, *optbuf; + + if (mntopts == NULL) + return (0); + optbuf = strdup(mntopts); + found = 0; + for (opt = optbuf; !found && opt != NULL; strsep(&opt, ",")) + found = !strncmp(opt, option, strlen(option)); + free(optbuf); + return (found); +} + static void usage(void) -- 2.20.1