From 1660ae87953868c406e94d75a0e8820248dd3067 Mon Sep 17 00:00:00 2001 From: Scott Long Date: Sat, 28 Feb 2004 07:50:42 +0000 Subject: [PATCH] In the case of a background fsck, periodically update the process title with a progress update. --- sbin/fsck_ffs/fsck.h | 2 ++ sbin/fsck_ffs/main.c | 9 +++++++++ sbin/fsck_ffs/pass1.c | 5 +++++ sbin/fsck_ffs/pass1b.c | 5 +++++ sbin/fsck_ffs/pass2.c | 5 +++++ sbin/fsck_ffs/pass3.c | 5 +++++ sbin/fsck_ffs/pass4.c | 5 +++++ sbin/fsck_ffs/pass5.c | 5 +++++ sbin/fsck_ffs/utilities.c | 6 ++++++ 9 files changed, 47 insertions(+) diff --git a/sbin/fsck_ffs/fsck.h b/sbin/fsck_ffs/fsck.h index fb30c365e8f2..3f23154ce2c3 100644 --- a/sbin/fsck_ffs/fsck.h +++ b/sbin/fsck_ffs/fsck.h @@ -258,6 +258,7 @@ ufs2_daddr_t n_blks; /* number of blocks in use */ ino_t n_files; /* number of files in use */ int got_siginfo; /* received a SIGINFO */ +int got_sigalarm; /* received a SIGALRM */ #define clearinode(dp) \ if (sblock.fs_magic == FS_UFS1_MAGIC) { \ @@ -324,6 +325,7 @@ union dinode *getnextinode(ino_t inumber); void getpathname(char *namebuf, ino_t curdir, ino_t ino); union dinode *ginode(ino_t inumber); void infohandler(int sig); +void alarmhandler(int sig); void inocleanup(void); void inodirty(void); struct inostat *inoinfo(ino_t inum); diff --git a/sbin/fsck_ffs/main.c b/sbin/fsck_ffs/main.c index 06b4540b557a..1202b5372cab 100644 --- a/sbin/fsck_ffs/main.c +++ b/sbin/fsck_ffs/main.c @@ -78,6 +78,7 @@ main(int argc, char *argv[]) { int ch; struct rlimit rlimit; + struct itimerval itimerval; int ret = 0; sync(); @@ -150,6 +151,14 @@ main(int argc, char *argv[]) if (preen) (void)signal(SIGQUIT, catchquit); signal(SIGINFO, infohandler); + if (bkgrdflag) { + signal(SIGALRM, alarmhandler); + itimerval.it_interval.tv_sec = 5; + itimerval.it_interval.tv_usec = 0; + itimerval.it_value.tv_sec = 5; + itimerval.it_value.tv_usec = 0; + setitimer(ITIMER_REAL, &itimerval, NULL); + } /* * Push up our allowed memory limit so we can cope * with huge file systems. diff --git a/sbin/fsck_ffs/pass1.c b/sbin/fsck_ffs/pass1.c index 341d0273ad58..258aeeee32e2 100644 --- a/sbin/fsck_ffs/pass1.c +++ b/sbin/fsck_ffs/pass1.c @@ -107,6 +107,11 @@ pass1(void) c * 100 / sblock.fs_ncg); got_siginfo = 0; } + if (got_sigalarm) { + setproctitle("%s p1 %d%%", cdevname, + c * 100 / sblock.fs_ncg); + got_sigalarm = 0; + } /* * If we are using soft updates, then we can trust the * cylinder group inode allocation maps to tell us which diff --git a/sbin/fsck_ffs/pass1b.c b/sbin/fsck_ffs/pass1b.c index d30295243a67..21eaf693e124 100644 --- a/sbin/fsck_ffs/pass1b.c +++ b/sbin/fsck_ffs/pass1b.c @@ -71,6 +71,11 @@ pass1b(void) c * 100 / sblock.fs_ncg); got_siginfo = 0; } + if (got_sigalarm) { + setproctitle("%s p1b %d%%", cdevname, + c * 100 / sblock.fs_ncg); + got_siginfo = 0; + } for (i = 0; i < sblock.fs_ipg; i++, inumber++) { if (inumber < ROOTINO) continue; diff --git a/sbin/fsck_ffs/pass2.c b/sbin/fsck_ffs/pass2.c index 470f9867022e..9f9e01adf202 100644 --- a/sbin/fsck_ffs/pass2.c +++ b/sbin/fsck_ffs/pass2.c @@ -140,6 +140,11 @@ pass2(void) (int)((inpp - inpsort) * 100 / inplast)); got_siginfo = 0; } + if (got_sigalarm) { + setproctitle("%s p2 %d%%", cdevname, + (int)((inpp - inpsort) * 100 / inplast)); + got_sigalarm = 0; + } inp = *inpp; if (inp->i_isize == 0) continue; diff --git a/sbin/fsck_ffs/pass3.c b/sbin/fsck_ffs/pass3.c index 0ae326751b20..925d880df0fe 100644 --- a/sbin/fsck_ffs/pass3.c +++ b/sbin/fsck_ffs/pass3.c @@ -65,6 +65,11 @@ pass3(void) (int)((inplast - inpindex - 1) * 100 / inplast)); got_siginfo = 0; } + if (got_sigalarm) { + setproctitle("%s p3 %d%%", cdevname, + (int)((inplast - inpindex - 1) * 100 / inplast)); + got_sigalarm = 0; + } inp = inpsort[inpindex]; state = inoinfo(inp->i_number)->ino_state; if (inp->i_number == ROOTINO || diff --git a/sbin/fsck_ffs/pass4.c b/sbin/fsck_ffs/pass4.c index 847dd97d6b25..53132a6e2704 100644 --- a/sbin/fsck_ffs/pass4.c +++ b/sbin/fsck_ffs/pass4.c @@ -68,6 +68,11 @@ pass4(void) cg * 100 / sblock.fs_ncg); got_siginfo = 0; } + if (got_sigalarm) { + setproctitle("%s p4 %d%%", cdevname, + cg * 100 / sblock.fs_ncg); + got_sigalarm = 0; + } inumber = cg * sblock.fs_ipg; for (i = 0; i < inostathead[cg].il_numalloced; i++, inumber++) { if (inumber < ROOTINO) diff --git a/sbin/fsck_ffs/pass5.c b/sbin/fsck_ffs/pass5.c index 6dbde11755f8..a2e758771133 100644 --- a/sbin/fsck_ffs/pass5.c +++ b/sbin/fsck_ffs/pass5.c @@ -157,6 +157,11 @@ pass5(void) c * 100 / sblock.fs_ncg); got_siginfo = 0; } + if (got_sigalarm) { + setproctitle("%s p5 %d%%\n", cdevname, + c * 100 / sblock.fs_ncg); + got_sigalarm = 0; + } getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize); if (!cg_chkmagic(cg)) pfatal("CG %d: BAD MAGIC NUMBER\n", c); diff --git a/sbin/fsck_ffs/utilities.c b/sbin/fsck_ffs/utilities.c index 441fd931e8df..e6c9f803eb00 100644 --- a/sbin/fsck_ffs/utilities.c +++ b/sbin/fsck_ffs/utilities.c @@ -117,3 +117,9 @@ infohandler(int sig __unused) { got_siginfo = 1; } + +void +alarmhandler(int sig __unused) +{ + got_sigalarm = 1; +}