Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9355fd11 authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Greg Kroah-Hartman
Browse files

xfs: shut down the filesystem if we screw up quota reservation



commit 2a4bdfa8558ca2904dc17b83497dc82aa7fc05e9 upstream.

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: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Acked-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarChandan Babu R <chandan.babu@oracle.com>
Acked-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 48f75df5
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#include "xfs_trans_priv.h"
#include "xfs_quota.h"
#include "xfs_qm.h"
#include "xfs_error.h"

STATIC void	xfs_trans_alloc_dqinfo(xfs_trans_t *);

@@ -700,9 +701,14 @@ xfs_trans_dqresv(
					    XFS_TRANS_DQ_RES_INOS,
					    ninos);
	}
	ASSERT(dqp->q_res_bcount >= be64_to_cpu(dqp->q_core.d_bcount));
	ASSERT(dqp->q_res_rtbcount >= be64_to_cpu(dqp->q_core.d_rtbcount));
	ASSERT(dqp->q_res_icount >= be64_to_cpu(dqp->q_core.d_icount));

	if (XFS_IS_CORRUPT(mp,
		dqp->q_res_bcount < be64_to_cpu(dqp->q_core.d_bcount)) ||
	    XFS_IS_CORRUPT(mp,
		dqp->q_res_rtbcount < be64_to_cpu(dqp->q_core.d_rtbcount)) ||
	    XFS_IS_CORRUPT(mp,
		dqp->q_res_icount < be64_to_cpu(dqp->q_core.d_icount)))
		goto error_corrupt;

	xfs_dqunlock(dqp);
	return 0;
@@ -712,6 +718,10 @@ xfs_trans_dqresv(
	if (flags & XFS_QMOPT_ENOSPC)
		return -ENOSPC;
	return -EDQUOT;
error_corrupt:
	xfs_dqunlock(dqp);
	xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
	return -EFSCORRUPTED;
}