xfs: factor out iclog size calculation from xlog_sync
Split out another self-contained bit of code from xlog_sync. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
5693384805
commit
db0a6faf93
@ -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(
|
|||||||
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(
|
|||||||
|
|
||||||
/* 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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user