aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_log_recover.c
diff options
context:
space:
mode:
authorBrian Foster <bfoster@redhat.com>2016-09-25 18:32:50 -0400
committerDave Chinner <david@fromorbit.com>2016-09-25 18:32:50 -0400
commit040c52c0aa7c1736522676078ece0483c8596daf (patch)
tree282d2313e2900a38cfd17df9cde6b690b45aa59e /fs/xfs/xfs_log_recover.c
parent22db9af2488655f7f841e9588d25384a5e694fa6 (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.c58
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/*