mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
[XFS] xlog_rec_header/xlog_rec_ext_header endianess annotations
Mostly trivial conversion with one exceptions: h_num_logops was kept in native endian previously and only converted to big endian in xlog_sync, but we always keep it big endian now. With todays cpus fast byteswap instructions that's not an issue but the new variant keeps the code clean and maintainable. SGI-PV: 971186 SGI-Modid: xfs-linux-melb:xfs-kern:29821a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: Tim Shimmin <tes@sgi.com>
This commit is contained in:
parent
67fcb7bfb6
commit
b53e675dc8
@ -1227,12 +1227,12 @@ xlog_alloc_log(xfs_mount_t *mp,
|
||||
|
||||
head = &iclog->ic_header;
|
||||
memset(head, 0, sizeof(xlog_rec_header_t));
|
||||
INT_SET(head->h_magicno, ARCH_CONVERT, XLOG_HEADER_MAGIC_NUM);
|
||||
INT_SET(head->h_version, ARCH_CONVERT,
|
||||
head->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM);
|
||||
head->h_version = cpu_to_be32(
|
||||
XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? 2 : 1);
|
||||
INT_SET(head->h_size, ARCH_CONVERT, log->l_iclog_size);
|
||||
head->h_size = cpu_to_be32(log->l_iclog_size);
|
||||
/* new fields */
|
||||
INT_SET(head->h_fmt, ARCH_CONVERT, XLOG_FMT);
|
||||
head->h_fmt = cpu_to_be32(XLOG_FMT);
|
||||
memcpy(&head->h_fs_uuid, &mp->m_sb.sb_uuid, sizeof(uuid_t));
|
||||
|
||||
|
||||
@ -1378,7 +1378,7 @@ xlog_sync(xlog_t *log,
|
||||
{
|
||||
xfs_caddr_t dptr; /* pointer to byte sized element */
|
||||
xfs_buf_t *bp;
|
||||
int i, ops;
|
||||
int i;
|
||||
uint count; /* byte count of bwrite */
|
||||
uint count_init; /* initial count before roundup */
|
||||
int roundoff; /* roundoff to BB or stripe */
|
||||
@ -1417,21 +1417,17 @@ xlog_sync(xlog_t *log,
|
||||
|
||||
/* real byte length */
|
||||
if (v2) {
|
||||
INT_SET(iclog->ic_header.h_len,
|
||||
ARCH_CONVERT,
|
||||
iclog->ic_offset + roundoff);
|
||||
iclog->ic_header.h_len =
|
||||
cpu_to_be32(iclog->ic_offset + roundoff);
|
||||
} else {
|
||||
INT_SET(iclog->ic_header.h_len, ARCH_CONVERT, iclog->ic_offset);
|
||||
iclog->ic_header.h_len =
|
||||
cpu_to_be32(iclog->ic_offset);
|
||||
}
|
||||
|
||||
/* put ops count in correct order */
|
||||
ops = iclog->ic_header.h_num_logops;
|
||||
INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops);
|
||||
|
||||
bp = iclog->ic_bp;
|
||||
ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1);
|
||||
XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2);
|
||||
XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT)));
|
||||
XFS_BUF_SET_ADDR(bp, BLOCK_LSN(be64_to_cpu(iclog->ic_header.h_lsn)));
|
||||
|
||||
XFS_STATS_ADD(xs_log_blocks, BTOBB(count));
|
||||
|
||||
@ -1494,10 +1490,10 @@ xlog_sync(xlog_t *log,
|
||||
* a new cycle. Watch out for the header magic number
|
||||
* case, though.
|
||||
*/
|
||||
for (i=0; i<split; i += BBSIZE) {
|
||||
INT_MOD(*(uint *)dptr, ARCH_CONVERT, +1);
|
||||
if (INT_GET(*(uint *)dptr, ARCH_CONVERT) == XLOG_HEADER_MAGIC_NUM)
|
||||
INT_MOD(*(uint *)dptr, ARCH_CONVERT, +1);
|
||||
for (i = 0; i < split; i += BBSIZE) {
|
||||
be32_add((__be32 *)dptr, 1);
|
||||
if (be32_to_cpu(*(__be32 *)dptr) == XLOG_HEADER_MAGIC_NUM)
|
||||
be32_add((__be32 *)dptr, 1);
|
||||
dptr += BBSIZE;
|
||||
}
|
||||
|
||||
@ -1586,7 +1582,7 @@ xlog_state_finish_copy(xlog_t *log,
|
||||
{
|
||||
spin_lock(&log->l_icloglock);
|
||||
|
||||
iclog->ic_header.h_num_logops += record_cnt;
|
||||
be32_add(&iclog->ic_header.h_num_logops, record_cnt);
|
||||
iclog->ic_offset += copy_bytes;
|
||||
|
||||
spin_unlock(&log->l_icloglock);
|
||||
@ -1813,7 +1809,7 @@ xlog_write(xfs_mount_t * mp,
|
||||
|
||||
/* start_lsn is the first lsn written to. That's all we need. */
|
||||
if (! *start_lsn)
|
||||
*start_lsn = INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT);
|
||||
*start_lsn = be64_to_cpu(iclog->ic_header.h_lsn);
|
||||
|
||||
/* This loop writes out as many regions as can fit in the amount
|
||||
* of space which was allocated by xlog_state_get_iclog_space().
|
||||
@ -1983,7 +1979,8 @@ xlog_state_clean_log(xlog_t *log)
|
||||
* We don't need to cover the dummy.
|
||||
*/
|
||||
if (!changed &&
|
||||
(INT_GET(iclog->ic_header.h_num_logops, ARCH_CONVERT) == XLOG_COVER_OPS)) {
|
||||
(be32_to_cpu(iclog->ic_header.h_num_logops) ==
|
||||
XLOG_COVER_OPS)) {
|
||||
changed = 1;
|
||||
} else {
|
||||
/*
|
||||
@ -2051,7 +2048,7 @@ xlog_get_lowest_lsn(
|
||||
lowest_lsn = 0;
|
||||
do {
|
||||
if (!(lsn_log->ic_state & (XLOG_STATE_ACTIVE|XLOG_STATE_DIRTY))) {
|
||||
lsn = INT_GET(lsn_log->ic_header.h_lsn, ARCH_CONVERT);
|
||||
lsn = be64_to_cpu(lsn_log->ic_header.h_lsn);
|
||||
if ((lsn && !lowest_lsn) ||
|
||||
(XFS_LSN_CMP(lsn, lowest_lsn) < 0)) {
|
||||
lowest_lsn = lsn;
|
||||
@ -2152,11 +2149,9 @@ xlog_state_do_callback(
|
||||
*/
|
||||
|
||||
lowest_lsn = xlog_get_lowest_lsn(log);
|
||||
if (lowest_lsn && (
|
||||
XFS_LSN_CMP(
|
||||
lowest_lsn,
|
||||
INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT)
|
||||
)<0)) {
|
||||
if (lowest_lsn &&
|
||||
XFS_LSN_CMP(lowest_lsn,
|
||||
be64_to_cpu(iclog->ic_header.h_lsn)) < 0) {
|
||||
iclog = iclog->ic_next;
|
||||
continue; /* Leave this iclog for
|
||||
* another thread */
|
||||
@ -2171,11 +2166,10 @@ xlog_state_do_callback(
|
||||
* No one else can be here except us.
|
||||
*/
|
||||
spin_lock(&log->l_grant_lock);
|
||||
ASSERT(XFS_LSN_CMP(
|
||||
log->l_last_sync_lsn,
|
||||
INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT)
|
||||
)<=0);
|
||||
log->l_last_sync_lsn = INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT);
|
||||
ASSERT(XFS_LSN_CMP(log->l_last_sync_lsn,
|
||||
be64_to_cpu(iclog->ic_header.h_lsn)) <= 0);
|
||||
log->l_last_sync_lsn =
|
||||
be64_to_cpu(iclog->ic_header.h_lsn);
|
||||
spin_unlock(&log->l_grant_lock);
|
||||
|
||||
/*
|
||||
@ -2392,8 +2386,8 @@ restart:
|
||||
xlog_tic_add_region(ticket,
|
||||
log->l_iclog_hsize,
|
||||
XLOG_REG_TYPE_LRHEADER);
|
||||
INT_SET(head->h_cycle, ARCH_CONVERT, log->l_curr_cycle);
|
||||
INT_SET(head->h_lsn, ARCH_CONVERT,
|
||||
head->h_cycle = cpu_to_be32(log->l_curr_cycle);
|
||||
head->h_lsn = cpu_to_be64(
|
||||
xlog_assign_lsn(log->l_curr_cycle, log->l_curr_block));
|
||||
ASSERT(log->l_curr_block >= 0);
|
||||
}
|
||||
@ -2823,7 +2817,7 @@ xlog_state_release_iclog(xlog_t *log,
|
||||
iclog->ic_state == XLOG_STATE_WANT_SYNC) {
|
||||
sync++;
|
||||
iclog->ic_state = XLOG_STATE_SYNCING;
|
||||
INT_SET(iclog->ic_header.h_tail_lsn, ARCH_CONVERT, log->l_tail_lsn);
|
||||
iclog->ic_header.h_tail_lsn = cpu_to_be64(log->l_tail_lsn);
|
||||
xlog_verify_tail_lsn(log, iclog, log->l_tail_lsn);
|
||||
/* cycle incremented when incrementing curr_block */
|
||||
}
|
||||
@ -2861,7 +2855,7 @@ xlog_state_switch_iclogs(xlog_t *log,
|
||||
if (!eventual_size)
|
||||
eventual_size = iclog->ic_offset;
|
||||
iclog->ic_state = XLOG_STATE_WANT_SYNC;
|
||||
INT_SET(iclog->ic_header.h_prev_block, ARCH_CONVERT, log->l_prev_block);
|
||||
iclog->ic_header.h_prev_block = cpu_to_be32(log->l_prev_block);
|
||||
log->l_prev_block = log->l_curr_block;
|
||||
log->l_prev_cycle = log->l_curr_cycle;
|
||||
|
||||
@ -2957,7 +2951,7 @@ xlog_state_sync_all(xlog_t *log, uint flags, int *log_flushed)
|
||||
* the previous sync.
|
||||
*/
|
||||
iclog->ic_refcnt++;
|
||||
lsn = INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT);
|
||||
lsn = be64_to_cpu(iclog->ic_header.h_lsn);
|
||||
xlog_state_switch_iclogs(log, iclog, 0);
|
||||
spin_unlock(&log->l_icloglock);
|
||||
|
||||
@ -2965,7 +2959,7 @@ xlog_state_sync_all(xlog_t *log, uint flags, int *log_flushed)
|
||||
return XFS_ERROR(EIO);
|
||||
*log_flushed = 1;
|
||||
spin_lock(&log->l_icloglock);
|
||||
if (INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT) == lsn &&
|
||||
if (be64_to_cpu(iclog->ic_header.h_lsn) == lsn &&
|
||||
iclog->ic_state != XLOG_STATE_DIRTY)
|
||||
goto maybe_sleep;
|
||||
else
|
||||
@ -3049,9 +3043,9 @@ try_again:
|
||||
}
|
||||
|
||||
do {
|
||||
if (INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT) != lsn) {
|
||||
iclog = iclog->ic_next;
|
||||
continue;
|
||||
if (be64_to_cpu(iclog->ic_header.h_lsn) != lsn) {
|
||||
iclog = iclog->ic_next;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (iclog->ic_state == XLOG_STATE_DIRTY) {
|
||||
@ -3460,18 +3454,18 @@ xlog_verify_iclog(xlog_t *log,
|
||||
spin_unlock(&log->l_icloglock);
|
||||
|
||||
/* check log magic numbers */
|
||||
ptr = (xfs_caddr_t) &(iclog->ic_header);
|
||||
if (INT_GET(*(uint *)ptr, ARCH_CONVERT) != XLOG_HEADER_MAGIC_NUM)
|
||||
if (be32_to_cpu(iclog->ic_header.h_magicno) != XLOG_HEADER_MAGIC_NUM)
|
||||
xlog_panic("xlog_verify_iclog: invalid magic num");
|
||||
|
||||
for (ptr += BBSIZE; ptr < ((xfs_caddr_t)&(iclog->ic_header))+count;
|
||||
ptr = (xfs_caddr_t) &iclog->ic_header;
|
||||
for (ptr += BBSIZE; ptr < ((xfs_caddr_t)&iclog->ic_header) + count;
|
||||
ptr += BBSIZE) {
|
||||
if (INT_GET(*(uint *)ptr, ARCH_CONVERT) == XLOG_HEADER_MAGIC_NUM)
|
||||
if (be32_to_cpu(*(__be32 *)ptr) == XLOG_HEADER_MAGIC_NUM)
|
||||
xlog_panic("xlog_verify_iclog: unexpected magic num");
|
||||
}
|
||||
|
||||
/* check fields */
|
||||
len = INT_GET(iclog->ic_header.h_num_logops, ARCH_CONVERT);
|
||||
len = be32_to_cpu(iclog->ic_header.h_num_logops);
|
||||
ptr = iclog->ic_datap;
|
||||
base_ptr = ptr;
|
||||
ophead = (xlog_op_header_t *)ptr;
|
||||
@ -3512,9 +3506,9 @@ xlog_verify_iclog(xlog_t *log,
|
||||
if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
|
||||
j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
|
||||
k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
|
||||
op_len = INT_GET(xhdr[j].hic_xheader.xh_cycle_data[k], ARCH_CONVERT);
|
||||
op_len = be32_to_cpu(xhdr[j].hic_xheader.xh_cycle_data[k]);
|
||||
} else {
|
||||
op_len = INT_GET(iclog->ic_header.h_cycle_data[idx], ARCH_CONVERT);
|
||||
op_len = be32_to_cpu(iclog->ic_header.h_cycle_data[idx]);
|
||||
}
|
||||
}
|
||||
ptr += sizeof(xlog_op_header_t) + op_len;
|
||||
|
@ -22,8 +22,9 @@
|
||||
|
||||
#define CYCLE_LSN(lsn) ((uint)((lsn)>>32))
|
||||
#define BLOCK_LSN(lsn) ((uint)(lsn))
|
||||
|
||||
/* this is used in a spot where we might otherwise double-endian-flip */
|
||||
#define CYCLE_LSN_DISK(lsn) (((uint *)&(lsn))[0])
|
||||
#define CYCLE_LSN_DISK(lsn) (((__be32 *)&(lsn))[0])
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/*
|
||||
|
@ -63,10 +63,10 @@ static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block)
|
||||
|
||||
static inline uint xlog_get_cycle(char *ptr)
|
||||
{
|
||||
if (INT_GET(*(uint *)ptr, ARCH_CONVERT) == XLOG_HEADER_MAGIC_NUM)
|
||||
return INT_GET(*((uint *)ptr + 1), ARCH_CONVERT);
|
||||
if (be32_to_cpu(*(__be32 *)ptr) == XLOG_HEADER_MAGIC_NUM)
|
||||
return be32_to_cpu(*((__be32 *)ptr + 1));
|
||||
else
|
||||
return INT_GET(*(uint *)ptr, ARCH_CONVERT);
|
||||
return be32_to_cpu(*(__be32 *)ptr);
|
||||
}
|
||||
|
||||
#define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1)
|
||||
@ -85,9 +85,9 @@ static inline uint xlog_get_cycle(char *ptr)
|
||||
*
|
||||
* this has endian issues, of course.
|
||||
*/
|
||||
static inline uint xlog_get_client_id(uint i)
|
||||
static inline uint xlog_get_client_id(__be32 i)
|
||||
{
|
||||
return INT_GET(i, ARCH_CONVERT) >> 24;
|
||||
return be32_to_cpu(i) >> 24;
|
||||
}
|
||||
|
||||
#define xlog_panic(args...) cmn_err(CE_PANIC, ## args)
|
||||
@ -287,25 +287,25 @@ typedef struct xlog_op_header {
|
||||
#endif
|
||||
|
||||
typedef struct xlog_rec_header {
|
||||
uint h_magicno; /* log record (LR) identifier : 4 */
|
||||
uint h_cycle; /* write cycle of log : 4 */
|
||||
int h_version; /* LR version : 4 */
|
||||
int h_len; /* len in bytes; should be 64-bit aligned: 4 */
|
||||
xfs_lsn_t h_lsn; /* lsn of this LR : 8 */
|
||||
xfs_lsn_t h_tail_lsn; /* lsn of 1st LR w/ buffers not committed: 8 */
|
||||
uint h_chksum; /* may not be used; non-zero if used : 4 */
|
||||
int h_prev_block; /* block number to previous LR : 4 */
|
||||
int h_num_logops; /* number of log operations in this LR : 4 */
|
||||
uint h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE];
|
||||
__be32 h_magicno; /* log record (LR) identifier : 4 */
|
||||
__be32 h_cycle; /* write cycle of log : 4 */
|
||||
__be32 h_version; /* LR version : 4 */
|
||||
__be32 h_len; /* len in bytes; should be 64-bit aligned: 4 */
|
||||
__be64 h_lsn; /* lsn of this LR : 8 */
|
||||
__be64 h_tail_lsn; /* lsn of 1st LR w/ buffers not committed: 8 */
|
||||
__be32 h_chksum; /* may not be used; non-zero if used : 4 */
|
||||
__be32 h_prev_block; /* block number to previous LR : 4 */
|
||||
__be32 h_num_logops; /* number of log operations in this LR : 4 */
|
||||
__be32 h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE];
|
||||
/* new fields */
|
||||
int h_fmt; /* format of log record : 4 */
|
||||
uuid_t h_fs_uuid; /* uuid of FS : 16 */
|
||||
int h_size; /* iclog size : 4 */
|
||||
__be32 h_fmt; /* format of log record : 4 */
|
||||
uuid_t h_fs_uuid; /* uuid of FS : 16 */
|
||||
__be32 h_size; /* iclog size : 4 */
|
||||
} xlog_rec_header_t;
|
||||
|
||||
typedef struct xlog_rec_ext_header {
|
||||
uint xh_cycle; /* write cycle of log : 4 */
|
||||
uint xh_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; /* : 256 */
|
||||
__be32 xh_cycle; /* write cycle of log : 4 */
|
||||
__be32 xh_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; /* : 256 */
|
||||
} xlog_rec_ext_header_t;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
@ -198,7 +198,7 @@ xlog_header_check_dump(
|
||||
cmn_err(CE_DEBUG, " log : uuid = ");
|
||||
for (b = 0; b < 16; b++)
|
||||
cmn_err(CE_DEBUG, "%02x",((uchar_t *)&head->h_fs_uuid)[b]);
|
||||
cmn_err(CE_DEBUG, ", fmt = %d\n", INT_GET(head->h_fmt, ARCH_CONVERT));
|
||||
cmn_err(CE_DEBUG, ", fmt = %d\n", be32_to_cpu(head->h_fmt));
|
||||
}
|
||||
#else
|
||||
#define xlog_header_check_dump(mp, head)
|
||||
@ -212,14 +212,14 @@ xlog_header_check_recover(
|
||||
xfs_mount_t *mp,
|
||||
xlog_rec_header_t *head)
|
||||
{
|
||||
ASSERT(INT_GET(head->h_magicno, ARCH_CONVERT) == XLOG_HEADER_MAGIC_NUM);
|
||||
ASSERT(be32_to_cpu(head->h_magicno) == XLOG_HEADER_MAGIC_NUM);
|
||||
|
||||
/*
|
||||
* IRIX doesn't write the h_fmt field and leaves it zeroed
|
||||
* (XLOG_FMT_UNKNOWN). This stops us from trying to recover
|
||||
* a dirty log created in IRIX.
|
||||
*/
|
||||
if (unlikely(INT_GET(head->h_fmt, ARCH_CONVERT) != XLOG_FMT)) {
|
||||
if (unlikely(be32_to_cpu(head->h_fmt) != XLOG_FMT)) {
|
||||
xlog_warn(
|
||||
"XFS: dirty log written in incompatible format - can't recover");
|
||||
xlog_header_check_dump(mp, head);
|
||||
@ -245,7 +245,7 @@ xlog_header_check_mount(
|
||||
xfs_mount_t *mp,
|
||||
xlog_rec_header_t *head)
|
||||
{
|
||||
ASSERT(INT_GET(head->h_magicno, ARCH_CONVERT) == XLOG_HEADER_MAGIC_NUM);
|
||||
ASSERT(be32_to_cpu(head->h_magicno) == XLOG_HEADER_MAGIC_NUM);
|
||||
|
||||
if (uuid_is_nil(&head->h_fs_uuid)) {
|
||||
/*
|
||||
@ -447,8 +447,7 @@ xlog_find_verify_log_record(
|
||||
|
||||
head = (xlog_rec_header_t *)offset;
|
||||
|
||||
if (XLOG_HEADER_MAGIC_NUM ==
|
||||
INT_GET(head->h_magicno, ARCH_CONVERT))
|
||||
if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(head->h_magicno))
|
||||
break;
|
||||
|
||||
if (!smallmem)
|
||||
@ -480,7 +479,7 @@ xlog_find_verify_log_record(
|
||||
* record do we update last_blk.
|
||||
*/
|
||||
if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) {
|
||||
uint h_size = INT_GET(head->h_size, ARCH_CONVERT);
|
||||
uint h_size = be32_to_cpu(head->h_size);
|
||||
|
||||
xhdrs = h_size / XLOG_HEADER_CYCLE_SIZE;
|
||||
if (h_size % XLOG_HEADER_CYCLE_SIZE)
|
||||
@ -489,8 +488,8 @@ xlog_find_verify_log_record(
|
||||
xhdrs = 1;
|
||||
}
|
||||
|
||||
if (*last_blk - i + extra_bblks
|
||||
!= BTOBB(INT_GET(head->h_len, ARCH_CONVERT)) + xhdrs)
|
||||
if (*last_blk - i + extra_bblks !=
|
||||
BTOBB(be32_to_cpu(head->h_len)) + xhdrs)
|
||||
*last_blk = i;
|
||||
|
||||
out:
|
||||
@ -823,8 +822,7 @@ xlog_find_tail(
|
||||
if ((error = xlog_bread(log, i, 1, bp)))
|
||||
goto bread_err;
|
||||
offset = xlog_align(log, i, 1, bp);
|
||||
if (XLOG_HEADER_MAGIC_NUM ==
|
||||
INT_GET(*(uint *)offset, ARCH_CONVERT)) {
|
||||
if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(*(__be32 *)offset)) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
@ -841,7 +839,7 @@ xlog_find_tail(
|
||||
goto bread_err;
|
||||
offset = xlog_align(log, i, 1, bp);
|
||||
if (XLOG_HEADER_MAGIC_NUM ==
|
||||
INT_GET(*(uint*)offset, ARCH_CONVERT)) {
|
||||
be32_to_cpu(*(__be32 *)offset)) {
|
||||
found = 2;
|
||||
break;
|
||||
}
|
||||
@ -855,7 +853,7 @@ xlog_find_tail(
|
||||
|
||||
/* find blk_no of tail of log */
|
||||
rhead = (xlog_rec_header_t *)offset;
|
||||
*tail_blk = BLOCK_LSN(INT_GET(rhead->h_tail_lsn, ARCH_CONVERT));
|
||||
*tail_blk = BLOCK_LSN(be64_to_cpu(rhead->h_tail_lsn));
|
||||
|
||||
/*
|
||||
* Reset log values according to the state of the log when we
|
||||
@ -869,11 +867,11 @@ xlog_find_tail(
|
||||
*/
|
||||
log->l_prev_block = i;
|
||||
log->l_curr_block = (int)*head_blk;
|
||||
log->l_curr_cycle = INT_GET(rhead->h_cycle, ARCH_CONVERT);
|
||||
log->l_curr_cycle = be32_to_cpu(rhead->h_cycle);
|
||||
if (found == 2)
|
||||
log->l_curr_cycle++;
|
||||
log->l_tail_lsn = INT_GET(rhead->h_tail_lsn, ARCH_CONVERT);
|
||||
log->l_last_sync_lsn = INT_GET(rhead->h_lsn, ARCH_CONVERT);
|
||||
log->l_tail_lsn = be64_to_cpu(rhead->h_tail_lsn);
|
||||
log->l_last_sync_lsn = be64_to_cpu(rhead->h_lsn);
|
||||
log->l_grant_reserve_cycle = log->l_curr_cycle;
|
||||
log->l_grant_reserve_bytes = BBTOB(log->l_curr_block);
|
||||
log->l_grant_write_cycle = log->l_curr_cycle;
|
||||
@ -891,8 +889,8 @@ xlog_find_tail(
|
||||
* unmount record rather than the block after it.
|
||||
*/
|
||||
if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) {
|
||||
int h_size = INT_GET(rhead->h_size, ARCH_CONVERT);
|
||||
int h_version = INT_GET(rhead->h_version, ARCH_CONVERT);
|
||||
int h_size = be32_to_cpu(rhead->h_size);
|
||||
int h_version = be32_to_cpu(rhead->h_version);
|
||||
|
||||
if ((h_version & XLOG_VERSION_2) &&
|
||||
(h_size > XLOG_HEADER_CYCLE_SIZE)) {
|
||||
@ -906,10 +904,10 @@ xlog_find_tail(
|
||||
hblks = 1;
|
||||
}
|
||||
after_umount_blk = (i + hblks + (int)
|
||||
BTOBB(INT_GET(rhead->h_len, ARCH_CONVERT))) % log->l_logBBsize;
|
||||
BTOBB(be32_to_cpu(rhead->h_len))) % log->l_logBBsize;
|
||||
tail_lsn = log->l_tail_lsn;
|
||||
if (*head_blk == after_umount_blk &&
|
||||
INT_GET(rhead->h_num_logops, ARCH_CONVERT) == 1) {
|
||||
be32_to_cpu(rhead->h_num_logops) == 1) {
|
||||
umount_data_blk = (i + hblks) % log->l_logBBsize;
|
||||
if ((error = xlog_bread(log, umount_data_blk, 1, bp))) {
|
||||
goto bread_err;
|
||||
@ -1100,14 +1098,13 @@ xlog_add_record(
|
||||
xlog_rec_header_t *recp = (xlog_rec_header_t *)buf;
|
||||
|
||||
memset(buf, 0, BBSIZE);
|
||||
INT_SET(recp->h_magicno, ARCH_CONVERT, XLOG_HEADER_MAGIC_NUM);
|
||||
INT_SET(recp->h_cycle, ARCH_CONVERT, cycle);
|
||||
INT_SET(recp->h_version, ARCH_CONVERT,
|
||||
recp->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM);
|
||||
recp->h_cycle = cpu_to_be32(cycle);
|
||||
recp->h_version = cpu_to_be32(
|
||||
XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? 2 : 1);
|
||||
INT_SET(recp->h_lsn, ARCH_CONVERT, xlog_assign_lsn(cycle, block));
|
||||
INT_SET(recp->h_tail_lsn, ARCH_CONVERT,
|
||||
xlog_assign_lsn(tail_cycle, tail_block));
|
||||
INT_SET(recp->h_fmt, ARCH_CONVERT, XLOG_FMT);
|
||||
recp->h_lsn = cpu_to_be64(xlog_assign_lsn(cycle, block));
|
||||
recp->h_tail_lsn = cpu_to_be64(xlog_assign_lsn(tail_cycle, tail_block));
|
||||
recp->h_fmt = cpu_to_be32(XLOG_FMT);
|
||||
memcpy(&recp->h_fs_uuid, &log->l_mp->m_sb.sb_uuid, sizeof(uuid_t));
|
||||
}
|
||||
|
||||
@ -2214,7 +2211,7 @@ xlog_recover_do_buffer_trans(
|
||||
* overlap with future reads of those inodes.
|
||||
*/
|
||||
if (XFS_DINODE_MAGIC ==
|
||||
INT_GET(*((__uint16_t *)(xfs_buf_offset(bp, 0))), ARCH_CONVERT) &&
|
||||
be16_to_cpu(*((__be16 *)xfs_buf_offset(bp, 0))) &&
|
||||
(XFS_BUF_COUNT(bp) != MAX(log->l_mp->m_sb.sb_blocksize,
|
||||
(__uint32_t)XFS_INODE_CLUSTER_SIZE(log->l_mp)))) {
|
||||
XFS_BUF_STALE(bp);
|
||||
@ -2584,8 +2581,7 @@ xlog_recover_do_dquot_trans(
|
||||
/*
|
||||
* This type of quotas was turned off, so ignore this record.
|
||||
*/
|
||||
type = INT_GET(recddq->d_flags, ARCH_CONVERT) &
|
||||
(XFS_DQ_USER | XFS_DQ_PROJ | XFS_DQ_GROUP);
|
||||
type = recddq->d_flags & (XFS_DQ_USER | XFS_DQ_PROJ | XFS_DQ_GROUP);
|
||||
ASSERT(type);
|
||||
if (log->l_quotaoffs_flag & type)
|
||||
return (0);
|
||||
@ -2898,8 +2894,8 @@ xlog_recover_process_data(
|
||||
unsigned long hash;
|
||||
uint flags;
|
||||
|
||||
lp = dp + INT_GET(rhead->h_len, ARCH_CONVERT);
|
||||
num_logops = INT_GET(rhead->h_num_logops, ARCH_CONVERT);
|
||||
lp = dp + be32_to_cpu(rhead->h_len);
|
||||
num_logops = be32_to_cpu(rhead->h_num_logops);
|
||||
|
||||
/* check the log format matches our own - else we can't recover */
|
||||
if (xlog_header_check_recover(log->l_mp, rhead))
|
||||
@ -2922,7 +2918,7 @@ xlog_recover_process_data(
|
||||
if (trans == NULL) { /* not found; add new tid */
|
||||
if (ohead->oh_flags & XLOG_START_TRANS)
|
||||
xlog_recover_new_tid(&rhash[hash], tid,
|
||||
INT_GET(rhead->h_lsn, ARCH_CONVERT));
|
||||
be64_to_cpu(rhead->h_lsn));
|
||||
} else {
|
||||
ASSERT(dp + be32_to_cpu(ohead->oh_len) <= lp);
|
||||
flags = ohead->oh_flags & ~XLOG_END_TRANS;
|
||||
@ -3313,16 +3309,16 @@ xlog_pack_data_checksum(
|
||||
int size)
|
||||
{
|
||||
int i;
|
||||
uint *up;
|
||||
__be32 *up;
|
||||
uint chksum = 0;
|
||||
|
||||
up = (uint *)iclog->ic_datap;
|
||||
up = (__be32 *)iclog->ic_datap;
|
||||
/* divide length by 4 to get # words */
|
||||
for (i = 0; i < (size >> 2); i++) {
|
||||
chksum ^= INT_GET(*up, ARCH_CONVERT);
|
||||
chksum ^= be32_to_cpu(*up);
|
||||
up++;
|
||||
}
|
||||
INT_SET(iclog->ic_header.h_chksum, ARCH_CONVERT, chksum);
|
||||
iclog->ic_header.h_chksum = cpu_to_be32(chksum);
|
||||
}
|
||||
#else
|
||||
#define xlog_pack_data_checksum(log, iclog, size)
|
||||
@ -3339,7 +3335,7 @@ xlog_pack_data(
|
||||
{
|
||||
int i, j, k;
|
||||
int size = iclog->ic_offset + roundoff;
|
||||
uint cycle_lsn;
|
||||
__be32 cycle_lsn;
|
||||
xfs_caddr_t dp;
|
||||
xlog_in_core_2_t *xhdr;
|
||||
|
||||
@ -3350,8 +3346,8 @@ xlog_pack_data(
|
||||
dp = iclog->ic_datap;
|
||||
for (i = 0; i < BTOBB(size) &&
|
||||
i < (XLOG_HEADER_CYCLE_SIZE / BBSIZE); i++) {
|
||||
iclog->ic_header.h_cycle_data[i] = *(uint *)dp;
|
||||
*(uint *)dp = cycle_lsn;
|
||||
iclog->ic_header.h_cycle_data[i] = *(__be32 *)dp;
|
||||
*(__be32 *)dp = cycle_lsn;
|
||||
dp += BBSIZE;
|
||||
}
|
||||
|
||||
@ -3360,8 +3356,8 @@ xlog_pack_data(
|
||||
for ( ; i < BTOBB(size); i++) {
|
||||
j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
|
||||
k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
|
||||
xhdr[j].hic_xheader.xh_cycle_data[k] = *(uint *)dp;
|
||||
*(uint *)dp = cycle_lsn;
|
||||
xhdr[j].hic_xheader.xh_cycle_data[k] = *(__be32 *)dp;
|
||||
*(__be32 *)dp = cycle_lsn;
|
||||
dp += BBSIZE;
|
||||
}
|
||||
|
||||
@ -3378,21 +3374,21 @@ xlog_unpack_data_checksum(
|
||||
xfs_caddr_t dp,
|
||||
xlog_t *log)
|
||||
{
|
||||
uint *up = (uint *)dp;
|
||||
__be32 *up = (__be32 *)dp;
|
||||
uint chksum = 0;
|
||||
int i;
|
||||
|
||||
/* divide length by 4 to get # words */
|
||||
for (i=0; i < INT_GET(rhead->h_len, ARCH_CONVERT) >> 2; i++) {
|
||||
chksum ^= INT_GET(*up, ARCH_CONVERT);
|
||||
for (i=0; i < be32_to_cpu(rhead->h_len) >> 2; i++) {
|
||||
chksum ^= be32_to_cpu(*up);
|
||||
up++;
|
||||
}
|
||||
if (chksum != INT_GET(rhead->h_chksum, ARCH_CONVERT)) {
|
||||
if (chksum != be32_to_cpu(rhead->h_chksum)) {
|
||||
if (rhead->h_chksum ||
|
||||
((log->l_flags & XLOG_CHKSUM_MISMATCH) == 0)) {
|
||||
cmn_err(CE_DEBUG,
|
||||
"XFS: LogR chksum mismatch: was (0x%x) is (0x%x)\n",
|
||||
INT_GET(rhead->h_chksum, ARCH_CONVERT), chksum);
|
||||
be32_to_cpu(rhead->h_chksum), chksum);
|
||||
cmn_err(CE_DEBUG,
|
||||
"XFS: Disregard message if filesystem was created with non-DEBUG kernel");
|
||||
if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) {
|
||||
@ -3416,18 +3412,18 @@ xlog_unpack_data(
|
||||
int i, j, k;
|
||||
xlog_in_core_2_t *xhdr;
|
||||
|
||||
for (i = 0; i < BTOBB(INT_GET(rhead->h_len, ARCH_CONVERT)) &&
|
||||
for (i = 0; i < BTOBB(be32_to_cpu(rhead->h_len)) &&
|
||||
i < (XLOG_HEADER_CYCLE_SIZE / BBSIZE); i++) {
|
||||
*(uint *)dp = *(uint *)&rhead->h_cycle_data[i];
|
||||
*(__be32 *)dp = *(__be32 *)&rhead->h_cycle_data[i];
|
||||
dp += BBSIZE;
|
||||
}
|
||||
|
||||
if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) {
|
||||
xhdr = (xlog_in_core_2_t *)rhead;
|
||||
for ( ; i < BTOBB(INT_GET(rhead->h_len, ARCH_CONVERT)); i++) {
|
||||
for ( ; i < BTOBB(be32_to_cpu(rhead->h_len)); i++) {
|
||||
j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
|
||||
k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
|
||||
*(uint *)dp = xhdr[j].hic_xheader.xh_cycle_data[k];
|
||||
*(__be32 *)dp = xhdr[j].hic_xheader.xh_cycle_data[k];
|
||||
dp += BBSIZE;
|
||||
}
|
||||
}
|
||||
@ -3443,24 +3439,21 @@ xlog_valid_rec_header(
|
||||
{
|
||||
int hlen;
|
||||
|
||||
if (unlikely(
|
||||
(INT_GET(rhead->h_magicno, ARCH_CONVERT) !=
|
||||
XLOG_HEADER_MAGIC_NUM))) {
|
||||
if (unlikely(be32_to_cpu(rhead->h_magicno) != XLOG_HEADER_MAGIC_NUM)) {
|
||||
XFS_ERROR_REPORT("xlog_valid_rec_header(1)",
|
||||
XFS_ERRLEVEL_LOW, log->l_mp);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
if (unlikely(
|
||||
(!rhead->h_version ||
|
||||
(INT_GET(rhead->h_version, ARCH_CONVERT) &
|
||||
(~XLOG_VERSION_OKBITS)) != 0))) {
|
||||
(be32_to_cpu(rhead->h_version) & (~XLOG_VERSION_OKBITS))))) {
|
||||
xlog_warn("XFS: %s: unrecognised log version (%d).",
|
||||
__FUNCTION__, INT_GET(rhead->h_version, ARCH_CONVERT));
|
||||
__FUNCTION__, be32_to_cpu(rhead->h_version));
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
|
||||
/* LR body must have data or it wouldn't have been written */
|
||||
hlen = INT_GET(rhead->h_len, ARCH_CONVERT);
|
||||
hlen = be32_to_cpu(rhead->h_len);
|
||||
if (unlikely( hlen <= 0 || hlen > INT_MAX )) {
|
||||
XFS_ERROR_REPORT("xlog_valid_rec_header(2)",
|
||||
XFS_ERRLEVEL_LOW, log->l_mp);
|
||||
@ -3520,9 +3513,8 @@ xlog_do_recovery_pass(
|
||||
error = xlog_valid_rec_header(log, rhead, tail_blk);
|
||||
if (error)
|
||||
goto bread_err1;
|
||||
h_size = INT_GET(rhead->h_size, ARCH_CONVERT);
|
||||
if ((INT_GET(rhead->h_version, ARCH_CONVERT)
|
||||
& XLOG_VERSION_2) &&
|
||||
h_size = be32_to_cpu(rhead->h_size);
|
||||
if ((be32_to_cpu(rhead->h_version) & XLOG_VERSION_2) &&
|
||||
(h_size > XLOG_HEADER_CYCLE_SIZE)) {
|
||||
hblks = h_size / XLOG_HEADER_CYCLE_SIZE;
|
||||
if (h_size % XLOG_HEADER_CYCLE_SIZE)
|
||||
@ -3559,7 +3551,7 @@ xlog_do_recovery_pass(
|
||||
goto bread_err2;
|
||||
|
||||
/* blocks in data section */
|
||||
bblks = (int)BTOBB(INT_GET(rhead->h_len, ARCH_CONVERT));
|
||||
bblks = (int)BTOBB(be32_to_cpu(rhead->h_len));
|
||||
error = xlog_bread(log, blk_no + hblks, bblks, dbp);
|
||||
if (error)
|
||||
goto bread_err2;
|
||||
@ -3634,7 +3626,7 @@ xlog_do_recovery_pass(
|
||||
if (error)
|
||||
goto bread_err2;
|
||||
|
||||
bblks = (int)BTOBB(INT_GET(rhead->h_len, ARCH_CONVERT));
|
||||
bblks = (int)BTOBB(be32_to_cpu(rhead->h_len));
|
||||
blk_no += hblks;
|
||||
|
||||
/* Read in data for log record */
|
||||
@ -3705,7 +3697,7 @@ xlog_do_recovery_pass(
|
||||
error = xlog_valid_rec_header(log, rhead, blk_no);
|
||||
if (error)
|
||||
goto bread_err2;
|
||||
bblks = (int)BTOBB(INT_GET(rhead->h_len, ARCH_CONVERT));
|
||||
bblks = (int)BTOBB(be32_to_cpu(rhead->h_len));
|
||||
if ((error = xlog_bread(log, blk_no+hblks, bblks, dbp)))
|
||||
goto bread_err2;
|
||||
offset = xlog_align(log, blk_no+hblks, bblks, dbp);
|
||||
|
Loading…
Reference in New Issue
Block a user