mirror of https://gitee.com/openkylin/linux.git
btrfs: abort unlink trans in missed error case
__btrfs_unlink_inode() aborts its transaction when it sees errors after it removes the directory item. But it missed the case where btrfs_del_dir_entries_in_log() returns an error. If this happens then the unlink appears to fail but the items have been removed without updating the directory size. The directory then has leaked bytes in i_size and can never be removed. Adding the missing transaction abort at least makes this failure consistent with the other failure cases. I noticed this while reading the code after someone on irc reported having a directory with i_size but no entries. I tested it by forcing btrfs_del_dir_entries_in_log() to return -ENOMEM. Signed-off-by: Zach Brown <zab@redhat.com> Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
This commit is contained in:
parent
f63e0cca91
commit
d4e3991b99
|
@ -3616,6 +3616,8 @@ static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans,
|
|||
dir, index);
|
||||
if (ret == -ENOENT)
|
||||
ret = 0;
|
||||
else if (ret)
|
||||
btrfs_abort_transaction(trans, root, ret);
|
||||
err:
|
||||
btrfs_free_path(path);
|
||||
if (ret)
|
||||
|
|
Loading…
Reference in New Issue