aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/xfs_log.c14
-rw-r--r--fs/xfs/xfs_log_priv.h47
-rw-r--r--fs/xfs/xfs_log_recover.c29
3 files changed, 40 insertions, 50 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 615638201284..90d96caf7200 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1161,7 +1161,7 @@ xlog_alloc_log(xfs_mount_t *mp,
1161 log->l_flags |= XLOG_ACTIVE_RECOVERY; 1161 log->l_flags |= XLOG_ACTIVE_RECOVERY;
1162 1162
1163 log->l_prev_block = -1; 1163 log->l_prev_block = -1;
1164 ASSIGN_ANY_LSN_HOST(log->l_tail_lsn, 1, 0); 1164 log->l_tail_lsn = xlog_assign_lsn(1, 0);
1165 /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */ 1165 /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */
1166 log->l_last_sync_lsn = log->l_tail_lsn; 1166 log->l_last_sync_lsn = log->l_tail_lsn;
1167 log->l_curr_cycle = 1; /* 0 is bad since this is initial value */ 1167 log->l_curr_cycle = 1; /* 0 is bad since this is initial value */
@@ -1326,8 +1326,7 @@ xlog_grant_push_ail(xfs_mount_t *mp,
1326 threshold_block -= log->l_logBBsize; 1326 threshold_block -= log->l_logBBsize;
1327 threshold_cycle += 1; 1327 threshold_cycle += 1;
1328 } 1328 }
1329 ASSIGN_ANY_LSN_HOST(threshold_lsn, threshold_cycle, 1329 threshold_lsn = xlog_assign_lsn(threshold_cycle, threshold_block);
1330 threshold_block);
1331 1330
1332 /* Don't pass in an lsn greater than the lsn of the last 1331 /* Don't pass in an lsn greater than the lsn of the last
1333 * log record known to be on disk. 1332 * log record known to be on disk.
@@ -2393,7 +2392,8 @@ restart:
2393 log->l_iclog_hsize, 2392 log->l_iclog_hsize,
2394 XLOG_REG_TYPE_LRHEADER); 2393 XLOG_REG_TYPE_LRHEADER);
2395 INT_SET(head->h_cycle, ARCH_CONVERT, log->l_curr_cycle); 2394 INT_SET(head->h_cycle, ARCH_CONVERT, log->l_curr_cycle);
2396 ASSIGN_LSN(head->h_lsn, log); 2395 INT_SET(head->h_lsn, ARCH_CONVERT,
2396 xlog_assign_lsn(log->l_curr_cycle, log->l_curr_block));
2397 ASSERT(log->l_curr_block >= 0); 2397 ASSERT(log->l_curr_block >= 0);
2398 } 2398 }
2399 2399
@@ -3488,9 +3488,11 @@ xlog_verify_iclog(xlog_t *log,
3488 if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) { 3488 if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
3489 j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); 3489 j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3490 k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); 3490 k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3491 clientid = GET_CLIENT_ID(xhdr[j].hic_xheader.xh_cycle_data[k], ARCH_CONVERT); 3491 clientid = xlog_get_client_id(
3492 xhdr[j].hic_xheader.xh_cycle_data[k]);
3492 } else { 3493 } else {
3493 clientid = GET_CLIENT_ID(iclog->ic_header.h_cycle_data[idx], ARCH_CONVERT); 3494 clientid = xlog_get_client_id(
3495 iclog->ic_header.h_cycle_data[idx]);
3494 } 3496 }
3495 } 3497 }
3496 if (clientid != XFS_TRANSACTION && clientid != XFS_LOG) 3498 if (clientid != XFS_TRANSACTION && clientid != XFS_LOG)
diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h
index 07da6a72628a..e391f58deae1 100644
--- a/fs/xfs/xfs_log_priv.h
+++ b/fs/xfs/xfs_log_priv.h
@@ -55,32 +55,21 @@ struct xfs_mount;
55 BTOBB(XLOG_MAX_ICLOGS << (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? \ 55 BTOBB(XLOG_MAX_ICLOGS << (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? \
56 XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) 56 XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT))
57 57
58/*
59 * set lsns
60 */
61 58
62#define ASSIGN_ANY_LSN_HOST(lsn,cycle,block) \ 59static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block)
63 { \ 60{
64 (lsn) = ((xfs_lsn_t)(cycle)<<32)|(block); \ 61 return ((xfs_lsn_t)cycle << 32) | block;
65 } 62}
66#define ASSIGN_ANY_LSN_DISK(lsn,cycle,block) \
67 { \
68 INT_SET(((uint *)&(lsn))[0], ARCH_CONVERT, (cycle)); \
69 INT_SET(((uint *)&(lsn))[1], ARCH_CONVERT, (block)); \
70 }
71#define ASSIGN_LSN(lsn,log) \
72 ASSIGN_ANY_LSN_DISK(lsn,(log)->l_curr_cycle,(log)->l_curr_block);
73
74#define XLOG_SET(f,b) (((f) & (b)) == (b))
75
76#define GET_CYCLE(ptr, arch) \
77 (INT_GET(*(uint *)(ptr), arch) == XLOG_HEADER_MAGIC_NUM ? \
78 INT_GET(*((uint *)(ptr)+1), arch) : \
79 INT_GET(*(uint *)(ptr), arch) \
80 )
81 63
82#define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1) 64static inline uint xlog_get_cycle(char *ptr)
65{
66 if (INT_GET(*(uint *)ptr, ARCH_CONVERT) == XLOG_HEADER_MAGIC_NUM)
67 return INT_GET(*((uint *)ptr + 1), ARCH_CONVERT);
68 else
69 return INT_GET(*(uint *)ptr, ARCH_CONVERT);
70}
83 71
72#define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1)
84 73
85#ifdef __KERNEL__ 74#ifdef __KERNEL__
86 75
@@ -96,14 +85,10 @@ struct xfs_mount;
96 * 85 *
97 * this has endian issues, of course. 86 * this has endian issues, of course.
98 */ 87 */
99 88static inline uint xlog_get_client_id(uint i)
100#ifndef XFS_NATIVE_HOST 89{
101#define GET_CLIENT_ID(i,arch) \ 90 return INT_GET(i, ARCH_CONVERT) >> 24;
102 ((i) & 0xff) 91}
103#else
104#define GET_CLIENT_ID(i,arch) \
105 ((i) >> 24)
106#endif
107 92
108#define xlog_panic(args...) cmn_err(CE_PANIC, ## args) 93#define xlog_panic(args...) cmn_err(CE_PANIC, ## args)
109#define xlog_exit(args...) cmn_err(CE_PANIC, ## args) 94#define xlog_exit(args...) cmn_err(CE_PANIC, ## args)
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 4c39dc0e6841..e603591b9922 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -311,7 +311,7 @@ xlog_find_cycle_start(
311 if ((error = xlog_bread(log, mid_blk, 1, bp))) 311 if ((error = xlog_bread(log, mid_blk, 1, bp)))
312 return error; 312 return error;
313 offset = xlog_align(log, mid_blk, 1, bp); 313 offset = xlog_align(log, mid_blk, 1, bp);
314 mid_cycle = GET_CYCLE(offset, ARCH_CONVERT); 314 mid_cycle = xlog_get_cycle(offset);
315 if (mid_cycle == cycle) { 315 if (mid_cycle == cycle) {
316 *last_blk = mid_blk; 316 *last_blk = mid_blk;
317 /* last_half_cycle == mid_cycle */ 317 /* last_half_cycle == mid_cycle */
@@ -371,7 +371,7 @@ xlog_find_verify_cycle(
371 371
372 buf = xlog_align(log, i, bcount, bp); 372 buf = xlog_align(log, i, bcount, bp);
373 for (j = 0; j < bcount; j++) { 373 for (j = 0; j < bcount; j++) {
374 cycle = GET_CYCLE(buf, ARCH_CONVERT); 374 cycle = xlog_get_cycle(buf);
375 if (cycle == stop_on_cycle_no) { 375 if (cycle == stop_on_cycle_no) {
376 *new_blk = i+j; 376 *new_blk = i+j;
377 goto out; 377 goto out;
@@ -550,13 +550,13 @@ xlog_find_head(
550 if ((error = xlog_bread(log, 0, 1, bp))) 550 if ((error = xlog_bread(log, 0, 1, bp)))
551 goto bp_err; 551 goto bp_err;
552 offset = xlog_align(log, 0, 1, bp); 552 offset = xlog_align(log, 0, 1, bp);
553 first_half_cycle = GET_CYCLE(offset, ARCH_CONVERT); 553 first_half_cycle = xlog_get_cycle(offset);
554 554
555 last_blk = head_blk = log_bbnum - 1; /* get cycle # of last block */ 555 last_blk = head_blk = log_bbnum - 1; /* get cycle # of last block */
556 if ((error = xlog_bread(log, last_blk, 1, bp))) 556 if ((error = xlog_bread(log, last_blk, 1, bp)))
557 goto bp_err; 557 goto bp_err;
558 offset = xlog_align(log, last_blk, 1, bp); 558 offset = xlog_align(log, last_blk, 1, bp);
559 last_half_cycle = GET_CYCLE(offset, ARCH_CONVERT); 559 last_half_cycle = xlog_get_cycle(offset);
560 ASSERT(last_half_cycle != 0); 560 ASSERT(last_half_cycle != 0);
561 561
562 /* 562 /*
@@ -808,7 +808,7 @@ xlog_find_tail(
808 if ((error = xlog_bread(log, 0, 1, bp))) 808 if ((error = xlog_bread(log, 0, 1, bp)))
809 goto bread_err; 809 goto bread_err;
810 offset = xlog_align(log, 0, 1, bp); 810 offset = xlog_align(log, 0, 1, bp);
811 if (GET_CYCLE(offset, ARCH_CONVERT) == 0) { 811 if (xlog_get_cycle(offset) == 0) {
812 *tail_blk = 0; 812 *tail_blk = 0;
813 /* leave all other log inited values alone */ 813 /* leave all other log inited values alone */
814 goto exit; 814 goto exit;
@@ -922,10 +922,12 @@ xlog_find_tail(
922 * log records will point recovery to after the 922 * log records will point recovery to after the
923 * current unmount record. 923 * current unmount record.
924 */ 924 */
925 ASSIGN_ANY_LSN_HOST(log->l_tail_lsn, log->l_curr_cycle, 925 log->l_tail_lsn =
926 after_umount_blk); 926 xlog_assign_lsn(log->l_curr_cycle,
927 ASSIGN_ANY_LSN_HOST(log->l_last_sync_lsn, log->l_curr_cycle, 927 after_umount_blk);
928 after_umount_blk); 928 log->l_last_sync_lsn =
929 xlog_assign_lsn(log->l_curr_cycle,
930 after_umount_blk);
929 *tail_blk = after_umount_blk; 931 *tail_blk = after_umount_blk;
930 932
931 /* 933 /*
@@ -1007,7 +1009,7 @@ xlog_find_zeroed(
1007 if ((error = xlog_bread(log, 0, 1, bp))) 1009 if ((error = xlog_bread(log, 0, 1, bp)))
1008 goto bp_err; 1010 goto bp_err;
1009 offset = xlog_align(log, 0, 1, bp); 1011 offset = xlog_align(log, 0, 1, bp);
1010 first_cycle = GET_CYCLE(offset, ARCH_CONVERT); 1012 first_cycle = xlog_get_cycle(offset);
1011 if (first_cycle == 0) { /* completely zeroed log */ 1013 if (first_cycle == 0) { /* completely zeroed log */
1012 *blk_no = 0; 1014 *blk_no = 0;
1013 xlog_put_bp(bp); 1015 xlog_put_bp(bp);
@@ -1018,7 +1020,7 @@ xlog_find_zeroed(
1018 if ((error = xlog_bread(log, log_bbnum-1, 1, bp))) 1020 if ((error = xlog_bread(log, log_bbnum-1, 1, bp)))
1019 goto bp_err; 1021 goto bp_err;
1020 offset = xlog_align(log, log_bbnum-1, 1, bp); 1022 offset = xlog_align(log, log_bbnum-1, 1, bp);
1021 last_cycle = GET_CYCLE(offset, ARCH_CONVERT); 1023 last_cycle = xlog_get_cycle(offset);
1022 if (last_cycle != 0) { /* log completely written to */ 1024 if (last_cycle != 0) { /* log completely written to */
1023 xlog_put_bp(bp); 1025 xlog_put_bp(bp);
1024 return 0; 1026 return 0;
@@ -1102,8 +1104,9 @@ xlog_add_record(
1102 INT_SET(recp->h_cycle, ARCH_CONVERT, cycle); 1104 INT_SET(recp->h_cycle, ARCH_CONVERT, cycle);
1103 INT_SET(recp->h_version, ARCH_CONVERT, 1105 INT_SET(recp->h_version, ARCH_CONVERT,
1104 XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? 2 : 1); 1106 XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? 2 : 1);
1105 ASSIGN_ANY_LSN_DISK(recp->h_lsn, cycle, block); 1107 INT_SET(recp->h_lsn, ARCH_CONVERT, xlog_assign_lsn(cycle, block));
1106 ASSIGN_ANY_LSN_DISK(recp->h_tail_lsn, tail_cycle, tail_block); 1108 INT_SET(recp->h_tail_lsn, ARCH_CONVERT,
1109 xlog_assign_lsn(tail_cycle, tail_block));
1107 INT_SET(recp->h_fmt, ARCH_CONVERT, XLOG_FMT); 1110 INT_SET(recp->h_fmt, ARCH_CONVERT, XLOG_FMT);
1108 memcpy(&recp->h_fs_uuid, &log->l_mp->m_sb.sb_uuid, sizeof(uuid_t)); 1111 memcpy(&recp->h_fs_uuid, &log->l_mp->m_sb.sb_uuid, sizeof(uuid_t));
1109} 1112}