mirror of
https://github.com/freebsd/freebsd-src
synced 2024-11-05 18:22:52 +00:00
Added filesystem clean bit support. This only affects fsck during a
preen (-p), and in that case the filesystem is skipped if it is clean. A new flag "-f" for 'force' has been added which basically gives back the old behavior of checking all the filesystems all the time. This very closely models the behavior of SunOS and Ultrix.
This commit is contained in:
parent
e0e9c42112
commit
41cee58cd8
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=2153
9 changed files with 84 additions and 6 deletions
|
@ -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:
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue