/* Set the root of an in-memory btree. */ void
xfbtree_set_root( struct xfs_btree_cur *cur, constunion xfs_btree_ptr *ptr, int inc)
{
ASSERT(cur->bc_ops->type == XFS_BTREE_TYPE_MEM);
/* Close the btree xfile and release all resources. */ void
xfbtree_destroy( struct xfbtree *xfbt)
{
xfs_buftarg_drain(xfbt->target);
}
/* Compute the number of bytes available for records. */ staticinlineunsignedint
xfbtree_rec_bytes( struct xfs_mount *mp, conststruct xfs_btree_ops *ops)
{ return XMBUF_BLOCKSIZE - XFS_BTREE_LBLOCK_CRC_LEN;
}
/* Initialize an empty leaf block as the btree root. */ STATICint
xfbtree_init_leaf_block( struct xfs_mount *mp, struct xfbtree *xfbt, conststruct xfs_btree_ops *ops)
{ struct xfs_buf *bp;
xfbno_t bno = xfbt->highest_bno++; int error;
error = xfs_buf_get(xfbt->target, xfbno_to_daddr(bno), XFBNO_BBSIZE,
&bp); if (error) return error;
/* Allocate a block to our in-memory btree. */ int
xfbtree_alloc_block( struct xfs_btree_cur *cur, constunion xfs_btree_ptr *start, union xfs_btree_ptr *new, int *stat)
{ struct xfbtree *xfbt = cur->bc_mem.xfbtree;
xfbno_t bno = xfbt->highest_bno++;
ASSERT(cur->bc_ops->type == XFS_BTREE_TYPE_MEM);
trace_xfbtree_alloc_block(xfbt, cur, bno);
/* Fail if the block address exceeds the maximum for the buftarg. */ if (!xfbtree_verify_bno(xfbt, bno)) {
ASSERT(xfbtree_verify_bno(xfbt, bno));
*stat = 0; return0;
}
if (bno + 1 == xfbt->highest_bno)
xfbt->highest_bno--;
return0;
}
/* Return the minimum number of records for a btree block. */ int
xfbtree_get_minrecs( struct xfs_btree_cur *cur, int level)
{ struct xfbtree *xfbt = cur->bc_mem.xfbtree;
return xfbt->minrecs[level != 0];
}
/* Return the maximum number of records for a btree block. */ int
xfbtree_get_maxrecs( struct xfs_btree_cur *cur, int level)
{ struct xfbtree *xfbt = cur->bc_mem.xfbtree;
return xfbt->maxrecs[level != 0];
}
/* If this log item is a buffer item that came from the xfbtree, return it. */ staticinlinestruct xfs_buf *
xfbtree_buf_match( struct xfbtree *xfbt, conststruct xfs_log_item *lip)
{ conststruct xfs_buf_log_item *bli; struct xfs_buf *bp;
if (lip->li_type != XFS_LI_BUF) return NULL;
bli = container_of(lip, struct xfs_buf_log_item, bli_item);
bp = bli->bli_buf; if (bp->b_target != xfbt->target) return NULL;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.