Proposed patch for xfsprogs
C Linus Hicks
linush at verizon.net
Mon Mar 1 08:37:59 CST 2010
On Mon, 2010-03-01 at 14:16 +1100, Dave Chinner wrote:
> On Sat, Feb 27, 2010 at 05:54:10PM -0500, C. Linus Hicks wrote:
> > During my recent experience with having to reconstruct parts of an XFS
> > filesystem that got corrupted as a result of several bad blocks, I found
> > that some of the information displayed using "blockget -v" was pretty
> > useless, and I am proposing the following code change to introduce a
> > slight summarization.
> >
> > Repeating lines of "setting block <foo> to <bar>" and "setting inode to
> > <foo> for {,rt}block <bar>" will be summarized down to two lines.
>
> Agreed, that would certainly help reduce the verbosity of the output.
> However, I don't think the patch is correct.
>
> > --- a/xfsprogs-3.1.1/db/check.c 2010-01-29 14:46:13.000000000 -0500
> > +++ b/xfsprogs-3.1.1/db/check.c 2010-02-27 17:02:14.111418960 -0500
> > @@ -1509,6 +1509,7 @@
> > {
> > xfs_extlen_t i;
> > int mayprint;
> > + int isfirst = 1;
> > char *p;
> >
> > if (!check_range(agno, agbno, len)) {
> > @@ -1520,10 +1521,15 @@
> > mayprint = verbose | blist_size;
> > for (i = 0, p = &dbmap[agno][agbno]; i < len; i++, p++) {
> > *p = (char)type2;
> > - if (mayprint && (verbose || CHECK_BLISTA(agno, agbno + i)))
> > + if (isfirst && mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) {
> > dbprintf(_("setting block %u/%u to %s\n"), agno, agbno + i,
> > typename[type2]);
> > + isfirst = 0;
> > + }
> > }
> > + if ((len > 1) && mayprint && (verbose || CHECK_BLISTA(agno, agbno + i)))
> > + dbprintf(_(" ... until %u/%u\n"),
> > + agno, agbno + len - 1);
> > }
>
> This doesn't take into account that not all blocks in the extent
> range might be bad and the change is actually doing something. i.e.
> only is CHECK_BLISTA() evaluating as true is there a printout
> occurring (unless you specify verbose mode). Hence if only interior
> portions are being changed or there are multiple ranges being
> changed, this output won't reflect the errors being detected
> accurately.
>
> The other sections of the patch have the same issue.
>
> I think that changing it to something like:
>
> int last_print == -1;
> .....
> if (mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) {
> if (i > 0 && last_print == i - 1) {
> last_print = i;
> continue;
> }
> if (last_print != i - 1) {
> dbprintf(_(" ... until %u/%u\n"),
> agno, agbno + last_print);
> last_print == -1;
> }
> if (last_print == -1) {
> dbprintf(_("setting block %u/%u to %s\n"),
> agno, agbno + i, typename[type2]);
> last_print = i;
> }
> }
> }
> if (len > 1 && last_print != -1)
> dbprintf(_(" ... until %u/%u\n"), agno, agbno + last_print);
>
> would do the trick. What do you think?
You're quite right, I'm glad you looked close enough to spot that. Sorry
I missed it. There's one case your code doesn't handle correctly, where
len > 0 and last_print == -1 and i == len - 1. Let me rework the code
and do some testing then I will re-submit.
Linus
More information about the xfs
mailing list