Yan Zheng
2007-Sep-23 20:00 UTC
[btrfs-devel][patch]fix get_bh and brelse issues when drop snapshot
Hello, When drop_progress isn't zero, the root->node's usage count is increased in btrfs_search_slot. Therefore, the get_bh in the body of while loop is redundant in most cases. (this change is in accordance with btrfs_defrag_leaves). The second change is decrease root->node's usage count when drop a snapshot. Regards YZ diff -r 29b8cc7794ac extent-tree.c --- a/extent-tree.c Thu Sep 20 14:14:42 2007 -0400 +++ b/extent-tree.c Sun Sep 23 12:35:00 2007 +0800 @@ -1483,6 +1483,7 @@ int btrfs_drop_snapshot(struct btrfs_tra level = btrfs_header_level(btrfs_buffer_header(root->node)); orig_level = level; if (btrfs_disk_key_objectid(&root_item->drop_progress) == 0) { + get_bh(root->node); path->nodes[level] = root->node; path->slots[level] = 0; } else { @@ -1516,7 +1517,6 @@ int btrfs_drop_snapshot(struct btrfs_tra if (wret < 0) ret = wret; ret = -EAGAIN; - get_bh(root->node); break; } for (i = 0; i <= orig_level; i++) { diff -r 29b8cc7794ac transaction.c --- a/transaction.c Thu Sep 20 14:14:42 2007 -0400 +++ b/transaction.c Sun Sep 23 12:35:00 2007 +0800 @@ -457,6 +457,7 @@ static int drop_dirty_roots(struct btrfs ret = btrfs_end_transaction(trans, tree_root); BUG_ON(ret); + btrfs_block_release(dirty->root, dirty->root->node); kfree(dirty->root); kfree(dirty); mutex_unlock(&tree_root->fs_info->fs_mutex);