From b9de0eb42015e4f6971f8ae3b6bb488d9b94de3b Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 13 Sep 2010 15:28:08 +1000 Subject: [PATCH] Get SegRef on parent of phys==0 blocks. We still need those parents to be segrefed! Signed-off-by: NeilBrown --- cluster.c | 2 +- segments.c | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cluster.c b/cluster.c index 4f20fff..c45c451 100644 --- a/cluster.c +++ b/cluster.c @@ -520,7 +520,7 @@ static int flush_data_to_inode(struct block *b) if (!test_and_set_bit(B_ICredit, &lai->dblock->b.flags)) credits--; lafs_space_return(fs, credits); - /* FIXME do I need to get a SegRef ?? */ + LAFS_BUG(!test_bit(B_SegRef, &lai->dblock->b.flags), &lai->dblock->b); set_bit(B_PinPending, &lai->dblock->b.flags); if (test_bit(B_Pinned, &b->flags)) lafs_pin_block_ph(&lai->dblock->b, !!test_bit(B_Phase1, &b->flags)); diff --git a/segments.c b/segments.c index 8f68aef..1e203c6 100644 --- a/segments.c +++ b/segments.c @@ -270,11 +270,6 @@ int lafs_seg_ref_block(struct block *b, int ssnum) BUG_ON(test_bit(B_Root, &b->flags)); - if (b->physaddr == 0) { - set_bit(B_SegRef, &b->flags); - break; - } - b2 = b; /* Need to check parents */ ino = b->inode; @@ -306,6 +301,12 @@ int lafs_seg_ref_block(struct block *b, int ssnum) * If it cannot, then we don't need the lock. */ + if (b2->physaddr == 0) { + /* There is no segsum to reference */ + set_bit(B_SegRef, &b2->flags); + continue; + } + ss = segsum_byaddr(fs, b2->physaddr, ssnum); if (IS_ERR(ss)) { putref(b, MKREF(segref)); -- 2.39.5