return ret;
 }
 
+static int update_raid_extent_item(struct btrfs_trans_handle *trans,
+                                  struct btrfs_key *key,
+                                  struct btrfs_stripe_extent *stripe_extent,
+                                  const size_t item_size)
+{
+       struct btrfs_path *path;
+       struct extent_buffer *leaf;
+       int ret;
+       int slot;
+
+       path = btrfs_alloc_path();
+       if (!path)
+               return -ENOMEM;
+
+       ret = btrfs_search_slot(trans, trans->fs_info->stripe_root, key, path,
+                               0, 1);
+       if (ret)
+               return (ret == 1 ? ret : -EINVAL);
+
+       leaf = path->nodes[0];
+       slot = path->slots[0];
+
+       write_extent_buffer(leaf, stripe_extent, btrfs_item_ptr_offset(leaf, slot),
+                           item_size);
+       btrfs_mark_buffer_dirty(trans, leaf);
+       btrfs_free_path(path);
+
+       return ret;
+}
+
 static int btrfs_insert_one_raid_extent(struct btrfs_trans_handle *trans,
                                        struct btrfs_io_context *bioc)
 {
 
        ret = btrfs_insert_item(trans, stripe_root, &stripe_key, stripe_extent,
                                item_size);
+       if (ret == -EEXIST)
+               ret = update_raid_extent_item(trans, &stripe_key, stripe_extent,
+                                             item_size);
        if (ret)
                btrfs_abort_transaction(trans, ret);