From: NeilBrown Date: Tue, 8 Jun 2010 08:07:59 +0000 (+1000) Subject: truncate: can only safely lafs_incorporate dirty blocks. X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=c81a033a49cab51635ffd3ad03198f7cad969b4c;p=LaFS.git truncate: can only safely lafs_incorporate dirty blocks. So if the block isn't dirty, don't try. Signed-off-by: NeilBrown --- diff --git a/inode.c b/inode.c index a002d9f..44fb73f 100644 --- a/inode.c +++ b/inode.c @@ -787,19 +787,23 @@ void lafs_inode_handle_orphan(struct datablock *b) lafs_dirty_iblock(ib); lafs_walk_leaf_index(ib, prune_some, ib); } - lafs_incorporate(fs, ib); + if (test_bit(B_Dirty, &ib->b.flags)) + lafs_incorporate(fs, ib); goto out; } LAFSI(ino)->trunc_next = next_trunc; - while (ib->uninc_table.pending_cnt || ib->uninc) + while (ib->uninc_table.pending_cnt || ib->uninc) { + LAFS_BUG(!test_bit(B_Dirty, &ib->b.flags), &ib->b); lafs_incorporate(fs, ib); + } if (!test_bit(B_PhysValid, &ib->b.flags) || ib->b.physaddr != 0) { lafs_dirty_iblock(ib); lafs_walk_leaf_index(ib, prune, ib); } - lafs_incorporate(fs, ib); + if (test_bit(B_Dirty, &ib->b.flags)) + lafs_incorporate(fs, ib); LAFS_BUG(!list_empty(&ib->children), &ib->b); out: