diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_refcount.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_refcount.c | 24 | 
1 files changed, 22 insertions, 2 deletions
diff --git a/fs/xfs/libxfs/xfs_refcount.c b/fs/xfs/libxfs/xfs_refcount.c index 560e28473024..418d53295893 100644 --- a/fs/xfs/libxfs/xfs_refcount.c +++ b/fs/xfs/libxfs/xfs_refcount.c @@ -88,8 +88,25 @@ xfs_refcount_lookup_ge(  	return xfs_btree_lookup(cur, XFS_LOOKUP_GE, stat);  } +/* + * Look up the first record equal to [bno, len] in the btree + * given by cur. + */ +int +xfs_refcount_lookup_eq( +	struct xfs_btree_cur	*cur, +	xfs_agblock_t		bno, +	int			*stat) +{ +	trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_private.a.agno, bno, +			XFS_LOOKUP_LE); +	cur->bc_rec.rc.rc_startblock = bno; +	cur->bc_rec.rc.rc_blockcount = 0; +	return xfs_btree_lookup(cur, XFS_LOOKUP_EQ, stat); +} +  /* Convert on-disk record to in-core format. */ -static inline void +void  xfs_refcount_btrec_to_irec(  	union xfs_btree_rec		*rec,  	struct xfs_refcount_irec	*irec) @@ -149,7 +166,7 @@ xfs_refcount_update(   * by [bno, len, refcount].   * This either works (return 0) or gets an EFSCORRUPTED error.   */ -STATIC int +int  xfs_refcount_insert(  	struct xfs_btree_cur		*cur,  	struct xfs_refcount_irec	*irec, @@ -162,7 +179,10 @@ xfs_refcount_insert(  	cur->bc_rec.rc.rc_blockcount = irec->rc_blockcount;  	cur->bc_rec.rc.rc_refcount = irec->rc_refcount;  	error = xfs_btree_insert(cur, i); +	if (error) +		goto out_error;  	XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, *i == 1, out_error); +  out_error:  	if (error)  		trace_xfs_refcount_insert_error(cur->bc_mp,  | 
