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.f...@cn.fujitsu.com>
---
 dir-item.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/dir-item.c b/dir-item.c
index 846fc292..a112ed72 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 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);
-- 
2.11.1



--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to