• Dave Chinner's avatar
    xfs: quotacheck failure can race with background inode inactivation · 0c7273e4
    Dave Chinner authored
    The background inode inactivation can attached dquots to inodes, but
    this can race with a foreground quotacheck failure that leads to
    disabling quotas and freeing the mp->m_quotainfo structure. The
    background inode inactivation then tries to allocate a quota, tries
    to dereference mp->m_quotainfo, and crashes like so:
    
    XFS (loop1): Quotacheck: Unsuccessful (Error -5): Disabling quotas.
    xfs filesystem being mounted at /root/syzkaller.qCVHXV/0/file0 supports timestamps until 2038 (0x7fffffff)
    BUG: kernel NULL pointer dereference, address: 00000000000002a8
    ....
    CPU: 0 PID: 161 Comm: kworker/0:4 Not tainted 6.2.0-c9c3395d #1
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014
    Workqueue: xfs-inodegc/loop1 xfs_inodegc_worker
    RIP: 0010:xfs_dquot_alloc+0x95/0x1e0
    ....
    Call Trace:
     <TASK>
     xfs_qm_dqread+0x46/0x440
     xfs_qm_dqget_inode+0x154/0x500
     xfs_qm_dqattach_one+0x142/0x3c0
     xfs_qm_dqattach_locked+0x14a/0x170
     xfs_qm_dqattach+0x52/0x80
     xfs_inactive+0x186/0x340
     xfs_inodegc_worker+0xd3/0x430
     process_one_work+0x3b1/0x960
     worker_thread+0x52/0x660
     kthread+0x161/0x1a0
     ret_from_fork+0x29/0x50
     </TASK>
    ....
    
    Prevent this race by flushing all the queued background inode
    inactivations pending before purging all the cached dquots when
    quotacheck fails.
    Reported-by: default avatarPengfei Xu <pengfei.xu@intel.com>
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    0c7273e4
xfs_qm.c 46.2 KB