xfs: remove the agfl_bno member from struct xfs_agfl

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>
This commit is contained in:
Christoph Hellwig 2020-03-10 08:57:28 -07:00 коммит произвёл Darrick J. Wong
Родитель 10a98cb16d
Коммит 183606d824
5 изменённых файлов: 17 добавлений и 13 удалений

Просмотреть файл

@ -301,7 +301,7 @@ xfs_agflblock_init(
uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid); 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++) for (bucket = 0; bucket < xfs_agfl_size(mp); bucket++)
agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK); agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK);
} }

Просмотреть файл

@ -589,6 +589,7 @@ xfs_agfl_verify(
{ {
struct xfs_mount *mp = bp->b_mount; struct xfs_mount *mp = bp->b_mount;
struct xfs_agfl *agfl = XFS_BUF_TO_AGFL(bp); struct xfs_agfl *agfl = XFS_BUF_TO_AGFL(bp);
__be32 *agfl_bno = xfs_buf_to_agfl_bno(bp);
int i; int i;
/* /*
@ -614,8 +615,8 @@ xfs_agfl_verify(
return __this_address; return __this_address;
for (i = 0; i < xfs_agfl_size(mp); i++) { for (i = 0; i < xfs_agfl_size(mp); i++) {
if (be32_to_cpu(agfl->agfl_bno[i]) != NULLAGBLOCK && if (be32_to_cpu(agfl_bno[i]) != NULLAGBLOCK &&
be32_to_cpu(agfl->agfl_bno[i]) >= mp->m_sb.sb_agblocks) be32_to_cpu(agfl_bno[i]) >= mp->m_sb.sb_agblocks)
return __this_address; return __this_address;
} }
@ -2684,7 +2685,7 @@ xfs_alloc_get_freelist(
/* /*
* Get the block number and update the data structures. * 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)]); bno = be32_to_cpu(agfl_bno[be32_to_cpu(agf->agf_flfirst)]);
be32_add_cpu(&agf->agf_flfirst, 1); be32_add_cpu(&agf->agf_flfirst, 1);
xfs_trans_brelse(tp, agflbp); xfs_trans_brelse(tp, agflbp);
@ -2820,7 +2821,7 @@ xfs_alloc_put_freelist(
ASSERT(be32_to_cpu(agf->agf_flcount) <= xfs_agfl_size(mp)); 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 = &agfl_bno[be32_to_cpu(agf->agf_fllast)];
*blockp = cpu_to_be32(bno); *blockp = cpu_to_be32(bno);
startoff = (char *)blockp - (char *)agflbp->b_addr; startoff = (char *)blockp - (char *)agflbp->b_addr;
@ -3424,7 +3425,7 @@ xfs_agfl_walk(
unsigned int i; unsigned int i;
int error; 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); i = be32_to_cpu(agf->agf_flfirst);
/* Nothing to walk in an empty AGFL. */ /* Nothing to walk in an empty AGFL. */

Просмотреть файл

@ -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, int xfs_agfl_walk(struct xfs_mount *mp, struct xfs_agf *agf,
struct xfs_buf *agflbp, xfs_agfl_walk_fn walk_fn, void *priv); 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__ */ #endif /* __XFS_ALLOC_H__ */

Просмотреть файл

@ -785,18 +785,12 @@ typedef struct xfs_agi {
#define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) #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(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 { typedef struct xfs_agfl {
__be32 agfl_magicnum; __be32 agfl_magicnum;
__be32 agfl_seqno; __be32 agfl_seqno;
uuid_t agfl_uuid; uuid_t agfl_uuid;
__be64 agfl_lsn; __be64 agfl_lsn;
__be32 agfl_crc; __be32 agfl_crc;
__be32 agfl_bno[]; /* actually xfs_agfl_size(mp) */
} __attribute__((packed)) xfs_agfl_t; } __attribute__((packed)) xfs_agfl_t;
#define XFS_AGFL_CRC_OFF offsetof(struct xfs_agfl, agfl_crc) #define XFS_AGFL_CRC_OFF offsetof(struct xfs_agfl, agfl_crc)

Просмотреть файл

@ -602,7 +602,7 @@ xrep_agfl_init_header(
* step. * step.
*/ */
fl_off = 0; 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) { for_each_xfs_bitmap_extent(br, n, agfl_extents) {
agbno = XFS_FSB_TO_AGBNO(mp, br->start); agbno = XFS_FSB_TO_AGBNO(mp, br->start);