summaryrefslogtreecommitdiffstats
path: root/sbin/fsck_ffs/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/fsck_ffs/main.c')
-rw-r--r--sbin/fsck_ffs/main.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/sbin/fsck_ffs/main.c b/sbin/fsck_ffs/main.c
index a9e7e90..83bb312 100644
--- a/sbin/fsck_ffs/main.c
+++ b/sbin/fsck_ffs/main.c
@@ -47,6 +47,7 @@ static const char rcsid[] =
#include <sys/param.h>
#include <sys/stat.h>
+#include <sys/file.h>
#include <sys/time.h>
#include <sys/mount.h>
#include <sys/resource.h>
@@ -199,6 +200,7 @@ checkfilesys(filesys, mntpt, auxdata, child)
cdevname = filesys;
if (debug && preen)
pwarn("starting\n");
+ sblock_init();
/*
* If we are to do a background check:
@@ -211,14 +213,35 @@ checkfilesys(filesys, mntpt, auxdata, child)
if (bkgrdflag) {
if (mntp == NULL) {
bkgrdflag = 0;
- pwarn("NOT MOUNTED, CANNOT RUN IN BACKGROUND\n");
+ pfatal("NOT MOUNTED, CANNOT RUN IN BACKGROUND\n");
} else if ((mntp->f_flags & MNT_SOFTDEP) == 0) {
bkgrdflag = 0;
- pwarn("NOT USING SOFT UPDATES, CANNOT RUN IN BACKGROUND\n");
+ pfatal("NOT USING SOFT UPDATES, %s\n",
+ "CANNOT RUN IN BACKGROUND");
} else if ((mntp->f_flags & MNT_RDONLY) != 0) {
bkgrdflag = 0;
- pwarn("MOUNTED READ-ONLY, CANNOT RUN IN BACKGROUND\n");
- } else {
+ pfatal("MOUNTED READ-ONLY, CANNOT RUN IN BACKGROUND\n");
+ } else if ((fsreadfd = open(filesys, O_RDONLY)) >= 0) {
+ if (readsb(0) != 0) {
+ if (sblock.fs_flags & FS_NEEDSFSCK) {
+ bkgrdflag = 0;
+ pfatal("UNEXPECTED INCONSISTENCY, %s\n",
+ "CANNOT RUN IN BACKGROUND\n");
+ }
+ if ((sblock.fs_flags & FS_UNCLEAN) == 0 &&
+ skipclean && preen) {
+ /*
+ * filesystem is clean;
+ * skip snapshot and report it clean
+ */
+ pwarn("FILESYSTEM CLEAN; %s\n",
+ "SKIPPING CHECKS");
+ goto clean;
+ }
+ }
+ close(fsreadfd);
+ }
+ if (bkgrdflag) {
snprintf(snapname, sizeof snapname, "%s/.fsck_snapshot",
mntp->f_mntonname);
args.fspec = snapname;
@@ -228,7 +251,7 @@ checkfilesys(filesys, mntpt, auxdata, child)
if (errno == EEXIST && unlink(snapname) == 0)
continue;
bkgrdflag = 0;
- pwarn("CANNOT CREATE SNAPSHOT %s: %s\n",
+ pfatal("CANNOT CREATE SNAPSHOT %s: %s\n",
snapname, strerror(errno));
break;
}
@@ -243,6 +266,7 @@ checkfilesys(filesys, mntpt, auxdata, child)
pfatal("CAN'T CHECK FILE SYSTEM.");
return (0);
case -1:
+ clean:
pwarn("clean, %ld free ", sblock.fs_cstotal.cs_nffree +
sblock.fs_frag * sblock.fs_cstotal.cs_nbfree);
printf("(%d frags, %d blocks, %.1f%% fragmentation)\n",
OpenPOWER on IntegriCloud