diff options
author | Brian Foster <bfoster@redhat.com> | 2016-09-25 18:32:50 -0400 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2016-09-25 18:32:50 -0400 |
commit | 040c52c0aa7c1736522676078ece0483c8596daf (patch) | |
tree | 282d2313e2900a38cfd17df9cde6b690b45aa59e /fs/xfs/xfs_log_recover.c | |
parent | 22db9af2488655f7f841e9588d25384a5e694fa6 (diff) |
xfs: don't warn on buffers not being recovered due to LSN
The log recovery buffer validation function is invoked in cases where a
buffer update may be skipped due to LSN ordering. If the validation
function happens to come across directory conversion situations (e.g., a
dir3 block to data conversion), it may warn about seeing a buffer log
format of one type and a buffer with a magic number of another.
This warning is not valid as the buffer update is ultimately skipped.
This is indicated by a current_lsn of NULLCOMMITLSN provided by the
caller. As such, update xlog_recover_validate_buf_type() to only warn in
such cases when a buffer update is expected.
Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r-- | fs/xfs/xfs_log_recover.c | 58 |
1 files changed, 26 insertions, 32 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index bf325f25d4ec..9be763043f28 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
@@ -2367,6 +2367,7 @@ xlog_recover_validate_buf_type( | |||
2367 | __uint32_t magic32; | 2367 | __uint32_t magic32; |
2368 | __uint16_t magic16; | 2368 | __uint16_t magic16; |
2369 | __uint16_t magicda; | 2369 | __uint16_t magicda; |
2370 | char *warnmsg = NULL; | ||
2370 | 2371 | ||
2371 | /* | 2372 | /* |
2372 | * We can only do post recovery validation on items on CRC enabled | 2373 | * We can only do post recovery validation on items on CRC enabled |
@@ -2405,31 +2406,27 @@ xlog_recover_validate_buf_type( | |||
2405 | bp->b_ops = &xfs_rmapbt_buf_ops; | 2406 | bp->b_ops = &xfs_rmapbt_buf_ops; |
2406 | break; | 2407 | break; |
2407 | default: | 2408 | default: |
2408 | xfs_warn(mp, "Bad btree block magic!"); | 2409 | warnmsg = "Bad btree block magic!"; |
2409 | ASSERT(0); | ||
2410 | break; | 2410 | break; |
2411 | } | 2411 | } |
2412 | break; | 2412 | break; |
2413 | case XFS_BLFT_AGF_BUF: | 2413 | case XFS_BLFT_AGF_BUF: |
2414 | if (magic32 != XFS_AGF_MAGIC) { | 2414 | if (magic32 != XFS_AGF_MAGIC) { |
2415 | xfs_warn(mp, "Bad AGF block magic!"); | 2415 | warnmsg = "Bad AGF block magic!"; |
2416 | ASSERT(0); | ||
2417 | break; | 2416 | break; |
2418 | } | 2417 | } |
2419 | bp->b_ops = &xfs_agf_buf_ops; | 2418 | bp->b_ops = &xfs_agf_buf_ops; |
2420 | break; | 2419 | break; |
2421 | case XFS_BLFT_AGFL_BUF: | 2420 | case XFS_BLFT_AGFL_BUF: |
2422 | if (magic32 != XFS_AGFL_MAGIC) { | 2421 | if (magic32 != XFS_AGFL_MAGIC) { |
2423 | xfs_warn(mp, "Bad AGFL block magic!"); | 2422 | warnmsg = "Bad AGFL block magic!"; |
2424 | ASSERT(0); | ||
2425 | break; | 2423 | break; |
2426 | } | 2424 | } |
2427 | bp->b_ops = &xfs_agfl_buf_ops; | 2425 | bp->b_ops = &xfs_agfl_buf_ops; |
2428 | break; | 2426 | break; |
2429 | case XFS_BLFT_AGI_BUF: | 2427 | case XFS_BLFT_AGI_BUF: |
2430 | if (magic32 != XFS_AGI_MAGIC) { | 2428 | if (magic32 != XFS_AGI_MAGIC) { |
2431 | xfs_warn(mp, "Bad AGI block magic!"); | 2429 | warnmsg = "Bad AGI block magic!"; |
2432 | ASSERT(0); | ||
2433 | break; | 2430 | break; |
2434 | } | 2431 | } |
2435 | bp->b_ops = &xfs_agi_buf_ops; | 2432 | bp->b_ops = &xfs_agi_buf_ops; |
@@ -2439,8 +2436,7 @@ xlog_recover_validate_buf_type( | |||
2439 | case XFS_BLFT_GDQUOT_BUF: | 2436 | case XFS_BLFT_GDQUOT_BUF: |
2440 | #ifdef CONFIG_XFS_QUOTA | 2437 | #ifdef CONFIG_XFS_QUOTA |
2441 | if (magic16 != XFS_DQUOT_MAGIC) { | 2438 | if (magic16 != XFS_DQUOT_MAGIC) { |
2442 | xfs_warn(mp, "Bad DQUOT block magic!"); | 2439 | warnmsg = "Bad DQUOT block magic!"; |
2443 | ASSERT(0); | ||
2444 | break; | 2440 | break; |
2445 | } | 2441 | } |
2446 | bp->b_ops = &xfs_dquot_buf_ops; | 2442 | bp->b_ops = &xfs_dquot_buf_ops; |
@@ -2452,16 +2448,14 @@ xlog_recover_validate_buf_type( | |||
2452 | break; | 2448 | break; |
2453 | case XFS_BLFT_DINO_BUF: | 2449 | case XFS_BLFT_DINO_BUF: |
2454 | if (magic16 != XFS_DINODE_MAGIC) { | 2450 | if (magic16 != XFS_DINODE_MAGIC) { |
2455 | xfs_warn(mp, "Bad INODE block magic!"); | 2451 | warnmsg = "Bad INODE block magic!"; |
2456 | ASSERT(0); | ||
2457 | break; | 2452 | break; |
2458 | } | 2453 | } |
2459 | bp->b_ops = &xfs_inode_buf_ops; | 2454 | bp->b_ops = &xfs_inode_buf_ops; |
2460 | break; | 2455 | break; |
2461 | case XFS_BLFT_SYMLINK_BUF: | 2456 | case XFS_BLFT_SYMLINK_BUF: |
2462 | if (magic32 != XFS_SYMLINK_MAGIC) { | 2457 | if (magic32 != XFS_SYMLINK_MAGIC) { |
2463 | xfs_warn(mp, "Bad symlink block magic!"); | 2458 | warnmsg = "Bad symlink block magic!"; |
2464 | ASSERT(0); | ||
2465 | break; | 2459 | break; |
2466 | } | 2460 | } |
2467 | bp->b_ops = &xfs_symlink_buf_ops; | 2461 | bp->b_ops = &xfs_symlink_buf_ops; |
@@ -2469,8 +2463,7 @@ xlog_recover_validate_buf_type( | |||
2469 | case XFS_BLFT_DIR_BLOCK_BUF: | 2463 | case XFS_BLFT_DIR_BLOCK_BUF: |
2470 | if (magic32 != XFS_DIR2_BLOCK_MAGIC && | 2464 | if (magic32 != XFS_DIR2_BLOCK_MAGIC && |
2471 | magic32 != XFS_DIR3_BLOCK_MAGIC) { | 2465 | magic32 != XFS_DIR3_BLOCK_MAGIC) { |
2472 | xfs_warn(mp, "Bad dir block magic!"); | 2466 | warnmsg = "Bad dir block magic!"; |
2473 | ASSERT(0); | ||
2474 | break; | 2467 | break; |
2475 | } | 2468 | } |
2476 | bp->b_ops = &xfs_dir3_block_buf_ops; | 2469 | bp->b_ops = &xfs_dir3_block_buf_ops; |
@@ -2478,8 +2471,7 @@ xlog_recover_validate_buf_type( | |||
2478 | case XFS_BLFT_DIR_DATA_BUF: | 2471 | case XFS_BLFT_DIR_DATA_BUF: |
2479 | if (magic32 != XFS_DIR2_DATA_MAGIC && | 2472 | if (magic32 != XFS_DIR2_DATA_MAGIC && |
2480 | magic32 != XFS_DIR3_DATA_MAGIC) { | 2473 | magic32 != XFS_DIR3_DATA_MAGIC) { |
2481 | xfs_warn(mp, "Bad dir data magic!"); | 2474 | warnmsg = "Bad dir data magic!"; |
2482 | ASSERT(0); | ||
2483 | break; | 2475 | break; |
2484 | } | 2476 | } |
2485 | bp->b_ops = &xfs_dir3_data_buf_ops; | 2477 | bp->b_ops = &xfs_dir3_data_buf_ops; |
@@ -2487,8 +2479,7 @@ xlog_recover_validate_buf_type( | |||
2487 | case XFS_BLFT_DIR_FREE_BUF: | 2479 | case XFS_BLFT_DIR_FREE_BUF: |
2488 | if (magic32 != XFS_DIR2_FREE_MAGIC && | 2480 | if (magic32 != XFS_DIR2_FREE_MAGIC && |
2489 | magic32 != XFS_DIR3_FREE_MAGIC) { | 2481 | magic32 != XFS_DIR3_FREE_MAGIC) { |
2490 | xfs_warn(mp, "Bad dir3 free magic!"); | 2482 | warnmsg = "Bad dir3 free magic!"; |
2491 | ASSERT(0); | ||
2492 | break; | 2483 | break; |
2493 | } | 2484 | } |
2494 | bp->b_ops = &xfs_dir3_free_buf_ops; | 2485 | bp->b_ops = &xfs_dir3_free_buf_ops; |
@@ -2496,8 +2487,7 @@ xlog_recover_validate_buf_type( | |||
2496 | case XFS_BLFT_DIR_LEAF1_BUF: | 2487 | case XFS_BLFT_DIR_LEAF1_BUF: |
2497 | if (magicda != XFS_DIR2_LEAF1_MAGIC && | 2488 | if (magicda != XFS_DIR2_LEAF1_MAGIC && |
2498 | magicda != XFS_DIR3_LEAF1_MAGIC) { | 2489 | magicda != XFS_DIR3_LEAF1_MAGIC) { |
2499 | xfs_warn(mp, "Bad dir leaf1 magic!"); | 2490 | warnmsg = "Bad dir leaf1 magic!"; |
2500 | ASSERT(0); | ||
2501 | break; | 2491 | break; |
2502 | } | 2492 | } |
2503 | bp->b_ops = &xfs_dir3_leaf1_buf_ops; | 2493 | bp->b_ops = &xfs_dir3_leaf1_buf_ops; |
@@ -2505,8 +2495,7 @@ xlog_recover_validate_buf_type( | |||
2505 | case XFS_BLFT_DIR_LEAFN_BUF: | 2495 | case XFS_BLFT_DIR_LEAFN_BUF: |
2506 | if (magicda != XFS_DIR2_LEAFN_MAGIC && | 2496 | if (magicda != XFS_DIR2_LEAFN_MAGIC && |
2507 | magicda != XFS_DIR3_LEAFN_MAGIC) { | 2497 | magicda != XFS_DIR3_LEAFN_MAGIC) { |
2508 | xfs_warn(mp, "Bad dir leafn magic!"); | 2498 | warnmsg = "Bad dir leafn magic!"; |
2509 | ASSERT(0); | ||
2510 | break; | 2499 | break; |
2511 | } | 2500 | } |
2512 | bp->b_ops = &xfs_dir3_leafn_buf_ops; | 2501 | bp->b_ops = &xfs_dir3_leafn_buf_ops; |
@@ -2514,8 +2503,7 @@ xlog_recover_validate_buf_type( | |||
2514 | case XFS_BLFT_DA_NODE_BUF: | 2503 | case XFS_BLFT_DA_NODE_BUF: |
2515 | if (magicda != XFS_DA_NODE_MAGIC && | 2504 | if (magicda != XFS_DA_NODE_MAGIC && |
2516 | magicda != XFS_DA3_NODE_MAGIC) { | 2505 | magicda != XFS_DA3_NODE_MAGIC) { |
2517 | xfs_warn(mp, "Bad da node magic!"); | 2506 | warnmsg = "Bad da node magic!"; |
2518 | ASSERT(0); | ||
2519 | break; | 2507 | break; |
2520 | } | 2508 | } |
2521 | bp->b_ops = &xfs_da3_node_buf_ops; | 2509 | bp->b_ops = &xfs_da3_node_buf_ops; |
@@ -2523,24 +2511,21 @@ xlog_recover_validate_buf_type( | |||
2523 | case XFS_BLFT_ATTR_LEAF_BUF: | 2511 | case XFS_BLFT_ATTR_LEAF_BUF: |
2524 | if (magicda != XFS_ATTR_LEAF_MAGIC && | 2512 | if (magicda != XFS_ATTR_LEAF_MAGIC && |
2525 | magicda != XFS_ATTR3_LEAF_MAGIC) { | 2513 | magicda != XFS_ATTR3_LEAF_MAGIC) { |
2526 | xfs_warn(mp, "Bad attr leaf magic!"); | 2514 | warnmsg = "Bad attr leaf magic!"; |
2527 | ASSERT(0); | ||
2528 | break; | 2515 | break; |
2529 | } | 2516 | } |
2530 | bp->b_ops = &xfs_attr3_leaf_buf_ops; | 2517 | bp->b_ops = &xfs_attr3_leaf_buf_ops; |
2531 | break; | 2518 | break; |
2532 | case XFS_BLFT_ATTR_RMT_BUF: | 2519 | case XFS_BLFT_ATTR_RMT_BUF: |
2533 | if (magic32 != XFS_ATTR3_RMT_MAGIC) { | 2520 | if (magic32 != XFS_ATTR3_RMT_MAGIC) { |
2534 | xfs_warn(mp, "Bad attr remote magic!"); | 2521 | warnmsg = "Bad attr remote magic!"; |
2535 | ASSERT(0); | ||
2536 | break; | 2522 | break; |
2537 | } | 2523 | } |
2538 | bp->b_ops = &xfs_attr3_rmt_buf_ops; | 2524 | bp->b_ops = &xfs_attr3_rmt_buf_ops; |
2539 | break; | 2525 | break; |
2540 | case XFS_BLFT_SB_BUF: | 2526 | case XFS_BLFT_SB_BUF: |
2541 | if (magic32 != XFS_SB_MAGIC) { | 2527 | if (magic32 != XFS_SB_MAGIC) { |
2542 | xfs_warn(mp, "Bad SB block magic!"); | 2528 | warnmsg = "Bad SB block magic!"; |
2543 | ASSERT(0); | ||
2544 | break; | 2529 | break; |
2545 | } | 2530 | } |
2546 | bp->b_ops = &xfs_sb_buf_ops; | 2531 | bp->b_ops = &xfs_sb_buf_ops; |
@@ -2557,6 +2542,15 @@ xlog_recover_validate_buf_type( | |||
2557 | xfs_blft_from_flags(buf_f)); | 2542 | xfs_blft_from_flags(buf_f)); |
2558 | break; | 2543 | break; |
2559 | } | 2544 | } |
2545 | |||
2546 | /* | ||
2547 | * Don't warn in the case of a NULL current LSN as this means the buffer | ||
2548 | * is more recent than the change in the log and will be skipped. | ||
2549 | */ | ||
2550 | if (warnmsg && current_lsn != NULLCOMMITLSN) { | ||
2551 | xfs_warn(mp, warnmsg); | ||
2552 | ASSERT(0); | ||
2553 | } | ||
2560 | } | 2554 | } |
2561 | 2555 | ||
2562 | /* | 2556 | /* |