xfs
[Top] [All Lists]

Re: [PATCH 3/3] xfs_repair: handle fragmented multiblock dir2 in process

To: Eric Sandeen <sandeen@xxxxxxxxxx>
Subject: Re: [PATCH 3/3] xfs_repair: handle fragmented multiblock dir2 in process_leaf_node_dir2()
From: Ben Myers <bpm@xxxxxxx>
Date: Fri, 1 Jun 2012 15:25:42 -0500
Cc: xfs-oss <xfs@xxxxxxxxxxx>
In-reply-to: <4FBABDA1.1030205@xxxxxxxxxx>
References: <4FBABCAB.20300@xxxxxxxxxx> <4FBABDA1.1030205@xxxxxxxxxx>
User-agent: Mutt/1.5.20 (2009-06-14)
On Mon, May 21, 2012 at 05:11:45PM -0500, Eric Sandeen wrote:
> process_leaf_node_dir2() had the following loop:
> 
>       while ((dbno = blkmap_next_off(blkmap, ndbno, &t)) < mp->m_dirleafblk) {
>               ...
>               ndbno = dbno + mp->m_dirblkfsbs - 1;
>               ...
>       }
> 
> which does not account for fragmented multiblock dir2.
> 
> ndbno was blindly being advanced by m_dirblkfsbs, but then
> blkmap_next_off() would return the logical block of the next
> mapped extent in blkmap, which may be within the current
> (fragmented) dir2 multi-block, not the next multi-block,
> because the extent index t hadn't been advanced.
> 
> Fix this by calling blkmap_next_off() until ndbno has advanced
> into the next multiblock dir2 block, thereby keeping
> the extent index t straight while properly advancing
> ndbno.
> 
> Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>
> ---
> 
> diff --git a/repair/dir2.c b/repair/dir2.c
> index f9562d7..7a614a8 100644
> --- a/repair/dir2.c
> +++ b/repair/dir2.c
> @@ -2003,7 +2003,11 @@ process_leaf_node_dir2(
>       ndbno = NULLDFILOFF;
>       while ((dbno = blkmap_next_off(blkmap, ndbno, &t)) < mp->m_dirleafblk) {
>               nex = blkmap_getn(blkmap, dbno, mp->m_dirblkfsbs, &bmp, &lbmp);
> -             ndbno = dbno + mp->m_dirblkfsbs - 1;
> +             /* Advance through map to last dfs block in this dir block */
> +             ndbno = dbno;
> +             while (ndbno < dbno + mp->m_dirblkfsbs - 1) {
> +                     ndbno = blkmap_next_off(blkmap, ndbno, &t);
> +             }

Yep, looks good to me.  An important thing to notice is that blkmap_getn
handles all extents in a dir2 multiblock... 

Reviewed-by: Ben Myers <bpm@xxxxxxx>

<Prev in Thread] Current Thread [Next in Thread>
  • Re: [PATCH 3/3] xfs_repair: handle fragmented multiblock dir2 in process_leaf_node_dir2(), Ben Myers <=