From b497b75be532d1b74d5af26fc5a013f0acb47489 Mon Sep 17 00:00:00 2001 From: Bob Peterson Date: Wed, 8 Aug 2007 16:52:09 -0500 Subject: [PATCH] --- yaml --- r: 67657 b: refs/heads/master c: 5f3eae7546093d845ca8ada1b95714202a136a1a h: refs/heads/master i: 67655: 5296d7879c4a2ffffcd37d7a5c5df63e6a33db24 v: v3 --- [refs] | 2 +- trunk/fs/gfs2/rgrp.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 5f5f5344318a..b68733efc7e4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8fbbfd214c853102b614f4705c1904ed14f5a808 +refs/heads/master: 5f3eae7546093d845ca8ada1b95714202a136a1a diff --git a/trunk/fs/gfs2/rgrp.c b/trunk/fs/gfs2/rgrp.c index b93ac45b88bb..2d7f7ea0c9a8 100644 --- a/trunk/fs/gfs2/rgrp.c +++ b/trunk/fs/gfs2/rgrp.c @@ -865,12 +865,15 @@ static struct inode *try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked) struct inode *inode; u32 goal = 0, block; u64 no_addr; + struct gfs2_sbd *sdp = rgd->rd_sbd; for(;;) { if (goal >= rgd->rd_data) break; + down_write(&sdp->sd_log_flush_lock); block = rgblk_search(rgd, goal, GFS2_BLKST_UNLINKED, GFS2_BLKST_UNLINKED); + up_write(&sdp->sd_log_flush_lock); if (block == BFITNOENT) break; /* rgblk_search can return a block < goal, so we need to @@ -1295,7 +1298,9 @@ static u32 rgblk_search(struct gfs2_rgrpd *rgd, u32 goal, allocatable block anywhere else, we want to be able wrap around and search in the first part of our first-searched bit block. */ for (x = 0; x <= length; x++) { - if (bi->bi_clone) + /* The GFS2_BLKST_UNLINKED state doesn't apply to the clone + bitmaps, so we must search the originals for that. */ + if (old_state != GFS2_BLKST_UNLINKED && bi->bi_clone) blk = gfs2_bitfit(rgd, bi->bi_clone + bi->bi_offset, bi->bi_len, goal, old_state); else