summaryrefslogtreecommitdiffstats
path: root/sbin/fsck_ffs/fsutil.c
diff options
context:
space:
mode:
authormckusick <mckusick@FreeBSD.org>2001-04-16 22:22:21 +0000
committermckusick <mckusick@FreeBSD.org>2001-04-16 22:22:21 +0000
commit8553bca948638af0851ed308cfc71c940bbc179e (patch)
tree22d991906cdeef6ffaca97cddaf80f72161dae29 /sbin/fsck_ffs/fsutil.c
parent3b359dad32baa6f19fa388a452fd376f08bb28a6 (diff)
downloadFreeBSD-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.c28
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);
}
OpenPOWER on IntegriCloud