diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index c12b7a6e534a643392ebc0cc8437912a614437ce..a6bf9e2ff68f6ba196f3cae71c1cfc4262db5962 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -9443,6 +9443,7 @@ static int btrfs_rename_exchange(struct inode *old_dir,
 	u64 new_idx = 0;
 	u64 root_objectid;
 	int ret;
+	int ret2;
 	bool root_log_pinned = false;
 	bool dest_log_pinned = false;
 
@@ -9639,7 +9640,8 @@ static int btrfs_rename_exchange(struct inode *old_dir,
 			dest_log_pinned = false;
 		}
 	}
-	ret = btrfs_end_transaction(trans);
+	ret2 = btrfs_end_transaction(trans);
+	ret = ret ? ret : ret2;
 out_notrans:
 	if (new_ino == BTRFS_FIRST_FREE_OBJECTID)
 		up_read(&fs_info->subvol_sem);