summaryrefslogtreecommitdiff
path: root/dir-item.c
diff options
context:
space:
mode:
authorSu Yue <suy.fnst@cn.fujitsu.com>2017-08-28 15:08:09 +0800
committerDavid Sterba <dsterba@suse.com>2017-10-16 20:33:00 +0200
commit3efc459166ad8d104912ec06c4ec9e0db6b7ef79 (patch)
treeb41c3099ccdd1b1aae298c1841ceb008ed283aff /dir-item.c
parent564901eac7a43e85c01e5da90dbd7af6507cc724 (diff)
btrfs-progs: check: adjustments for further repair
For code reuse, btrfs_insert_dir_item() now calls inserts_with_overflow() even if the dir_item existed. Add a parameter @ignore_existed to btrfs_add_link(). If @ignore_existed is not zero, btrfs_add_link() continues to do link. Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'dir-item.c')
-rw-r--r--dir-item.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/dir-item.c b/dir-item.c
index e34f6935..462546c0 100644
--- a/dir-item.c
+++ b/dir-item.c
@@ -135,7 +135,14 @@ int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
name, name_len);
if (IS_ERR(dir_item)) {
ret = PTR_ERR(dir_item);
- goto out;
+
+ /* Continue to insert item if existed */
+ if (ret == -EEXIST) {
+ ret = 0;
+ goto insert;
+ } else {
+ goto out;
+ }
}
leaf = path->nodes[0];
@@ -149,6 +156,7 @@ int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
write_extent_buffer(leaf, name, name_ptr, name_len);
btrfs_mark_buffer_dirty(leaf);
+insert:
/* FIXME, use some real flag for selecting the extra index */
if (root == root->fs_info->tree_root) {
ret = 0;
@@ -162,6 +170,8 @@ int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
name, name_len);
if (IS_ERR(dir_item)) {
ret2 = PTR_ERR(dir_item);
+ if (ret2 == -EEXIST)
+ ret = 0;
goto out;
}
leaf = path->nodes[0];