di = btrfs_match_dir_item_name(root, path, name, name_len);
if (di)
return ERR_PTR(-EEXIST);
- ret = btrfs_extend_item(trans, root, path, data_size);
+ ret = btrfs_extend_item(root, path, data_size);
WARN_ON(ret > 0);
}
if (ret < 0)
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];
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;
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_MAX_XATTR_SIZE is the same for all dir items */
if ((btrfs_dir_data_len(leaf, dir_item) +
- btrfs_dir_name_len(leaf, dir_item)) > BTRFS_MAX_XATTR_SIZE(root)) {
+ btrfs_dir_name_len(leaf, dir_item)) >
+ BTRFS_MAX_XATTR_SIZE(root->fs_info)) {
fprintf(stderr, "invalid dir item name + data len: %u + %u\n",
(unsigned)btrfs_dir_name_len(leaf, dir_item),
(unsigned)btrfs_dir_data_len(leaf, dir_item));