diff options
-rw-r--r-- | fs/xfs/xfs_log.c | 12 | ||||
-rw-r--r-- | fs/xfs/xfs_log_priv.h | 46 | ||||
-rw-r--r-- | fs/xfs/xfs_log_recover.c | 7 |
3 files changed, 19 insertions, 46 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 8a5b05536a28..aadaa1472f69 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
@@ -1029,12 +1029,6 @@ xlog_iodone(xfs_buf_t *bp) | |||
1029 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long) 2); | 1029 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long) 2); |
1030 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1); | 1030 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1); |
1031 | aborted = 0; | 1031 | aborted = 0; |
1032 | |||
1033 | /* | ||
1034 | * Some versions of cpp barf on the recursive definition of | ||
1035 | * ic_log -> hic_fields.ic_log and expand ic_log twice when | ||
1036 | * it is passed through two macros. Workaround broken cpp. | ||
1037 | */ | ||
1038 | l = iclog->ic_log; | 1032 | l = iclog->ic_log; |
1039 | 1033 | ||
1040 | /* | 1034 | /* |
@@ -1301,7 +1295,7 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
1301 | XFS_BUF_SET_BDSTRAT_FUNC(bp, xlog_bdstrat_cb); | 1295 | XFS_BUF_SET_BDSTRAT_FUNC(bp, xlog_bdstrat_cb); |
1302 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1); | 1296 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1); |
1303 | iclog->ic_bp = bp; | 1297 | iclog->ic_bp = bp; |
1304 | iclog->hic_data = bp->b_addr; | 1298 | iclog->ic_data = bp->b_addr; |
1305 | #ifdef DEBUG | 1299 | #ifdef DEBUG |
1306 | log->l_iclog_bak[i] = (xfs_caddr_t)&(iclog->ic_header); | 1300 | log->l_iclog_bak[i] = (xfs_caddr_t)&(iclog->ic_header); |
1307 | #endif | 1301 | #endif |
@@ -1321,7 +1315,7 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
1321 | atomic_set(&iclog->ic_refcnt, 0); | 1315 | atomic_set(&iclog->ic_refcnt, 0); |
1322 | spin_lock_init(&iclog->ic_callback_lock); | 1316 | spin_lock_init(&iclog->ic_callback_lock); |
1323 | iclog->ic_callback_tail = &(iclog->ic_callback); | 1317 | iclog->ic_callback_tail = &(iclog->ic_callback); |
1324 | iclog->ic_datap = (char *)iclog->hic_data + log->l_iclog_hsize; | 1318 | iclog->ic_datap = (char *)iclog->ic_data + log->l_iclog_hsize; |
1325 | 1319 | ||
1326 | ASSERT(XFS_BUF_ISBUSY(iclog->ic_bp)); | 1320 | ASSERT(XFS_BUF_ISBUSY(iclog->ic_bp)); |
1327 | ASSERT(XFS_BUF_VALUSEMA(iclog->ic_bp) <= 0); | 1321 | ASSERT(XFS_BUF_VALUSEMA(iclog->ic_bp) <= 0); |
@@ -3463,7 +3457,7 @@ xlog_verify_iclog(xlog_t *log, | |||
3463 | ptr = iclog->ic_datap; | 3457 | ptr = iclog->ic_datap; |
3464 | base_ptr = ptr; | 3458 | base_ptr = ptr; |
3465 | ophead = (xlog_op_header_t *)ptr; | 3459 | ophead = (xlog_op_header_t *)ptr; |
3466 | xhdr = (xlog_in_core_2_t *)&iclog->ic_header; | 3460 | xhdr = iclog->ic_data; |
3467 | for (i = 0; i < len; i++) { | 3461 | for (i = 0; i < len; i++) { |
3468 | ophead = (xlog_op_header_t *)ptr; | 3462 | ophead = (xlog_op_header_t *)ptr; |
3469 | 3463 | ||
diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index b39a1980e82d..654167be0efb 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h | |||
@@ -310,6 +310,16 @@ typedef struct xlog_rec_ext_header { | |||
310 | } xlog_rec_ext_header_t; | 310 | } xlog_rec_ext_header_t; |
311 | 311 | ||
312 | #ifdef __KERNEL__ | 312 | #ifdef __KERNEL__ |
313 | |||
314 | /* | ||
315 | * Quite misnamed, because this union lays out the actual on-disk log buffer. | ||
316 | */ | ||
317 | typedef union xlog_in_core2 { | ||
318 | xlog_rec_header_t hic_header; | ||
319 | xlog_rec_ext_header_t hic_xheader; | ||
320 | char hic_sector[XLOG_HEADER_SIZE]; | ||
321 | } xlog_in_core_2_t; | ||
322 | |||
313 | /* | 323 | /* |
314 | * - A log record header is 512 bytes. There is plenty of room to grow the | 324 | * - A log record header is 512 bytes. There is plenty of room to grow the |
315 | * xlog_rec_header_t into the reserved space. | 325 | * xlog_rec_header_t into the reserved space. |
@@ -339,7 +349,7 @@ typedef struct xlog_rec_ext_header { | |||
339 | * We'll put all the read-only and l_icloglock fields in the first cacheline, | 349 | * We'll put all the read-only and l_icloglock fields in the first cacheline, |
340 | * and move everything else out to subsequent cachelines. | 350 | * and move everything else out to subsequent cachelines. |
341 | */ | 351 | */ |
342 | typedef struct xlog_iclog_fields { | 352 | typedef struct xlog_in_core { |
343 | sv_t ic_force_wait; | 353 | sv_t ic_force_wait; |
344 | sv_t ic_write_wait; | 354 | sv_t ic_write_wait; |
345 | struct xlog_in_core *ic_next; | 355 | struct xlog_in_core *ic_next; |
@@ -362,41 +372,11 @@ typedef struct xlog_iclog_fields { | |||
362 | 372 | ||
363 | /* reference counts need their own cacheline */ | 373 | /* reference counts need their own cacheline */ |
364 | atomic_t ic_refcnt ____cacheline_aligned_in_smp; | 374 | atomic_t ic_refcnt ____cacheline_aligned_in_smp; |
365 | } xlog_iclog_fields_t; | 375 | xlog_in_core_2_t *ic_data; |
366 | 376 | #define ic_header ic_data->hic_header | |
367 | typedef union xlog_in_core2 { | ||
368 | xlog_rec_header_t hic_header; | ||
369 | xlog_rec_ext_header_t hic_xheader; | ||
370 | char hic_sector[XLOG_HEADER_SIZE]; | ||
371 | } xlog_in_core_2_t; | ||
372 | |||
373 | typedef struct xlog_in_core { | ||
374 | xlog_iclog_fields_t hic_fields; | ||
375 | xlog_in_core_2_t *hic_data; | ||
376 | } xlog_in_core_t; | 377 | } xlog_in_core_t; |
377 | 378 | ||
378 | /* | 379 | /* |
379 | * Defines to save our code from this glop. | ||
380 | */ | ||
381 | #define ic_force_wait hic_fields.ic_force_wait | ||
382 | #define ic_write_wait hic_fields.ic_write_wait | ||
383 | #define ic_next hic_fields.ic_next | ||
384 | #define ic_prev hic_fields.ic_prev | ||
385 | #define ic_bp hic_fields.ic_bp | ||
386 | #define ic_log hic_fields.ic_log | ||
387 | #define ic_callback hic_fields.ic_callback | ||
388 | #define ic_callback_lock hic_fields.ic_callback_lock | ||
389 | #define ic_callback_tail hic_fields.ic_callback_tail | ||
390 | #define ic_trace hic_fields.ic_trace | ||
391 | #define ic_size hic_fields.ic_size | ||
392 | #define ic_offset hic_fields.ic_offset | ||
393 | #define ic_refcnt hic_fields.ic_refcnt | ||
394 | #define ic_bwritecnt hic_fields.ic_bwritecnt | ||
395 | #define ic_state hic_fields.ic_state | ||
396 | #define ic_datap hic_fields.ic_datap | ||
397 | #define ic_header hic_data->hic_header | ||
398 | |||
399 | /* | ||
400 | * The reservation head lsn is not made up of a cycle number and block number. | 380 | * The reservation head lsn is not made up of a cycle number and block number. |
401 | * Instead, it uses a cycle number and byte number. Logs don't expect to | 381 | * Instead, it uses a cycle number and byte number. Logs don't expect to |
402 | * overflow 31 bits worth of byte offset, so using a byte number will mean | 382 | * overflow 31 bits worth of byte offset, so using a byte number will mean |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index d94987915d5e..9abb96a7674d 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
@@ -3332,7 +3332,6 @@ xlog_pack_data( | |||
3332 | int size = iclog->ic_offset + roundoff; | 3332 | int size = iclog->ic_offset + roundoff; |
3333 | __be32 cycle_lsn; | 3333 | __be32 cycle_lsn; |
3334 | xfs_caddr_t dp; | 3334 | xfs_caddr_t dp; |
3335 | xlog_in_core_2_t *xhdr; | ||
3336 | 3335 | ||
3337 | xlog_pack_data_checksum(log, iclog, size); | 3336 | xlog_pack_data_checksum(log, iclog, size); |
3338 | 3337 | ||
@@ -3347,7 +3346,8 @@ xlog_pack_data( | |||
3347 | } | 3346 | } |
3348 | 3347 | ||
3349 | if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { | 3348 | if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { |
3350 | xhdr = (xlog_in_core_2_t *)&iclog->ic_header; | 3349 | xlog_in_core_2_t *xhdr = iclog->ic_data; |
3350 | |||
3351 | for ( ; i < BTOBB(size); i++) { | 3351 | for ( ; i < BTOBB(size); i++) { |
3352 | j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); | 3352 | j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); |
3353 | k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); | 3353 | k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); |
@@ -3405,7 +3405,6 @@ xlog_unpack_data( | |||
3405 | xlog_t *log) | 3405 | xlog_t *log) |
3406 | { | 3406 | { |
3407 | int i, j, k; | 3407 | int i, j, k; |
3408 | xlog_in_core_2_t *xhdr; | ||
3409 | 3408 | ||
3410 | for (i = 0; i < BTOBB(be32_to_cpu(rhead->h_len)) && | 3409 | for (i = 0; i < BTOBB(be32_to_cpu(rhead->h_len)) && |
3411 | i < (XLOG_HEADER_CYCLE_SIZE / BBSIZE); i++) { | 3410 | i < (XLOG_HEADER_CYCLE_SIZE / BBSIZE); i++) { |
@@ -3414,7 +3413,7 @@ xlog_unpack_data( | |||
3414 | } | 3413 | } |
3415 | 3414 | ||
3416 | if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { | 3415 | if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { |
3417 | xhdr = (xlog_in_core_2_t *)rhead; | 3416 | xlog_in_core_2_t *xhdr = (xlog_in_core_2_t *)rhead; |
3418 | for ( ; i < BTOBB(be32_to_cpu(rhead->h_len)); i++) { | 3417 | for ( ; i < BTOBB(be32_to_cpu(rhead->h_len)); i++) { |
3419 | j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); | 3418 | j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); |
3420 | k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); | 3419 | k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); |