Commit db0a6faf authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong

xfs: factor out iclog size calculation from xlog_sync

Split out another self-contained bit of code from xlog_sync.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 56933848
...@@ -1791,6 +1791,39 @@ xlog_split_iclog( ...@@ -1791,6 +1791,39 @@ xlog_split_iclog(
return split_offset; return split_offset;
} }
static int
xlog_calc_iclog_size(
struct xlog *log,
struct xlog_in_core *iclog,
uint32_t *roundoff)
{
uint32_t count_init, count;
bool use_lsunit;
use_lsunit = xfs_sb_version_haslogv2(&log->l_mp->m_sb) &&
log->l_mp->m_sb.sb_logsunit > 1;
/* Add for LR header */
count_init = log->l_iclog_hsize + iclog->ic_offset;
/* Round out the log write size */
if (use_lsunit) {
/* we have a v2 stripe unit to use */
count = XLOG_LSUNITTOB(log, XLOG_BTOLSUNIT(log, count_init));
} else {
count = BBTOB(BTOBB(count_init));
}
ASSERT(count >= count_init);
*roundoff = count - count_init;
if (use_lsunit)
ASSERT(*roundoff < log->l_mp->m_sb.sb_logsunit);
else
ASSERT(*roundoff < BBTOB(1));
return count;
}
/* /*
* Flush out the in-core log (iclog) to the on-disk log in an asynchronous * Flush out the in-core log (iclog) to the on-disk log in an asynchronous
* fashion. Previously, we should have moved the current iclog * fashion. Previously, we should have moved the current iclog
...@@ -1819,35 +1852,17 @@ xlog_sync( ...@@ -1819,35 +1852,17 @@ xlog_sync(
struct xlog *log, struct xlog *log,
struct xlog_in_core *iclog) struct xlog_in_core *iclog)
{ {
uint count; /* byte count of bwrite */ unsigned int count; /* byte count of bwrite */
uint count_init; /* initial count before roundup */ unsigned int roundoff; /* roundoff to BB or stripe */
int roundoff; /* roundoff to BB or stripe */ uint64_t bno;
int v2 = xfs_sb_version_haslogv2(&log->l_mp->m_sb); unsigned int split = 0;
uint64_t bno; unsigned int size;
unsigned int split = 0; bool need_flush = true;
int size;
bool need_flush = true;
XFS_STATS_INC(log->l_mp, xs_log_writes); XFS_STATS_INC(log->l_mp, xs_log_writes);
ASSERT(atomic_read(&iclog->ic_refcnt) == 0); ASSERT(atomic_read(&iclog->ic_refcnt) == 0);
/* Add for LR header */ count = xlog_calc_iclog_size(log, iclog, &roundoff);
count_init = log->l_iclog_hsize + iclog->ic_offset;
/* Round out the log write size */
if (v2 && log->l_mp->m_sb.sb_logsunit > 1) {
/* we have a v2 stripe unit to use */
count = XLOG_LSUNITTOB(log, XLOG_BTOLSUNIT(log, count_init));
} else {
count = BBTOB(BTOBB(count_init));
}
roundoff = count - count_init;
ASSERT(roundoff >= 0);
ASSERT((v2 && log->l_mp->m_sb.sb_logsunit > 1 &&
roundoff < log->l_mp->m_sb.sb_logsunit)
||
(log->l_mp->m_sb.sb_logsunit <= 1 &&
roundoff < BBTOB(1)));
/* move grant heads by roundoff in sync */ /* move grant heads by roundoff in sync */
xlog_grant_add_space(log, &log->l_reserve_head.grant, roundoff); xlog_grant_add_space(log, &log->l_reserve_head.grant, roundoff);
...@@ -1858,7 +1873,7 @@ xlog_sync( ...@@ -1858,7 +1873,7 @@ xlog_sync(
/* real byte length */ /* real byte length */
size = iclog->ic_offset; size = iclog->ic_offset;
if (v2) if (xfs_sb_version_haslogv2(&log->l_mp->m_sb))
size += roundoff; size += roundoff;
iclog->ic_header.h_len = cpu_to_be32(size); iclog->ic_header.h_len = cpu_to_be32(size);
......
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