• Sungjong Seo's avatar
    exfat: fix potential deadlock on __exfat_get_dentry_set · 89fc5487
    Sungjong Seo authored
    When accessing a file with more entries than ES_MAX_ENTRY_NUM, the bh-array
    is allocated in __exfat_get_entry_set. The problem is that the bh-array is
    allocated with GFP_KERNEL. It does not make sense. In the following cases,
    a deadlock for sbi->s_lock between the two processes may occur.
    
           CPU0                CPU1
           ----                ----
      kswapd
       balance_pgdat
        lock(fs_reclaim)
                          exfat_iterate
                           lock(&sbi->s_lock)
                           exfat_readdir
                            exfat_get_uniname_from_ext_entry
                             exfat_get_dentry_set
                              __exfat_get_dentry_set
                               kmalloc_array
                                ...
                                lock(fs_reclaim)
        ...
        evict
         exfat_evict_inode
          lock(&sbi->s_lock)
    
    To fix this, let's allocate bh-array with GFP_NOFS.
    
    Fixes: a3ff29a9 ("exfat: support dynamic allocate bh for exfat_entry_set_cache")
    Cc: stable@vger.kernel.org # v6.2+
    Reported-by: syzbot+412a392a2cd4a65e71db@syzkaller.appspotmail.com
    Closes: https://lore.kernel.org/lkml/000000000000fef47e0618c0327f@google.comSigned-off-by: default avatarSungjong Seo <sj1557.seo@samsung.com>
    Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
    89fc5487
dir.c 29.7 KB