| From 13ab93abe416b141988daa917c9992e5a3bdc12d Mon Sep 17 00:00:00 2001 |
| From: Robbie Ko <robbieko@synology.com> |
| Date: Tue, 17 Mar 2020 14:31:02 +0800 |
| Subject: [PATCH] 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c |
| index c5a0ca8e4cf8..6dd68197419d 100644 |
| --- a/fs/btrfs/file.c |
| +++ b/fs/btrfs/file.c |
| @@ -2145,6 +2145,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; |
| } |
| -- |
| 2.7.4 |
| |