Skip to content

Commit

Permalink
[XFS] implement generic xfs_btree_get_rec
Browse files Browse the repository at this point in the history
Not really much reason to make it generic given that it's so small, but
this is the last non-method in xfs_alloc_btree.c and xfs_ialloc_btree.c,
so it makes the whole btree implementation more structured.

SGI-PV: 985583

SGI-Modid: xfs-linux-melb:xfs-kern:32206a

Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Signed-off-by: Bill O'Donnell <billodo@sgi.com>
Signed-off-by: David Chinner <david@fromorbit.com>
  • Loading branch information
Christoph Hellwig authored and Lachlan McIlroy committed Oct 30, 2008
1 parent 91cca5d commit 8cc938f
Show file tree
Hide file tree
Showing 9 changed files with 91 additions and 101 deletions.
21 changes: 21 additions & 0 deletions fs/xfs/xfs_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,27 @@ xfs_alloc_update(
return xfs_btree_update(cur, &rec);
}

/*
* Get the data from the pointed-to record.
*/
STATIC int /* error */
xfs_alloc_get_rec(
struct xfs_btree_cur *cur, /* btree cursor */
xfs_agblock_t *bno, /* output: starting block of extent */
xfs_extlen_t *len, /* output: length of extent */
int *stat) /* output: success/failure */
{
union xfs_btree_rec *rec;
int error;

error = xfs_btree_get_rec(cur, &rec, stat);
if (!error && *stat == 1) {
*bno = be32_to_cpu(rec->alloc.ar_startblock);
*len = be32_to_cpu(rec->alloc.ar_blockcount);
}
return error;
}

/*
* Compute aligned version of the found extent.
* Takes alignment and min length into account.
Expand Down
44 changes: 0 additions & 44 deletions fs/xfs/xfs_alloc_btree.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,50 +41,6 @@
#include "xfs_error.h"


/*
* Get the data from the pointed-to record.
*/
int /* error */
xfs_alloc_get_rec(
xfs_btree_cur_t *cur, /* btree cursor */
xfs_agblock_t *bno, /* output: starting block of extent */
xfs_extlen_t *len, /* output: length of extent */
int *stat) /* output: success/failure */
{
xfs_alloc_block_t *block; /* btree block */
#ifdef DEBUG
int error; /* error return value */
#endif
int ptr; /* record number */

ptr = cur->bc_ptrs[0];
block = XFS_BUF_TO_ALLOC_BLOCK(cur->bc_bufs[0]);
#ifdef DEBUG
if ((error = xfs_btree_check_sblock(cur, block, 0, cur->bc_bufs[0])))
return error;
#endif
/*
* Off the right end or left end, return failure.
*/
if (ptr > be16_to_cpu(block->bb_numrecs) || ptr <= 0) {
*stat = 0;
return 0;
}
/*
* Point to the record and extract its data.
*/
{
xfs_alloc_rec_t *rec; /* record data */

rec = XFS_ALLOC_REC_ADDR(block, ptr, cur);
*bno = be32_to_cpu(rec->ar_startblock);
*len = be32_to_cpu(rec->ar_blockcount);
}
*stat = 1;
return 0;
}


STATIC struct xfs_btree_cur *
xfs_allocbt_dup_cursor(
struct xfs_btree_cur *cur)
Expand Down
6 changes: 0 additions & 6 deletions fs/xfs/xfs_alloc_btree.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,12 +94,6 @@ typedef struct xfs_btree_sblock xfs_alloc_block_t;
#define XFS_ALLOC_PTR_ADDR(bb,i,cur) \
XFS_BTREE_PTR_ADDR(xfs_alloc, bb, i, XFS_ALLOC_BLOCK_MAXRECS(1, cur))

/*
* Get the data from the pointed-to record.
*/
extern int xfs_alloc_get_rec(struct xfs_btree_cur *cur, xfs_agblock_t *bno,
xfs_extlen_t *len, int *stat);


extern struct xfs_btree_cur *xfs_allocbt_init_cursor(struct xfs_mount *,
struct xfs_trans *, struct xfs_buf *,
Expand Down
41 changes: 41 additions & 0 deletions fs/xfs/xfs_btree.c
Original file line number Diff line number Diff line change
Expand Up @@ -3764,3 +3764,44 @@ xfs_btree_delete(
XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR);
return error;
}

/*
* Get the data from the pointed-to record.
*/
int /* error */
xfs_btree_get_rec(
struct xfs_btree_cur *cur, /* btree cursor */
union xfs_btree_rec **recp, /* output: btree record */
int *stat) /* output: success/failure */
{
struct xfs_btree_block *block; /* btree block */
struct xfs_buf *bp; /* buffer pointer */
int ptr; /* record number */
#ifdef DEBUG
int error; /* error return value */
#endif

ptr = cur->bc_ptrs[0];
block = xfs_btree_get_block(cur, 0, &bp);

#ifdef DEBUG
error = xfs_btree_check_block(cur, block, 0, bp);
if (error)
return error;
#endif

/*
* Off the right end or left end, return failure.
*/
if (ptr > xfs_btree_get_numrecs(block) || ptr <= 0) {
*stat = 0;
return 0;
}

/*
* Point to the record and extract its data.
*/
*recp = xfs_btree_rec_addr(cur, ptr, block);
*stat = 1;
return 0;
}
1 change: 1 addition & 0 deletions fs/xfs/xfs_btree.h
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,7 @@ int xfs_btree_new_iroot(struct xfs_btree_cur *, int *, int *);
int xfs_btree_kill_iroot(struct xfs_btree_cur *);
int xfs_btree_insert(struct xfs_btree_cur *, int *);
int xfs_btree_delete(struct xfs_btree_cur *, int *);
int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int *);

/*
* Helpers.
Expand Down
23 changes: 23 additions & 0 deletions fs/xfs/xfs_ialloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,29 @@ xfs_inobt_update(
return xfs_btree_update(cur, &rec);
}

/*
* Get the data from the pointed-to record.
*/
int /* error */
xfs_inobt_get_rec(
struct xfs_btree_cur *cur, /* btree cursor */
xfs_agino_t *ino, /* output: starting inode of chunk */
__int32_t *fcnt, /* output: number of free inodes */
xfs_inofree_t *free, /* output: free inode mask */
int *stat) /* output: success/failure */
{
union xfs_btree_rec *rec;
int error;

error = xfs_btree_get_rec(cur, &rec, stat);
if (!error && *stat == 1) {
*ino = be32_to_cpu(rec->inobt.ir_startino);
*fcnt = be32_to_cpu(rec->inobt.ir_freecount);
*free = be64_to_cpu(rec->inobt.ir_free);
}
return error;
}

/*
* Allocate new inodes in the allocation group specified by agbp.
* Return 0 for success, else error code.
Expand Down
5 changes: 5 additions & 0 deletions fs/xfs/xfs_ialloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,11 @@ int xfs_inobt_lookup_ge(struct xfs_btree_cur *cur, xfs_agino_t ino,
int xfs_inobt_lookup_le(struct xfs_btree_cur *cur, xfs_agino_t ino,
__int32_t fcnt, xfs_inofree_t free, int *stat);

/*
* Get the data from the pointed-to record.
*/
extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur, xfs_agino_t *ino,
__int32_t *fcnt, xfs_inofree_t *free, int *stat);

#endif /* __KERNEL__ */

Expand Down
44 changes: 0 additions & 44 deletions fs/xfs/xfs_ialloc_btree.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,50 +41,6 @@
#include "xfs_error.h"


/*
* Get the data from the pointed-to record.
*/
int /* error */
xfs_inobt_get_rec(
xfs_btree_cur_t *cur, /* btree cursor */
xfs_agino_t *ino, /* output: starting inode of chunk */
__int32_t *fcnt, /* output: number of free inodes */
xfs_inofree_t *free, /* output: free inode mask */
int *stat) /* output: success/failure */
{
xfs_inobt_block_t *block; /* btree block */
xfs_buf_t *bp; /* buffer containing btree block */
#ifdef DEBUG
int error; /* error return value */
#endif
int ptr; /* record number */
xfs_inobt_rec_t *rec; /* record data */

bp = cur->bc_bufs[0];
ptr = cur->bc_ptrs[0];
block = XFS_BUF_TO_INOBT_BLOCK(bp);
#ifdef DEBUG
if ((error = xfs_btree_check_sblock(cur, block, 0, bp)))
return error;
#endif
/*
* Off the right end or left end, return failure.
*/
if (ptr > be16_to_cpu(block->bb_numrecs) || ptr <= 0) {
*stat = 0;
return 0;
}
/*
* Point to the record and extract its data.
*/
rec = XFS_INOBT_REC_ADDR(block, ptr, cur);
*ino = be32_to_cpu(rec->ir_startino);
*fcnt = be32_to_cpu(rec->ir_freecount);
*free = be64_to_cpu(rec->ir_free);
*stat = 1;
return 0;
}

STATIC int
xfs_inobt_get_minrecs(
struct xfs_btree_cur *cur,
Expand Down
7 changes: 0 additions & 7 deletions fs/xfs/xfs_ialloc_btree.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,13 +116,6 @@ typedef struct xfs_btree_sblock xfs_inobt_block_t;
(XFS_BTREE_PTR_ADDR(xfs_inobt, bb, \
i, XFS_INOBT_BLOCK_MAXRECS(1, cur)))

/*
* Get the data from the pointed-to record.
*/
extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur, xfs_agino_t *ino,
__int32_t *fcnt, xfs_inofree_t *free, int *stat);


extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *,
struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t);

Expand Down

0 comments on commit 8cc938f

Please sign in to comment.