btrfs: fix missing semaphore unlock in btrfs_sync_file
authorRobbie Ko <robbieko@synology.com>
Tue, 17 Mar 2020 06:31:02 +0000 (14:31 +0800)
committerDavid Sterba <dsterba@suse.com>
Wed, 25 Mar 2020 15:29:16 +0000 (16:29 +0100)
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>
fs/btrfs/file.c

index 20107f4..8a144f9 100644 (file)
@@ -2117,6 +2117,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;
        }