Always update root items for fs trees at commit time
PATCH 1/1 Always update root items for fs trees at commit time
commit_fs_roots skips updating root items for fs trees that aren't modified. This is unsafe since relocation code modifies root item's last_snapshot field without modifying corresponding fs tree.
Signed-off-by Yan Zheng <[email protected]>
---
fs/btrfs/transaction.c +6 -6
@@ -543,13 +543,13 @@ static noinline int commit_fs_roots(strubtrfs_free_log (trans, root);btrfs_update_reloc_root (trans, root); -if (root->commit_root == root->node) -continue ; +if (root->commit_root != root->node) { +free_extent_buffer (root->commit_root); + root->commit_root =btrfs_root_node (root); +btrfs_set_root_node (&root->root_item, + root->node); + } -free_extent_buffer (root->commit_root); - root->commit_root =btrfs_root_node (root); - -btrfs_set_root_node (&root->root_item, root->node); err =btrfs_update_root (trans, fs_info->tree_root, &root->root_key, &root->root_item);
Quoted 3 lines · Yan Zheng
commit_fs_rootsskips updating root items for fs trees that aren't modified. This is unsafe since relocation code modifies root item'slast_snapshotfield without modifying corresponding fs tree.
Thanks for working on these patches.
This could make commit pretty expensive when there are many snapshots in place that don't get modified. Could you please change the balance code to mark the root to force writeout?
-chris