• Darrick J. Wong's avatar
    xfs: clear XFS_DQ_FREEING if we can't lock the dquot buffer to flush · c97738a9
    Darrick J. Wong authored
    In commit 8d3d7e2b, we changed xfs_qm_dqpurge to bail out if we
    can't lock the dquot buf to flush the dquot.  This prevents the AIL from
    blocking on the dquot, but it also forgets to clear the FREEING flag on
    its way out.  A subsequent purge attempt will see the FREEING flag is
    set and bail out, which leads to dqpurge_all failing to purge all the
    dquots.
    
    (copy-pasting from Dave Chinner's identical patch)
    
    This was found by inspection after having xfs/305 hang 1 in ~50
    iterations in a quotaoff operation:
    
    [ 8872.301115] xfs_quota       D13888 92262  91813 0x00004002
    [ 8872.302538] Call Trace:
    [ 8872.303193]  __schedule+0x2d2/0x780
    [ 8872.304108]  ? do_raw_spin_unlock+0x57/0xd0
    [ 8872.305198]  schedule+0x6e/0xe0
    [ 8872.306021]  schedule_timeout+0x14d/0x300
    [ 8872.307060]  ? __next_timer_interrupt+0xe0/0xe0
    [ 8872.308231]  ? xfs_qm_dqusage_adjust+0x200/0x200
    [ 8872.309422]  schedule_timeout_uninterruptible+0x2a/0x30
    [ 8872.310759]  xfs_qm_dquot_walk.isra.0+0x15a/0x1b0
    [ 8872.311971]  xfs_qm_dqpurge_all+0x7f/0x90
    [ 8872.313022]  xfs_qm_scall_quotaoff+0x18d/0x2b0
    [ 8872.314163]  xfs_quota_disable+0x3a/0x60
    [ 8872.315179]  kernel_quotactl+0x7e2/0x8d0
    [ 8872.316196]  ? __do_sys_newstat+0x51/0x80
    [ 8872.317238]  __x64_sys_quotactl+0x1e/0x30
    [ 8872.318266]  do_syscall_64+0x46/0x90
    [ 8872.319193]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 8872.320490] RIP: 0033:0x7f46b5490f2a
    [ 8872.321414] Code: Bad RIP value.
    
    Returning -EAGAIN from xfs_qm_dqpurge() without clearing the
    XFS_DQ_FREEING flag means the xfs_qm_dqpurge_all() code can never
    free the dquot, and we loop forever waiting for the XFS_DQ_FREEING
    flag to go away on the dquot that leaked it via -EAGAIN.
    
    Fixes: 8d3d7e2b ("xfs: trylock underlying buffer on dquot flush")
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarAllison Collins <allison.henderson@oracle.com>
    Reviewed-by: default avatarChandan Babu R <chandanrlinux@gmail.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    c97738a9
xfs_qm.c 46.4 KB