diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 52da573741ede6744d02a2938d8384c352b3ebd3..51a119ac91cd5aad29e2e239f6e35d06d168701d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -9527,6 +9527,7 @@ static int btrfs_rename_exchange(struct inode *old_dir, int ret; bool root_log_pinned = false; bool dest_log_pinned = false; + bool need_abort = false; struct btrfs_log_ctx ctx_root; struct btrfs_log_ctx ctx_dest; bool sync_log_root = false; @@ -9591,6 +9592,7 @@ static int btrfs_rename_exchange(struct inode *old_dir, old_idx); if (ret) goto out_fail; + need_abort = true; } /* And now for the dest. */ @@ -9606,8 +9608,11 @@ static int btrfs_rename_exchange(struct inode *old_dir, new_ino, btrfs_ino(BTRFS_I(old_dir)), new_idx); - if (ret) + if (ret) { + if (need_abort) + btrfs_abort_transaction(trans, ret); goto out_fail; + } } /* Update inode version and ctime/mtime. */