* Copyright (c) 1980, 1986, 1993
* The Regents of the University of California. All rights reserved.
* %sccs.include.redist.c%
static char copyright
[] =
"@(#) Copyright (c) 1980, 1986, 1993\n\
The Regents of the University of California. All rights reserved.\n";
static char sccsid
[] = "@(#)main.c 8.1 (Berkeley) %G%";
#include <ufs/ufs/dinode.h>
void catch(), catchquit(), voidquit();
extern int docheck(), checkfilesys();
extern char *optarg
, *blockcheck();
while ((ch
= getopt(argc
, argv
, "dpnNyYb:c:l:m:")) != EOF
) {
bflag
= argtoi('b', "number", optarg
, 10);
printf("Alternate super block location: %d\n", bflag
);
cvtlevel
= argtoi('c', "conversion level", optarg
, 10);
maxrun
= argtoi('l', "number", optarg
, 10);
lfmode
= argtoi('m', "mode", optarg
, 8);
errexit("bad mode to -m: %o\n", lfmode
);
printf("** lost+found creation mode %o\n", lfmode
);
errexit("%c option?\n", ch
);
if (signal(SIGINT
, SIG_IGN
) != SIG_IGN
)
(void)signal(SIGINT
, catch);
(void)signal(SIGQUIT
, catchquit
);
(void)checkfilesys(blockcheck(*argv
++), 0, 0L, 0);
ret
= checkfstab(preen
, maxrun
, docheck
, checkfilesys
);
argtoi(flag
, req
, str
, base
)
ret
= (int)strtol(str
, &cp
, base
);
errexit("-%c flag requires a %s\n", flag
, req
);
* Determine whether a filesystem should be checked.
register struct fstab
*fsp
;
if (strcmp(fsp
->fs_vfstype
, "ufs") ||
(strcmp(fsp
->fs_type
, FSTAB_RW
) &&
strcmp(fsp
->fs_type
, FSTAB_RO
)) ||
* Check the specified filesystem.
checkfilesys(filesys
, mntpt
, auxdata
, child
)
daddr_t n_ffree
, n_bfree
;
(void)signal(SIGQUIT
, voidquit
);
if (setup(filesys
) == 0) {
pfatal("CAN'T CHECK FILE SYSTEM.");
* 1: scan inodes tallying blocks used
printf("** Last Mounted on %s\n", sblock
.fs_fsmnt
);
printf("** Root file system\n");
printf("** Phase 1 - Check Blocks and Sizes\n");
* 1b: locate first references to duplicates, if any
pfatal("INTERNAL ERROR: dups with -p");
printf("** Phase 1b - Rescan For More DUPS\n");
* 2: traverse directories from root to mark all connected directories
printf("** Phase 2 - Check Pathnames\n");
* 3: scan inodes looking for disconnected directories
printf("** Phase 3 - Check Connectivity\n");
* 4: scan inodes looking for disconnected files; check reference counts
printf("** Phase 4 - Check Reference Counts\n");
* 5: check and repair resource counts in cylinder groups
printf("** Phase 5 - Check Cyl groups\n");
* print out summary statistics
n_ffree
= sblock
.fs_cstotal
.cs_nffree
;
n_bfree
= sblock
.fs_cstotal
.cs_nbfree
;
pwarn("%ld files, %ld used, %ld free ",
n_files
, n_blks
, n_ffree
+ sblock
.fs_frag
* n_bfree
);
printf("(%ld frags, %ld blocks, %d.%d%% fragmentation)\n",
n_ffree
, n_bfree
, (n_ffree
* 100) / sblock
.fs_dsize
,
((n_ffree
* 1000 + sblock
.fs_dsize
/ 2) / sblock
.fs_dsize
) % 10);
(n_files
-= maxino
- ROOTINO
- sblock
.fs_cstotal
.cs_nifree
))
printf("%ld files missing\n", n_files
);
n_blks
+= sblock
.fs_ncg
*
(cgdmin(&sblock
, 0) - cgsblock(&sblock
, 0));
n_blks
+= cgsblock(&sblock
, 0) - cgbase(&sblock
, 0);
n_blks
+= howmany(sblock
.fs_cssize
, sblock
.fs_fsize
);
if (n_blks
-= maxfsblock
- (n_ffree
+ sblock
.fs_frag
* n_bfree
))
printf("%ld blocks missing\n", n_blks
);
printf("The following duplicate blocks remain:");
for (dp
= duplist
; dp
; dp
= dp
->next
)
printf(" %ld,", dp
->dup
);
printf("The following zero link count inodes remain:");
for (zlnp
= zlnhead
; zlnp
; zlnp
= zlnp
->next
)
printf(" %lu,", zlnp
->zlncnt
);
zlnhead
= (struct zlncnt
*)0;
duplist
= (struct dups
*)0;
muldup
= (struct dups
*)0;
(void)time(&sblock
.fs_time
);
if (cvtlevel
&& sblk
.b_dirty
) {
* Write out the duplicate super blocks
for (cylno
= 0; cylno
< sblock
.fs_ncg
; cylno
++)
bwrite(fswritefd
, (char *)&sblock
,
fsbtodb(&sblock
, cgsblock(&sblock
, cylno
)), SBSIZE
);
printf("\n***** FILE SYSTEM WAS MODIFIED *****\n");
* We modified the root. Do a mount update on
* it, unless it is read-write, so we can continue.
if (statfs("/", &stfs_buf
) == 0) {
long flags
= stfs_buf
.f_flags
;
if (flags
& MNT_RDONLY
) {
flags
|= MNT_UPDATE
| MNT_RELOAD
;
ret
= mount(MOUNT_UFS
, "/", flags
, &args
);
printf("\n***** REBOOT NOW *****\n");