Re: [Jfs-discussion] jfs_fsck stucks
Brought to you by:
blaschke-oss,
shaggyk
From: Marek S. <mar...@gm...> - 2013-06-16 10:54:02
|
On 14/06/2013 23:45, Dave Kleikamp wrote: > On 06/14/2013 12:28 PM, Marek Skuczynski wrote: >>> Values passed to bread are: vol: 0, pxd: len: 1, addr1: 0, addr2: 0 >>> >>> The p->header.flag is equal 0 after returning from bread(). >>> >>> >>> Any idea how to handle this problem ? >>> It looks like the function needs to do a better job of sanity checking. >>> >> I guess that a pxdAddress couldn't be equal to zero. >> If this is the case, rXtree() should return MINOR_ERROR, as in the case >> when bread fails. >> Am I correct? > Something like this would probably fix it. A corrupt node may have > any kind of data, so just keeping it from infinitely recursing > would probably catch any problem where bread() doesn't fail. > > > Index: libfs/log_map.c > =================================================================== > RCS file: /cvsroot/jfs/jfsutils/libfs/log_map.c,v > retrieving revision 1.21 > diff -u -p -r1.21 log_map.c > --- libfs/log_map.c 11 May 2012 13:02:04 -0000 1.21 > +++ libfs/log_map.c 14 Jun 2013 21:37:56 -0000 > @@ -1682,6 +1682,7 @@ int rXtree(int32_t vol, /* index in vop > xtpage_t *p; > caddr_t buf_ptr; > pxd_t pxd; > + int max_depth; > > /* start from root in dinode */ > p = (xtpage_t *) & dp->di_btroot; > @@ -1696,6 +1697,13 @@ int rXtree(int32_t vol, /* index in vop > /* > * traverse down leftmost child node to the leftmost leaf of xtree > */ > + > + /* > + * Overkill, but I don't know the practical limit for the xtree > + * depth > + */ > + max_depth = 100; > + > do { > /* read in the leftmost child page */ > if (bread(vol, pxd, (void **) &buf_ptr, PB_READ) != 0) { > @@ -1711,7 +1719,12 @@ int rXtree(int32_t vol, /* index in vop > PXDlength(&pxd, vopen[vol].lbperpage); > PXDaddress(&pxd, addressXAD(&p->xad[XTENTRYSTART])); > } > - } while (!(p->header.flag & BT_LEAF)); > + } while (--max_depth); > + > + if (!(p->header.flag & BT_LEAF)) { > + fsck_send_msg(lrdo_RXTREADLFFAIL); > + return(MINOR_ERROR); > + } > > out: > *first_leaf = p; > Thank you for your feedback and proposed problem solution. |