All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: linux-xfs@vger.kernel.org
Cc: nathans@redhat.com
Subject: [PATCH 1/2] xfs: stats expose padding value at end of qm line
Date: Wed, 30 Sep 2020 16:35:31 +1000	[thread overview]
Message-ID: <20200930063532.142256-2-david@fromorbit.com> (raw)
In-Reply-To: <20200930063532.142256-1-david@fromorbit.com>

From: Dave Chinner <dchinner@redhat.com>

There are 8 quota stats exposed, but:

$ grep qm /proc/fs/xfs/stat
qm 0 0 0 1889 308893 0 0 0 0
$

There are 9 values exposed. Code inspection reveals that the struct
xfsstats has a hole in the structure where the values change from 32
bit counters to 64 bit counters. pahole output:

....
uint32_t                   xs_qm_dquot;          /*   748     4 */
uint32_t                   xs_qm_dquot_unused;   /*   752     4 */

/* XXX 4 bytes hole, try to pack */

uint64_t                   xs_xstrat_bytes;      /*   760     8 */
....

Fix this by defining an "end of 32 bit variables" variable that
we then use to define the end of the quota line. This will then
ensure that we print the correct number of values regardless of
structure layout.

However, ABI requirements for userspace parsers mean we cannot
remove the output that results from this hole, so we also need to
explicitly define this unused value until such time that we actually
add a new stat that makes the output meaningful.

And now we have a defined end of 32bit variables, update the  stats
union to be sized to match all the 32 bit variables correctly.

Output with this patch:

$ grep qm /proc/fs/xfs/stat
qm 0 0 0 326 1802 0 6 3 0
$

Reported-by: Nathan Scott <nathans@redhat.com>
Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
 fs/xfs/xfs_stats.c |  2 +-
 fs/xfs/xfs_stats.h | 15 +++++++++++++--
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/fs/xfs/xfs_stats.c b/fs/xfs/xfs_stats.c
index f70f1255220b..3409b273f00a 100644
--- a/fs/xfs/xfs_stats.c
+++ b/fs/xfs/xfs_stats.c
@@ -51,7 +51,7 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf)
 		{ "rmapbt",		xfsstats_offset(xs_refcbt_2)	},
 		{ "refcntbt",		xfsstats_offset(xs_qm_dqreclaims)},
 		/* we print both series of quota information together */
-		{ "qm",			xfsstats_offset(xs_xstrat_bytes)},
+		{ "qm",			xfsstats_offset(xs_end_of_32bit_counts)},
 	};
 
 	/* Loop over all stats groups */
diff --git a/fs/xfs/xfs_stats.h b/fs/xfs/xfs_stats.h
index 34d704f703d2..861acf84cb3c 100644
--- a/fs/xfs/xfs_stats.h
+++ b/fs/xfs/xfs_stats.h
@@ -133,6 +133,17 @@ struct __xfsstats {
 	uint32_t		xs_qm_dqwants;
 	uint32_t		xs_qm_dquot;
 	uint32_t		xs_qm_dquot_unused;
+	uint32_t		xs_qm_zero_until_next_stat_is_added;
+
+/*
+ * Define the end of 32 bit counters as a 32 bit variable so that we don't
+ * end up exposing an implicit structure padding hole due to the next counters
+ * being 64bit values. If the number of coutners is odd, this fills the hole. If
+ * the number of coutners is even the hole is after this variable and the stats
+ * line will terminate printing at this offset and not print the hole.
+ */
+	uint32_t		xs_end_of_32bit_counts;
+
 /* Extra precision counters */
 	uint64_t		xs_xstrat_bytes;
 	uint64_t		xs_write_bytes;
@@ -143,8 +154,8 @@ struct __xfsstats {
 
 struct xfsstats {
 	union {
-		struct __xfsstats	s;
-		uint32_t		a[xfsstats_offset(xs_qm_dquot)];
+		struct __xfsstats s;
+		uint32_t	a[xfsstats_offset(xs_end_of_32bit_counts)];
 	};
 };
 
-- 
2.28.0


  reply	other threads:[~2020-09-30  6:35 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-30  6:35 [PATCH 0/2] xfs: a couple of small fixes Dave Chinner
2020-09-30  6:35 ` Dave Chinner [this message]
2020-09-30 14:25   ` [PATCH 1/2] xfs: stats expose padding value at end of qm line Darrick J. Wong
2021-02-16 19:08     ` Eric Sandeen
2021-02-16 19:15   ` Eric Sandeen
2020-09-30  6:35 ` [PATCH 2/2] xfs: fix finobt btree block recovery ordering Dave Chinner
2020-09-30 14:28   ` Darrick J. Wong
2020-09-30 14:51   ` Brian Foster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200930063532.142256-2-david@fromorbit.com \
    --to=david@fromorbit.com \
    --cc=linux-xfs@vger.kernel.org \
    --cc=nathans@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.