diff options
author | mckusick <mckusick@FreeBSD.org> | 2001-04-16 22:22:21 +0000 |
---|---|---|
committer | mckusick <mckusick@FreeBSD.org> | 2001-04-16 22:22:21 +0000 |
commit | 8553bca948638af0851ed308cfc71c940bbc179e (patch) | |
tree | 22d991906cdeef6ffaca97cddaf80f72161dae29 /sbin/fsck_ffs/fsutil.c | |
parent | 3b359dad32baa6f19fa388a452fd376f08bb28a6 (diff) | |
download | FreeBSD-src-8553bca948638af0851ed308cfc71c940bbc179e.zip FreeBSD-src-8553bca948638af0851ed308cfc71c940bbc179e.tar.gz |
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 <ufs/ffs/fs.h> defining FS_NEEDSFSCK for this to compile.
Diffstat (limited to 'sbin/fsck_ffs/fsutil.c')
-rw-r--r-- | sbin/fsck_ffs/fsutil.c | 28 |
1 files changed, 26 insertions, 2 deletions
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); } |