Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 04 Dec 2000 21:19:19 +0000
From:      Ian Dowse <iedowse@maths.tcd.ie>
To:        freebsd-fs@freebsd.org
Cc:        iedowse@maths.tcd.ie, Kirk McKusick <mckusick@mckusick.com>
Subject:   SIGINFO handler for fsck(8)
Message-ID:   <200012042119.aa25259@salmon.maths.tcd.ie>

next in thread | raw e-mail | index | archive | help

I've had this patch lying around here for a while - it adds a simple
SIGINFO handler to fsck(8) so you can tell what it's doing by
pressing Ctrl-T. The output will be something like:

^T
load: 0.14  cmd: fsck_ufs 10473 [physstr] 2.12u 0.30s 8% 2016k
/dev/da0s1f: phase 1: cyl group 26 of 60 (43%)
^T
load: 0.12  cmd: fsck_ufs 10473 [physstr] 4.00u 0.49s 11% 2804k
/dev/da0s1f: phase 2: dir 488 of 27965 (1%)

Is this a feature we want in fsck? It doesn't really help except
to give you something to do while waiting for a huge filesystem to
be checked :-) I guess it also allows you to see if fsck is actually
getting anywhere.

Ian

Index: fsck.h
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sbin/fsck_ffs/fsck.h,v
retrieving revision 1.14
diff -u -r1.14 fsck.h
--- fsck.h	2000/10/09 08:26:28	1.14
+++ fsck.h	2000/12/04 21:06:19
@@ -223,6 +223,8 @@
 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 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));
Index: main.c
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sbin/fsck_ffs/main.c,v
retrieving revision 1.22
diff -u -r1.22 main.c
--- main.c	2000/10/09 08:26:28	1.22
+++ main.c	2000/12/04 21:06:19
@@ -140,6 +140,7 @@
 		(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.
Index: pass1.c
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sbin/fsck_ffs/pass1.c,v
retrieving revision 1.18
diff -u -r1.18 pass1.c
--- pass1.c	2000/07/12 06:19:22	1.18
+++ pass1.c	2000/12/04 21:06:19
@@ -89,6 +89,13 @@
 		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
Index: pass1b.c
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sbin/fsck_ffs/pass1b.c,v
retrieving revision 1.7
diff -u -r1.7 pass1b.c
--- pass1b.c	1999/08/28 00:12:46	1.7
+++ pass1b.c	2000/12/04 21:06:19
@@ -65,6 +65,12 @@
 	duphead = duplist;
 	inumber = 0;
 	for (c = 0; c < sblock.fs_ncg; c++) {
+		if (got_siginfo) {
+			printf("%s: phase 1c: 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;
Index: pass2.c
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sbin/fsck_ffs/pass2.c,v
retrieving revision 1.10
diff -u -r1.10 pass2.c
--- pass2.c	1999/08/28 00:12:46	1.10
+++ pass2.c	2000/12/04 21:06:19
@@ -134,6 +134,12 @@
 	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;
Index: pass3.c
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sbin/fsck_ffs/pass3.c,v
retrieving revision 1.7
diff -u -r1.7 pass3.c
--- pass3.c	1999/08/28 00:12:47	1.7
+++ pass3.c	2000/12/04 21:06:20
@@ -59,6 +59,12 @@
 	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, inplast,
+			    100 - inpindex * 100 / inplast);
+			got_siginfo = 0;
+		}
 		inp = inpsort[inpindex];
 		state = inoinfo(inp->i_number)->ino_state;
 		if (inp->i_number == ROOTINO ||
Index: pass4.c
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sbin/fsck_ffs/pass4.c,v
retrieving revision 1.7
diff -u -r1.7 pass4.c
--- pass4.c	1999/08/28 00:12:47	1.7
+++ pass4.c	2000/12/04 21:06:20
@@ -62,6 +62,12 @@
 	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)
Index: pass5.c
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sbin/fsck_ffs/pass5.c,v
retrieving revision 1.18
diff -u -r1.18 pass5.c
--- pass5.c	2000/07/06 02:03:11	1.18
+++ pass5.c	2000/12/04 21:06:20
@@ -169,6 +169,12 @@
 	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);
Index: utilities.c
===================================================================
RCS file: /FreeBSD/FreeBSD-CVS/src/sbin/fsck_ffs/utilities.c,v
retrieving revision 1.14
diff -u -r1.14 utilities.c
--- utilities.c	2000/10/09 09:21:04	1.14
+++ utilities.c	2000/12/04 21:07:20
@@ -101,3 +101,10 @@
 	 */
 	return (origname);
 }
+
+void
+infohandler(sig)
+	int sig;
+{
+	got_siginfo = 1;
+}


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-fs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi? <200012042119.aa25259>