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.




------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Jfs-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jfs-discussion

Reply via email to