Message ID | 20181023094147.7906-7-suy.fnst@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs-progs: fixes of file extent in original and lowmem check | expand |
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@cn.fujitsu.com> Reviewed-by: Qu Wenruo <wqu@suse.com> > --- > 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: >
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. + * 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:
The function can delete items in trees besides extent tree. Rename and move it for further use. Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com> --- check/mode-lowmem.c | 99 +++++++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 48 deletions(-)