summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorRobbie Ko <robbieko@synology.com>2020-03-17 09:31:02 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-04-17 11:50:15 +0300
commit0425813c2279c6f91fa0c818fd9e70f1298200c2 (patch)
treef4096d7d319d76e6717c8928ead9d9461ff00376 /fs
parent08e69ab983da576141bf20b27ce7728bc7eee4c5 (diff)
downloadlinux-0425813c2279c6f91fa0c818fd9e70f1298200c2.tar.xz
btrfs: fix missing semaphore unlock in btrfs_sync_file
commit 6ff06729c22ec0b7498d900d79cc88cfb8aceaeb upstream. Ordered ops are started twice in sync file, once outside of inode mutex and once inside, taking the dio semaphore. There was one error path missing the semaphore unlock. Fixes: aab15e8ec2576 ("Btrfs: fix rare chances for data loss when doing a fast fsync") CC: stable@vger.kernel.org # 4.19+ Signed-off-by: Robbie Ko <robbieko@synology.com> Reviewed-by: Filipe Manana <fdmanana@suse.com> [ add changelog ] Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/file.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index e1c2aa46cb0c..3cfbccacef7f 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -2137,6 +2137,7 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
*/
ret = start_ordered_ops(inode, start, end);
if (ret) {
+ up_write(&BTRFS_I(inode)->dio_sem);
inode_unlock(inode);
goto out;
}