summaryrefslogtreecommitdiffstats
path: root/sbin/fsck_ffs
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/fsck_ffs')
-rw-r--r--sbin/fsck_ffs/fsck.h1
-rw-r--r--sbin/fsck_ffs/fsck_ffs.87
-rw-r--r--sbin/fsck_ffs/main.c22
3 files changed, 28 insertions, 2 deletions
diff --git a/sbin/fsck_ffs/fsck.h b/sbin/fsck_ffs/fsck.h
index 7fa831f..0a49e4c 100644
--- a/sbin/fsck_ffs/fsck.h
+++ b/sbin/fsck_ffs/fsck.h
@@ -164,6 +164,7 @@ long numdirs, listmax, inplast;
char *cdevname; /* name of device being checked */
long dev_bsize; /* computed value of DEV_BSIZE */
long secsize; /* actual disk sector size */
+char fflag; /* force fs check (ignore clean flag) */
char nflag; /* assume a no response */
char yflag; /* assume a yes response */
int bflag; /* location of alternate super block */
diff --git a/sbin/fsck_ffs/fsck_ffs.8 b/sbin/fsck_ffs/fsck_ffs.8
index cf8c499..94e31ef 100644
--- a/sbin/fsck_ffs/fsck_ffs.8
+++ b/sbin/fsck_ffs/fsck_ffs.8
@@ -40,6 +40,7 @@
.Sh SYNOPSIS
.Nm fsck
.Fl p
+.Op Fl f
.Op Fl m Ar mode
.Nm fsck
.Op Fl b Ar block#
@@ -72,6 +73,12 @@ The disk drive containing each filesystem is inferred from the longest prefix
of the device name that ends in a digit; the remaining characters are assumed
to be the partition designator.
.Pp
+The clean flag of each filesystem's superblock is examined and only those filesystems that
+are not marked clean are checked. If the
+.Fl f
+option is specified, the filesystems
+will be checked regardless of the state of their clean flag.
+.Pp
The kernel takes care that only a restricted class of innocuous filesystem
inconsistencies can happen unless hardware or software failures intervene.
These are limited to the following:
diff --git a/sbin/fsck_ffs/main.c b/sbin/fsck_ffs/main.c
index 2e69715..f2dba1c 100644
--- a/sbin/fsck_ffs/main.c
+++ b/sbin/fsck_ffs/main.c
@@ -43,6 +43,7 @@ static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 1/23/94";
#include <sys/param.h>
#include <sys/time.h>
+#include <sys/proc.h>
#include <sys/mount.h>
#include <ufs/ufs/dinode.h>
#include <ufs/ffs/fs.h>
@@ -67,7 +68,7 @@ main(argc, argv)
extern int optind;
sync();
- while ((ch = getopt(argc, argv, "dpnNyYb:c:l:m:")) != EOF) {
+ while ((ch = getopt(argc, argv, "dfpnNyYb:c:l:m:")) != EOF) {
switch (ch) {
case 'p':
preen++;
@@ -86,6 +87,10 @@ main(argc, argv)
debug++;
break;
+ case 'f':
+ fflag++;
+ break;
+
case 'l':
maxrun = argtoi('l', "number", optarg, 10);
break;
@@ -182,6 +187,18 @@ checkfilesys(filesys, mntpt, auxdata, child)
pfatal("CAN'T CHECK FILE SYSTEM.");
return (0);
}
+
+ if (preen && sblock.fs_clean && !fflag) {
+ pwarn("clean, %ld free ", sblock.fs_cstotal.cs_nffree +
+ sblock.fs_frag * sblock.fs_cstotal.cs_nbfree);
+ printf("(%ld frags, %ld blocks, %.1f%% fragmentation)\n",
+ sblock.fs_cstotal.cs_nffree,
+ sblock.fs_cstotal.cs_nbfree,
+ (float)(sblock.fs_cstotal.cs_nffree * 100) /
+ sblock.fs_dsize);
+ return(0);
+ }
+
/*
* 1: scan inodes tallying blocks used
*/
@@ -268,7 +285,8 @@ checkfilesys(filesys, mntpt, auxdata, child)
duplist = (struct dups *)0;
muldup = (struct dups *)0;
inocleanup();
- if (fsmodified) {
+ if (fsmodified || (!sblock.fs_clean && preen && !nflag && !hotroot)) {
+ sblock.fs_clean = 1;
(void)time(&sblock.fs_time);
sbdirty();
}
OpenPOWER on IntegriCloud