From: Filipe Manana Date: Thu, 29 May 2014 22:31:39 +0000 (+0100) Subject: Btrfs: fix transaction leak during fsync call X-Git-Tag: v3.16-rc1~5^2~28 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b05fd8742f6291b67571ad0fdad4da6b6eb98025;p=platform%2Fkernel%2Flinux-stable.git Btrfs: fix transaction leak during fsync call If btrfs_log_dentry_safe() returns an error, we set ret to 1 and fall through with the goal of committing the transaction. However, in the case where the inode doesn't need a full sync, we would call btrfs_wait_ordered_range() against the target range for our inode, and if it returned an error, we would return without commiting or ending the transaction. Signed-off-by: Filipe David Borba Manana Signed-off-by: Chris Mason --- diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index eb3f270..ad7c059 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -2025,8 +2025,10 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) if (!full_sync) { ret = btrfs_wait_ordered_range(inode, start, end - start + 1); - if (ret) + if (ret) { + btrfs_end_transaction(trans, root); goto out; + } } ret = btrfs_commit_transaction(trans, root); } else {