On 2018/10/23 下午5:41, Su Yue wrote:
> The function can delete items in trees besides extent tree.
> Rename and move it for further use.
>
> Signed-off-by: Su Yue <suy.fnst@xxxxxxxxxxxxxx>
Reviewed-by: Qu Wenruo <wqu@xxxxxxxx>
> ---
> check/mode-lowmem.c | 99 +++++++++++++++++++++++----------------------
> 1 file changed, 51 insertions(+), 48 deletions(-)
>
> diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
> index e8a2e825c0f3..3c9ecff7e498 100644
> --- a/check/mode-lowmem.c
> +++ b/check/mode-lowmem.c
> @@ -537,6 +537,52 @@ static int end_avoid_extents_overwrite(struct btrfs_fs_info *fs_info)
> return ret;
> }
>
> +/*
> + * Delete the item @path point to.
Although I'd prefer to add some more words about the fact it's a wrapper
for btrfs_del_item().
Thanks,
Qu
> + * If deleted, path will point to the previous item to the deleted item.
> + */
> +static int delete_item(struct btrfs_root *root, struct btrfs_path *path)
> +{
> + struct btrfs_key key;
> + struct btrfs_trans_handle *trans;
> + int ret = 0;
> +
> + ret = avoid_extents_overwrite(root->fs_info);
> + if (ret)
> + return ret;
> + trans = btrfs_start_transaction(root, 1);
> + if (IS_ERR(trans)) {
> + ret = PTR_ERR(trans);
> + error("fail to start transaction %s", strerror(-ret));
> + goto out;
> + }
> + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
> + btrfs_release_path(path);
> + ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
> + if (ret) {
> + ret = -ENOENT;
> + goto out;
> + }
> +
> + ret = btrfs_del_item(trans, root, path);
> + if (ret)
> + goto out;
> +
> + if (path->slots[0] == 0)
> + btrfs_prev_leaf(root, path);
> + else
> + path->slots[0]--;
> +out:
> + btrfs_commit_transaction(trans, root);
> + if (ret)
> + error("failed to delete root %llu item[%llu, %u, %llu]",
> + root->objectid, key.objectid, key.type, key.offset);
> + else
> + printf("Deleted root %llu item[%llu, %u, %llu]\n",
> + root->objectid, key.objectid, key.type, key.offset);
> + return ret;
> +}
> +
> /*
> * Wrapper function for btrfs_fix_block_accounting().
> *
> @@ -4335,49 +4381,6 @@ static int repair_chunk_item(struct btrfs_root *chunk_root,
> return err;
> }
>
> -static int delete_extent_tree_item(struct btrfs_root *root,
> - struct btrfs_path *path)
> -{
> - struct btrfs_key key;
> - struct btrfs_trans_handle *trans;
> - int ret = 0;
> -
> - ret = avoid_extents_overwrite(root->fs_info);
> - if (ret)
> - return ret;
> - trans = btrfs_start_transaction(root, 1);
> - if (IS_ERR(trans)) {
> - ret = PTR_ERR(trans);
> - error("fail to start transaction %s", strerror(-ret));
> - goto out;
> - }
> - btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
> - btrfs_release_path(path);
> - ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
> - if (ret) {
> - ret = -ENOENT;
> - goto out;
> - }
> -
> - ret = btrfs_del_item(trans, root, path);
> - if (ret)
> - goto out;
> -
> - if (path->slots[0] == 0)
> - btrfs_prev_leaf(root, path);
> - else
> - path->slots[0]--;
> -out:
> - btrfs_commit_transaction(trans, root);
> - if (ret)
> - error("failed to delete root %llu item[%llu, %u, %llu]",
> - root->objectid, key.objectid, key.type, key.offset);
> - else
> - printf("Deleted root %llu item[%llu, %u, %llu]\n",
> - root->objectid, key.objectid, key.type, key.offset);
> - return ret;
> -}
> -
> /*
> * Main entry function to check known items and update related accounting info
> */
> @@ -4419,7 +4422,7 @@ again:
> ret = check_block_group_item(fs_info, eb, slot);
> if (repair &&
> ret & REFERENCER_MISSING)
> - ret = delete_extent_tree_item(root, path);
> + ret = delete_item(root, path);
> err |= ret;
> break;
> case BTRFS_DEV_ITEM_KEY:
> @@ -4450,7 +4453,7 @@ again:
> key.objectid, -1);
> if (repair &&
> ret & (REFERENCER_MISMATCH | REFERENCER_MISSING))
> - ret = delete_extent_tree_item(root, path);
> + ret = delete_item(root, path);
> err |= ret;
> break;
> case BTRFS_EXTENT_DATA_REF_KEY:
> @@ -4463,7 +4466,7 @@ again:
> btrfs_extent_data_ref_count(eb, dref));
> if (repair &&
> ret & (REFERENCER_MISMATCH | REFERENCER_MISSING))
> - ret = delete_extent_tree_item(root, path);
> + ret = delete_item(root, path);
> err |= ret;
> break;
> case BTRFS_SHARED_BLOCK_REF_KEY:
> @@ -4471,7 +4474,7 @@ again:
> key.objectid, -1);
> if (repair &&
> ret & (REFERENCER_MISMATCH | REFERENCER_MISSING))
> - ret = delete_extent_tree_item(root, path);
> + ret = delete_item(root, path);
> err |= ret;
> break;
> case BTRFS_SHARED_DATA_REF_KEY:
> @@ -4479,7 +4482,7 @@ again:
> key.objectid);
> if (repair &&
> ret & (REFERENCER_MISMATCH | REFERENCER_MISSING))
> - ret = delete_extent_tree_item(root, path);
> + ret = delete_item(root, path);
> err |= ret;
> break;
> default:
>