[Cluster-devel] Re: [PATCH][GFS2] bz #246114: GFS2: soft lockup in rgblk_search

Steven Whitehouse swhiteho at redhat.com
Fri Jul 13 07:48:47 UTC 2007


Hi,

Now in the GFS2 -nmw git tree. Thanks,

Steve,

On Thu, 2007-07-12 at 16:58 -0500, Bob Peterson wrote:
> This patch seems to fix the problem described in bugzilla bug 246114.
> It was written by Steve Whitehouse with some tweaking by me.
> 
> The code was looping in the relatively new section of code designed to
> search for and reuse unlinked inodes.  In cases where it was finding an
> appropriate inode to reuse, it was looping around and finding the same
> block over and over because a "<=" check should have been a "<" when
> comparing the goal block to the last unlinked block found.
> 
> Regards,
> 
> Bob Peterson
> Red Hat Cluster Suite
> 
> Signed-off-by: Bob Peterson <rpeterso at redhat.com>
> --
>  fs/gfs2/rgrp.c |    9 ++++++---
>  1 files changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
> index e4e0406..bb58e69 100644
> --- a/fs/gfs2/rgrp.c
> +++ b/fs/gfs2/rgrp.c
> @@ -863,16 +863,19 @@ static struct inode *try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked)
>  	u64 no_addr;
>  
>  	for(;;) {
> +		if (goal >= rgd->rd_data)
> +			break;
>  		goal = rgblk_search(rgd, goal, GFS2_BLKST_UNLINKED,
>  				    GFS2_BLKST_UNLINKED);
>  		if (goal == 0)
> -			return 0;
> +			break;
>  		no_addr = goal + rgd->rd_data0;
> -		if (no_addr <= *last_unlinked)
> +		goal++;
> +		if (no_addr < *last_unlinked)
>  			continue;
>  		*last_unlinked = no_addr;
>  		inode = gfs2_inode_lookup(rgd->rd_sbd->sd_vfs, DT_UNKNOWN,
> -					no_addr, -1);
> +					  no_addr, -1);
>  		if (!IS_ERR(inode))
>  			return inode;
>  	}
> 
> 




More information about the Cluster-devel mailing list