Blame SOURCES/xfsprogs-5.9.0-xfs-improve-ondisk-dquot-flags-checking.patch

0bf83d
From 28518f7782310951019d6d28f2a6e9f9fc6e4a1c Mon Sep 17 00:00:00 2001
0bf83d
From: "Darrick J. Wong" <darrick.wong@oracle.com>
0bf83d
Date: Tue, 15 Sep 2020 15:50:35 -0400
0bf83d
Subject: [PATCH] xfs: improve ondisk dquot flags checking
0bf83d
0bf83d
Source kernel commit: a990f7a84edc9941956ea3c1dfb89733c80f9ad0
0bf83d
0bf83d
Create an XFS_DQTYPE_ANY mask for ondisk dquots flags, and use that to
0bf83d
ensure that we never accept any garbage flags when we're loading dquots.
0bf83d
While we're at it, restructure the quota type flag checking to use the
0bf83d
proper masking.
0bf83d
0bf83d
Note that I plan to add y2038 support soon, which will require a new
0bf83d
xfs_dqtype_t flag for extended timestamp support, hence all the work to
0bf83d
make the type masking work correctly.
0bf83d
0bf83d
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
0bf83d
Reviewed-by: Dave Chinner <dchinner@redhat.com>
0bf83d
Reviewed-by: Christoph Hellwig <hch@lst.de>
0bf83d
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
0bf83d
---
0bf83d
0bf83d
NOTES: I did not backport the type-vs-flags split, so some of the
0bf83d
naming convenstions are different here.
0bf83d
0bf83d
diff --git a/db/check.c b/db/check.c
0bf83d
index c3dae20..27f6639 100644
0bf83d
--- a/db/check.c
0bf83d
+++ b/db/check.c
0bf83d
@@ -3452,7 +3452,7 @@ process_quota(
0bf83d
 				error++;
0bf83d
 				continue;
0bf83d
 			}
0bf83d
-			if (dqb->dd_diskdq.d_flags != exp_flags) {
0bf83d
+			if (dqb->dd_diskdq.d_flags & ~XFS_DQTYPE_ANY) {
0bf83d
 				if (scicb)
0bf83d
 					dbprintf(_("bad flags %#x for %s dqblk "
0bf83d
 						 "%lld entry %d id %u\n"),
0bf83d
@@ -3461,6 +3461,17 @@ process_quota(
0bf83d
 				error++;
0bf83d
 				continue;
0bf83d
 			}
0bf83d
+			if ((dqb->dd_diskdq.d_flags & XFS_DQ_ALLTYPES)
0bf83d
+								!= exp_flags) {
0bf83d
+				if (scicb)
0bf83d
+					dbprintf(_("wrong type %#x for %s dqblk "
0bf83d
+						 "%lld entry %d id %u\n"),
0bf83d
+						dqb->dd_diskdq.d_flags &
0bf83d
+							XFS_DQ_ALLTYPES, s,
0bf83d
+						(xfs_fileoff_t)qbno, i, dqid);
0bf83d
+				error++;
0bf83d
+				continue;
0bf83d
+			}
0bf83d
 			if (be32_to_cpu(dqb->dd_diskdq.d_id) != dqid) {
0bf83d
 				if (scicb)
0bf83d
 					dbprintf(_("bad id %u for %s dqblk %lld "
0bf83d
diff --git a/libxfs/xfs_dquot_buf.c b/libxfs/xfs_dquot_buf.c
0bf83d
index a3e8ba1..324f528 100644
0bf83d
--- a/libxfs/xfs_dquot_buf.c
0bf83d
+++ b/libxfs/xfs_dquot_buf.c
0bf83d
@@ -39,6 +39,8 @@ xfs_dquot_verify(
0bf83d
 	xfs_disk_dquot_t *ddq,
0bf83d
 	xfs_dqid_t	 id)	  /* used only during quotacheck */
0bf83d
 {
0bf83d
+	__u8			ddq_type;
0bf83d
+
0bf83d
 	/*
0bf83d
 	 * We can encounter an uninitialized dquot buffer for 2 reasons:
0bf83d
 	 * 1. If we crash while deleting the quotainode(s), and those blks got
0bf83d
@@ -59,9 +61,12 @@ xfs_dquot_verify(
0bf83d
 	if (ddq->d_version != XFS_DQUOT_VERSION)
0bf83d
 		return __this_address;
0bf83d
 
0bf83d
-	if (ddq->d_flags != XFS_DQ_USER &&
0bf83d
-	    ddq->d_flags != XFS_DQ_PROJ &&
0bf83d
-	    ddq->d_flags != XFS_DQ_GROUP)
0bf83d
+	if (ddq->d_flags & ~XFS_DQTYPE_ANY)
0bf83d
+		return __this_address;
0bf83d
+	ddq_type = ddq->d_flags & XFS_DQ_ALLTYPES;
0bf83d
+	if (ddq_type != XFS_DQ_USER &&
0bf83d
+	    ddq_type != XFS_DQ_PROJ &&
0bf83d
+	    ddq_type != XFS_DQ_GROUP)
0bf83d
 		return __this_address;
0bf83d
 
0bf83d
 	if (id != -1 && id != be32_to_cpu(ddq->d_id))
0bf83d
diff --git a/libxfs/xfs_quota_defs.h b/libxfs/xfs_quota_defs.h
0bf83d
index afe1ea0..c69dba4 100644
0bf83d
--- a/libxfs/xfs_quota_defs.h
0bf83d
+++ b/libxfs/xfs_quota_defs.h
0bf83d
@@ -31,6 +31,8 @@ typedef uint16_t	xfs_qwarncnt_t;
0bf83d
 
0bf83d
 #define XFS_DQ_ALLTYPES		(XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP)
0bf83d
 
0bf83d
+#define XFS_DQTYPE_ANY		(XFS_DQ_ALLTYPES)
0bf83d
+
0bf83d
 #define XFS_DQ_FLAGS \
0bf83d
 	{ XFS_DQ_USER,		"USER" }, \
0bf83d
 	{ XFS_DQ_PROJ,		"PROJ" }, \