mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 08:34:20 +08:00
xfs: remove xfs_btree_cur private firstblock field
The bmbt cursor private structure has a firstblock field that is used to maintain locking order on bmbt allocations. The field holds an actual firstblock value (as opposed to a pointer), so it is initialized on cursor creation, updated on allocation and then the value is transferred back to the source before the cursor is destroyed. This value is always transferred from and back to the ->t_firstblock field. Since xfs_btree_cur already carries a reference to the transaction, we can remove this field from xfs_btree_cur and the associated copying. The bmbt allocations will update the value in the transaction directly. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
280253d213
commit
cf612de732
@ -688,7 +688,6 @@ xfs_bmap_extents_to_btree(
|
||||
* Need a cursor. Can't allocate until bb_level is filled in.
|
||||
*/
|
||||
cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork);
|
||||
cur->bc_private.b.firstblock = tp->t_firstblock;
|
||||
cur->bc_private.b.flags = wasdel ? XFS_BTCUR_BPRV_WASDEL : 0;
|
||||
/*
|
||||
* Convert to a btree with two levels, one record in root.
|
||||
@ -732,7 +731,7 @@ xfs_bmap_extents_to_btree(
|
||||
*/
|
||||
ASSERT(tp->t_firstblock == NULLFSBLOCK ||
|
||||
args.agno >= XFS_FSB_TO_AGNO(mp, tp->t_firstblock));
|
||||
tp->t_firstblock = cur->bc_private.b.firstblock = args.fsbno;
|
||||
tp->t_firstblock = args.fsbno;
|
||||
cur->bc_private.b.allocated++;
|
||||
ip->i_d.di_nblocks++;
|
||||
xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
|
||||
@ -925,7 +924,6 @@ xfs_bmap_add_attrfork_btree(
|
||||
*flags |= XFS_ILOG_DBROOT;
|
||||
else {
|
||||
cur = xfs_bmbt_init_cursor(mp, tp, ip, XFS_DATA_FORK);
|
||||
cur->bc_private.b.firstblock = tp->t_firstblock;
|
||||
error = xfs_bmbt_lookup_first(cur, &stat);
|
||||
if (error)
|
||||
goto error0;
|
||||
@ -937,7 +935,6 @@ xfs_bmap_add_attrfork_btree(
|
||||
xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
|
||||
return -ENOSPC;
|
||||
}
|
||||
tp->t_firstblock = cur->bc_private.b.firstblock;
|
||||
cur->bc_private.b.allocated = 0;
|
||||
xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
|
||||
}
|
||||
@ -4058,14 +4055,10 @@ xfs_bmapi_allocate(
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (bma->cur)
|
||||
bma->cur->bc_private.b.firstblock = bma->tp->t_firstblock;
|
||||
if (bma->blkno == NULLFSBLOCK)
|
||||
return 0;
|
||||
if ((ifp->if_flags & XFS_IFBROOT) && !bma->cur) {
|
||||
if ((ifp->if_flags & XFS_IFBROOT) && !bma->cur)
|
||||
bma->cur = xfs_bmbt_init_cursor(mp, bma->tp, bma->ip, whichfork);
|
||||
bma->cur->bc_private.b.firstblock = bma->tp->t_firstblock;
|
||||
}
|
||||
/*
|
||||
* Bump the number of extents we've allocated
|
||||
* in this call.
|
||||
@ -4151,7 +4144,6 @@ xfs_bmapi_convert_unwritten(
|
||||
if ((ifp->if_flags & XFS_IFBROOT) && !bma->cur) {
|
||||
bma->cur = xfs_bmbt_init_cursor(bma->ip->i_mount, bma->tp,
|
||||
bma->ip, whichfork);
|
||||
bma->cur->bc_private.b.firstblock = bma->tp->t_firstblock;
|
||||
}
|
||||
mval->br_state = (mval->br_state == XFS_EXT_UNWRITTEN)
|
||||
? XFS_EXT_NORM : XFS_EXT_UNWRITTEN;
|
||||
@ -4458,13 +4450,6 @@ error0:
|
||||
xfs_trans_log_inode(tp, ip, bma.logflags);
|
||||
|
||||
if (bma.cur) {
|
||||
if (!error) {
|
||||
ASSERT(tp->t_firstblock == NULLFSBLOCK ||
|
||||
XFS_FSB_TO_AGNO(mp, tp->t_firstblock) <=
|
||||
XFS_FSB_TO_AGNO(mp,
|
||||
bma.cur->bc_private.b.firstblock));
|
||||
tp->t_firstblock = bma.cur->bc_private.b.firstblock;
|
||||
}
|
||||
xfs_btree_del_cursor(bma.cur,
|
||||
error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR);
|
||||
}
|
||||
@ -4528,7 +4513,6 @@ xfs_bmapi_remap(
|
||||
|
||||
if (ifp->if_flags & XFS_IFBROOT) {
|
||||
cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork);
|
||||
cur->bc_private.b.firstblock = tp->t_firstblock;
|
||||
cur->bc_private.b.flags = 0;
|
||||
}
|
||||
|
||||
@ -5189,7 +5173,6 @@ __xfs_bunmapi(
|
||||
if (ifp->if_flags & XFS_IFBROOT) {
|
||||
ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE);
|
||||
cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork);
|
||||
cur->bc_private.b.firstblock = tp->t_firstblock;
|
||||
cur->bc_private.b.flags = 0;
|
||||
} else
|
||||
cur = NULL;
|
||||
@ -5457,10 +5440,8 @@ error0:
|
||||
if (logflags)
|
||||
xfs_trans_log_inode(tp, ip, logflags);
|
||||
if (cur) {
|
||||
if (!error) {
|
||||
tp->t_firstblock = cur->bc_private.b.firstblock;
|
||||
if (!error)
|
||||
cur->bc_private.b.allocated = 0;
|
||||
}
|
||||
xfs_btree_del_cursor(cur,
|
||||
error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR);
|
||||
}
|
||||
@ -5676,7 +5657,6 @@ xfs_bmap_collapse_extents(
|
||||
|
||||
if (ifp->if_flags & XFS_IFBROOT) {
|
||||
cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork);
|
||||
cur->bc_private.b.firstblock = tp->t_firstblock;
|
||||
cur->bc_private.b.flags = 0;
|
||||
}
|
||||
|
||||
@ -5796,7 +5776,6 @@ xfs_bmap_insert_extents(
|
||||
|
||||
if (ifp->if_flags & XFS_IFBROOT) {
|
||||
cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork);
|
||||
cur->bc_private.b.firstblock = tp->t_firstblock;
|
||||
cur->bc_private.b.flags = 0;
|
||||
}
|
||||
|
||||
@ -5918,7 +5897,6 @@ xfs_bmap_split_extent_at(
|
||||
|
||||
if (ifp->if_flags & XFS_IFBROOT) {
|
||||
cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork);
|
||||
cur->bc_private.b.firstblock = tp->t_firstblock;
|
||||
cur->bc_private.b.flags = 0;
|
||||
error = xfs_bmbt_lookup_eq(cur, &got, &i);
|
||||
if (error)
|
||||
|
@ -175,7 +175,6 @@ xfs_bmbt_dup_cursor(
|
||||
* Copy the firstblock, dfops, and flags values,
|
||||
* since init cursor doesn't get them.
|
||||
*/
|
||||
new->bc_private.b.firstblock = cur->bc_private.b.firstblock;
|
||||
new->bc_private.b.flags = cur->bc_private.b.flags;
|
||||
|
||||
return new;
|
||||
@ -186,11 +185,11 @@ xfs_bmbt_update_cursor(
|
||||
struct xfs_btree_cur *src,
|
||||
struct xfs_btree_cur *dst)
|
||||
{
|
||||
ASSERT((dst->bc_private.b.firstblock != NULLFSBLOCK) ||
|
||||
ASSERT((dst->bc_tp->t_firstblock != NULLFSBLOCK) ||
|
||||
(dst->bc_private.b.ip->i_d.di_flags & XFS_DIFLAG_REALTIME));
|
||||
|
||||
dst->bc_private.b.allocated += src->bc_private.b.allocated;
|
||||
dst->bc_private.b.firstblock = src->bc_private.b.firstblock;
|
||||
dst->bc_tp->t_firstblock = src->bc_tp->t_firstblock;
|
||||
|
||||
src->bc_private.b.allocated = 0;
|
||||
}
|
||||
@ -208,7 +207,7 @@ xfs_bmbt_alloc_block(
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.tp = cur->bc_tp;
|
||||
args.mp = cur->bc_mp;
|
||||
args.fsbno = cur->bc_private.b.firstblock;
|
||||
args.fsbno = cur->bc_tp->t_firstblock;
|
||||
args.firstblock = args.fsbno;
|
||||
xfs_rmap_ino_bmbt_owner(&args.oinfo, cur->bc_private.b.ip->i_ino,
|
||||
cur->bc_private.b.whichfork);
|
||||
@ -263,7 +262,7 @@ xfs_bmbt_alloc_block(
|
||||
}
|
||||
|
||||
ASSERT(args.len == 1);
|
||||
cur->bc_private.b.firstblock = args.fsbno;
|
||||
cur->bc_tp->t_firstblock = args.fsbno;
|
||||
cur->bc_private.b.allocated++;
|
||||
cur->bc_private.b.ip->i_d.di_nblocks++;
|
||||
xfs_trans_log_inode(args.tp, cur->bc_private.b.ip, XFS_ILOG_CORE);
|
||||
@ -562,7 +561,6 @@ xfs_bmbt_init_cursor(
|
||||
|
||||
cur->bc_private.b.forksize = XFS_IFORK_SIZE(ip, whichfork);
|
||||
cur->bc_private.b.ip = ip;
|
||||
cur->bc_private.b.firstblock = NULLFSBLOCK;
|
||||
cur->bc_private.b.allocated = 0;
|
||||
cur->bc_private.b.flags = 0;
|
||||
cur->bc_private.b.whichfork = whichfork;
|
||||
|
@ -214,7 +214,6 @@ typedef struct xfs_btree_cur
|
||||
} a;
|
||||
struct { /* needed for BMAP */
|
||||
struct xfs_inode *ip; /* pointer to our inode */
|
||||
xfs_fsblock_t firstblock; /* 1st blk allocated */
|
||||
int allocated; /* count of alloced */
|
||||
short forksize; /* fork's inode space */
|
||||
char whichfork; /* data or attr fork */
|
||||
|
Loading…
Reference in New Issue
Block a user