xfs: remove the agfl_bno member from struct xfs_agfl
authorChristoph Hellwig <hch@lst.de>
Tue, 10 Mar 2020 15:57:28 +0000 (08:57 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 11 Mar 2020 16:11:38 +0000 (09:11 -0700)
struct xfs_agfl is a header in front of the AGFL entries that exists
for CRC enabled file systems.  For not CRC enabled file systems the AGFL
is simply a list of agbno.  Make the CRC case similar to that by just
using the list behind the new header.  This indirectly solves a problem
with modern gcc versions that warn about taking addresses of packed
structures (and we have to pack the AGFL given that gcc rounds up
structure sizes).  Also replace the helper macro to get from a buffer
with an inline function in xfs_alloc.h to make the code easier to
read.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/libxfs/xfs_ag.c
fs/xfs/libxfs/xfs_alloc.c
fs/xfs/libxfs/xfs_alloc.h
fs/xfs/libxfs/xfs_format.h
fs/xfs/scrub/agheader_repair.c

index 08d6beb54f8cd775cf74f054ed3fd2471cb4ec26..831bdd03590058dfcc6ab72bf6cd53ea139305ef 100644 (file)
@@ -301,7 +301,7 @@ xfs_agflblock_init(
                uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid);
        }
 
-       agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, bp);
+       agfl_bno = xfs_buf_to_agfl_bno(bp);
        for (bucket = 0; bucket < xfs_agfl_size(mp); bucket++)
                agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK);
 }
index 183dc258709227a31cd7980a20f81f087e963e32..f668e62acc5676fc800c37af08996fb62773b68f 100644 (file)
@@ -589,6 +589,7 @@ xfs_agfl_verify(
 {
        struct xfs_mount *mp = bp->b_mount;
        struct xfs_agfl *agfl = XFS_BUF_TO_AGFL(bp);
+       __be32          *agfl_bno = xfs_buf_to_agfl_bno(bp);
        int             i;
 
        /*
@@ -614,8 +615,8 @@ xfs_agfl_verify(
                return __this_address;
 
        for (i = 0; i < xfs_agfl_size(mp); i++) {
-               if (be32_to_cpu(agfl->agfl_bno[i]) != NULLAGBLOCK &&
-                   be32_to_cpu(agfl->agfl_bno[i]) >= mp->m_sb.sb_agblocks)
+               if (be32_to_cpu(agfl_bno[i]) != NULLAGBLOCK &&
+                   be32_to_cpu(agfl_bno[i]) >= mp->m_sb.sb_agblocks)
                        return __this_address;
        }
 
@@ -2684,7 +2685,7 @@ xfs_alloc_get_freelist(
        /*
         * Get the block number and update the data structures.
         */
-       agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp);
+       agfl_bno = xfs_buf_to_agfl_bno(agflbp);
        bno = be32_to_cpu(agfl_bno[be32_to_cpu(agf->agf_flfirst)]);
        be32_add_cpu(&agf->agf_flfirst, 1);
        xfs_trans_brelse(tp, agflbp);
@@ -2820,7 +2821,7 @@ xfs_alloc_put_freelist(
 
        ASSERT(be32_to_cpu(agf->agf_flcount) <= xfs_agfl_size(mp));
 
-       agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp);
+       agfl_bno = xfs_buf_to_agfl_bno(agflbp);
        blockp = &agfl_bno[be32_to_cpu(agf->agf_fllast)];
        *blockp = cpu_to_be32(bno);
        startoff = (char *)blockp - (char *)agflbp->b_addr;
@@ -3424,7 +3425,7 @@ xfs_agfl_walk(
        unsigned int            i;
        int                     error;
 
-       agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp);
+       agfl_bno = xfs_buf_to_agfl_bno(agflbp);
        i = be32_to_cpu(agf->agf_flfirst);
 
        /* Nothing to walk in an empty AGFL. */
index 7380fbe4a3fffd68e382ccd31c149a3cfd0880cb..a851bf77f17bfa91027be5e0c01740fd21a2e66e 100644 (file)
@@ -236,4 +236,13 @@ typedef int (*xfs_agfl_walk_fn)(struct xfs_mount *mp, xfs_agblock_t bno,
 int xfs_agfl_walk(struct xfs_mount *mp, struct xfs_agf *agf,
                struct xfs_buf *agflbp, xfs_agfl_walk_fn walk_fn, void *priv);
 
+static inline __be32 *
+xfs_buf_to_agfl_bno(
+       struct xfs_buf          *bp)
+{
+       if (xfs_sb_version_hascrc(&bp->b_mount->m_sb))
+               return bp->b_addr + sizeof(struct xfs_agfl);
+       return bp->b_addr;
+}
+
 #endif /* __XFS_ALLOC_H__ */
index 77e9fa38598042048d74f7c689c21f6b8564aad3..8c7aea7795dac38cb5086cd73eabeecd08dc5fdc 100644 (file)
@@ -785,18 +785,12 @@ typedef struct xfs_agi {
 #define        XFS_AGFL_BLOCK(mp)      XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp))
 #define        XFS_BUF_TO_AGFL(bp)     ((xfs_agfl_t *)((bp)->b_addr))
 
-#define XFS_BUF_TO_AGFL_BNO(mp, bp) \
-       (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \
-               &(XFS_BUF_TO_AGFL(bp)->agfl_bno[0]) : \
-               (__be32 *)(bp)->b_addr)
-
 typedef struct xfs_agfl {
        __be32          agfl_magicnum;
        __be32          agfl_seqno;
        uuid_t          agfl_uuid;
        __be64          agfl_lsn;
        __be32          agfl_crc;
-       __be32          agfl_bno[];     /* actually xfs_agfl_size(mp) */
 } __attribute__((packed)) xfs_agfl_t;
 
 #define XFS_AGFL_CRC_OFF       offsetof(struct xfs_agfl, agfl_crc)
index d5e6db9af434e836bfbc42f9ae076fbb2be86e41..68ee1ce1ae36de2a29ea7385dd1d200255eda80c 100644 (file)
@@ -602,7 +602,7 @@ xrep_agfl_init_header(
         * step.
         */
        fl_off = 0;
-       agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agfl_bp);
+       agfl_bno = xfs_buf_to_agfl_bno(agfl_bp);
        for_each_xfs_bitmap_extent(br, n, agfl_extents) {
                agbno = XFS_FSB_TO_AGBNO(mp, br->start);