fs/ntfs3: fix deadlock in mark_as_free_ex
authorKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Fri, 30 Jun 2023 12:22:53 +0000 (16:22 +0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 Oct 2023 10:03:05 +0000 (12:03 +0200)
commit bfbe5b31caa74ab97f1784fe9ade5f45e0d3de91 upstream.

Reported-by: syzbot+e94d98936a0ed08bde43@syzkaller.appspotmail.com
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/ntfs3/fsntfs.c

index 829b62d3bb889fa7b2dd0b279eef25c37aa1ce5d..9c0fc3a29d0c9f014d9e54caf6a7e3b83f91d29f 100644 (file)
@@ -2428,10 +2428,12 @@ void mark_as_free_ex(struct ntfs_sb_info *sbi, CLST lcn, CLST len, bool trim)
 {
        CLST end, i, zone_len, zlen;
        struct wnd_bitmap *wnd = &sbi->used.bitmap;
+       bool dirty = false;
 
        down_write_nested(&wnd->rw_lock, BITMAP_MUTEX_CLUSTERS);
        if (!wnd_is_used(wnd, lcn, len)) {
-               ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
+               /* mark volume as dirty out of wnd->rw_lock */
+               dirty = true;
 
                end = lcn + len;
                len = 0;
@@ -2485,6 +2487,8 @@ void mark_as_free_ex(struct ntfs_sb_info *sbi, CLST lcn, CLST len, bool trim)
 
 out:
        up_write(&wnd->rw_lock);
+       if (dirty)
+               ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
 }
 
 /*