On Mon, Feb 01, 2021 at 06:04:48PM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > If we ever screw up the quota reservations enough to trip the > assertions, something's wrong with the quota code. Shut down the > filesystem when this happens, because this is corruption. > > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > --- Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/xfs_trans_dquot.c | 13 ++++++++++--- > 1 file changed, 10 insertions(+), 3 deletions(-) > > > diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c > index a1a72b7900c5..48e09ea30ee5 100644 > --- a/fs/xfs/xfs_trans_dquot.c > +++ b/fs/xfs/xfs_trans_dquot.c > @@ -16,6 +16,7 @@ > #include "xfs_quota.h" > #include "xfs_qm.h" > #include "xfs_trace.h" > +#include "xfs_error.h" > > STATIC void xfs_trans_alloc_dqinfo(xfs_trans_t *); > > @@ -691,9 +692,11 @@ xfs_trans_dqresv( > nblks); > xfs_trans_mod_dquot(tp, dqp, XFS_TRANS_DQ_RES_INOS, ninos); > } > - ASSERT(dqp->q_blk.reserved >= dqp->q_blk.count); > - ASSERT(dqp->q_rtb.reserved >= dqp->q_rtb.count); > - ASSERT(dqp->q_ino.reserved >= dqp->q_ino.count); > + > + if (XFS_IS_CORRUPT(mp, dqp->q_blk.reserved < dqp->q_blk.count) || > + XFS_IS_CORRUPT(mp, dqp->q_rtb.reserved < dqp->q_rtb.count) || > + XFS_IS_CORRUPT(mp, dqp->q_ino.reserved < dqp->q_ino.count)) > + goto error_corrupt; > > xfs_dqunlock(dqp); > return 0; > @@ -703,6 +706,10 @@ xfs_trans_dqresv( > if (xfs_dquot_type(dqp) == XFS_DQTYPE_PROJ) > return -ENOSPC; > return -EDQUOT; > +error_corrupt: > + xfs_dqunlock(dqp); > + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); > + return -EFSCORRUPTED; > } > > >