Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Apr 2007 20:53:26 +0200 (CEST)
From:      Ulrich Spoerlein <uspoerlein@gmail.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Cc:        phk@FreeBSD.org
Subject:   bin/111630: [PATCH] Slightly improve output of recoverdisk
Message-ID:  <200704151853.l3FIrQrr077231@roadrunner.q.local>
Resent-Message-ID: <200704151900.l3FJ09Cn054933@freefall.freebsd.org>

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

>Number:         111630
>Category:       bin
>Synopsis:       [PATCH] Slightly improve output of recoverdisk
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sun Apr 15 19:00:09 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Ulrich Spoerlein
>Release:        FreeBSD 6.2-STABLE i386
>Organization:
>Environment:
>Description:
recoverdisk does not display the final update of the status line, this
means that it will usually print something like

   ... 0.9983 % done
Completed

This is very un-intuitive, the user expects a 100% completed column. And
therein lies the second nit. recoverdisk claims to print the percentage done,
when in fact it is printing no percentage at all. Multiplying by 100 fixes
this trivially.
>How-To-Repeat:
Create a memory disk, run recoverdisk /dev/md0
# recoverdisk /dev/md0
        start    size           len state          done     remaining    % done
     19922944 1048576     248512512     0      19922944     248512512 0.0742188
Completed

The attached patch fixes this from printing '0.07 done' to '100% done'
# ./recoverdisk /dev/md0
        start    size           len state          done     remaining    % done
    267386880 1048576       1048576     0     268435456             0 100.00000
Completed

If there are any style issues, please let me know. Thanks.

>Fix:

--- recoverdisk.c.diff begins here ---
Index: recoverdisk.c
===================================================================
RCS file: /home/ncvs/src/tools/tools/recoverdisk/recoverdisk.c,v
retrieving revision 1.7
diff -u -p -r1.7 recoverdisk.c
--- recoverdisk.c	30 May 2006 19:10:18 -0000	1.7
+++ recoverdisk.c	15 Apr 2007 18:46:33 -0000
@@ -56,6 +56,21 @@ static struct lump *lp;
 static char *wworklist = NULL;
 static char *rworklist = NULL;
 
+
+#define PRINT_HEADER \
+	printf("%13s %7s %13s %5s %13s %13s %9s\n", \
+		"start", "size", "len", "state", "done", "remaining", "% done")
+
+#define PRINT_STATUS(start, i, len, state, d, t) \
+	printf("\r%13jd %7zu %13jd %5d %13jd %13jd %9.5f", \
+		(intmax_t)start, \
+		i,  \
+		(intmax_t)len, \
+		state, \
+		(intmax_t)d, \
+		(intmax_t)(t - d), \
+		100*(double)d/(double)t)
+
 /* Save the worklist if -w was given */
 static void
 save_worklist(void)
@@ -138,9 +153,9 @@ main(int argc, char * const argv[])
 {
 	int ch;
 	int fdr, fdw;
-	off_t t, d;
+	off_t t, d, start, len;
 	size_t i, j;
-	int error, flags;
+	int error, flags, state;
 	u_char *buf;
 	u_int sectorsize;
 	time_t t1, t2;
@@ -221,13 +236,18 @@ main(int argc, char * const argv[])
 		signal(SIGINT, sighandler);
 
 	t1 = 0;
-	printf("%13s %7s %13s %5s %13s %13s %9s\n",
-	    "start", "size", "len", "state", "done", "remaining", "% done");
+	start = len = i = state = 0;
+	PRINT_HEADER;
 	for (;;) {
 		lp = TAILQ_FIRST(&lumps);
 		if (lp == NULL)
 			break;
 		while (lp->len > 0 && !aborting) {
+			/* These are only copied for printing stats */
+			start = lp->start;
+			len = lp->len;
+			state = lp->state;
+
 			i = MIN(lp->len, (off_t)bigsize);
 			if (lp->state == 1)
 				i = MIN(lp->len, (off_t)medsize);
@@ -235,14 +255,7 @@ main(int argc, char * const argv[])
 				i = MIN(lp->len, (off_t)minsize);
 			time(&t2);
 			if (t1 != t2 || lp->len < (off_t)bigsize) {
-				printf("\r%13jd %7zu %13jd %5d %13jd %13jd %.7f",
-				    (intmax_t)lp->start,
-				    i, 
-				    (intmax_t)lp->len,
-				    lp->state,
-				    (intmax_t)d,
-				    (intmax_t)(t - d),
-				    (double)d/(double)t);
+				PRINT_STATUS(start, i, len, state, d, t);
 				t1 = t2;
 			}
 			if (i == 0) {
@@ -275,6 +288,7 @@ main(int argc, char * const argv[])
 		TAILQ_REMOVE(&lumps, lp, list);
 		free(lp);
 	}
+	PRINT_STATUS(start, i, len, state, d, t);
 	printf("\nCompleted\n");
 	return (0);
 }
--- recoverdisk.c.diff ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



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