bin/111630: [PATCH] Slightly improve output of recoverdisk
Ulrich Spoerlein
uspoerlein at gmail.com
Sun Apr 15 19:00:10 UTC 2007
>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:
More information about the freebsd-bugs
mailing list