Add a simple SIGINFO handler to fsck_ffs. Shortly after receipt of
a SIGINFO (normally via Ctrl-T), a line will be output indicating the current phase number and progress information relevant to the current phase. Approved by: mckusick
This commit is contained in:
parent
e6f0df2b20
commit
6db798cae4
@ -223,6 +223,8 @@ int lfmode; /* lost & found directory creation mode */
|
||||
ufs_daddr_t n_blks; /* number of blocks in use */
|
||||
ufs_daddr_t n_files; /* number of files in use */
|
||||
|
||||
int got_siginfo; /* received a SIGINFO */
|
||||
|
||||
#define clearinode(dp) (*(dp) = zino)
|
||||
struct dinode zino;
|
||||
|
||||
@ -280,6 +282,7 @@ struct inoinfo *getinoinfo __P((ino_t inumber));
|
||||
struct dinode *getnextinode __P((ino_t inumber));
|
||||
void getpathname __P((char *namebuf, ino_t curdir, ino_t ino));
|
||||
struct dinode *ginode __P((ino_t inumber));
|
||||
void infohandler __P((int sig));
|
||||
void inocleanup __P((void));
|
||||
void inodirty __P((void));
|
||||
struct inostat *inoinfo __P((ino_t inum));
|
||||
|
@ -140,6 +140,7 @@ main(argc, argv)
|
||||
(void)signal(SIGINT, catch);
|
||||
if (preen)
|
||||
(void)signal(SIGQUIT, catchquit);
|
||||
signal(SIGINFO, infohandler);
|
||||
/*
|
||||
* Push up our allowed memory limit so we can cope
|
||||
* with huge filesystems.
|
||||
|
@ -93,6 +93,12 @@ pass1()
|
||||
inumber = c * sblock.fs_ipg;
|
||||
setinodebuf(inumber);
|
||||
inosused = sblock.fs_ipg;
|
||||
if (got_siginfo) {
|
||||
printf("%s: phase 1: cyl group %d of %d (%d%%)\n",
|
||||
cdevname, c, sblock.fs_ncg,
|
||||
c * 100 / sblock.fs_ncg);
|
||||
got_siginfo = 0;
|
||||
}
|
||||
/*
|
||||
* If we are using soft updates, then we can trust the
|
||||
* cylinder group inode allocation maps to tell us which
|
||||
|
@ -65,6 +65,12 @@ pass1b()
|
||||
duphead = duplist;
|
||||
inumber = 0;
|
||||
for (c = 0; c < sblock.fs_ncg; c++) {
|
||||
if (got_siginfo) {
|
||||
printf("%s: phase 1b: cyl group %d of %d (%d%%)\n",
|
||||
cdevname, c, sblock.fs_ncg,
|
||||
c * 100 / sblock.fs_ncg);
|
||||
got_siginfo = 0;
|
||||
}
|
||||
for (i = 0; i < sblock.fs_ipg; i++, inumber++) {
|
||||
if (inumber < ROOTINO)
|
||||
continue;
|
||||
|
@ -134,6 +134,12 @@ pass2()
|
||||
dp = &dino;
|
||||
inpend = &inpsort[inplast];
|
||||
for (inpp = inpsort; inpp < inpend; inpp++) {
|
||||
if (got_siginfo) {
|
||||
printf("%s: phase 2: dir %d of %d (%d%%)\n", cdevname,
|
||||
inpp - inpsort, inplast, (inpp - inpsort) * 100 /
|
||||
inplast);
|
||||
got_siginfo = 0;
|
||||
}
|
||||
inp = *inpp;
|
||||
if (inp->i_isize == 0)
|
||||
continue;
|
||||
|
@ -59,6 +59,12 @@ pass3()
|
||||
char namebuf[MAXNAMLEN+1];
|
||||
|
||||
for (inpindex = inplast - 1; inpindex >= 0; inpindex--) {
|
||||
if (got_siginfo) {
|
||||
printf("%s: phase 3: dir %d of %d (%d%%)\n", cdevname,
|
||||
inplast - inpindex - 1, inplast,
|
||||
(inplast - inpindex - 1) * 100 / inplast);
|
||||
got_siginfo = 0;
|
||||
}
|
||||
inp = inpsort[inpindex];
|
||||
state = inoinfo(inp->i_number)->ino_state;
|
||||
if (inp->i_number == ROOTINO ||
|
||||
|
@ -62,6 +62,12 @@ pass4()
|
||||
idesc.id_type = ADDR;
|
||||
idesc.id_func = pass4check;
|
||||
for (cg = 0; cg < sblock.fs_ncg; cg++) {
|
||||
if (got_siginfo) {
|
||||
printf("%s: phase 4: cyl group %d of %d (%d%%)\n",
|
||||
cdevname, cg, sblock.fs_ncg,
|
||||
cg * 100 / sblock.fs_ncg);
|
||||
got_siginfo = 0;
|
||||
}
|
||||
inumber = cg * sblock.fs_ipg;
|
||||
for (i = 0; i < inostathead[cg].il_numalloced; i++, inumber++) {
|
||||
if (inumber < ROOTINO)
|
||||
|
@ -169,6 +169,12 @@ pass5()
|
||||
for (i = fs->fs_size; i < j; i++)
|
||||
setbmap(i);
|
||||
for (c = 0; c < fs->fs_ncg; c++) {
|
||||
if (got_siginfo) {
|
||||
printf("%s: phase 5: cyl group %d of %d (%d%%)\n",
|
||||
cdevname, c, sblock.fs_ncg,
|
||||
c * 100 / sblock.fs_ncg);
|
||||
got_siginfo = 0;
|
||||
}
|
||||
getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize);
|
||||
if (!cg_chkmagic(cg))
|
||||
pfatal("CG %d: BAD MAGIC NUMBER\n", c);
|
||||
|
@ -101,3 +101,10 @@ blockcheck(origname)
|
||||
*/
|
||||
return (origname);
|
||||
}
|
||||
|
||||
void
|
||||
infohandler(sig)
|
||||
int sig;
|
||||
{
|
||||
got_siginfo = 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user