xfs: remove struct xfs_dabuf and infrastructure
The struct xfs_dabuf now only tracks a single xfs_buf and all the information it holds can be gained directly from the xfs_buf. Hence we can remove the struct dabuf and pass the xfs_buf around everywhere. Kill the struct dabuf and the associated infrastructure. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
@@ -36,20 +36,20 @@
|
||||
/*
|
||||
* Function declarations.
|
||||
*/
|
||||
static void xfs_dir2_free_log_header(xfs_trans_t *tp, xfs_dabuf_t *bp);
|
||||
static int xfs_dir2_leafn_add(xfs_dabuf_t *bp, xfs_da_args_t *args, int index);
|
||||
static int xfs_dir2_leafn_add(struct xfs_buf *bp, xfs_da_args_t *args,
|
||||
int index);
|
||||
#ifdef DEBUG
|
||||
static void xfs_dir2_leafn_check(xfs_inode_t *dp, xfs_dabuf_t *bp);
|
||||
static void xfs_dir2_leafn_check(struct xfs_inode *dp, struct xfs_buf *bp);
|
||||
#else
|
||||
#define xfs_dir2_leafn_check(dp, bp)
|
||||
#endif
|
||||
static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, xfs_dabuf_t *bp_s,
|
||||
int start_s, xfs_dabuf_t *bp_d, int start_d,
|
||||
int count);
|
||||
static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, struct xfs_buf *bp_s,
|
||||
int start_s, struct xfs_buf *bp_d,
|
||||
int start_d, int count);
|
||||
static void xfs_dir2_leafn_rebalance(xfs_da_state_t *state,
|
||||
xfs_da_state_blk_t *blk1,
|
||||
xfs_da_state_blk_t *blk2);
|
||||
static int xfs_dir2_leafn_remove(xfs_da_args_t *args, xfs_dabuf_t *bp,
|
||||
static int xfs_dir2_leafn_remove(xfs_da_args_t *args, struct xfs_buf *bp,
|
||||
int index, xfs_da_state_blk_t *dblk,
|
||||
int *rval);
|
||||
static int xfs_dir2_node_addname_int(xfs_da_args_t *args,
|
||||
@@ -60,16 +60,16 @@ static int xfs_dir2_node_addname_int(xfs_da_args_t *args,
|
||||
*/
|
||||
STATIC void
|
||||
xfs_dir2_free_log_bests(
|
||||
xfs_trans_t *tp, /* transaction pointer */
|
||||
xfs_dabuf_t *bp, /* freespace buffer */
|
||||
struct xfs_trans *tp,
|
||||
struct xfs_buf *bp,
|
||||
int first, /* first entry to log */
|
||||
int last) /* last entry to log */
|
||||
{
|
||||
xfs_dir2_free_t *free; /* freespace structure */
|
||||
|
||||
free = bp->data;
|
||||
free = bp->b_addr;
|
||||
ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
|
||||
xfs_da_log_buf(tp, bp,
|
||||
xfs_trans_log_buf(tp, bp,
|
||||
(uint)((char *)&free->bests[first] - (char *)free),
|
||||
(uint)((char *)&free->bests[last] - (char *)free +
|
||||
sizeof(free->bests[0]) - 1));
|
||||
@@ -80,14 +80,14 @@ xfs_dir2_free_log_bests(
|
||||
*/
|
||||
static void
|
||||
xfs_dir2_free_log_header(
|
||||
xfs_trans_t *tp, /* transaction pointer */
|
||||
xfs_dabuf_t *bp) /* freespace buffer */
|
||||
struct xfs_trans *tp,
|
||||
struct xfs_buf *bp)
|
||||
{
|
||||
xfs_dir2_free_t *free; /* freespace structure */
|
||||
|
||||
free = bp->data;
|
||||
free = bp->b_addr;
|
||||
ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
|
||||
xfs_da_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free),
|
||||
xfs_trans_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free),
|
||||
(uint)(sizeof(xfs_dir2_free_hdr_t) - 1));
|
||||
}
|
||||
|
||||
@@ -99,11 +99,11 @@ xfs_dir2_free_log_header(
|
||||
int /* error */
|
||||
xfs_dir2_leaf_to_node(
|
||||
xfs_da_args_t *args, /* operation arguments */
|
||||
xfs_dabuf_t *lbp) /* leaf buffer */
|
||||
struct xfs_buf *lbp) /* leaf buffer */
|
||||
{
|
||||
xfs_inode_t *dp; /* incore directory inode */
|
||||
int error; /* error return value */
|
||||
xfs_dabuf_t *fbp; /* freespace buffer */
|
||||
struct xfs_buf *fbp; /* freespace buffer */
|
||||
xfs_dir2_db_t fdb; /* freespace block number */
|
||||
xfs_dir2_free_t *free; /* freespace structure */
|
||||
__be16 *from; /* pointer to freespace entry */
|
||||
@@ -136,8 +136,8 @@ xfs_dir2_leaf_to_node(
|
||||
return error;
|
||||
}
|
||||
ASSERT(fbp != NULL);
|
||||
free = fbp->data;
|
||||
leaf = lbp->data;
|
||||
free = fbp->b_addr;
|
||||
leaf = lbp->b_addr;
|
||||
ltp = xfs_dir2_leaf_tail_p(mp, leaf);
|
||||
/*
|
||||
* Initialize the freespace block header.
|
||||
@@ -164,7 +164,6 @@ xfs_dir2_leaf_to_node(
|
||||
xfs_dir2_leaf_log_header(tp, lbp);
|
||||
xfs_dir2_free_log_header(tp, fbp);
|
||||
xfs_dir2_free_log_bests(tp, fbp, 0, be32_to_cpu(free->hdr.nvalid) - 1);
|
||||
xfs_da_buf_done(fbp);
|
||||
xfs_dir2_leafn_check(dp, lbp);
|
||||
return 0;
|
||||
}
|
||||
@@ -175,7 +174,7 @@ xfs_dir2_leaf_to_node(
|
||||
*/
|
||||
static int /* error */
|
||||
xfs_dir2_leafn_add(
|
||||
xfs_dabuf_t *bp, /* leaf buffer */
|
||||
struct xfs_buf *bp, /* leaf buffer */
|
||||
xfs_da_args_t *args, /* operation arguments */
|
||||
int index) /* insertion pt for new entry */
|
||||
{
|
||||
@@ -195,7 +194,7 @@ xfs_dir2_leafn_add(
|
||||
dp = args->dp;
|
||||
mp = dp->i_mount;
|
||||
tp = args->trans;
|
||||
leaf = bp->data;
|
||||
leaf = bp->b_addr;
|
||||
|
||||
/*
|
||||
* Quick check just to make sure we are not going to index
|
||||
@@ -261,15 +260,15 @@ xfs_dir2_leafn_add(
|
||||
*/
|
||||
void
|
||||
xfs_dir2_leafn_check(
|
||||
xfs_inode_t *dp, /* incore directory inode */
|
||||
xfs_dabuf_t *bp) /* leaf buffer */
|
||||
struct xfs_inode *dp,
|
||||
struct xfs_buf *bp)
|
||||
{
|
||||
int i; /* leaf index */
|
||||
xfs_dir2_leaf_t *leaf; /* leaf structure */
|
||||
xfs_mount_t *mp; /* filesystem mount point */
|
||||
int stale; /* count of stale leaves */
|
||||
|
||||
leaf = bp->data;
|
||||
leaf = bp->b_addr;
|
||||
mp = dp->i_mount;
|
||||
ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
ASSERT(be16_to_cpu(leaf->hdr.count) <= xfs_dir2_max_leaf_ents(mp));
|
||||
@@ -291,12 +290,12 @@ xfs_dir2_leafn_check(
|
||||
*/
|
||||
xfs_dahash_t /* hash value */
|
||||
xfs_dir2_leafn_lasthash(
|
||||
xfs_dabuf_t *bp, /* leaf buffer */
|
||||
struct xfs_buf *bp, /* leaf buffer */
|
||||
int *count) /* count of entries in leaf */
|
||||
{
|
||||
xfs_dir2_leaf_t *leaf; /* leaf structure */
|
||||
|
||||
leaf = bp->data;
|
||||
leaf = bp->b_addr;
|
||||
ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
if (count)
|
||||
*count = be16_to_cpu(leaf->hdr.count);
|
||||
@@ -311,12 +310,12 @@ xfs_dir2_leafn_lasthash(
|
||||
*/
|
||||
STATIC int
|
||||
xfs_dir2_leafn_lookup_for_addname(
|
||||
xfs_dabuf_t *bp, /* leaf buffer */
|
||||
struct xfs_buf *bp, /* leaf buffer */
|
||||
xfs_da_args_t *args, /* operation arguments */
|
||||
int *indexp, /* out: leaf entry index */
|
||||
xfs_da_state_t *state) /* state to fill in */
|
||||
{
|
||||
xfs_dabuf_t *curbp = NULL; /* current data/free buffer */
|
||||
struct xfs_buf *curbp = NULL; /* current data/free buffer */
|
||||
xfs_dir2_db_t curdb = -1; /* current data block number */
|
||||
xfs_dir2_db_t curfdb = -1; /* current free block number */
|
||||
xfs_inode_t *dp; /* incore directory inode */
|
||||
@@ -335,7 +334,7 @@ xfs_dir2_leafn_lookup_for_addname(
|
||||
dp = args->dp;
|
||||
tp = args->trans;
|
||||
mp = dp->i_mount;
|
||||
leaf = bp->data;
|
||||
leaf = bp->b_addr;
|
||||
ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
#ifdef __KERNEL__
|
||||
ASSERT(be16_to_cpu(leaf->hdr.count) > 0);
|
||||
@@ -352,7 +351,7 @@ xfs_dir2_leafn_lookup_for_addname(
|
||||
/* If so, it's a free block buffer, get the block number. */
|
||||
curbp = state->extrablk.bp;
|
||||
curfdb = state->extrablk.blkno;
|
||||
free = curbp->data;
|
||||
free = curbp->b_addr;
|
||||
ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
|
||||
}
|
||||
length = xfs_dir2_data_entsize(args->namelen);
|
||||
@@ -394,7 +393,7 @@ xfs_dir2_leafn_lookup_for_addname(
|
||||
* If we had one before, drop it.
|
||||
*/
|
||||
if (curbp)
|
||||
xfs_da_brelse(tp, curbp);
|
||||
xfs_trans_brelse(tp, curbp);
|
||||
/*
|
||||
* Read the free block.
|
||||
*/
|
||||
@@ -403,7 +402,7 @@ xfs_dir2_leafn_lookup_for_addname(
|
||||
-1, &curbp, XFS_DATA_FORK);
|
||||
if (error)
|
||||
return error;
|
||||
free = curbp->data;
|
||||
free = curbp->b_addr;
|
||||
ASSERT(be32_to_cpu(free->hdr.magic) ==
|
||||
XFS_DIR2_FREE_MAGIC);
|
||||
ASSERT((be32_to_cpu(free->hdr.firstdb) %
|
||||
@@ -424,7 +423,7 @@ xfs_dir2_leafn_lookup_for_addname(
|
||||
XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int",
|
||||
XFS_ERRLEVEL_LOW, mp);
|
||||
if (curfdb != newfdb)
|
||||
xfs_da_brelse(tp, curbp);
|
||||
xfs_trans_brelse(tp, curbp);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
curfdb = newfdb;
|
||||
@@ -459,12 +458,12 @@ out:
|
||||
*/
|
||||
STATIC int
|
||||
xfs_dir2_leafn_lookup_for_entry(
|
||||
xfs_dabuf_t *bp, /* leaf buffer */
|
||||
struct xfs_buf *bp, /* leaf buffer */
|
||||
xfs_da_args_t *args, /* operation arguments */
|
||||
int *indexp, /* out: leaf entry index */
|
||||
xfs_da_state_t *state) /* state to fill in */
|
||||
{
|
||||
xfs_dabuf_t *curbp = NULL; /* current data/free buffer */
|
||||
struct xfs_buf *curbp = NULL; /* current data/free buffer */
|
||||
xfs_dir2_db_t curdb = -1; /* current data block number */
|
||||
xfs_dir2_data_entry_t *dep; /* data block entry */
|
||||
xfs_inode_t *dp; /* incore directory inode */
|
||||
@@ -480,7 +479,7 @@ xfs_dir2_leafn_lookup_for_entry(
|
||||
dp = args->dp;
|
||||
tp = args->trans;
|
||||
mp = dp->i_mount;
|
||||
leaf = bp->data;
|
||||
leaf = bp->b_addr;
|
||||
ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
#ifdef __KERNEL__
|
||||
ASSERT(be16_to_cpu(leaf->hdr.count) > 0);
|
||||
@@ -525,7 +524,7 @@ xfs_dir2_leafn_lookup_for_entry(
|
||||
*/
|
||||
if (curbp && (args->cmpresult == XFS_CMP_DIFFERENT ||
|
||||
curdb != state->extrablk.blkno))
|
||||
xfs_da_brelse(tp, curbp);
|
||||
xfs_trans_brelse(tp, curbp);
|
||||
/*
|
||||
* If needing the block that is saved with a CI match,
|
||||
* use it otherwise read in the new data block.
|
||||
@@ -547,7 +546,7 @@ xfs_dir2_leafn_lookup_for_entry(
|
||||
/*
|
||||
* Point to the data entry.
|
||||
*/
|
||||
dep = (xfs_dir2_data_entry_t *)((char *)curbp->data +
|
||||
dep = (xfs_dir2_data_entry_t *)((char *)curbp->b_addr +
|
||||
xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address)));
|
||||
/*
|
||||
* Compare the entry and if it's an exact match, return
|
||||
@@ -559,7 +558,7 @@ xfs_dir2_leafn_lookup_for_entry(
|
||||
/* If there is a CI match block, drop it */
|
||||
if (args->cmpresult != XFS_CMP_DIFFERENT &&
|
||||
curdb != state->extrablk.blkno)
|
||||
xfs_da_brelse(tp, state->extrablk.bp);
|
||||
xfs_trans_brelse(tp, state->extrablk.bp);
|
||||
args->cmpresult = cmp;
|
||||
args->inumber = be64_to_cpu(dep->inumber);
|
||||
*indexp = index;
|
||||
@@ -567,7 +566,7 @@ xfs_dir2_leafn_lookup_for_entry(
|
||||
state->extrablk.bp = curbp;
|
||||
state->extrablk.blkno = curdb;
|
||||
state->extrablk.index = (int)((char *)dep -
|
||||
(char *)curbp->data);
|
||||
(char *)curbp->b_addr);
|
||||
state->extrablk.magic = XFS_DIR2_DATA_MAGIC;
|
||||
if (cmp == XFS_CMP_EXACT)
|
||||
return XFS_ERROR(EEXIST);
|
||||
@@ -586,7 +585,7 @@ xfs_dir2_leafn_lookup_for_entry(
|
||||
} else {
|
||||
/* If the curbp is not the CI match block, drop it */
|
||||
if (state->extrablk.bp != curbp)
|
||||
xfs_da_brelse(tp, curbp);
|
||||
xfs_trans_brelse(tp, curbp);
|
||||
}
|
||||
} else {
|
||||
state->extravalid = 0;
|
||||
@@ -602,7 +601,7 @@ xfs_dir2_leafn_lookup_for_entry(
|
||||
*/
|
||||
int
|
||||
xfs_dir2_leafn_lookup_int(
|
||||
xfs_dabuf_t *bp, /* leaf buffer */
|
||||
struct xfs_buf *bp, /* leaf buffer */
|
||||
xfs_da_args_t *args, /* operation arguments */
|
||||
int *indexp, /* out: leaf entry index */
|
||||
xfs_da_state_t *state) /* state to fill in */
|
||||
@@ -620,9 +619,9 @@ xfs_dir2_leafn_lookup_int(
|
||||
static void
|
||||
xfs_dir2_leafn_moveents(
|
||||
xfs_da_args_t *args, /* operation arguments */
|
||||
xfs_dabuf_t *bp_s, /* source leaf buffer */
|
||||
struct xfs_buf *bp_s, /* source leaf buffer */
|
||||
int start_s, /* source leaf index */
|
||||
xfs_dabuf_t *bp_d, /* destination leaf buffer */
|
||||
struct xfs_buf *bp_d, /* destination leaf buffer */
|
||||
int start_d, /* destination leaf index */
|
||||
int count) /* count of leaves to copy */
|
||||
{
|
||||
@@ -640,8 +639,8 @@ xfs_dir2_leafn_moveents(
|
||||
return;
|
||||
}
|
||||
tp = args->trans;
|
||||
leaf_s = bp_s->data;
|
||||
leaf_d = bp_d->data;
|
||||
leaf_s = bp_s->b_addr;
|
||||
leaf_d = bp_d->b_addr;
|
||||
/*
|
||||
* If the destination index is not the end of the current
|
||||
* destination leaf entries, open up a hole in the destination
|
||||
@@ -702,14 +701,14 @@ xfs_dir2_leafn_moveents(
|
||||
*/
|
||||
int /* sort order */
|
||||
xfs_dir2_leafn_order(
|
||||
xfs_dabuf_t *leaf1_bp, /* leaf1 buffer */
|
||||
xfs_dabuf_t *leaf2_bp) /* leaf2 buffer */
|
||||
struct xfs_buf *leaf1_bp, /* leaf1 buffer */
|
||||
struct xfs_buf *leaf2_bp) /* leaf2 buffer */
|
||||
{
|
||||
xfs_dir2_leaf_t *leaf1; /* leaf1 structure */
|
||||
xfs_dir2_leaf_t *leaf2; /* leaf2 structure */
|
||||
|
||||
leaf1 = leaf1_bp->data;
|
||||
leaf2 = leaf2_bp->data;
|
||||
leaf1 = leaf1_bp->b_addr;
|
||||
leaf2 = leaf2_bp->b_addr;
|
||||
ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
if (be16_to_cpu(leaf1->hdr.count) > 0 &&
|
||||
@@ -757,8 +756,8 @@ xfs_dir2_leafn_rebalance(
|
||||
blk1 = blk2;
|
||||
blk2 = tmp;
|
||||
}
|
||||
leaf1 = blk1->bp->data;
|
||||
leaf2 = blk2->bp->data;
|
||||
leaf1 = blk1->bp->b_addr;
|
||||
leaf2 = blk2->bp->b_addr;
|
||||
oldsum = be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count);
|
||||
#ifdef DEBUG
|
||||
oldstale = be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale);
|
||||
@@ -834,14 +833,14 @@ xfs_dir2_leafn_rebalance(
|
||||
static int /* error */
|
||||
xfs_dir2_leafn_remove(
|
||||
xfs_da_args_t *args, /* operation arguments */
|
||||
xfs_dabuf_t *bp, /* leaf buffer */
|
||||
struct xfs_buf *bp, /* leaf buffer */
|
||||
int index, /* leaf entry index */
|
||||
xfs_da_state_blk_t *dblk, /* data block */
|
||||
int *rval) /* resulting block needs join */
|
||||
{
|
||||
xfs_dir2_data_hdr_t *hdr; /* data block header */
|
||||
xfs_dir2_db_t db; /* data block number */
|
||||
xfs_dabuf_t *dbp; /* data block buffer */
|
||||
struct xfs_buf *dbp; /* data block buffer */
|
||||
xfs_dir2_data_entry_t *dep; /* data block entry */
|
||||
xfs_inode_t *dp; /* incore directory inode */
|
||||
xfs_dir2_leaf_t *leaf; /* leaf structure */
|
||||
@@ -858,7 +857,7 @@ xfs_dir2_leafn_remove(
|
||||
dp = args->dp;
|
||||
tp = args->trans;
|
||||
mp = dp->i_mount;
|
||||
leaf = bp->data;
|
||||
leaf = bp->b_addr;
|
||||
ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
/*
|
||||
* Point to the entry we're removing.
|
||||
@@ -884,7 +883,7 @@ xfs_dir2_leafn_remove(
|
||||
* in the data block in case it changes.
|
||||
*/
|
||||
dbp = dblk->bp;
|
||||
hdr = dbp->data;
|
||||
hdr = dbp->b_addr;
|
||||
dep = (xfs_dir2_data_entry_t *)((char *)hdr + off);
|
||||
longest = be16_to_cpu(hdr->bestfree[0].length);
|
||||
needlog = needscan = 0;
|
||||
@@ -905,7 +904,7 @@ xfs_dir2_leafn_remove(
|
||||
*/
|
||||
if (longest < be16_to_cpu(hdr->bestfree[0].length)) {
|
||||
int error; /* error return value */
|
||||
xfs_dabuf_t *fbp; /* freeblock buffer */
|
||||
struct xfs_buf *fbp; /* freeblock buffer */
|
||||
xfs_dir2_db_t fdb; /* freeblock block number */
|
||||
int findex; /* index in freeblock entries */
|
||||
xfs_dir2_free_t *free; /* freeblock structure */
|
||||
@@ -920,7 +919,7 @@ xfs_dir2_leafn_remove(
|
||||
-1, &fbp, XFS_DATA_FORK))) {
|
||||
return error;
|
||||
}
|
||||
free = fbp->data;
|
||||
free = fbp->b_addr;
|
||||
ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
|
||||
ASSERT(be32_to_cpu(free->hdr.firstdb) ==
|
||||
xfs_dir2_free_max_bests(mp) *
|
||||
@@ -948,9 +947,7 @@ xfs_dir2_leafn_remove(
|
||||
* In this case just drop the buffer and some one else
|
||||
* will eventually get rid of the empty block.
|
||||
*/
|
||||
else if (error == ENOSPC && args->total == 0)
|
||||
xfs_da_buf_done(dbp);
|
||||
else
|
||||
else if (!(error == ENOSPC && args->total == 0))
|
||||
return error;
|
||||
}
|
||||
/*
|
||||
@@ -1018,11 +1015,6 @@ xfs_dir2_leafn_remove(
|
||||
*/
|
||||
if (logfree)
|
||||
xfs_dir2_free_log_bests(tp, fbp, findex, findex);
|
||||
/*
|
||||
* Drop the buffer if we still have it.
|
||||
*/
|
||||
if (fbp)
|
||||
xfs_da_buf_done(fbp);
|
||||
}
|
||||
xfs_dir2_leafn_check(dp, bp);
|
||||
/*
|
||||
@@ -1114,7 +1106,7 @@ xfs_dir2_leafn_toosmall(
|
||||
{
|
||||
xfs_da_state_blk_t *blk; /* leaf block */
|
||||
xfs_dablk_t blkno; /* leaf block number */
|
||||
xfs_dabuf_t *bp; /* leaf buffer */
|
||||
struct xfs_buf *bp; /* leaf buffer */
|
||||
int bytes; /* bytes in use */
|
||||
int count; /* leaf live entry count */
|
||||
int error; /* error return value */
|
||||
@@ -1130,7 +1122,7 @@ xfs_dir2_leafn_toosmall(
|
||||
* to coalesce with a sibling.
|
||||
*/
|
||||
blk = &state->path.blk[state->path.active - 1];
|
||||
info = blk->bp->data;
|
||||
info = blk->bp->b_addr;
|
||||
ASSERT(info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
leaf = (xfs_dir2_leaf_t *)info;
|
||||
count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale);
|
||||
@@ -1189,7 +1181,7 @@ xfs_dir2_leafn_toosmall(
|
||||
leaf = (xfs_dir2_leaf_t *)info;
|
||||
count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale);
|
||||
bytes = state->blocksize - (state->blocksize >> 2);
|
||||
leaf = bp->data;
|
||||
leaf = bp->b_addr;
|
||||
ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
count += be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale);
|
||||
bytes -= count * (uint)sizeof(leaf->ents[0]);
|
||||
@@ -1198,7 +1190,7 @@ xfs_dir2_leafn_toosmall(
|
||||
*/
|
||||
if (bytes >= 0)
|
||||
break;
|
||||
xfs_da_brelse(state->args->trans, bp);
|
||||
xfs_trans_brelse(state->args->trans, bp);
|
||||
}
|
||||
/*
|
||||
* Didn't like either block, give up.
|
||||
@@ -1207,11 +1199,7 @@ xfs_dir2_leafn_toosmall(
|
||||
*action = 0;
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* Done with the sibling leaf block here, drop the dabuf
|
||||
* so path_shift can get it.
|
||||
*/
|
||||
xfs_da_buf_done(bp);
|
||||
|
||||
/*
|
||||
* Make altpath point to the block we want to keep (the lower
|
||||
* numbered block) and path point to the block we want to drop.
|
||||
@@ -1247,8 +1235,8 @@ xfs_dir2_leafn_unbalance(
|
||||
args = state->args;
|
||||
ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC);
|
||||
ASSERT(save_blk->magic == XFS_DIR2_LEAFN_MAGIC);
|
||||
drop_leaf = drop_blk->bp->data;
|
||||
save_leaf = save_blk->bp->data;
|
||||
drop_leaf = drop_blk->bp->b_addr;
|
||||
save_leaf = save_blk->bp->b_addr;
|
||||
ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
|
||||
/*
|
||||
@@ -1356,13 +1344,13 @@ xfs_dir2_node_addname_int(
|
||||
{
|
||||
xfs_dir2_data_hdr_t *hdr; /* data block header */
|
||||
xfs_dir2_db_t dbno; /* data block number */
|
||||
xfs_dabuf_t *dbp; /* data block buffer */
|
||||
struct xfs_buf *dbp; /* data block buffer */
|
||||
xfs_dir2_data_entry_t *dep; /* data entry pointer */
|
||||
xfs_inode_t *dp; /* incore directory inode */
|
||||
xfs_dir2_data_unused_t *dup; /* data unused entry pointer */
|
||||
int error; /* error return value */
|
||||
xfs_dir2_db_t fbno; /* freespace block number */
|
||||
xfs_dabuf_t *fbp; /* freespace buffer */
|
||||
struct xfs_buf *fbp; /* freespace buffer */
|
||||
int findex; /* freespace entry index */
|
||||
xfs_dir2_free_t *free=NULL; /* freespace block structure */
|
||||
xfs_dir2_db_t ifbno; /* initial freespace block no */
|
||||
@@ -1390,7 +1378,7 @@ xfs_dir2_node_addname_int(
|
||||
* Remember initial freespace block number.
|
||||
*/
|
||||
ifbno = fblk->blkno;
|
||||
free = fbp->data;
|
||||
free = fbp->b_addr;
|
||||
ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
|
||||
findex = fblk->index;
|
||||
/*
|
||||
@@ -1474,7 +1462,7 @@ xfs_dir2_node_addname_int(
|
||||
if (unlikely(fbp == NULL)) {
|
||||
continue;
|
||||
}
|
||||
free = fbp->data;
|
||||
free = fbp->b_addr;
|
||||
ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
|
||||
findex = 0;
|
||||
}
|
||||
@@ -1492,7 +1480,7 @@ xfs_dir2_node_addname_int(
|
||||
/*
|
||||
* Drop the block.
|
||||
*/
|
||||
xfs_da_brelse(tp, fbp);
|
||||
xfs_trans_brelse(tp, fbp);
|
||||
fbp = NULL;
|
||||
if (fblk && fblk->bp)
|
||||
fblk->bp = NULL;
|
||||
@@ -1507,36 +1495,23 @@ xfs_dir2_node_addname_int(
|
||||
/*
|
||||
* Not allowed to allocate, return failure.
|
||||
*/
|
||||
if ((args->op_flags & XFS_DA_OP_JUSTCHECK) ||
|
||||
args->total == 0) {
|
||||
/*
|
||||
* Drop the freespace buffer unless it came from our
|
||||
* caller.
|
||||
*/
|
||||
if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL)
|
||||
xfs_da_buf_done(fbp);
|
||||
if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total == 0)
|
||||
return XFS_ERROR(ENOSPC);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate and initialize the new data block.
|
||||
*/
|
||||
if (unlikely((error = xfs_dir2_grow_inode(args,
|
||||
XFS_DIR2_DATA_SPACE,
|
||||
&dbno)) ||
|
||||
(error = xfs_dir2_data_init(args, dbno, &dbp)))) {
|
||||
/*
|
||||
* Drop the freespace buffer unless it came from our
|
||||
* caller.
|
||||
*/
|
||||
if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL)
|
||||
xfs_da_buf_done(fbp);
|
||||
(error = xfs_dir2_data_init(args, dbno, &dbp))))
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* If (somehow) we have a freespace block, get rid of it.
|
||||
*/
|
||||
if (fbp)
|
||||
xfs_da_brelse(tp, fbp);
|
||||
xfs_trans_brelse(tp, fbp);
|
||||
if (fblk && fblk->bp)
|
||||
fblk->bp = NULL;
|
||||
|
||||
@@ -1547,10 +1522,9 @@ xfs_dir2_node_addname_int(
|
||||
fbno = xfs_dir2_db_to_fdb(mp, dbno);
|
||||
if (unlikely(error = xfs_da_read_buf(tp, dp,
|
||||
xfs_dir2_db_to_da(mp, fbno), -2, &fbp,
|
||||
XFS_DATA_FORK))) {
|
||||
xfs_da_buf_done(dbp);
|
||||
XFS_DATA_FORK)))
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there wasn't a freespace block, the read will
|
||||
* return a NULL fbp. Allocate and initialize a new one.
|
||||
@@ -1598,7 +1572,7 @@ xfs_dir2_node_addname_int(
|
||||
* Initialize the new block to be empty, and remember
|
||||
* its first slot as our empty slot.
|
||||
*/
|
||||
free = fbp->data;
|
||||
free = fbp->b_addr;
|
||||
free->hdr.magic = cpu_to_be32(XFS_DIR2_FREE_MAGIC);
|
||||
free->hdr.firstdb = cpu_to_be32(
|
||||
(fbno - XFS_DIR2_FREE_FIRSTDB(mp)) *
|
||||
@@ -1606,7 +1580,7 @@ xfs_dir2_node_addname_int(
|
||||
free->hdr.nvalid = 0;
|
||||
free->hdr.nused = 0;
|
||||
} else {
|
||||
free = fbp->data;
|
||||
free = fbp->b_addr;
|
||||
ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
|
||||
}
|
||||
|
||||
@@ -1639,7 +1613,7 @@ xfs_dir2_node_addname_int(
|
||||
* We haven't allocated the data entry yet so this will
|
||||
* change again.
|
||||
*/
|
||||
hdr = dbp->data;
|
||||
hdr = dbp->b_addr;
|
||||
free->bests[findex] = hdr->bestfree[0].length;
|
||||
logfree = 1;
|
||||
}
|
||||
@@ -1650,22 +1624,17 @@ xfs_dir2_node_addname_int(
|
||||
/*
|
||||
* If just checking, we succeeded.
|
||||
*/
|
||||
if (args->op_flags & XFS_DA_OP_JUSTCHECK) {
|
||||
if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL)
|
||||
xfs_da_buf_done(fbp);
|
||||
if (args->op_flags & XFS_DA_OP_JUSTCHECK)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the data block in.
|
||||
*/
|
||||
if (unlikely(
|
||||
error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, dbno),
|
||||
-1, &dbp, XFS_DATA_FORK))) {
|
||||
if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL)
|
||||
xfs_da_buf_done(fbp);
|
||||
error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, dbno),
|
||||
-1, &dbp, XFS_DATA_FORK);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
hdr = dbp->data;
|
||||
hdr = dbp->b_addr;
|
||||
logfree = 0;
|
||||
}
|
||||
ASSERT(be16_to_cpu(hdr->bestfree[0].length) >= length);
|
||||
@@ -1713,17 +1682,11 @@ xfs_dir2_node_addname_int(
|
||||
*/
|
||||
if (logfree)
|
||||
xfs_dir2_free_log_bests(tp, fbp, findex, findex);
|
||||
/*
|
||||
* If the caller didn't hand us the freespace block, drop it.
|
||||
*/
|
||||
if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL)
|
||||
xfs_da_buf_done(fbp);
|
||||
/*
|
||||
* Return the data block and offset in args, then drop the data block.
|
||||
*/
|
||||
args->blkno = (xfs_dablk_t)dbno;
|
||||
args->index = be16_to_cpu(*tagp);
|
||||
xfs_da_buf_done(dbp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1761,22 +1724,23 @@ xfs_dir2_node_lookup(
|
||||
/* If a CI match, dup the actual name and return EEXIST */
|
||||
xfs_dir2_data_entry_t *dep;
|
||||
|
||||
dep = (xfs_dir2_data_entry_t *)((char *)state->extrablk.bp->
|
||||
data + state->extrablk.index);
|
||||
dep = (xfs_dir2_data_entry_t *)
|
||||
((char *)state->extrablk.bp->b_addr +
|
||||
state->extrablk.index);
|
||||
rval = xfs_dir_cilookup_result(args, dep->name, dep->namelen);
|
||||
}
|
||||
/*
|
||||
* Release the btree blocks and leaf block.
|
||||
*/
|
||||
for (i = 0; i < state->path.active; i++) {
|
||||
xfs_da_brelse(args->trans, state->path.blk[i].bp);
|
||||
xfs_trans_brelse(args->trans, state->path.blk[i].bp);
|
||||
state->path.blk[i].bp = NULL;
|
||||
}
|
||||
/*
|
||||
* Release the data block if we have it.
|
||||
*/
|
||||
if (state->extravalid && state->extrablk.bp) {
|
||||
xfs_da_brelse(args->trans, state->extrablk.bp);
|
||||
xfs_trans_brelse(args->trans, state->extrablk.bp);
|
||||
state->extrablk.bp = NULL;
|
||||
}
|
||||
xfs_da_state_free(state);
|
||||
@@ -1893,13 +1857,13 @@ xfs_dir2_node_replace(
|
||||
*/
|
||||
blk = &state->path.blk[state->path.active - 1];
|
||||
ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC);
|
||||
leaf = blk->bp->data;
|
||||
leaf = blk->bp->b_addr;
|
||||
lep = &leaf->ents[blk->index];
|
||||
ASSERT(state->extravalid);
|
||||
/*
|
||||
* Point to the data entry.
|
||||
*/
|
||||
hdr = state->extrablk.bp->data;
|
||||
hdr = state->extrablk.bp->b_addr;
|
||||
ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC));
|
||||
dep = (xfs_dir2_data_entry_t *)
|
||||
((char *)hdr +
|
||||
@@ -1916,14 +1880,14 @@ xfs_dir2_node_replace(
|
||||
* Didn't find it, and we're holding a data block. Drop it.
|
||||
*/
|
||||
else if (state->extravalid) {
|
||||
xfs_da_brelse(args->trans, state->extrablk.bp);
|
||||
xfs_trans_brelse(args->trans, state->extrablk.bp);
|
||||
state->extrablk.bp = NULL;
|
||||
}
|
||||
/*
|
||||
* Release all the buffers in the cursor.
|
||||
*/
|
||||
for (i = 0; i < state->path.active; i++) {
|
||||
xfs_da_brelse(args->trans, state->path.blk[i].bp);
|
||||
xfs_trans_brelse(args->trans, state->path.blk[i].bp);
|
||||
state->path.blk[i].bp = NULL;
|
||||
}
|
||||
xfs_da_state_free(state);
|
||||
@@ -1940,7 +1904,7 @@ xfs_dir2_node_trim_free(
|
||||
xfs_fileoff_t fo, /* free block number */
|
||||
int *rvalp) /* out: did something */
|
||||
{
|
||||
xfs_dabuf_t *bp; /* freespace buffer */
|
||||
struct xfs_buf *bp; /* freespace buffer */
|
||||
xfs_inode_t *dp; /* incore directory inode */
|
||||
int error; /* error return code */
|
||||
xfs_dir2_free_t *free; /* freespace structure */
|
||||
@@ -1965,13 +1929,13 @@ xfs_dir2_node_trim_free(
|
||||
if (bp == NULL) {
|
||||
return 0;
|
||||
}
|
||||
free = bp->data;
|
||||
free = bp->b_addr;
|
||||
ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
|
||||
/*
|
||||
* If there are used entries, there's nothing to do.
|
||||
*/
|
||||
if (be32_to_cpu(free->hdr.nused) > 0) {
|
||||
xfs_da_brelse(tp, bp);
|
||||
xfs_trans_brelse(tp, bp);
|
||||
*rvalp = 0;
|
||||
return 0;
|
||||
}
|
||||
@@ -1987,7 +1951,7 @@ xfs_dir2_node_trim_free(
|
||||
* pieces. This is the last block of an extent.
|
||||
*/
|
||||
ASSERT(error != ENOSPC);
|
||||
xfs_da_brelse(tp, bp);
|
||||
xfs_trans_brelse(tp, bp);
|
||||
return error;
|
||||
}
|
||||
/*
|
||||
|
Reference in New Issue
Block a user