From patchwork Wed Oct 18 02:10:25 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13426242 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2DEF6CDB474 for ; Wed, 18 Oct 2023 02:10:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229455AbjJRCK2 (ORCPT ); Tue, 17 Oct 2023 22:10:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53258 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229460AbjJRCK2 (ORCPT ); Tue, 17 Oct 2023 22:10:28 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 419EAFC for ; Tue, 17 Oct 2023 19:10:26 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D9071C433C8; Wed, 18 Oct 2023 02:10:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1697595025; bh=knsMA1HkNiSKgVKvMqVT/enR9IPcFhr55dt78NPcUFk=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=lkPDGXoCEvZbyHMWwATYeAx8Zvwo7D2PoT0Bs2yDv6+RdJf0n395G88IrQb60LMUI xineKNoC1g4C0uVYoPtbqKGScYlOE9aHmY+85sw/6SbJvyLjDdE3eD7kHU62DX59o+ Qrhvd5/NLyEab2aInMWgP4NM/DryvFwWZ7vacvE7JU7sEUEK6799xiqx2bWfnlAYZr DAB+rkWGx3nSzfbhaKesdwZ5clTjOJiZ9ILuFXWnE4RVsHCi8r8dKxcjEfAqSCyNhM /mktSGVHtl/XQ5dZoxYsLlmb/SKZts5FU5FfSdqrxx7JCGtfeMauVVtrxWTHqKAVHo UpR5/+kI0k9Ng== Subject: [PATCH 1/4] xfs: create a helper to handle logging parts of rt bitmap blocks From: "Darrick J. Wong" To: djwong@kernel.org Cc: Christoph Hellwig , osandov@fb.com, hch@lst.de, linux-xfs@vger.kernel.org Date: Tue, 17 Oct 2023 19:10:25 -0700 Message-ID: <169759502538.3396240.16032555048636051800.stgit@frogsfrogsfrogs> In-Reply-To: <169759501951.3396240.14113780813650896727.stgit@frogsfrogsfrogs> References: <169759501951.3396240.14113780813650896727.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Create an explicit helper function to log parts of rt bitmap blocks. While we're at it, fix an off-by-one error in two of the the rtbitmap logging calls that led to unnecessarily large log items but was otherwise benign. Suggested-by: Christoph Hellwig Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_rtbitmap.c | 49 +++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index aefa2b0747a5..d05bd0218885 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -432,6 +432,18 @@ xfs_rtfind_forw( return 0; } +/* Log rtsummary counter at @infoword. */ +static inline void +xfs_trans_log_rtsummary( + struct xfs_trans *tp, + struct xfs_buf *bp, + unsigned int infoword) +{ + xfs_trans_log_buf(tp, bp, + infoword * sizeof(xfs_suminfo_t), + (infoword + 1) * sizeof(xfs_suminfo_t) - 1); +} + /* * Read and/or modify the summary information for a given extent size, * bitmap block combination. @@ -497,8 +509,6 @@ xfs_rtmodify_summary_int( infoword = xfs_rtsumoffs_to_infoword(mp, so); sp = xfs_rsumblock_infoptr(bp, infoword); if (delta) { - uint first = (uint)((char *)sp - (char *)bp->b_addr); - *sp += delta; if (mp->m_rsum_cache) { if (*sp == 0 && log == mp->m_rsum_cache[bbno]) @@ -506,7 +516,7 @@ xfs_rtmodify_summary_int( if (*sp != 0 && log < mp->m_rsum_cache[bbno]) mp->m_rsum_cache[bbno] = log; } - xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); + xfs_trans_log_rtsummary(tp, bp, infoword); } if (sum) *sum = *sp; @@ -527,6 +537,19 @@ xfs_rtmodify_summary( delta, rbpp, rsb, NULL); } +/* Log rtbitmap block from the word @from to the byte before @next. */ +static inline void +xfs_trans_log_rtbitmap( + struct xfs_trans *tp, + struct xfs_buf *bp, + unsigned int from, + unsigned int next) +{ + xfs_trans_log_buf(tp, bp, + from * sizeof(xfs_rtword_t), + next * sizeof(xfs_rtword_t) - 1); +} + /* * Set the given range of bitmap bits to the given value. * Do whatever I/O and logging is required. @@ -548,6 +571,7 @@ xfs_rtmodify_range( int i; /* current bit number rel. to start */ int lastbit; /* last useful bit in word */ xfs_rtword_t mask; /* mask o frelevant bits for value */ + unsigned int firstword; /* first word used in the buffer */ unsigned int word; /* word number in the buffer */ /* @@ -565,7 +589,7 @@ xfs_rtmodify_range( /* * Compute the starting word's address, and starting bit. */ - word = xfs_rtx_to_rbmword(mp, start); + firstword = word = xfs_rtx_to_rbmword(mp, start); first = b = xfs_rbmblock_wordptr(bp, word); bit = (int)(start & (XFS_NBWORD - 1)); /* @@ -599,15 +623,13 @@ xfs_rtmodify_range( * Log the changed part of this block. * Get the next one. */ - xfs_trans_log_buf(tp, bp, - (uint)((char *)first - (char *)bp->b_addr), - (uint)((char *)b - (char *)bp->b_addr)); + xfs_trans_log_rtbitmap(tp, bp, firstword, word); error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); if (error) { return error; } - word = 0; + firstword = word = 0; first = b = xfs_rbmblock_wordptr(bp, word); } else { /* @@ -640,15 +662,13 @@ xfs_rtmodify_range( * Log the changed part of this block. * Get the next one. */ - xfs_trans_log_buf(tp, bp, - (uint)((char *)first - (char *)bp->b_addr), - (uint)((char *)b - (char *)bp->b_addr)); + xfs_trans_log_rtbitmap(tp, bp, firstword, word); error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); if (error) { return error; } - word = 0; + firstword = word = 0; first = b = xfs_rbmblock_wordptr(bp, word); } else { /* @@ -673,15 +693,14 @@ xfs_rtmodify_range( *b |= mask; else *b &= ~mask; + word++; b++; } /* * Log any remaining changed bytes. */ if (b > first) - xfs_trans_log_buf(tp, bp, - (uint)((char *)first - (char *)bp->b_addr), - (uint)((char *)b - (char *)bp->b_addr - 1)); + xfs_trans_log_rtbitmap(tp, bp, firstword, word); return 0; } From patchwork Wed Oct 18 02:10:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13426243 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C997BCDB474 for ; Wed, 18 Oct 2023 02:10:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229481AbjJRCKe (ORCPT ); Tue, 17 Oct 2023 22:10:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53272 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229460AbjJRCKe (ORCPT ); Tue, 17 Oct 2023 22:10:34 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2FA9EF7 for ; Tue, 17 Oct 2023 19:10:32 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 91745C433C7; Wed, 18 Oct 2023 02:10:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1697595031; bh=MQCLCqjZFrwz4gtoFrI7aAcYWMUtVgpMv2ywbiWd0Jk=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=ey3LAnMfG2dh43HINYretrFZVYlkmNMZfk331Bn2uSxDUlRovYbs4HXt1Mkptv4lp G0bNYE2csNzg6SF9ij3qvV4B8Wc//tEeXQeFHy6kBtwSrmG7cMR3lx4d9TMNgFNy3C AGDcRItNLGwEDqk3dcDQI3DWcL4xRXYQ0CSPL3SZXz3rehK4lkA+L4YYe4+/7SZBcx VACGADWR4Pn3BGv0wHcynwa4mIoqDwMR+/AXZ6HQKbZi+/bBU2+qCMwCBCBJ8CQMYg hWk8uV3sQbo7dsT8c0wRzpY4PSo5yQKZEDRAMs3W3W5dEnCLhwBrKFy292ICFQysV2 bCwma8nbBZjhg== Subject: [PATCH 2/4] xfs: use accessor functions for bitmap words From: "Darrick J. Wong" To: djwong@kernel.org Cc: osandov@fb.com, hch@lst.de, linux-xfs@vger.kernel.org Date: Tue, 17 Oct 2023 19:10:31 -0700 Message-ID: <169759503104.3396240.5905890094753315092.stgit@frogsfrogsfrogs> In-Reply-To: <169759501951.3396240.14113780813650896727.stgit@frogsfrogsfrogs> References: <169759501951.3396240.14113780813650896727.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Create get and set functions for rtbitmap words so that we can redefine the ondisk format with a specific endianness. Note that this requires the definition of a distinct type for ondisk rtbitmap words so that the compiler can perform proper typechecking as we go back and forth. In the upcoming rtgroups feature, we're going to fix the problem that rtwords are written in host endian order, which means we'll need the distinct rtword/rtword_raw types. Signed-off-by: Darrick J. Wong Signed-off-by: Christoph Hellwig Reviewed-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_format.h | 8 +++ fs/xfs/libxfs/xfs_rtbitmap.c | 109 +++++++++++++----------------------------- fs/xfs/libxfs/xfs_rtbitmap.h | 27 ++++++++++ fs/xfs/xfs_ondisk.h | 3 + 4 files changed, 70 insertions(+), 77 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index d48e3a395bd9..2af891d5d171 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -690,6 +690,14 @@ struct xfs_agfl { ASSERT(xfs_daddr_to_agno(mp, d) == \ xfs_daddr_to_agno(mp, (d) + (len) - 1))) +/* + * Realtime bitmap information is accessed by the word, which is currently + * stored in host-endian format. + */ +union xfs_rtword_raw { + __u32 old; +}; + /* * XFS Timestamps * ============== diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index d05bd0218885..0e83eca507dd 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -99,7 +99,6 @@ xfs_rtfind_back( xfs_rtxnum_t limit, /* last rtext to look at */ xfs_rtxnum_t *rtx) /* out: start rtext found */ { - xfs_rtword_t *b; /* current word in buffer */ int bit; /* bit number in the word */ xfs_fileoff_t block; /* bitmap block number */ struct xfs_buf *bp; /* buf for the block */ @@ -110,6 +109,7 @@ xfs_rtfind_back( xfs_rtword_t mask; /* mask of relevant bits for value */ xfs_rtword_t want; /* mask for "good" values */ xfs_rtword_t wdiff; /* difference from wanted value */ + xfs_rtword_t incore; unsigned int word; /* word number in the buffer */ /* @@ -125,14 +125,14 @@ xfs_rtfind_back( * Get the first word's index & point to it. */ word = xfs_rtx_to_rbmword(mp, start); - b = xfs_rbmblock_wordptr(bp, word); bit = (int)(start & (XFS_NBWORD - 1)); len = start - limit + 1; /* * Compute match value, based on the bit at start: if 1 (free) * then all-ones, else all-zeroes. */ - want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; + incore = xfs_rtbitmap_getword(bp, word); + want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0; /* * If the starting position is not word-aligned, deal with the * partial word. @@ -149,7 +149,7 @@ xfs_rtfind_back( * Calculate the difference between the value there * and what we're looking for. */ - if ((wdiff = (*b ^ want) & mask)) { + if ((wdiff = (incore ^ want) & mask)) { /* * Different. Mark where we are and return. */ @@ -174,12 +174,6 @@ xfs_rtfind_back( } word = mp->m_blockwsize - 1; - b = xfs_rbmblock_wordptr(bp, word); - } else { - /* - * Go on to the previous word in the buffer. - */ - b--; } } else { /* @@ -195,7 +189,8 @@ xfs_rtfind_back( /* * Compute difference between actual and desired value. */ - if ((wdiff = *b ^ want)) { + incore = xfs_rtbitmap_getword(bp, word); + if ((wdiff = incore ^ want)) { /* * Different, mark where we are and return. */ @@ -220,12 +215,6 @@ xfs_rtfind_back( } word = mp->m_blockwsize - 1; - b = xfs_rbmblock_wordptr(bp, word); - } else { - /* - * Go on to the previous word in the buffer. - */ - b--; } } /* @@ -242,7 +231,8 @@ xfs_rtfind_back( /* * Compute difference between actual and desired value. */ - if ((wdiff = (*b ^ want) & mask)) { + incore = xfs_rtbitmap_getword(bp, word); + if ((wdiff = (incore ^ want) & mask)) { /* * Different, mark where we are and return. */ @@ -273,7 +263,6 @@ xfs_rtfind_forw( xfs_rtxnum_t limit, /* last rtext to look at */ xfs_rtxnum_t *rtx) /* out: start rtext found */ { - xfs_rtword_t *b; /* current word in buffer */ int bit; /* bit number in the word */ xfs_fileoff_t block; /* bitmap block number */ struct xfs_buf *bp; /* buf for the block */ @@ -284,6 +273,7 @@ xfs_rtfind_forw( xfs_rtword_t mask; /* mask of relevant bits for value */ xfs_rtword_t want; /* mask for "good" values */ xfs_rtword_t wdiff; /* difference from wanted value */ + xfs_rtword_t incore; unsigned int word; /* word number in the buffer */ /* @@ -299,14 +289,14 @@ xfs_rtfind_forw( * Get the first word's index & point to it. */ word = xfs_rtx_to_rbmword(mp, start); - b = xfs_rbmblock_wordptr(bp, word); bit = (int)(start & (XFS_NBWORD - 1)); len = limit - start + 1; /* * Compute match value, based on the bit at start: if 1 (free) * then all-ones, else all-zeroes. */ - want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; + incore = xfs_rtbitmap_getword(bp, word); + want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0; /* * If the starting position is not word-aligned, deal with the * partial word. @@ -322,7 +312,7 @@ xfs_rtfind_forw( * Calculate the difference between the value there * and what we're looking for. */ - if ((wdiff = (*b ^ want) & mask)) { + if ((wdiff = (incore ^ want) & mask)) { /* * Different. Mark where we are and return. */ @@ -347,12 +337,6 @@ xfs_rtfind_forw( } word = 0; - b = xfs_rbmblock_wordptr(bp, word); - } else { - /* - * Go on to the previous word in the buffer. - */ - b++; } } else { /* @@ -368,7 +352,8 @@ xfs_rtfind_forw( /* * Compute difference between actual and desired value. */ - if ((wdiff = *b ^ want)) { + incore = xfs_rtbitmap_getword(bp, word); + if ((wdiff = incore ^ want)) { /* * Different, mark where we are and return. */ @@ -393,12 +378,6 @@ xfs_rtfind_forw( } word = 0; - b = xfs_rbmblock_wordptr(bp, word); - } else { - /* - * Go on to the next word in the buffer. - */ - b++; } } /* @@ -413,7 +392,8 @@ xfs_rtfind_forw( /* * Compute difference between actual and desired value. */ - if ((wdiff = (*b ^ want) & mask)) { + incore = xfs_rtbitmap_getword(bp, word); + if ((wdiff = (incore ^ want) & mask)) { /* * Different, mark where we are and return. */ @@ -562,15 +542,14 @@ xfs_rtmodify_range( xfs_rtxlen_t len, /* length of extent to modify */ int val) /* 1 for free, 0 for allocated */ { - xfs_rtword_t *b; /* current word in buffer */ int bit; /* bit number in the word */ xfs_fileoff_t block; /* bitmap block number */ struct xfs_buf *bp; /* buf for the block */ int error; /* error value */ - xfs_rtword_t *first; /* first used word in the buffer */ int i; /* current bit number rel. to start */ int lastbit; /* last useful bit in word */ xfs_rtword_t mask; /* mask o frelevant bits for value */ + xfs_rtword_t incore; unsigned int firstword; /* first word used in the buffer */ unsigned int word; /* word number in the buffer */ @@ -590,7 +569,6 @@ xfs_rtmodify_range( * Compute the starting word's address, and starting bit. */ firstword = word = xfs_rtx_to_rbmword(mp, start); - first = b = xfs_rbmblock_wordptr(bp, word); bit = (int)(start & (XFS_NBWORD - 1)); /* * 0 (allocated) => all zeroes; 1 (free) => all ones. @@ -609,10 +587,12 @@ xfs_rtmodify_range( /* * Set/clear the active bits. */ + incore = xfs_rtbitmap_getword(bp, word); if (val) - *b |= mask; + incore |= mask; else - *b &= ~mask; + incore &= ~mask; + xfs_rtbitmap_setword(bp, word, incore); i = lastbit - bit; /* * Go on to the next block if that's where the next word is @@ -630,12 +610,6 @@ xfs_rtmodify_range( } firstword = word = 0; - first = b = xfs_rbmblock_wordptr(bp, word); - } else { - /* - * Go on to the next word in the buffer - */ - b++; } } else { /* @@ -651,7 +625,7 @@ xfs_rtmodify_range( /* * Set the word value correctly. */ - *b = val; + xfs_rtbitmap_setword(bp, word, val); i += XFS_NBWORD; /* * Go on to the next block if that's where the next word is @@ -669,12 +643,6 @@ xfs_rtmodify_range( } firstword = word = 0; - first = b = xfs_rbmblock_wordptr(bp, word); - } else { - /* - * Go on to the next word in the buffer - */ - b++; } } /* @@ -689,17 +657,18 @@ xfs_rtmodify_range( /* * Set/clear the active bits. */ + incore = xfs_rtbitmap_getword(bp, word); if (val) - *b |= mask; + incore |= mask; else - *b &= ~mask; + incore &= ~mask; + xfs_rtbitmap_setword(bp, word, incore); word++; - b++; } /* * Log any remaining changed bytes. */ - if (b > first) + if (word > firstword) xfs_trans_log_rtbitmap(tp, bp, firstword, word); return 0; } @@ -794,7 +763,6 @@ xfs_rtcheck_range( xfs_rtxnum_t *new, /* out: first rtext not matching */ int *stat) /* out: 1 for matches, 0 for not */ { - xfs_rtword_t *b; /* current word in buffer */ int bit; /* bit number in the word */ xfs_fileoff_t block; /* bitmap block number */ struct xfs_buf *bp; /* buf for the block */ @@ -803,6 +771,7 @@ xfs_rtcheck_range( xfs_rtxnum_t lastbit; /* last useful bit in word */ xfs_rtword_t mask; /* mask of relevant bits for value */ xfs_rtword_t wdiff; /* difference from wanted value */ + xfs_rtword_t incore; unsigned int word; /* word number in the buffer */ /* @@ -821,7 +790,6 @@ xfs_rtcheck_range( * Compute the starting word's address, and starting bit. */ word = xfs_rtx_to_rbmword(mp, start); - b = xfs_rbmblock_wordptr(bp, word); bit = (int)(start & (XFS_NBWORD - 1)); /* * 0 (allocated) => all zero's; 1 (free) => all one's. @@ -843,7 +811,8 @@ xfs_rtcheck_range( /* * Compute difference between actual and desired value. */ - if ((wdiff = (*b ^ val) & mask)) { + incore = xfs_rtbitmap_getword(bp, word); + if ((wdiff = (incore ^ val) & mask)) { /* * Different, compute first wrong bit and return. */ @@ -869,12 +838,6 @@ xfs_rtcheck_range( } word = 0; - b = xfs_rbmblock_wordptr(bp, word); - } else { - /* - * Go on to the next word in the buffer. - */ - b++; } } else { /* @@ -890,7 +853,8 @@ xfs_rtcheck_range( /* * Compute difference between actual and desired value. */ - if ((wdiff = *b ^ val)) { + incore = xfs_rtbitmap_getword(bp, word); + if ((wdiff = incore ^ val)) { /* * Different, compute first wrong bit and return. */ @@ -916,12 +880,6 @@ xfs_rtcheck_range( } word = 0; - b = xfs_rbmblock_wordptr(bp, word); - } else { - /* - * Go on to the next word in the buffer. - */ - b++; } } /* @@ -936,7 +894,8 @@ xfs_rtcheck_range( /* * Compute difference between actual and desired value. */ - if ((wdiff = (*b ^ val) & mask)) { + incore = xfs_rtbitmap_getword(bp, word); + if ((wdiff = (incore ^ val) & mask)) { /* * Different, compute first wrong bit and return. */ diff --git a/fs/xfs/libxfs/xfs_rtbitmap.h b/fs/xfs/libxfs/xfs_rtbitmap.h index 01eabb9b5516..ede24de74620 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.h +++ b/fs/xfs/libxfs/xfs_rtbitmap.h @@ -159,16 +159,39 @@ xfs_rbmblock_to_rtx( } /* Return a pointer to a bitmap word within a rt bitmap block. */ -static inline xfs_rtword_t * +static inline union xfs_rtword_raw * xfs_rbmblock_wordptr( struct xfs_buf *bp, unsigned int index) { - xfs_rtword_t *words = bp->b_addr; + union xfs_rtword_raw *words = bp->b_addr; return words + index; } +/* Convert an ondisk bitmap word to its incore representation. */ +static inline xfs_rtword_t +xfs_rtbitmap_getword( + struct xfs_buf *bp, + unsigned int index) +{ + union xfs_rtword_raw *word = xfs_rbmblock_wordptr(bp, index); + + return word->old; +} + +/* Set an ondisk bitmap word from an incore representation. */ +static inline void +xfs_rtbitmap_setword( + struct xfs_buf *bp, + unsigned int index, + xfs_rtword_t value) +{ + union xfs_rtword_raw *word = xfs_rbmblock_wordptr(bp, index); + + word->old = value; +} + /* * Convert a rt extent length and rt bitmap block number to a xfs_suminfo_t * offset within the rt summary file. diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h index c4cc99b70dd3..14d455f768d3 100644 --- a/fs/xfs/xfs_ondisk.h +++ b/fs/xfs/xfs_ondisk.h @@ -72,6 +72,9 @@ xfs_check_ondisk_structs(void) XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_map_t, 4); XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_local_t, 4); + /* realtime structures */ + XFS_CHECK_STRUCT_SIZE(union xfs_rtword_raw, 4); + /* * m68k has problems with xfs_attr_leaf_name_remote_t, but we pad it to * 4 bytes anyway so it's not obviously a problem. Hence for the moment From patchwork Wed Oct 18 02:10:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13426244 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A0D37CDB474 for ; Wed, 18 Oct 2023 02:10:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229460AbjJRCKj (ORCPT ); Tue, 17 Oct 2023 22:10:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57604 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229468AbjJRCKj (ORCPT ); Tue, 17 Oct 2023 22:10:39 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A61E3F7 for ; Tue, 17 Oct 2023 19:10:37 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 456FFC433C8; Wed, 18 Oct 2023 02:10:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1697595037; bh=LOscQkPf/9Ud3FWzWzoY0tOCHt0fe9ti/pJoX/+CorU=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=W/qcOyf31ndxXCwh8ts9X6VInxcX/2p856LwUcHBBYRVaAdblWA/T42CIT+gqpmj+ 7YytjEKeGAWGrwu3QNhMu3dFM2W2z8BaUvLKy7Fb7eiDQbCzwzRC58St4DWNGqKCr+ KJPOQQQYbV3ez1f6dRP6z1D/Y/FY38PB3f/tpR596b8duNAx8+005F9cJJgoGxJQ32 3keyVgHWRWSqpEehv0QPqgj92avnqrAXYG6eJGJa6TwBB8fRDKyp7aIt/IfUWg4Y88 G/9zDDWdjrN+qYY+GDMAZSXcNnGVOGVTCdsfqipg/W71sOhRpCrANexd+U2TtRp7PQ n8nN6uvXvyaGA== Subject: [PATCH 3/4] xfs: create helpers for rtsummary block/wordcount computations From: "Darrick J. Wong" To: djwong@kernel.org Cc: Christoph Hellwig , osandov@fb.com, hch@lst.de, linux-xfs@vger.kernel.org Date: Tue, 17 Oct 2023 19:10:36 -0700 Message-ID: <169759503678.3396240.13232826574442593948.stgit@frogsfrogsfrogs> In-Reply-To: <169759501951.3396240.14113780813650896727.stgit@frogsfrogsfrogs> References: <169759501951.3396240.14113780813650896727.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Create helper functions that compute the number of blocks or words necessary to store the rt summary file. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_rtbitmap.c | 29 +++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rtbitmap.h | 7 +++++++ fs/xfs/xfs_rtalloc.c | 17 +++++++---------- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index 0e83eca507dd..4ef54bfbb3da 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -1140,3 +1140,32 @@ xfs_rtbitmap_wordcount( blocks = xfs_rtbitmap_blockcount(mp, rtextents); return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG; } + +/* Compute the number of rtsummary blocks needed to track the given rt space. */ +xfs_filblks_t +xfs_rtsummary_blockcount( + struct xfs_mount *mp, + unsigned int rsumlevels, + xfs_extlen_t rbmblocks) +{ + unsigned long long rsumwords; + + rsumwords = (unsigned long long)rsumlevels * rbmblocks; + return XFS_B_TO_FSB(mp, rsumwords << XFS_WORDLOG); +} + +/* + * Compute the number of rtsummary info words needed to populate every block of + * a summary file that is large enough to track the given rt space. + */ +unsigned long long +xfs_rtsummary_wordcount( + struct xfs_mount *mp, + unsigned int rsumlevels, + xfs_extlen_t rbmblocks) +{ + xfs_filblks_t blocks; + + blocks = xfs_rtsummary_blockcount(mp, rsumlevels, rbmblocks); + return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG; +} diff --git a/fs/xfs/libxfs/xfs_rtbitmap.h b/fs/xfs/libxfs/xfs_rtbitmap.h index ede24de74620..a3e8288bedea 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.h +++ b/fs/xfs/libxfs/xfs_rtbitmap.h @@ -308,6 +308,11 @@ xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents); unsigned long long xfs_rtbitmap_wordcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents); + +xfs_filblks_t xfs_rtsummary_blockcount(struct xfs_mount *mp, + unsigned int rsumlevels, xfs_extlen_t rbmblocks); +unsigned long long xfs_rtsummary_wordcount(struct xfs_mount *mp, + unsigned int rsumlevels, xfs_extlen_t rbmblocks); #else /* CONFIG_XFS_RT */ # define xfs_rtfree_extent(t,b,l) (-ENOSYS) # define xfs_rtfree_blocks(t,rb,rl) (-ENOSYS) @@ -322,6 +327,8 @@ xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents) return 0; } # define xfs_rtbitmap_wordcount(mp, r) (0) +# define xfs_rtsummary_blockcount(mp, l, b) (0) +# define xfs_rtsummary_wordcount(mp, l, b) (0) #endif /* CONFIG_XFS_RT */ #endif /* __XFS_RTBITMAP_H__ */ diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 8e041df12640..3be6bda2fd92 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -1001,8 +1001,7 @@ xfs_growfs_rt( nrbmblocks = xfs_rtbitmap_blockcount(mp, nrextents); nrextslog = xfs_highbit32(nrextents); nrsumlevels = nrextslog + 1; - nrsumsize = (uint)sizeof(xfs_suminfo_t) * nrsumlevels * nrbmblocks; - nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize); + nrsumblocks = xfs_rtsummary_blockcount(mp, nrsumlevels, nrbmblocks); nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks); /* * New summary size can't be more than half the size of @@ -1063,10 +1062,8 @@ xfs_growfs_rt( ASSERT(nsbp->sb_rextents != 0); nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents); nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1; - nrsumsize = - (uint)sizeof(xfs_suminfo_t) * nrsumlevels * - nsbp->sb_rbmblocks; - nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize); + nrsumblocks = xfs_rtsummary_blockcount(mp, nrsumlevels, + nsbp->sb_rbmblocks); nmp->m_rsumsize = nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks); /* * Start a transaction, get the log reservation. @@ -1272,6 +1269,7 @@ xfs_rtmount_init( struct xfs_buf *bp; /* buffer for last block of subvolume */ struct xfs_sb *sbp; /* filesystem superblock copy in mount */ xfs_daddr_t d; /* address of last block of subvolume */ + unsigned int rsumblocks; int error; sbp = &mp->m_sb; @@ -1283,10 +1281,9 @@ xfs_rtmount_init( return -ENODEV; } mp->m_rsumlevels = sbp->sb_rextslog + 1; - mp->m_rsumsize = - (uint)sizeof(xfs_suminfo_t) * mp->m_rsumlevels * - sbp->sb_rbmblocks; - mp->m_rsumsize = roundup(mp->m_rsumsize, sbp->sb_blocksize); + rsumblocks = xfs_rtsummary_blockcount(mp, mp->m_rsumlevels, + mp->m_sb.sb_rbmblocks); + mp->m_rsumsize = XFS_FSB_TO_B(mp, rsumblocks); mp->m_rbmip = mp->m_rsumip = NULL; /* * Check that the realtime section is an ok size. From patchwork Wed Oct 18 02:10:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13426245 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A7DB6CDB474 for ; Wed, 18 Oct 2023 02:10:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229486AbjJRCKq (ORCPT ); Tue, 17 Oct 2023 22:10:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57662 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229468AbjJRCKq (ORCPT ); Tue, 17 Oct 2023 22:10:46 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 37F62FC for ; Tue, 17 Oct 2023 19:10:43 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CE1F3C433C8; Wed, 18 Oct 2023 02:10:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1697595042; bh=jNGuDrWE0KRAv6DyYiCNRSXYFbyY4fvdz0s3r/jXJJ0=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=SvP3S5PbP5onMWPzR0QDYhlnRQuYcby9VgXCH1YlDZlw5WnEJDViMB7kB0edLuZRG T/SuOSfHNd0ZZETxtkdBe+n6j0IeYaPrAljEeyB6GASJH4NMaibpMIIXEppP3Mkuiq N2wn/0vrZrYWObsb5yh25zgAantX2OCtSIUlBZdd/ne+vCDtNbqaO8PrtVQ2BLn9zW rw/DVtPwbVT2B8L114OSTRCP8XkSjYEDz5COA6EdEDB9p21BQrI8YHbkf+DpWHEGh1 UGfiiRj0PuI7RCSMP4bTPPATX5bdFSoO/4w2egEPmJDHIaWEqfNdkmbVPrHfVkPAw/ oHi15GVthNj0g== Subject: [PATCH 4/4] xfs: use accessor functions for summary info words From: "Darrick J. Wong" To: djwong@kernel.org Cc: osandov@fb.com, hch@lst.de, linux-xfs@vger.kernel.org Date: Tue, 17 Oct 2023 19:10:42 -0700 Message-ID: <169759504247.3396240.12544584850393209864.stgit@frogsfrogsfrogs> In-Reply-To: <169759501951.3396240.14113780813650896727.stgit@frogsfrogsfrogs> References: <169759501951.3396240.14113780813650896727.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Create get and set functions for rtsummary words so that we can redefine the ondisk format with a specific endianness. Note that this requires the definition of a distinct type for ondisk summary info words so that the compiler can perform proper typechecking. Signed-off-by: Darrick J. Wong Signed-off-by: Christoph Hellwig Reviewed-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_format.h | 8 ++++++++ fs/xfs/libxfs/xfs_rtbitmap.c | 15 ++++++++------- fs/xfs/libxfs/xfs_rtbitmap.h | 28 ++++++++++++++++++++++++++-- fs/xfs/scrub/rtsummary.c | 30 +++++++++++++++++++++--------- fs/xfs/scrub/trace.c | 1 + fs/xfs/scrub/trace.h | 10 +++++----- fs/xfs/xfs_ondisk.h | 1 + 7 files changed, 70 insertions(+), 23 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 2af891d5d171..9a88aba1589f 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -698,6 +698,14 @@ union xfs_rtword_raw { __u32 old; }; +/* + * Realtime summary counts are accessed by the word, which is currently + * stored in host-endian format. + */ +union xfs_suminfo_raw { + __u32 old; +}; + /* * XFS Timestamps * ============== diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index 4ef54bfbb3da..93de330e9cae 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -448,7 +448,6 @@ xfs_rtmodify_summary_int( int error; /* error value */ xfs_fileoff_t sb; /* summary fsblock */ xfs_rtsumoff_t so; /* index into the summary file */ - xfs_suminfo_t *sp; /* pointer to returned data */ unsigned int infoword; /* @@ -487,19 +486,21 @@ xfs_rtmodify_summary_int( * Point to the summary information, modify/log it, and/or copy it out. */ infoword = xfs_rtsumoffs_to_infoword(mp, so); - sp = xfs_rsumblock_infoptr(bp, infoword); if (delta) { - *sp += delta; + xfs_suminfo_t val = xfs_suminfo_add(bp, infoword, delta); + if (mp->m_rsum_cache) { - if (*sp == 0 && log == mp->m_rsum_cache[bbno]) + if (val == 0 && log == mp->m_rsum_cache[bbno]) mp->m_rsum_cache[bbno]++; - if (*sp != 0 && log < mp->m_rsum_cache[bbno]) + if (val != 0 && log < mp->m_rsum_cache[bbno]) mp->m_rsum_cache[bbno] = log; } xfs_trans_log_rtsummary(tp, bp, infoword); + if (sum) + *sum = val; + } else if (sum) { + *sum = xfs_suminfo_get(bp, infoword); } - if (sum) - *sum = *sp; return 0; } diff --git a/fs/xfs/libxfs/xfs_rtbitmap.h b/fs/xfs/libxfs/xfs_rtbitmap.h index a3e8288bedea..fdfa98e0ee52 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.h +++ b/fs/xfs/libxfs/xfs_rtbitmap.h @@ -232,16 +232,40 @@ xfs_rtsumoffs_to_infoword( } /* Return a pointer to a summary info word within a rt summary block. */ -static inline xfs_suminfo_t * +static inline union xfs_suminfo_raw * xfs_rsumblock_infoptr( struct xfs_buf *bp, unsigned int index) { - xfs_suminfo_t *info = bp->b_addr; + union xfs_suminfo_raw *info = bp->b_addr; return info + index; } +/* Get the current value of a summary counter. */ +static inline xfs_suminfo_t +xfs_suminfo_get( + struct xfs_buf *bp, + unsigned int index) +{ + union xfs_suminfo_raw *info = xfs_rsumblock_infoptr(bp, index); + + return info->old; +} + +/* Add to the current value of a summary counter and return the new value. */ +static inline xfs_suminfo_t +xfs_suminfo_add( + struct xfs_buf *bp, + unsigned int index, + int delta) +{ + union xfs_suminfo_raw *info = xfs_rsumblock_infoptr(bp, index); + + info->old += delta; + return info->old; +} + /* * Functions for walking free space rtextents in the realtime bitmap. */ diff --git a/fs/xfs/scrub/rtsummary.c b/fs/xfs/scrub/rtsummary.c index ae51fb982808..6ef1fd7e086b 100644 --- a/fs/xfs/scrub/rtsummary.c +++ b/fs/xfs/scrub/rtsummary.c @@ -82,9 +82,10 @@ static inline int xfsum_load( struct xfs_scrub *sc, xfs_rtsumoff_t sumoff, - xfs_suminfo_t *info) + union xfs_suminfo_raw *rawinfo) { - return xfile_obj_load(sc->xfile, info, sizeof(xfs_suminfo_t), + return xfile_obj_load(sc->xfile, rawinfo, + sizeof(union xfs_suminfo_raw), sumoff << XFS_WORDLOG); } @@ -92,9 +93,10 @@ static inline int xfsum_store( struct xfs_scrub *sc, xfs_rtsumoff_t sumoff, - const xfs_suminfo_t info) + const union xfs_suminfo_raw rawinfo) { - return xfile_obj_store(sc->xfile, &info, sizeof(xfs_suminfo_t), + return xfile_obj_store(sc->xfile, &rawinfo, + sizeof(union xfs_suminfo_raw), sumoff << XFS_WORDLOG); } @@ -102,13 +104,22 @@ static inline int xfsum_copyout( struct xfs_scrub *sc, xfs_rtsumoff_t sumoff, - xfs_suminfo_t *info, + union xfs_suminfo_raw *rawinfo, unsigned int nr_words) { - return xfile_obj_load(sc->xfile, info, nr_words << XFS_WORDLOG, + return xfile_obj_load(sc->xfile, rawinfo, nr_words << XFS_WORDLOG, sumoff << XFS_WORDLOG); } +static inline xfs_suminfo_t +xchk_rtsum_inc( + struct xfs_mount *mp, + union xfs_suminfo_raw *v) +{ + v->old += 1; + return v->old; +} + /* Update the summary file to reflect the free extent that we've accumulated. */ STATIC int xchk_rtsum_record_free( @@ -123,7 +134,8 @@ xchk_rtsum_record_free( xfs_filblks_t rtlen; xfs_rtsumoff_t offs; unsigned int lenlog; - xfs_suminfo_t v = 0; + union xfs_suminfo_raw v; + xfs_suminfo_t value; int error = 0; if (xchk_should_terminate(sc, &error)) @@ -147,9 +159,9 @@ xchk_rtsum_record_free( if (error) return error; - v++; + value = xchk_rtsum_inc(sc->mp, &v); trace_xchk_rtsum_record_free(mp, rec->ar_startext, rec->ar_extcount, - lenlog, offs, v); + lenlog, offs, value); return xfsum_store(sc, offs, v); } diff --git a/fs/xfs/scrub/trace.c b/fs/xfs/scrub/trace.c index 46249e7b17e0..29afa4851235 100644 --- a/fs/xfs/scrub/trace.c +++ b/fs/xfs/scrub/trace.c @@ -13,6 +13,7 @@ #include "xfs_inode.h" #include "xfs_btree.h" #include "xfs_ag.h" +#include "xfs_rtbitmap.h" #include "scrub/scrub.h" #include "scrub/xfile.h" #include "scrub/xfarray.h" diff --git a/fs/xfs/scrub/trace.h b/fs/xfs/scrub/trace.h index b0cf6757444f..4a8bc6f3c8f2 100644 --- a/fs/xfs/scrub/trace.h +++ b/fs/xfs/scrub/trace.h @@ -1038,8 +1038,8 @@ TRACE_EVENT(xfarray_sort_stats, TRACE_EVENT(xchk_rtsum_record_free, TP_PROTO(struct xfs_mount *mp, xfs_rtxnum_t start, xfs_rtbxlen_t len, unsigned int log, loff_t pos, - xfs_suminfo_t v), - TP_ARGS(mp, start, len, log, pos, v), + xfs_suminfo_t value), + TP_ARGS(mp, start, len, log, pos, value), TP_STRUCT__entry( __field(dev_t, dev) __field(dev_t, rtdev) @@ -1047,7 +1047,7 @@ TRACE_EVENT(xchk_rtsum_record_free, __field(unsigned long long, len) __field(unsigned int, log) __field(loff_t, pos) - __field(xfs_suminfo_t, v) + __field(xfs_suminfo_t, value) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; @@ -1056,7 +1056,7 @@ TRACE_EVENT(xchk_rtsum_record_free, __entry->len = len; __entry->log = log; __entry->pos = pos; - __entry->v = v; + __entry->value = value; ), TP_printk("dev %d:%d rtdev %d:%d rtx 0x%llx rtxcount 0x%llx log %u rsumpos 0x%llx sumcount %u", MAJOR(__entry->dev), MINOR(__entry->dev), @@ -1065,7 +1065,7 @@ TRACE_EVENT(xchk_rtsum_record_free, __entry->len, __entry->log, __entry->pos, - __entry->v) + __entry->value) ); #endif /* CONFIG_XFS_RT */ diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h index 14d455f768d3..21a7e350b4c5 100644 --- a/fs/xfs/xfs_ondisk.h +++ b/fs/xfs/xfs_ondisk.h @@ -74,6 +74,7 @@ xfs_check_ondisk_structs(void) /* realtime structures */ XFS_CHECK_STRUCT_SIZE(union xfs_rtword_raw, 4); + XFS_CHECK_STRUCT_SIZE(union xfs_suminfo_raw, 4); /* * m68k has problems with xfs_attr_leaf_name_remote_t, but we pad it to