Commit afabfd30 authored by Eric Sandeen's avatar Eric Sandeen Committed by Dave Chinner

xfs: combine xfs_rtmodify_summary and xfs_rtget_summary

xfs_rtmodify_summary and xfs_rtget_summary are almost identical;
fold them into xfs_rtmodify_summary_int(), with wrappers for each of
the original calls.

The _int function modifies if a delta is passed, and returns a
summary pointer if *sum is passed.
Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent b16ed7c1
...@@ -424,20 +424,24 @@ xfs_rtfind_forw( ...@@ -424,20 +424,24 @@ xfs_rtfind_forw(
} }
/* /*
* Read and modify the summary information for a given extent size, * Read and/or modify the summary information for a given extent size,
* bitmap block combination. * bitmap block combination.
* Keeps track of a current summary block, so we don't keep reading * Keeps track of a current summary block, so we don't keep reading
* it from the buffer cache. * it from the buffer cache.
*
* Summary information is returned in *sum if specified.
* If no delta is specified, returns summary only.
*/ */
int int
xfs_rtmodify_summary( xfs_rtmodify_summary_int(
xfs_mount_t *mp, /* file system mount point */ xfs_mount_t *mp, /* file system mount structure */
xfs_trans_t *tp, /* transaction pointer */ xfs_trans_t *tp, /* transaction pointer */
int log, /* log2 of extent size */ int log, /* log2 of extent size */
xfs_rtblock_t bbno, /* bitmap block number */ xfs_rtblock_t bbno, /* bitmap block number */
int delta, /* change to make to summary info */ int delta, /* change to make to summary info */
xfs_buf_t **rbpp, /* in/out: summary block buffer */ xfs_buf_t **rbpp, /* in/out: summary block buffer */
xfs_fsblock_t *rsb) /* in/out: summary block number */ xfs_fsblock_t *rsb, /* in/out: summary block number */
xfs_suminfo_t *sum) /* out: summary info for this block */
{ {
xfs_buf_t *bp; /* buffer for the summary block */ xfs_buf_t *bp; /* buffer for the summary block */
int error; /* error value */ int error; /* error value */
...@@ -480,15 +484,40 @@ xfs_rtmodify_summary( ...@@ -480,15 +484,40 @@ xfs_rtmodify_summary(
} }
} }
/* /*
* Point to the summary information, modify and log it. * Point to the summary information, modify/log it, and/or copy it out.
*/ */
sp = XFS_SUMPTR(mp, bp, so); sp = XFS_SUMPTR(mp, bp, so);
*sp += delta; if (delta) {
xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), uint first = (uint)((char *)sp - (char *)bp->b_addr);
(uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1));
*sp += delta;
xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
}
if (sum) {
/*
* Drop the buffer if we're not asked to remember it.
*/
if (!rbpp)
xfs_trans_brelse(tp, bp);
*sum = *sp;
}
return 0; return 0;
} }
int
xfs_rtmodify_summary(
xfs_mount_t *mp, /* file system mount structure */
xfs_trans_t *tp, /* transaction pointer */
int log, /* log2 of extent size */
xfs_rtblock_t bbno, /* bitmap block number */
int delta, /* change to make to summary info */
xfs_buf_t **rbpp, /* in/out: summary block buffer */
xfs_fsblock_t *rsb) /* in/out: summary block number */
{
return xfs_rtmodify_summary_int(mp, tp, log, bbno,
delta, rbpp, rsb, NULL);
}
/* /*
* Set the given range of bitmap bits to the given value. * Set the given range of bitmap bits to the given value.
* Do whatever I/O and logging is required. * Do whatever I/O and logging is required.
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
* Keeps track of a current summary block, so we don't keep reading * Keeps track of a current summary block, so we don't keep reading
* it from the buffer cache. * it from the buffer cache.
*/ */
STATIC int /* error */ int
xfs_rtget_summary( xfs_rtget_summary(
xfs_mount_t *mp, /* file system mount structure */ xfs_mount_t *mp, /* file system mount structure */
xfs_trans_t *tp, /* transaction pointer */ xfs_trans_t *tp, /* transaction pointer */
...@@ -56,60 +56,9 @@ xfs_rtget_summary( ...@@ -56,60 +56,9 @@ xfs_rtget_summary(
xfs_fsblock_t *rsb, /* in/out: summary block number */ xfs_fsblock_t *rsb, /* in/out: summary block number */
xfs_suminfo_t *sum) /* out: summary info for this block */ xfs_suminfo_t *sum) /* out: summary info for this block */
{ {
xfs_buf_t *bp; /* buffer for summary block */ return xfs_rtmodify_summary_int(mp, tp, log, bbno, 0, rbpp, rsb, sum);
int error; /* error value */
xfs_fsblock_t sb; /* summary fsblock */
int so; /* index into the summary file */
xfs_suminfo_t *sp; /* pointer to returned data */
/*
* Compute entry number in the summary file.
*/
so = XFS_SUMOFFS(mp, log, bbno);
/*
* Compute the block number in the summary file.
*/
sb = XFS_SUMOFFSTOBLOCK(mp, so);
/*
* If we have an old buffer, and the block number matches, use that.
*/
if (rbpp && *rbpp && *rsb == sb)
bp = *rbpp;
/*
* Otherwise we have to get the buffer.
*/
else {
/*
* If there was an old one, get rid of it first.
*/
if (rbpp && *rbpp)
xfs_trans_brelse(tp, *rbpp);
error = xfs_rtbuf_get(mp, tp, sb, 1, &bp);
if (error) {
return error;
}
/*
* Remember this buffer and block for the next call.
*/
if (rbpp) {
*rbpp = bp;
*rsb = sb;
}
}
/*
* Point to the summary information & copy it out.
*/
sp = XFS_SUMPTR(mp, bp, so);
*sum = *sp;
/*
* Drop the buffer if we're not asked to remember it.
*/
if (!rbpp)
xfs_trans_brelse(tp, bp);
return 0;
} }
/* /*
* Return whether there are any free extents in the size range given * Return whether there are any free extents in the size range given
* by low and high, for the bitmap block bbno. * by low and high, for the bitmap block bbno.
......
...@@ -111,6 +111,10 @@ int xfs_rtfind_forw(struct xfs_mount *mp, struct xfs_trans *tp, ...@@ -111,6 +111,10 @@ int xfs_rtfind_forw(struct xfs_mount *mp, struct xfs_trans *tp,
xfs_rtblock_t *rtblock); xfs_rtblock_t *rtblock);
int xfs_rtmodify_range(struct xfs_mount *mp, struct xfs_trans *tp, int xfs_rtmodify_range(struct xfs_mount *mp, struct xfs_trans *tp,
xfs_rtblock_t start, xfs_extlen_t len, int val); xfs_rtblock_t start, xfs_extlen_t len, int val);
int xfs_rtmodify_summary_int(struct xfs_mount *mp, struct xfs_trans *tp,
int log, xfs_rtblock_t bbno, int delta,
xfs_buf_t **rbpp, xfs_fsblock_t *rsb,
xfs_suminfo_t *sum);
int xfs_rtmodify_summary(struct xfs_mount *mp, struct xfs_trans *tp, int log, int xfs_rtmodify_summary(struct xfs_mount *mp, struct xfs_trans *tp, int log,
xfs_rtblock_t bbno, int delta, xfs_buf_t **rbpp, xfs_rtblock_t bbno, int delta, xfs_buf_t **rbpp,
xfs_fsblock_t *rsb); xfs_fsblock_t *rsb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment