diff options
Diffstat (limited to 'fs/btrfs/inode-item.c')
| -rw-r--r-- | fs/btrfs/inode-item.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/btrfs/inode-item.c b/fs/btrfs/inode-item.c index 8ffa4783cbf4..265e03c73f4d 100644 --- a/fs/btrfs/inode-item.c +++ b/fs/btrfs/inode-item.c | |||
| @@ -344,6 +344,7 @@ int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans, | |||
| 344 | return -ENOMEM; | 344 | return -ENOMEM; |
| 345 | 345 | ||
| 346 | path->leave_spinning = 1; | 346 | path->leave_spinning = 1; |
| 347 | path->skip_release_on_error = 1; | ||
| 347 | ret = btrfs_insert_empty_item(trans, root, path, &key, | 348 | ret = btrfs_insert_empty_item(trans, root, path, &key, |
| 348 | ins_len); | 349 | ins_len); |
| 349 | if (ret == -EEXIST) { | 350 | if (ret == -EEXIST) { |
| @@ -362,8 +363,12 @@ int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans, | |||
| 362 | ptr = (unsigned long)(ref + 1); | 363 | ptr = (unsigned long)(ref + 1); |
| 363 | ret = 0; | 364 | ret = 0; |
| 364 | } else if (ret < 0) { | 365 | } else if (ret < 0) { |
| 365 | if (ret == -EOVERFLOW) | 366 | if (ret == -EOVERFLOW) { |
| 366 | ret = -EMLINK; | 367 | if (find_name_in_backref(path, name, name_len, &ref)) |
| 368 | ret = -EEXIST; | ||
| 369 | else | ||
| 370 | ret = -EMLINK; | ||
| 371 | } | ||
| 367 | goto out; | 372 | goto out; |
| 368 | } else { | 373 | } else { |
| 369 | ref = btrfs_item_ptr(path->nodes[0], path->slots[0], | 374 | ref = btrfs_item_ptr(path->nodes[0], path->slots[0], |
