always use struct xfs_btree_block instead of short / longform structures
PATCH 5/6 always use struct xfs_btree_block instead of short / longform structures
Always use the generic xfs_btree_block type instead of the short / long structures. Add XFS_BTREE_SBLOCK_LEN / XFS_BTREE_LBLOCK_LEN defines for the length of a short / long form block. The rationale for this is that we will grow more btree block header variants to support CRCs and other RAS information, and always accessing them through the same datatype with unions for the short / long form pointers makes implementing this much easier.
fs/xfs/xfs_alloc.c +10 -11
@@ -380,21 +380,20 @@ xfs_alloc_fixup_trees(return error;XFS_WANT_CORRUPTED_RETURN (i ==1 ); } +#ifdef DEBUG - { -xfs_alloc_block_t *bnoblock; -xfs_alloc_block_t *cntblock; +if (bno_cur->bc_nlevels ==1 && cnt_cur->bc_nlevels ==1 ) { +struct xfs_btree_block *bnoblock; +struct xfs_btree_block *cntblock; -if (bno_cur->bc_nlevels ==1 && - cnt_cur->bc_nlevels ==1 ) { - bnoblock =XFS_BUF_TO_ALLOC_BLOCK (bno_cur->bc_bufs[0 ]); - cntblock =XFS_BUF_TO_ALLOC_BLOCK (cnt_cur->bc_bufs[0 ]); -XFS_WANT_CORRUPTED_RETURN ( -be16_to_cpu (bnoblock->bb_numrecs) == -be16_to_cpu (cntblock->bb_numrecs)); - } + bnoblock =XFS_BUF_TO_BLOCK (bno_cur->bc_bufs[0 ]); + cntblock =XFS_BUF_TO_BLOCK (cnt_cur->bc_bufs[0 ]); + +XFS_WANT_CORRUPTED_RETURN ( + bnoblock->bb_numrecs == cntblock->bb_numrecs); }#endif +/* * Deal with all four cases: the allocated record is contained * within the freespace record, so we can have new freespace
fs/xfs/xfs_alloc_btree.c +1 -1
@@ -490,7 +490,7 @@ xfs_allocbt_maxrecs( int blocklen, int leaf) { - blocklen -=sizeof (struct xfs_btree_sblock ); + blocklen -=XFS_ALLOC_BLOCK_LEN (mp);if (leaf)return blocklen /sizeof (xfs_alloc_rec_t);
fs/xfs/xfs_alloc_btree.h +10 -8
@@ -24,7 +24,6 @@struct xfs_buf ;struct xfs_btree_cur ; -struct xfs_btree_sblock ;struct xfs_mount ;/*
@@ -50,10 +49,6 @@ typedef struct xfs_alloc_rec_incore {/* btree pointer type */ typedef __be32 xfs_alloc_ptr_t ; -/* btree block header type */ -typedef struct xfs_btree_sblock xfs_alloc_block_t ; - -#define XFS_BUF_TO_ALLOC_BLOCK (bp) ((xfs_alloc_block_t *)XFS_BUF_PTR(bp))/* * Minimum and maximum blocksize and sectorsize.
@@ -77,26 +72,33 @@ typedef struct xfs_btree_sblock xfs_allo#define XFS_CNT_BLOCK (mp) ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1))/* +* Btree block header size depends on a superblock flag. +* +* (not quite yet, but soon) +*/ +#define XFS_ALLOC_BLOCK_LEN (mp) XFS_BTREE_SBLOCK_LEN + +/* * Record, key, and pointer address macros for btree blocks. * * (note that some of these may appear unused, but they are used in userspace) */ #define XFS_ALLOC_REC_ADDR (mp, block, index) \ ((xfs_alloc_rec_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_ALLOC_BLOCK_LEN(mp) + \ (((index) - 1) * sizeof(xfs_alloc_rec_t))))#define XFS_ALLOC_KEY_ADDR (mp, block, index) \ ((xfs_alloc_key_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_ALLOC_BLOCK_LEN(mp) + \ ((index) - 1) * sizeof(xfs_alloc_key_t)))#define XFS_ALLOC_PTR_ADDR (mp, block, index, maxrecs) \ ((xfs_alloc_ptr_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_ALLOC_BLOCK_LEN(mp) + \ (maxrecs) * sizeof(xfs_alloc_key_t) + \ ((index) - 1) * sizeof(xfs_alloc_ptr_t)))
fs/xfs/xfs_bmap.c +37 -34
244 lines not on this page · raw message
fs/xfs/xfs_bmap_btree.c +7 -7
@@ -68,7 +68,7 @@ xfs_bmdr_to_bmbt(struct xfs_mount *mp, xfs_bmdr_block_t *dblock, int dblocklen, - xfs_bmbt_block_t *rblock, + struct xfs_btree_block *rblock, int rblocklen) { int dmxr;
@@ -81,8 +81,8 @@ xfs_bmdr_to_bmbt( rblock->bb_level = dblock->bb_level;ASSERT (be16_to_cpu (rblock->bb_level) >0 ); rblock->bb_numrecs = dblock->bb_numrecs; - rblock->bb_leftsib =cpu_to_be64 (NULLDFSBNO ); - rblock->bb_rightsib =cpu_to_be64 (NULLDFSBNO ); + rblock->bb_u.l.bb_leftsib =cpu_to_be64 (NULLDFSBNO ); + rblock->bb_u.l.bb_rightsib =cpu_to_be64 (NULLDFSBNO ); dmxr =xfs_bmdr_maxrecs (mp, dblocklen,0 ); fkp =XFS_BMDR_KEY_ADDR (dblock,1 ); tkp =XFS_BMBT_KEY_ADDR (mp, rblock,1 );
@@ -429,7 +429,7 @@ xfs_bmbt_set_state(void xfs_bmbt_to_bmdr (struct xfs_mount *mp, -xfs_bmbt_block_t *rblock, +struct xfs_btree_block *rblock,int rblocklen,xfs_bmdr_block_t *dblock,int dblocklen)
@@ -441,8 +441,8 @@ xfs_bmbt_to_bmdr(__be64 *tpp;ASSERT (be32_to_cpu (rblock->bb_magic) ==XFS_BMAP_MAGIC ); -ASSERT (be64_to_cpu (rblock->bb_leftsib) ==NULLDFSBNO ); -ASSERT (be64_to_cpu (rblock->bb_rightsib) ==NULLDFSBNO ); +ASSERT (be64_to_cpu (rblock->bb_u.l.bb_leftsib) ==NULLDFSBNO ); +ASSERT (be64_to_cpu (rblock->bb_u.l.bb_rightsib) ==NULLDFSBNO );ASSERT (be16_to_cpu (rblock->bb_level) >0 ); dblock->bb_level = rblock->bb_level; dblock->bb_numrecs = rblock->bb_numrecs;
@@ -906,7 +906,7 @@ xfs_bmbt_maxrecs( int blocklen, int leaf) { - blocklen -=sizeof (struct xfs_btree_lblock ); + blocklen -=XFS_BMBT_BLOCK_LEN (mp);if (leaf)return blocklen /sizeof (xfs_bmbt_rec_t);
fs/xfs/xfs_bmap_btree.h +12 -11
@@ -22,7 +22,6 @@struct xfs_btree_cur ;struct xfs_btree_block ; -struct xfs_btree_lblock ;struct xfs_mount ;struct xfs_inode ;struct xfs_trans ;
@@ -147,27 +146,29 @@ typedef struct xfs_bmbt_key {/* btree pointer type */ typedef __be64 xfs_bmbt_ptr_t ,xfs_bmdr_ptr_t ; -/* btree block header type */ -typedef struct xfs_btree_lblock xfs_bmbt_block_t ; - -#define XFS_BUF_TO_BMBT_BLOCK (bp) ((xfs_bmbt_block_t *)XFS_BUF_PTR(bp)) +/* +* Btree block header size depends on a superblock flag. +* +* (not quite yet, but soon) +*/ +#define XFS_BMBT_BLOCK_LEN (mp) XFS_BTREE_LBLOCK_LEN#define XFS_BMBT_REC_ADDR (mp, block, index) \ ((xfs_bmbt_rec_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_lblock) + \ + XFS_BMBT_BLOCK_LEN(mp) + \ ((index) - 1) * sizeof(xfs_bmbt_rec_t)))#define XFS_BMBT_KEY_ADDR (mp, block, index) \ ((xfs_bmbt_key_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_lblock) + \ + XFS_BMBT_BLOCK_LEN(mp) + \ ((index) - 1) * sizeof(xfs_bmbt_key_t)))#define XFS_BMBT_PTR_ADDR (mp, block, index, maxrecs) \ ((xfs_bmbt_ptr_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_lblock) + \ + XFS_BMBT_BLOCK_LEN(mp) + \ (maxrecs) * sizeof(xfs_bmbt_key_t) + \ ((index) - 1) * sizeof(xfs_bmbt_ptr_t)))
@@ -198,7 +199,7 @@ typedef struct xfs_btree_lblock xfs_bmbt XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0))#define XFS_BMAP_BROOT_SPACE_CALC (nrecs) \ - (int)(sizeof(xfs_bmbt_block_t) + \ + (int)(XFS_BTREE_LBLOCK_LEN + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t))))#define XFS_BMAP_BROOT_SPACE (bb) \
@@ -223,7 +224,7 @@ typedef struct xfs_btree_lblock xfs_bmbt* Prototypes for xfs_bmap.c to call. */ extern void xfs_bmdr_to_bmbt (struct xfs_mount *,xfs_bmdr_block_t *,int , -xfs_bmbt_block_t *,int ); +struct xfs_btree_block *,int );extern void xfs_bmbt_get_all (xfs_bmbt_rec_host_t *r,xfs_bmbt_irec_t *s);extern xfs_filblks_t xfs_bmbt_get_blockcount (xfs_bmbt_rec_host_t *r);extern xfs_fsblock_t xfs_bmbt_get_startblock (xfs_bmbt_rec_host_t *r);
@@ -246,7 +247,7 @@ extern void xfs_bmbt_disk_set_all(xfs_bmextern void xfs_bmbt_disk_set_allf (xfs_bmbt_rec_t *r,xfs_fileoff_t o,xfs_fsblock_t b,xfs_filblks_t c,xfs_exntst_t v); -extern void xfs_bmbt_to_bmdr (struct xfs_mount *,xfs_bmbt_block_t *,int , +extern void xfs_bmbt_to_bmdr (struct xfs_mount *,struct xfs_btree_block *,int ,xfs_bmdr_block_t *,int );extern int xfs_bmbt_get_maxrecs (struct xfs_btree_cur *,int level);
fs/xfs/xfs_btree.c +40 -41
157 lines not on this page · raw message
fs/xfs/xfs_btree.h +15 -38
73 lines not on this page · raw message
fs/xfs/xfs_fsops.c +10 -10
@@ -126,7 +126,7 @@ xfs_growfs_data_private(xfs_extlen_t agsize;xfs_extlen_t tmpsize;xfs_alloc_rec_t *arec; -xfs_btree_sblock_t *block; +struct xfs_btree_block *block;xfs_buf_t *bp;int bucket;int dpct;
@@ -251,13 +251,13 @@ xfs_growfs_data_private( bp =xfs_buf_get (mp->m_ddev_targp,XFS_AGB_TO_DADDR (mp, agno,XFS_BNO_BLOCK (mp)),BTOBB (mp->m_sb.sb_blocksize),0 ); - block =XFS_BUF_TO_SBLOCK (bp); + block =XFS_BUF_TO_BLOCK (bp);memset (block,0 , mp->m_sb.sb_blocksize); block->bb_magic =cpu_to_be32 (XFS_ABTB_MAGIC ); block->bb_level =0 ; block->bb_numrecs =cpu_to_be16 (1 ); - block->bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); - block->bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); arec =XFS_ALLOC_REC_ADDR (mp, block,1 ); arec->ar_startblock =cpu_to_be32 (XFS_PREALLOC_BLOCKS (mp)); arec->ar_blockcount = cpu_to_be32(
@@ -272,13 +272,13 @@ xfs_growfs_data_private( bp =xfs_buf_get (mp->m_ddev_targp,XFS_AGB_TO_DADDR (mp, agno,XFS_CNT_BLOCK (mp)),BTOBB (mp->m_sb.sb_blocksize),0 ); - block =XFS_BUF_TO_SBLOCK (bp); + block =XFS_BUF_TO_BLOCK (bp);memset (block,0 , mp->m_sb.sb_blocksize); block->bb_magic =cpu_to_be32 (XFS_ABTC_MAGIC ); block->bb_level =0 ; block->bb_numrecs =cpu_to_be16 (1 ); - block->bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); - block->bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); arec =XFS_ALLOC_REC_ADDR (mp, block,1 ); arec->ar_startblock =cpu_to_be32 (XFS_PREALLOC_BLOCKS (mp)); arec->ar_blockcount = cpu_to_be32(
@@ -294,13 +294,13 @@ xfs_growfs_data_private( bp =xfs_buf_get (mp->m_ddev_targp,XFS_AGB_TO_DADDR (mp, agno,XFS_IBT_BLOCK (mp)),BTOBB (mp->m_sb.sb_blocksize),0 ); - block =XFS_BUF_TO_SBLOCK (bp); + block =XFS_BUF_TO_BLOCK (bp);memset (block,0 , mp->m_sb.sb_blocksize); block->bb_magic =cpu_to_be32 (XFS_IBT_MAGIC ); block->bb_level =0 ; block->bb_numrecs =0 ; - block->bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); - block->bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); error =xfs_bwrite (mp, bp);if (error) { goto error0;
fs/xfs/xfs_ialloc_btree.c +1 -1
@@ -375,7 +375,7 @@ xfs_inobt_maxrecs( int blocklen, int leaf) { - blocklen -=sizeof (struct xfs_btree_sblock ); + blocklen -=XFS_INOBT_BLOCK_LEN (mp);if (leaf)return blocklen /sizeof (xfs_inobt_rec_t);
fs/xfs/xfs_ialloc_btree.h +10 -9
@@ -24,7 +24,6 @@struct xfs_buf ;struct xfs_btree_cur ; -struct xfs_btree_sblock ;struct xfs_mount ;/*
@@ -70,11 +69,6 @@ typedef struct xfs_inobt_key {/* btree pointer type */ typedef __be32 xfs_inobt_ptr_t ; -/* btree block header type */ -typedef struct xfs_btree_sblock xfs_inobt_block_t ; - -#define XFS_BUF_TO_INOBT_BLOCK (bp) ((xfs_inobt_block_t *)XFS_BUF_PTR(bp)) -/* * Bit manipulations for ir_free. */
@@ -96,6 +90,13 @@ typedef struct xfs_btree_sblock xfs_inob#define XFS_PREALLOC_BLOCKS (mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1))/* +* Btree block header size depends on a superblock flag. +* +* (not quite yet, but soon) +*/ +#define XFS_INOBT_BLOCK_LEN (mp) XFS_BTREE_SBLOCK_LEN + +/* * Record, key, and pointer address macros for btree blocks. * * (note that some of these may appear unused, but they are used in userspace)
@@ -103,19 +104,19 @@ typedef struct xfs_btree_sblock xfs_inob#define XFS_INOBT_REC_ADDR (mp, block, index) \ ((xfs_inobt_rec_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_INOBT_BLOCK_LEN(mp) + \ (((index) - 1) * sizeof(xfs_inobt_rec_t))))#define XFS_INOBT_KEY_ADDR (mp, block, index) \ ((xfs_inobt_key_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_INOBT_BLOCK_LEN(mp) + \ ((index) - 1) * sizeof(xfs_inobt_key_t)))#define XFS_INOBT_PTR_ADDR (mp, block, index, maxrecs) \ ((xfs_inobt_ptr_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_INOBT_BLOCK_LEN(mp) + \ (maxrecs) * sizeof(xfs_inobt_key_t) + \ ((index) - 1) * sizeof(xfs_inobt_ptr_t)))
fs/xfs/xfs_inode.c +5 -8
@@ -2352,7 +2352,7 @@ xfs_iroot_realloc(struct xfs_mount *mp = ip->i_mount;int cur_max;xfs_ifork_t *ifp; -xfs_bmbt_block_t *new_broot; +struct xfs_btree_block *new_broot;int new_max;size_t new_size;char *np;
@@ -2373,8 +2373,7 @@ xfs_iroot_realloc(*/ if (ifp->if_broot_bytes ==0 ) { new_size = (size_t )XFS_BMAP_BROOT_SPACE_CALC (rec_diff); - ifp->if_broot = (xfs_bmbt_block_t *)kmem_alloc (new_size, -KM_SLEEP ); + ifp->if_broot =kmem_alloc (new_size,KM_SLEEP ); ifp->if_broot_bytes = (int )new_size;return ; }
@@ -2388,9 +2387,7 @@ xfs_iroot_realloc( cur_max =xfs_bmbt_maxrecs (mp, ifp->if_broot_bytes,0 ); new_max = cur_max + rec_diff; new_size = (size_t )XFS_BMAP_BROOT_SPACE_CALC (new_max); - ifp->if_broot = (xfs_bmbt_block_t *) -kmem_realloc (ifp->if_broot, - new_size, + ifp->if_broot =kmem_realloc (ifp->if_broot, new_size, (size_t )XFS_BMAP_BROOT_SPACE_CALC (cur_max),/* old size */ KM_SLEEP ); op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
@@ -2418,11 +2415,11 @@ xfs_iroot_realloc(else new_size =0 ;if (new_size >0 ) { - new_broot = (xfs_bmbt_block_t *)kmem_alloc (new_size,KM_SLEEP ); + new_broot =kmem_alloc (new_size,KM_SLEEP );/* * First copy over the btree block header. */ -memcpy (new_broot, ifp->if_broot,sizeof (xfs_bmbt_block_t)); +memcpy (new_broot, ifp->if_broot,XFS_BTREE_LBLOCK_LEN ); }else { new_broot =NULL ; ifp->if_flags &= ~XFS_IFBROOT ;
fs/xfs/xfs_inode.h +1 -2
@@ -63,7 +63,7 @@ typedef struct xfs_ext_irec { typedef struct xfs_ifork { int if_bytes; /* bytes in if_u1 */ int if_real_bytes; /* bytes allocated in if_u1 */ - xfs_bmbt_block_t *if_broot; /* file's incore btree root */ + struct xfs_btree_block *if_broot; /* file's incore btree root */ short if_broot_bytes; /* bytes allocated for root */ unsigned char if_flags; /* per-fork flags */ unsigned char if_ext_max; /* max # of extent records */
@@ -110,7 +110,6 @@ struct ktrace;struct xfs_buf ;struct xfs_bmap_free ;struct xfs_bmbt_irec ; -struct xfs_bmbt_block ;struct xfs_inode ;struct xfs_inode_log_item ;struct xfs_mount ;
fs/xfs/xfs_log_recover.c +4 -4
@@ -2452,8 +2452,8 @@ xlog_recover_do_inode_trans(break ;case XFS_ILOG_DBROOT : -xfs_bmbt_to_bmdr (mp, (xfs_bmbt_block_t *)src, len, - &(dip->di_u.di_bmbt), +xfs_bmbt_to_bmdr (mp, (struct xfs_btree_block *)src, len, + &dip->di_u.di_bmbt,XFS_DFORK_DSIZE (dip, mp));break ;
@@ -2490,8 +2490,8 @@ xlog_recover_do_inode_trans(case XFS_ILOG_ABROOT : dest =XFS_DFORK_APTR (dip); -xfs_bmbt_to_bmdr (mp, (xfs_bmbt_block_t *)src, len, - (xfs_bmdr_block_t *)dest, +xfs_bmbt_to_bmdr (mp, (struct xfs_btree_block *)src, + len, (xfs_bmdr_block_t *)dest,XFS_DFORK_ASIZE (dip, mp));break ;
fs/xfs/xfsidbg.c +4 -5
@@ -3078,7 +3078,7 @@ xfsidbg_print_alloc_key(int i, union xfs }static struct xfsidbg_btree xfsidbg_allocbt = { - .block_len =sizeof (struct xfs_btree_sblock ), + .block_len =XFS_BTREE_SBLOCK_LEN , .key_len =sizeof (xfs_alloc_key_t), .rec_len =sizeof (xfs_alloc_rec_t), .ptr_len =sizeof (__be32),
@@ -3110,7 +3110,7 @@ xfsidbg_print_bmbt_key(int i, union xfs_ }static struct xfsidbg_btree xfsidbg_bmbt = { - .block_len =sizeof (struct xfs_btree_lblock ), + .block_len =XFS_BTREE_LBLOCK_LEN , .key_len =sizeof (xfs_bmbt_key_t), .rec_len =sizeof (xfs_bmbt_rec_t), .ptr_len =sizeof (__be64),
@@ -3138,7 +3138,7 @@ xfsidbg_print_inobt_key(int i, union xfs }static struct xfsidbg_btree xfsidbg_inobtbt = { - .block_len =sizeof (struct xfs_btree_sblock ), + .block_len =XFS_BTREE_SBLOCK_LEN , .key_len =sizeof (xfs_inobt_key_t), .rec_len =sizeof (xfs_inobt_rec_t), .ptr_len =sizeof (__be32),
@@ -3162,8 +3162,7 @@ xfs_broot(xfs_inode_t *ip, xfs_ifork_t *return ; } -xfs_btblock ((struct xfs_btree_block *)f->if_broot, f->if_broot_bytes, - &xfsidbg_bmbt); +xfs_btblock (f->if_broot, f->if_broot_bytes, &xfsidbg_bmbt); }
fs/xfs/xfs_dinode.h +1 -1
@@ -165,7 +165,7 @@ typedef enum xfs_dinode_fmt*/ #define XFS_LITINO (mp) ((mp)->m_litino)#define XFS_BROOT_SIZE_ADJ \ - (sizeof(xfs_bmbt_block_t) - sizeof(xfs_bmdr_block_t)) + (XFS_BTREE_LBLOCK_LEN - sizeof(xfs_bmdr_block_t))/* * Inode data & attribute fork sizes, per inode.
Quoted 10 lines · Christoph Hellwig
Always use the generic
xfs_btree_blocktype instead of the short / long structures. AddXFS_BTREE_SBLOCK_LEN/XFS_BTREE_LBLOCK_LENdefines for the length of a short / long form block. The rationale for this is that we will grow more btree block header variants to support CRCs and other RAS information, and always accessing them through the same datatype with unions for the short / long form pointers makes implementing this much easier.Signed-off-by Christoph Hellwig <[email protected]>
Updated version to apply ontop of the header changes from Barry:
fs/xfs/xfs_alloc.c +10 -11
@@ -380,21 +380,20 @@ xfs_alloc_fixup_trees(return error;XFS_WANT_CORRUPTED_RETURN (i ==1 ); } +#ifdef DEBUG - { -xfs_alloc_block_t *bnoblock; -xfs_alloc_block_t *cntblock; +if (bno_cur->bc_nlevels ==1 && cnt_cur->bc_nlevels ==1 ) { +struct xfs_btree_block *bnoblock; +struct xfs_btree_block *cntblock; -if (bno_cur->bc_nlevels ==1 && - cnt_cur->bc_nlevels ==1 ) { - bnoblock =XFS_BUF_TO_ALLOC_BLOCK (bno_cur->bc_bufs[0 ]); - cntblock =XFS_BUF_TO_ALLOC_BLOCK (cnt_cur->bc_bufs[0 ]); -XFS_WANT_CORRUPTED_RETURN ( -be16_to_cpu (bnoblock->bb_numrecs) == -be16_to_cpu (cntblock->bb_numrecs)); - } + bnoblock =XFS_BUF_TO_BLOCK (bno_cur->bc_bufs[0 ]); + cntblock =XFS_BUF_TO_BLOCK (cnt_cur->bc_bufs[0 ]); + +XFS_WANT_CORRUPTED_RETURN ( + bnoblock->bb_numrecs == cntblock->bb_numrecs); }#endif +/* * Deal with all four cases: the allocated record is contained * within the freespace record, so we can have new freespace
fs/xfs/xfs_alloc_btree.c +1 -1
@@ -490,7 +490,7 @@ xfs_allocbt_maxrecs( int blocklen, int leaf) { - blocklen -=sizeof (struct xfs_btree_sblock ); + blocklen -=XFS_ALLOC_BLOCK_LEN (mp);if (leaf)return blocklen /sizeof (xfs_alloc_rec_t);
fs/xfs/xfs_alloc_btree.h +10 -8
@@ -24,7 +24,6 @@struct xfs_buf ;struct xfs_btree_cur ; -struct xfs_btree_sblock ;struct xfs_mount ;/*
@@ -50,10 +49,6 @@ typedef struct xfs_alloc_rec_incore {/* btree pointer type */ typedef __be32 xfs_alloc_ptr_t ; -/* btree block header type */ -typedef struct xfs_btree_sblock xfs_alloc_block_t ; - -#define XFS_BUF_TO_ALLOC_BLOCK (bp) ((xfs_alloc_block_t *)XFS_BUF_PTR(bp))/* * Minimum and maximum blocksize and sectorsize.
@@ -77,6 +72,13 @@ typedef struct xfs_btree_sblock xfs_allo#define XFS_CNT_BLOCK (mp) ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1))/* +* Btree block header size depends on a superblock flag. +* +* (not quite yet, but soon) +*/ +#define XFS_ALLOC_BLOCK_LEN (mp) XFS_BTREE_SBLOCK_LEN + +/* * Record, key, and pointer address macros for btree blocks. * * (note that some of these may appear unused, but they are used in userspace)
@@ -84,19 +86,19 @@ typedef struct xfs_btree_sblock xfs_allo#define XFS_ALLOC_REC_ADDR (mp, block, index) \ ((xfs_alloc_rec_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_ALLOC_BLOCK_LEN(mp) + \ (((index) - 1) * sizeof(xfs_alloc_rec_t))))#define XFS_ALLOC_KEY_ADDR (mp, block, index) \ ((xfs_alloc_key_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_ALLOC_BLOCK_LEN(mp) + \ ((index) - 1) * sizeof(xfs_alloc_key_t)))#define XFS_ALLOC_PTR_ADDR (mp, block, index, maxrecs) \ ((xfs_alloc_ptr_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_ALLOC_BLOCK_LEN(mp) + \ (maxrecs) * sizeof(xfs_alloc_key_t) + \ ((index) - 1) * sizeof(xfs_alloc_ptr_t)))
fs/xfs/xfs_bmap.c +37 -34
244 lines not on this page · raw message
fs/xfs/xfs_bmap_btree.c +7 -7
@@ -68,7 +68,7 @@ xfs_bmdr_to_bmbt(struct xfs_mount *mp, xfs_bmdr_block_t *dblock, int dblocklen, - xfs_bmbt_block_t *rblock, + struct xfs_btree_block *rblock, int rblocklen) { int dmxr;
@@ -81,8 +81,8 @@ xfs_bmdr_to_bmbt( rblock->bb_level = dblock->bb_level;ASSERT (be16_to_cpu (rblock->bb_level) >0 ); rblock->bb_numrecs = dblock->bb_numrecs; - rblock->bb_leftsib =cpu_to_be64 (NULLDFSBNO ); - rblock->bb_rightsib =cpu_to_be64 (NULLDFSBNO ); + rblock->bb_u.l.bb_leftsib =cpu_to_be64 (NULLDFSBNO ); + rblock->bb_u.l.bb_rightsib =cpu_to_be64 (NULLDFSBNO ); dmxr =xfs_bmdr_maxrecs (mp, dblocklen,0 ); fkp =XFS_BMDR_KEY_ADDR (dblock,1 ); tkp =XFS_BMBT_KEY_ADDR (mp, rblock,1 );
@@ -429,7 +429,7 @@ xfs_bmbt_set_state(void xfs_bmbt_to_bmdr (struct xfs_mount *mp, -xfs_bmbt_block_t *rblock, +struct xfs_btree_block *rblock,int rblocklen,xfs_bmdr_block_t *dblock,int dblocklen)
@@ -441,8 +441,8 @@ xfs_bmbt_to_bmdr(__be64 *tpp;ASSERT (be32_to_cpu (rblock->bb_magic) ==XFS_BMAP_MAGIC ); -ASSERT (be64_to_cpu (rblock->bb_leftsib) ==NULLDFSBNO ); -ASSERT (be64_to_cpu (rblock->bb_rightsib) ==NULLDFSBNO ); +ASSERT (be64_to_cpu (rblock->bb_u.l.bb_leftsib) ==NULLDFSBNO ); +ASSERT (be64_to_cpu (rblock->bb_u.l.bb_rightsib) ==NULLDFSBNO );ASSERT (be16_to_cpu (rblock->bb_level) >0 ); dblock->bb_level = rblock->bb_level; dblock->bb_numrecs = rblock->bb_numrecs;
@@ -906,7 +906,7 @@ xfs_bmbt_maxrecs( int blocklen, int leaf) { - blocklen -=sizeof (struct xfs_btree_lblock ); + blocklen -=XFS_BMBT_BLOCK_LEN (mp);if (leaf)return blocklen /sizeof (xfs_bmbt_rec_t);
fs/xfs/xfs_bmap_btree.h +12 -11
@@ -22,7 +22,6 @@struct xfs_btree_cur ;struct xfs_btree_block ; -struct xfs_btree_lblock ;struct xfs_mount ;struct xfs_inode ;struct xfs_trans ;
@@ -147,27 +146,29 @@ typedef struct xfs_bmbt_key {/* btree pointer type */ typedef __be64 xfs_bmbt_ptr_t ,xfs_bmdr_ptr_t ; -/* btree block header type */ -typedef struct xfs_btree_lblock xfs_bmbt_block_t ; - -#define XFS_BUF_TO_BMBT_BLOCK (bp) ((xfs_bmbt_block_t *)XFS_BUF_PTR(bp)) +/* +* Btree block header size depends on a superblock flag. +* +* (not quite yet, but soon) +*/ +#define XFS_BMBT_BLOCK_LEN (mp) XFS_BTREE_LBLOCK_LEN#define XFS_BMBT_REC_ADDR (mp, block, index) \ ((xfs_bmbt_rec_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_lblock) + \ + XFS_BMBT_BLOCK_LEN(mp) + \ ((index) - 1) * sizeof(xfs_bmbt_rec_t)))#define XFS_BMBT_KEY_ADDR (mp, block, index) \ ((xfs_bmbt_key_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_lblock) + \ + XFS_BMBT_BLOCK_LEN(mp) + \ ((index) - 1) * sizeof(xfs_bmbt_key_t)))#define XFS_BMBT_PTR_ADDR (mp, block, index, maxrecs) \ ((xfs_bmbt_ptr_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_lblock) + \ + XFS_BMBT_BLOCK_LEN(mp) + \ (maxrecs) * sizeof(xfs_bmbt_key_t) + \ ((index) - 1) * sizeof(xfs_bmbt_ptr_t)))
@@ -198,7 +199,7 @@ typedef struct xfs_btree_lblock xfs_bmbt XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0))#define XFS_BMAP_BROOT_SPACE_CALC (nrecs) \ - (int)(sizeof(xfs_bmbt_block_t) + \ + (int)(XFS_BTREE_LBLOCK_LEN + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t))))#define XFS_BMAP_BROOT_SPACE (bb) \
@@ -223,7 +224,7 @@ typedef struct xfs_btree_lblock xfs_bmbt* Prototypes for xfs_bmap.c to call. */ extern void xfs_bmdr_to_bmbt (struct xfs_mount *,xfs_bmdr_block_t *,int , -xfs_bmbt_block_t *,int ); +struct xfs_btree_block *,int );extern void xfs_bmbt_get_all (xfs_bmbt_rec_host_t *r,xfs_bmbt_irec_t *s);extern xfs_filblks_t xfs_bmbt_get_blockcount (xfs_bmbt_rec_host_t *r);extern xfs_fsblock_t xfs_bmbt_get_startblock (xfs_bmbt_rec_host_t *r);
@@ -246,7 +247,7 @@ extern void xfs_bmbt_disk_set_all(xfs_bmextern void xfs_bmbt_disk_set_allf (xfs_bmbt_rec_t *r,xfs_fileoff_t o,xfs_fsblock_t b,xfs_filblks_t c,xfs_exntst_t v); -extern void xfs_bmbt_to_bmdr (struct xfs_mount *,xfs_bmbt_block_t *,int , +extern void xfs_bmbt_to_bmdr (struct xfs_mount *,struct xfs_btree_block *,int ,xfs_bmdr_block_t *,int );extern int xfs_bmbt_get_maxrecs (struct xfs_btree_cur *,int level);
fs/xfs/xfs_btree.c +40 -41
157 lines not on this page · raw message
fs/xfs/xfs_btree.h +15 -38
73 lines not on this page · raw message
fs/xfs/xfs_fsops.c +10 -10
@@ -126,7 +126,7 @@ xfs_growfs_data_private(xfs_extlen_t agsize;xfs_extlen_t tmpsize;xfs_alloc_rec_t *arec; -xfs_btree_sblock_t *block; +struct xfs_btree_block *block;xfs_buf_t *bp;int bucket;int dpct;
@@ -251,13 +251,13 @@ xfs_growfs_data_private( bp =xfs_buf_get (mp->m_ddev_targp,XFS_AGB_TO_DADDR (mp, agno,XFS_BNO_BLOCK (mp)),BTOBB (mp->m_sb.sb_blocksize),0 ); - block =XFS_BUF_TO_SBLOCK (bp); + block =XFS_BUF_TO_BLOCK (bp);memset (block,0 , mp->m_sb.sb_blocksize); block->bb_magic =cpu_to_be32 (XFS_ABTB_MAGIC ); block->bb_level =0 ; block->bb_numrecs =cpu_to_be16 (1 ); - block->bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); - block->bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); arec =XFS_ALLOC_REC_ADDR (mp, block,1 ); arec->ar_startblock =cpu_to_be32 (XFS_PREALLOC_BLOCKS (mp)); arec->ar_blockcount = cpu_to_be32(
@@ -272,13 +272,13 @@ xfs_growfs_data_private( bp =xfs_buf_get (mp->m_ddev_targp,XFS_AGB_TO_DADDR (mp, agno,XFS_CNT_BLOCK (mp)),BTOBB (mp->m_sb.sb_blocksize),0 ); - block =XFS_BUF_TO_SBLOCK (bp); + block =XFS_BUF_TO_BLOCK (bp);memset (block,0 , mp->m_sb.sb_blocksize); block->bb_magic =cpu_to_be32 (XFS_ABTC_MAGIC ); block->bb_level =0 ; block->bb_numrecs =cpu_to_be16 (1 ); - block->bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); - block->bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); arec =XFS_ALLOC_REC_ADDR (mp, block,1 ); arec->ar_startblock =cpu_to_be32 (XFS_PREALLOC_BLOCKS (mp)); arec->ar_blockcount = cpu_to_be32(
@@ -294,13 +294,13 @@ xfs_growfs_data_private( bp =xfs_buf_get (mp->m_ddev_targp,XFS_AGB_TO_DADDR (mp, agno,XFS_IBT_BLOCK (mp)),BTOBB (mp->m_sb.sb_blocksize),0 ); - block =XFS_BUF_TO_SBLOCK (bp); + block =XFS_BUF_TO_BLOCK (bp);memset (block,0 , mp->m_sb.sb_blocksize); block->bb_magic =cpu_to_be32 (XFS_IBT_MAGIC ); block->bb_level =0 ; block->bb_numrecs =0 ; - block->bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); - block->bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_leftsib =cpu_to_be32 (NULLAGBLOCK ); + block->bb_u.s.bb_rightsib =cpu_to_be32 (NULLAGBLOCK ); error =xfs_bwrite (mp, bp);if (error) { goto error0;
fs/xfs/xfs_ialloc_btree.c +1 -1
@@ -375,7 +375,7 @@ xfs_inobt_maxrecs( int blocklen, int leaf) { - blocklen -=sizeof (struct xfs_btree_sblock ); + blocklen -=XFS_INOBT_BLOCK_LEN (mp);if (leaf)return blocklen /sizeof (xfs_inobt_rec_t);
fs/xfs/xfs_ialloc_btree.h +10 -9
@@ -24,7 +24,6 @@struct xfs_buf ;struct xfs_btree_cur ; -struct xfs_btree_sblock ;struct xfs_mount ;/*
@@ -70,11 +69,6 @@ typedef struct xfs_inobt_key {/* btree pointer type */ typedef __be32 xfs_inobt_ptr_t ; -/* btree block header type */ -typedef struct xfs_btree_sblock xfs_inobt_block_t ; - -#define XFS_BUF_TO_INOBT_BLOCK (bp) ((xfs_inobt_block_t *)XFS_BUF_PTR(bp)) -/* * Bit manipulations for ir_free. */
@@ -96,6 +90,13 @@ typedef struct xfs_btree_sblock xfs_inob#define XFS_PREALLOC_BLOCKS (mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1))/* +* Btree block header size depends on a superblock flag. +* +* (not quite yet, but soon) +*/ +#define XFS_INOBT_BLOCK_LEN (mp) XFS_BTREE_SBLOCK_LEN + +/* * Record, key, and pointer address macros for btree blocks. * * (note that some of these may appear unused, but they are used in userspace)
@@ -103,19 +104,19 @@ typedef struct xfs_btree_sblock xfs_inob#define XFS_INOBT_REC_ADDR (mp, block, index) \ ((xfs_inobt_rec_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_INOBT_BLOCK_LEN(mp) + \ (((index) - 1) * sizeof(xfs_inobt_rec_t))))#define XFS_INOBT_KEY_ADDR (mp, block, index) \ ((xfs_inobt_key_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_INOBT_BLOCK_LEN(mp) + \ ((index) - 1) * sizeof(xfs_inobt_key_t)))#define XFS_INOBT_PTR_ADDR (mp, block, index, maxrecs) \ ((xfs_inobt_ptr_t *) \ ((char *)(block) + \ - sizeof(struct xfs_btree_sblock) + \ + XFS_INOBT_BLOCK_LEN(mp) + \ (maxrecs) * sizeof(xfs_inobt_key_t) + \ ((index) - 1) * sizeof(xfs_inobt_ptr_t)))
fs/xfs/xfs_inode.c +5 -8
@@ -2352,7 +2352,7 @@ xfs_iroot_realloc(struct xfs_mount *mp = ip->i_mount;int cur_max;xfs_ifork_t *ifp; -xfs_bmbt_block_t *new_broot; +struct xfs_btree_block *new_broot;int new_max;size_t new_size;char *np;
@@ -2373,8 +2373,7 @@ xfs_iroot_realloc(*/ if (ifp->if_broot_bytes ==0 ) { new_size = (size_t )XFS_BMAP_BROOT_SPACE_CALC (rec_diff); - ifp->if_broot = (xfs_bmbt_block_t *)kmem_alloc (new_size, -KM_SLEEP ); + ifp->if_broot =kmem_alloc (new_size,KM_SLEEP ); ifp->if_broot_bytes = (int )new_size;return ; }
@@ -2388,9 +2387,7 @@ xfs_iroot_realloc( cur_max =xfs_bmbt_maxrecs (mp, ifp->if_broot_bytes,0 ); new_max = cur_max + rec_diff; new_size = (size_t )XFS_BMAP_BROOT_SPACE_CALC (new_max); - ifp->if_broot = (xfs_bmbt_block_t *) -kmem_realloc (ifp->if_broot, - new_size, + ifp->if_broot =kmem_realloc (ifp->if_broot, new_size, (size_t )XFS_BMAP_BROOT_SPACE_CALC (cur_max),/* old size */ KM_SLEEP ); op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
@@ -2418,11 +2415,11 @@ xfs_iroot_realloc(else new_size =0 ;if (new_size >0 ) { - new_broot = (xfs_bmbt_block_t *)kmem_alloc (new_size,KM_SLEEP ); + new_broot =kmem_alloc (new_size,KM_SLEEP );/* * First copy over the btree block header. */ -memcpy (new_broot, ifp->if_broot,sizeof (xfs_bmbt_block_t)); +memcpy (new_broot, ifp->if_broot,XFS_BTREE_LBLOCK_LEN ); }else { new_broot =NULL ; ifp->if_flags &= ~XFS_IFBROOT ;
fs/xfs/xfs_inode.h +1 -2
@@ -63,7 +63,7 @@ typedef struct xfs_ext_irec { typedef struct xfs_ifork { int if_bytes; /* bytes in if_u1 */ int if_real_bytes; /* bytes allocated in if_u1 */ - xfs_bmbt_block_t *if_broot; /* file's incore btree root */ + struct xfs_btree_block *if_broot; /* file's incore btree root */ short if_broot_bytes; /* bytes allocated for root */ unsigned char if_flags; /* per-fork flags */ unsigned char if_ext_max; /* max # of extent records */
@@ -213,7 +213,6 @@ struct ktrace;struct xfs_buf ;struct xfs_bmap_free ;struct xfs_bmbt_irec ; -struct xfs_bmbt_block ;struct xfs_inode_log_item ;struct xfs_mount ;struct xfs_trans ;
fs/xfs/xfs_log_recover.c +4 -4
@@ -2452,8 +2452,8 @@ xlog_recover_do_inode_trans(break ;case XFS_ILOG_DBROOT : -xfs_bmbt_to_bmdr (mp, (xfs_bmbt_block_t *)src, len, - &(dip->di_u.di_bmbt), +xfs_bmbt_to_bmdr (mp, (struct xfs_btree_block *)src, len, + &dip->di_u.di_bmbt,XFS_DFORK_DSIZE (dip, mp));break ;
@@ -2490,8 +2490,8 @@ xlog_recover_do_inode_trans(case XFS_ILOG_ABROOT : dest =XFS_DFORK_APTR (dip); -xfs_bmbt_to_bmdr (mp, (xfs_bmbt_block_t *)src, len, - (xfs_bmdr_block_t *)dest, +xfs_bmbt_to_bmdr (mp, (struct xfs_btree_block *)src, + len, (xfs_bmdr_block_t *)dest,XFS_DFORK_ASIZE (dip, mp));break ;
fs/xfs/xfsidbg.c +4 -5
@@ -3078,7 +3078,7 @@ xfsidbg_print_alloc_key(int i, union xfs }static struct xfsidbg_btree xfsidbg_allocbt = { - .block_len =sizeof (struct xfs_btree_sblock ), + .block_len =XFS_BTREE_SBLOCK_LEN , .key_len =sizeof (xfs_alloc_key_t), .rec_len =sizeof (xfs_alloc_rec_t), .ptr_len =sizeof (__be32),
@@ -3110,7 +3110,7 @@ xfsidbg_print_bmbt_key(int i, union xfs_ }static struct xfsidbg_btree xfsidbg_bmbt = { - .block_len =sizeof (struct xfs_btree_lblock ), + .block_len =XFS_BTREE_LBLOCK_LEN , .key_len =sizeof (xfs_bmbt_key_t), .rec_len =sizeof (xfs_bmbt_rec_t), .ptr_len =sizeof (__be64),
@@ -3138,7 +3138,7 @@ xfsidbg_print_inobt_key(int i, union xfs }static struct xfsidbg_btree xfsidbg_inobtbt = { - .block_len =sizeof (struct xfs_btree_sblock ), + .block_len =XFS_BTREE_SBLOCK_LEN , .key_len =sizeof (xfs_inobt_key_t), .rec_len =sizeof (xfs_inobt_rec_t), .ptr_len =sizeof (__be32),
@@ -3162,8 +3162,7 @@ xfs_broot(xfs_inode_t *ip, xfs_ifork_t *return ; } -xfs_btblock ((struct xfs_btree_block *)f->if_broot, f->if_broot_bytes, - &xfsidbg_bmbt); +xfs_btblock (f->if_broot, f->if_broot_bytes, &xfsidbg_bmbt); }
fs/xfs/xfs_dinode.h +1 -1
@@ -165,7 +165,7 @@ typedef enum xfs_dinode_fmt*/ #define XFS_LITINO (mp) ((mp)->m_litino)#define XFS_BROOT_SIZE_ADJ \ - (sizeof(xfs_bmbt_block_t) - sizeof(xfs_bmdr_block_t)) + (XFS_BTREE_LBLOCK_LEN - sizeof(xfs_bmdr_block_t))/* * Inode data & attribute fork sizes, per inode.