Re: [PATCH 3/3] xfs_repair: handle fragmented multiblock dir2 in process_leaf_node_dir2()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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>

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs


[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux