From 8553bca948638af0851ed308cfc71c940bbc179e Mon Sep 17 00:00:00 2001 From: mckusick Date: Mon, 16 Apr 2001 22:22:21 +0000 Subject: Minor background cleanups: 1) Set the FS_NEEDSFSCK flag when unexpected problems are encountered. 2) Clear the FS_NEEDSFSCK flag after a successful foreground cleanup. 3) Refuse to run in background when the FS_NEEDSFSCK flag is set. 4) Avoid taking and removing a snapshot when the filesystem is already clean. 5) Properly implement the force cleaning (-f) flag when in preen mode. Note that you need to have revision 1.21 (date: 2001/04/14 05:26:28) of fs.h installed in defining FS_NEEDSFSCK for this to compile. --- sbin/fsck_ffs/fsutil.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'sbin/fsck_ffs/fsutil.c') diff --git a/sbin/fsck_ffs/fsutil.c b/sbin/fsck_ffs/fsutil.c index fa06dfb..c743aca 100644 --- a/sbin/fsck_ffs/fsutil.c +++ b/sbin/fsck_ffs/fsutil.c @@ -321,7 +321,8 @@ ckfini(markclean) errx(EEXIT, "panic: lost %d buffers", bufhead.b_size - cnt); pbp = pdirbp = (struct bufarea *)0; if (cursnapshot == 0 && sblock.fs_clean != markclean) { - sblock.fs_clean = markclean; + if ((sblock.fs_clean = markclean) != 0) + sblock.fs_flags &= ~(FS_UNCLEAN | FS_NEEDSFSCK); sbdirty(); ofsmodified = fsmodified; flush(fswritefd, &sblk); @@ -336,7 +337,7 @@ ckfini(markclean) printf("\n***** FILE SYSTEM STILL DIRTY *****\n"); rerun = 1; } - if (debug) + if (debug && totalreads > 0) printf("cache missed %ld of %ld (%d%%)\n", diskreads, totalreads, (int)(diskreads * 100 / totalreads)); (void)close(fsreadfd); @@ -649,6 +650,19 @@ pfatal(fmt, va_alist) if (usedsoftdep) (void)fprintf(stderr, "\nUNEXPECTED SOFT UPDATE INCONSISTENCY\n"); + /* + * Force foreground fsck to clean up inconsistency. + */ + if (bkgrdflag) { + cmd.value = FS_NEEDSFSCK; + cmd.size = 1; + if (sysctlbyname("vfs.ffs.setflags", 0, 0, + &cmd, sizeof cmd) == -1) + pwarn("CANNOT SET FS_NEEDSFSCK FLAG\n"); + fprintf(stderr, "CANNOT RUN IN BACKGROUND\n"); + ckfini(0); + exit(EEXIT); + } return; } if (cdevname == NULL) @@ -658,6 +672,16 @@ pfatal(fmt, va_alist) (void)fprintf(stderr, "\n%s: UNEXPECTED%sINCONSISTENCY; RUN fsck MANUALLY.\n", cdevname, usedsoftdep ? " SOFT UPDATE " : " "); + /* + * Force foreground fsck to clean up inconsistency. + */ + if (bkgrdflag) { + cmd.value = FS_NEEDSFSCK; + cmd.size = 1; + if (sysctlbyname("vfs.ffs.setflags", 0, 0, + &cmd, sizeof cmd) == -1) + pwarn("CANNOT SET FS_NEEDSFSCK FLAG\n"); + } ckfini(0); exit(EEXIT); } -- cgit v1.1