]> git.neil.brown.name Git - LaFS.git/commitdiff
truncate: can only safely lafs_incorporate dirty blocks.
authorNeilBrown <neilb@suse.de>
Tue, 8 Jun 2010 08:07:59 +0000 (18:07 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 8 Jun 2010 08:07:59 +0000 (18:07 +1000)
So if the block isn't dirty, don't try.

Signed-off-by: NeilBrown <neilb@suse.de>
inode.c

diff --git a/inode.c b/inode.c
index a002d9fb43ff01e5c30765d5bbf58156b3e70649..44fb73f7feb0fe29e3eb84c600c2c0d17b64c332 100644 (file)
--- 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: