mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
xfs: use btree block initialisation functions in growfs
Factor xfs_btree_init_block() to be independent of the btree cursor, and use the function to initialise btree blocks in the growfs code. This makes adding support for different format btree blocks simple. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by Rich Johnston <rjohnston@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
ee73259b40
commit
b64f3a390d
@ -853,18 +853,22 @@ xfs_btree_set_sibling(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void
|
void
|
||||||
xfs_btree_init_block(
|
xfs_btree_init_block(
|
||||||
struct xfs_btree_cur *cur,
|
struct xfs_mount *mp,
|
||||||
int level,
|
struct xfs_buf *bp,
|
||||||
int numrecs,
|
__u32 magic,
|
||||||
struct xfs_btree_block *new) /* new block */
|
__u16 level,
|
||||||
|
__u16 numrecs,
|
||||||
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
new->bb_magic = cpu_to_be32(xfs_magics[cur->bc_btnum]);
|
struct xfs_btree_block *new = XFS_BUF_TO_BLOCK(bp);
|
||||||
|
|
||||||
|
new->bb_magic = cpu_to_be32(magic);
|
||||||
new->bb_level = cpu_to_be16(level);
|
new->bb_level = cpu_to_be16(level);
|
||||||
new->bb_numrecs = cpu_to_be16(numrecs);
|
new->bb_numrecs = cpu_to_be16(numrecs);
|
||||||
|
|
||||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
|
if (flags & XFS_BTREE_LONG_PTRS) {
|
||||||
new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
|
new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
|
||||||
new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
|
new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
|
||||||
} else {
|
} else {
|
||||||
@ -873,6 +877,17 @@ xfs_btree_init_block(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC void
|
||||||
|
xfs_btree_init_block_cur(
|
||||||
|
struct xfs_btree_cur *cur,
|
||||||
|
int level,
|
||||||
|
int numrecs,
|
||||||
|
struct xfs_buf *bp)
|
||||||
|
{
|
||||||
|
xfs_btree_init_block(cur->bc_mp, bp, xfs_magics[cur->bc_btnum],
|
||||||
|
level, numrecs, cur->bc_flags);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return true if ptr is the last record in the btree and
|
* Return true if ptr is the last record in the btree and
|
||||||
* we need to track updateѕ to this record. The decision
|
* we need to track updateѕ to this record. The decision
|
||||||
@ -2183,7 +2198,7 @@ xfs_btree_split(
|
|||||||
goto error0;
|
goto error0;
|
||||||
|
|
||||||
/* Fill in the btree header for the new right block. */
|
/* Fill in the btree header for the new right block. */
|
||||||
xfs_btree_init_block(cur, xfs_btree_get_level(left), 0, right);
|
xfs_btree_init_block_cur(cur, xfs_btree_get_level(left), 0, rbp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Split the entries between the old and the new block evenly.
|
* Split the entries between the old and the new block evenly.
|
||||||
@ -2492,7 +2507,7 @@ xfs_btree_new_root(
|
|||||||
nptr = 2;
|
nptr = 2;
|
||||||
}
|
}
|
||||||
/* Fill in the new block's btree header and log it. */
|
/* Fill in the new block's btree header and log it. */
|
||||||
xfs_btree_init_block(cur, cur->bc_nlevels, 2, new);
|
xfs_btree_init_block_cur(cur, cur->bc_nlevels, 2, nbp);
|
||||||
xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS);
|
xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS);
|
||||||
ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) &&
|
ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) &&
|
||||||
!xfs_btree_ptr_is_null(cur, &rptr));
|
!xfs_btree_ptr_is_null(cur, &rptr));
|
||||||
|
@ -378,6 +378,17 @@ xfs_btree_reada_bufs(
|
|||||||
xfs_agblock_t agbno, /* allocation group block number */
|
xfs_agblock_t agbno, /* allocation group block number */
|
||||||
xfs_extlen_t count); /* count of filesystem blocks */
|
xfs_extlen_t count); /* count of filesystem blocks */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialise a new btree block header
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
xfs_btree_init_block(
|
||||||
|
struct xfs_mount *mp,
|
||||||
|
struct xfs_buf *bp,
|
||||||
|
__u32 magic,
|
||||||
|
__u16 level,
|
||||||
|
__u16 numrecs,
|
||||||
|
unsigned int flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Common btree core entry points.
|
* Common btree core entry points.
|
||||||
|
@ -125,7 +125,6 @@ xfs_growfs_data_private(
|
|||||||
xfs_extlen_t agsize;
|
xfs_extlen_t agsize;
|
||||||
xfs_extlen_t tmpsize;
|
xfs_extlen_t tmpsize;
|
||||||
xfs_alloc_rec_t *arec;
|
xfs_alloc_rec_t *arec;
|
||||||
struct xfs_btree_block *block;
|
|
||||||
xfs_buf_t *bp;
|
xfs_buf_t *bp;
|
||||||
int bucket;
|
int bucket;
|
||||||
int dpct;
|
int dpct;
|
||||||
@ -263,17 +262,14 @@ xfs_growfs_data_private(
|
|||||||
error = ENOMEM;
|
error = ENOMEM;
|
||||||
goto error0;
|
goto error0;
|
||||||
}
|
}
|
||||||
block = XFS_BUF_TO_BLOCK(bp);
|
xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
|
||||||
memset(block, 0, mp->m_sb.sb_blocksize);
|
xfs_btree_init_block(mp, bp, XFS_ABTB_MAGIC, 0, 1, 0);
|
||||||
block->bb_magic = cpu_to_be32(XFS_ABTB_MAGIC);
|
|
||||||
block->bb_level = 0;
|
arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1);
|
||||||
block->bb_numrecs = cpu_to_be16(1);
|
|
||||||
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_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
|
||||||
arec->ar_blockcount = cpu_to_be32(
|
arec->ar_blockcount = cpu_to_be32(
|
||||||
agsize - be32_to_cpu(arec->ar_startblock));
|
agsize - be32_to_cpu(arec->ar_startblock));
|
||||||
|
|
||||||
error = xfs_bwrite(bp);
|
error = xfs_bwrite(bp);
|
||||||
xfs_buf_relse(bp);
|
xfs_buf_relse(bp);
|
||||||
if (error)
|
if (error)
|
||||||
@ -289,18 +285,15 @@ xfs_growfs_data_private(
|
|||||||
error = ENOMEM;
|
error = ENOMEM;
|
||||||
goto error0;
|
goto error0;
|
||||||
}
|
}
|
||||||
block = XFS_BUF_TO_BLOCK(bp);
|
xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
|
||||||
memset(block, 0, mp->m_sb.sb_blocksize);
|
xfs_btree_init_block(mp, bp, XFS_ABTC_MAGIC, 0, 1, 0);
|
||||||
block->bb_magic = cpu_to_be32(XFS_ABTC_MAGIC);
|
|
||||||
block->bb_level = 0;
|
arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1);
|
||||||
block->bb_numrecs = cpu_to_be16(1);
|
|
||||||
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_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
|
||||||
arec->ar_blockcount = cpu_to_be32(
|
arec->ar_blockcount = cpu_to_be32(
|
||||||
agsize - be32_to_cpu(arec->ar_startblock));
|
agsize - be32_to_cpu(arec->ar_startblock));
|
||||||
nfree += be32_to_cpu(arec->ar_blockcount);
|
nfree += be32_to_cpu(arec->ar_blockcount);
|
||||||
|
|
||||||
error = xfs_bwrite(bp);
|
error = xfs_bwrite(bp);
|
||||||
xfs_buf_relse(bp);
|
xfs_buf_relse(bp);
|
||||||
if (error)
|
if (error)
|
||||||
@ -316,13 +309,9 @@ xfs_growfs_data_private(
|
|||||||
error = ENOMEM;
|
error = ENOMEM;
|
||||||
goto error0;
|
goto error0;
|
||||||
}
|
}
|
||||||
block = XFS_BUF_TO_BLOCK(bp);
|
xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
|
||||||
memset(block, 0, mp->m_sb.sb_blocksize);
|
xfs_btree_init_block(mp, bp, XFS_IBT_MAGIC, 0, 0, 0);
|
||||||
block->bb_magic = cpu_to_be32(XFS_IBT_MAGIC);
|
|
||||||
block->bb_level = 0;
|
|
||||||
block->bb_numrecs = 0;
|
|
||||||
block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
|
|
||||||
block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
|
|
||||||
error = xfs_bwrite(bp);
|
error = xfs_bwrite(bp);
|
||||||
xfs_buf_relse(bp);
|
xfs_buf_relse(bp);
|
||||||
if (error)
|
if (error)
|
||||||
|
Loading…
Reference in New Issue
Block a user