Btrfs: explicitly mark the tree log root for writeback
authorChris Mason <chris.mason@oracle.com>
Fri, 9 Jan 2009 18:14:17 +0000 (13:14 -0500)
committerChris Mason <chris.mason@oracle.com>
Fri, 9 Jan 2009 18:14:17 +0000 (13:14 -0500)
Each subvolume has an extent_state_tree used to mark metadata
that needs to be sent to disk while syncing the tree.  This is
used in addition to the dirty bits on the pages themselves so that
a single subvolume can be sent to disk efficiently in disk order.

Normally this marking happens in btrfs_alloc_free_block, which also does
special recording of dirty tree blocks for the tree log roots.

Yan Zheng noticed that when the root of the log tree is allocated, it is added
to the wrong writeback list.  The fix used here is to explicitly set
it dirty as part of tree log creation.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/tree-log.c

index 332ec35d2c0858351aa1d7937d2576e55bc1ad99..d81cda2e077c9b3c4685d26a55057826d0c06b2d 100644 (file)
@@ -158,6 +158,19 @@ static int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
         */
        new_root->ref_cows = 0;
        new_root->last_trans = trans->transid;
+
+       /*
+        * we need to make sure the root block for this new tree
+        * is marked as dirty in the dirty_log_pages tree.  This
+        * is how it gets flushed down to disk at tree log commit time.
+        *
+        * the tree logging mutex keeps others from coming in and changing
+        * the new_root->node, so we can safely access it here
+        */
+       set_extent_dirty(&new_root->dirty_log_pages, new_root->node->start,
+                        new_root->node->start + new_root->node->len - 1,
+                        GFP_NOFS);
+
 fail:
        return ret;
 }