Commit 69ce58f0 authored by Alex Elder's avatar Alex Elder

xfs: record log sector size rather than log2(that)

Change struct log so it keeps track of the size (in basic blocks) of
a log sector in l_sectBBsize rather than the log-base-2 of that
value (previously, l_sectbb_log).  The name was chosen for
consistency with the other fields in the structure that represent
a number of basic blocks.

(Updated so that a variable used in computing and verifying a log's
sector size is named "log2_size".  Also added the "BB" to the
structure field name, based on feedback from Eric Sandeen.  Also
dropped some superfluous parentheses.)
Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
Reviewed-by: default avatarEric Sandeen <sandeen@sandeen.net>
parent 1414a604
...@@ -1039,6 +1039,7 @@ xlog_alloc_log(xfs_mount_t *mp, ...@@ -1039,6 +1039,7 @@ xlog_alloc_log(xfs_mount_t *mp,
int i; int i;
int iclogsize; int iclogsize;
int error = ENOMEM; int error = ENOMEM;
uint log2_size = 0;
log = kmem_zalloc(sizeof(xlog_t), KM_MAYFAIL); log = kmem_zalloc(sizeof(xlog_t), KM_MAYFAIL);
if (!log) { if (!log) {
...@@ -1064,29 +1065,31 @@ xlog_alloc_log(xfs_mount_t *mp, ...@@ -1064,29 +1065,31 @@ xlog_alloc_log(xfs_mount_t *mp,
error = EFSCORRUPTED; error = EFSCORRUPTED;
if (xfs_sb_version_hassector(&mp->m_sb)) { if (xfs_sb_version_hassector(&mp->m_sb)) {
log->l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT; log2_size = mp->m_sb.sb_logsectlog;
if (log->l_sectbb_log < 0 || if (log2_size < BBSHIFT) {
log->l_sectbb_log > mp->m_sectbb_log) { xlog_warn("XFS: Log sector size too small "
xlog_warn("XFS: Log sector size (0x%x) out of range.", "(0x%x < 0x%x)", log2_size, BBSHIFT);
log->l_sectbb_log);
goto out_free_log; goto out_free_log;
} }
/* for larger sector sizes, must have v2 or external log */ log2_size -= BBSHIFT;
if (log->l_sectbb_log != 0 && if (log2_size > mp->m_sectbb_log) {
(log->l_logBBstart != 0 && xlog_warn("XFS: Log sector size too large "
!xfs_sb_version_haslogv2(&mp->m_sb))) { "(0x%x > 0x%x)", log2_size, mp->m_sectbb_log);
xlog_warn("XFS: log sector size (0x%x) invalid "
"for configuration.", log->l_sectbb_log);
goto out_free_log; goto out_free_log;
} }
if (mp->m_sb.sb_logsectlog < BBSHIFT) {
xlog_warn("XFS: Log sector log (0x%x) too small.", /* for larger sector sizes, must have v2 or external log */
mp->m_sb.sb_logsectlog); if (log2_size && log->l_logBBstart > 0 &&
!xfs_sb_version_haslogv2(&mp->m_sb)) {
xlog_warn("XFS: log sector size (0x%x) invalid "
"for configuration.", log2_size);
goto out_free_log; goto out_free_log;
} }
} }
log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1; log->l_sectBBsize = 1 << log2_size;
log->l_sectbb_mask = log->l_sectBBsize - 1;
xlog_get_iclog_buffer_size(mp, log); xlog_get_iclog_buffer_size(mp, log);
......
...@@ -396,7 +396,7 @@ typedef struct log { ...@@ -396,7 +396,7 @@ typedef struct log {
struct xfs_buf_cancel **l_buf_cancel_table; struct xfs_buf_cancel **l_buf_cancel_table;
int l_iclog_hsize; /* size of iclog header */ int l_iclog_hsize; /* size of iclog header */
int l_iclog_heads; /* # of iclog header sectors */ int l_iclog_heads; /* # of iclog header sectors */
uint l_sectbb_log; /* log2 of sector size in BBs */ uint l_sectBBsize; /* sector size in BBs */
uint l_sectbb_mask; /* sector size (in BBs) uint l_sectbb_mask; /* sector size (in BBs)
* alignment mask */ * alignment mask */
int l_iclog_size; /* size of log in bytes */ int l_iclog_size; /* size of log in bytes */
......
...@@ -60,9 +60,6 @@ STATIC void xlog_recover_check_summary(xlog_t *); ...@@ -60,9 +60,6 @@ STATIC void xlog_recover_check_summary(xlog_t *);
* Sector aligned buffer routines for buffer create/read/write/access * Sector aligned buffer routines for buffer create/read/write/access
*/ */
/* Number of basic blocks in a log sector */
#define xlog_sectbb(log) (1 << (log)->l_sectbb_log)
/* /*
* Verify the given count of basic blocks is valid number of blocks * Verify the given count of basic blocks is valid number of blocks
* to specify for an operation involving the given XFS log buffer. * to specify for an operation involving the given XFS log buffer.
...@@ -110,9 +107,9 @@ xlog_get_bp( ...@@ -110,9 +107,9 @@ xlog_get_bp(
* extend the buffer by one extra log sector to ensure * extend the buffer by one extra log sector to ensure
* there's space to accomodate this possiblility. * there's space to accomodate this possiblility.
*/ */
if (nbblks > 1 && log->l_sectbb_log) if (nbblks > 1 && log->l_sectBBsize > 1)
nbblks += xlog_sectbb(log); nbblks += log->l_sectBBsize;
nbblks = round_up(nbblks, xlog_sectbb(log)); nbblks = round_up(nbblks, log->l_sectBBsize);
return xfs_buf_get_noaddr(BBTOB(nbblks), log->l_mp->m_logdev_targp); return xfs_buf_get_noaddr(BBTOB(nbblks), log->l_mp->m_logdev_targp);
} }
...@@ -133,7 +130,7 @@ xlog_align( ...@@ -133,7 +130,7 @@ xlog_align(
{ {
xfs_caddr_t ptr; xfs_caddr_t ptr;
if (!log->l_sectbb_log) if (log->l_sectBBsize == 1)
return XFS_BUF_PTR(bp); return XFS_BUF_PTR(bp);
ptr = XFS_BUF_PTR(bp) + BBTOB((int)blk_no & log->l_sectbb_mask); ptr = XFS_BUF_PTR(bp) + BBTOB((int)blk_no & log->l_sectbb_mask);
...@@ -162,8 +159,8 @@ xlog_bread_noalign( ...@@ -162,8 +159,8 @@ xlog_bread_noalign(
return EFSCORRUPTED; return EFSCORRUPTED;
} }
blk_no = round_down(blk_no, xlog_sectbb(log)); blk_no = round_down(blk_no, log->l_sectBBsize);
nbblks = round_up(nbblks, xlog_sectbb(log)); nbblks = round_up(nbblks, log->l_sectBBsize);
ASSERT(nbblks > 0); ASSERT(nbblks > 0);
ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp)); ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp));
...@@ -221,8 +218,8 @@ xlog_bwrite( ...@@ -221,8 +218,8 @@ xlog_bwrite(
return EFSCORRUPTED; return EFSCORRUPTED;
} }
blk_no = round_down(blk_no, xlog_sectbb(log)); blk_no = round_down(blk_no, log->l_sectBBsize);
nbblks = round_up(nbblks, xlog_sectbb(log)); nbblks = round_up(nbblks, log->l_sectBBsize);
ASSERT(nbblks > 0); ASSERT(nbblks > 0);
ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp)); ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp));
...@@ -410,7 +407,7 @@ xlog_find_verify_cycle( ...@@ -410,7 +407,7 @@ xlog_find_verify_cycle(
bufblks = 1 << ffs(nbblks); bufblks = 1 << ffs(nbblks);
while (!(bp = xlog_get_bp(log, bufblks))) { while (!(bp = xlog_get_bp(log, bufblks))) {
bufblks >>= 1; bufblks >>= 1;
if (bufblks < xlog_sectbb(log)) if (bufblks < log->l_sectBBsize)
return ENOMEM; return ENOMEM;
} }
...@@ -1181,7 +1178,7 @@ xlog_write_log_records( ...@@ -1181,7 +1178,7 @@ xlog_write_log_records(
xfs_caddr_t offset; xfs_caddr_t offset;
xfs_buf_t *bp; xfs_buf_t *bp;
int balign, ealign; int balign, ealign;
int sectbb = xlog_sectbb(log); int sectbb = log->l_sectBBsize;
int end_block = start_block + blocks; int end_block = start_block + blocks;
int bufblks; int bufblks;
int error = 0; int error = 0;
...@@ -1196,7 +1193,7 @@ xlog_write_log_records( ...@@ -1196,7 +1193,7 @@ xlog_write_log_records(
bufblks = 1 << ffs(blocks); bufblks = 1 << ffs(blocks);
while (!(bp = xlog_get_bp(log, bufblks))) { while (!(bp = xlog_get_bp(log, bufblks))) {
bufblks >>= 1; bufblks >>= 1;
if (bufblks < xlog_sectbb(log)) if (bufblks < sectbb)
return ENOMEM; return ENOMEM;
} }
...@@ -3515,7 +3512,7 @@ xlog_do_recovery_pass( ...@@ -3515,7 +3512,7 @@ xlog_do_recovery_pass(
hblks = 1; hblks = 1;
} }
} else { } else {
ASSERT(log->l_sectbb_log == 0); ASSERT(log->l_sectBBsize == 1);
hblks = 1; hblks = 1;
hbp = xlog_get_bp(log, 1); hbp = xlog_get_bp(log, 1);
h_size = XLOG_BIG_RECORD_BSIZE; h_size = XLOG_BIG_RECORD_BSIZE;
......
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