[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