]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
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)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Thu, 28 Sep 2023 12:03:58 +0000 (15:03 +0300)
Reported-by: syzbot+e94d98936a0ed08bde43@syzkaller.appspotmail.com
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/fsntfs.c

index edb51dc12f65f62dffd7f1a12a547db6169fac3f..fbfe21dbb42597cdb25a6d809f7b396e37508046 100644 (file)
@@ -2454,10 +2454,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;
@@ -2511,6 +2513,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);
 }
 
 /*