@@ -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 next;
+ } 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);
+next:
/* FIXME, use some real flag for selecting the extra index */
if (root == root->fs_info->tree_root) {
ret = 0;
@@ -162,8 +170,11 @@ 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];
btrfs_cpu_key_to_disk(&disk_key, location);
btrfs_set_dir_item_key(leaf, dir_item, &disk_key);
In the function 'btrfs_insert_dir_item', let it continue to insert dir index if the dir item is existed and set ret value to 0. This further is for further repair. Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com> --- dir-item.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)