]> git.baikalelectronics.ru Git - kernel.git/commitdiff
xfs: shut down the filesystem if we screw up quota reservation
authorDarrick J. Wong <djwong@kernel.org>
Wed, 12 Apr 2023 04:26:21 +0000 (09:56 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Apr 2023 10:07:38 +0000 (12:07 +0200)
commit f0282941741ecb2fce8546979e0946df9cd940b8 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: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Acked-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
Acked-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/xfs/xfs_trans_dquot.c

index c1238a2dbd6a5c490add5358faa7bdf6bfb89109..4e43d415161ded12d3c5efa2dc4c9d0b39107755 100644 (file)
@@ -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 @@ error_return:
        if (flags & XFS_QMOPT_ENOSPC)
                return -ENOSPC;
        return -EDQUOT;
+error_corrupt:
+       xfs_dqunlock(dqp);
+       xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
+       return -EFSCORRUPTED;
 }