Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xfs: dump corrupt recovered log intent items to dmesg consistently

If log recovery decides that an intent item is corrupt and wants to
abort the mount, capture a hexdump of the corrupt log item in the kernel
log for further analysis. Some of the log item code already did this,
so we're fixing the rest to do it consistently.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>

+43 -20
+13 -6
fs/xfs/xfs_attr_item.c
··· 717 717 /* Validate xfs_attri_log_format before the large memory allocation */ 718 718 len = sizeof(struct xfs_attri_log_format); 719 719 if (item->ri_buf[0].i_len != len) { 720 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); 720 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 721 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 721 722 return -EFSCORRUPTED; 722 723 } 723 724 724 725 if (!xfs_attri_validate(mp, attri_formatp)) { 725 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); 726 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 727 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 726 728 return -EFSCORRUPTED; 727 729 } 728 730 729 731 /* Validate the attr name */ 730 732 if (item->ri_buf[1].i_len != 731 733 xlog_calc_iovec_len(attri_formatp->alfi_name_len)) { 732 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); 734 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 735 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 733 736 return -EFSCORRUPTED; 734 737 } 735 738 736 739 if (!xfs_attr_namecheck(attr_name, attri_formatp->alfi_name_len)) { 737 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); 740 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 741 + item->ri_buf[1].i_addr, item->ri_buf[1].i_len); 738 742 return -EFSCORRUPTED; 739 743 } 740 744 741 745 /* Validate the attr value, if present */ 742 746 if (attri_formatp->alfi_value_len != 0) { 743 747 if (item->ri_buf[2].i_len != xlog_calc_iovec_len(attri_formatp->alfi_value_len)) { 744 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); 748 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 749 + item->ri_buf[0].i_addr, 750 + item->ri_buf[0].i_len); 745 751 return -EFSCORRUPTED; 746 752 } 747 753 ··· 840 834 841 835 attrd_formatp = item->ri_buf[0].i_addr; 842 836 if (item->ri_buf[0].i_len != sizeof(struct xfs_attrd_log_format)) { 843 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL); 837 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp, 838 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 844 839 return -EFSCORRUPTED; 845 840 } 846 841
+8 -4
fs/xfs/xfs_bmap_item.c
··· 644 644 bui_formatp = item->ri_buf[0].i_addr; 645 645 646 646 if (item->ri_buf[0].i_len < xfs_bui_log_format_sizeof(0)) { 647 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 647 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 648 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 648 649 return -EFSCORRUPTED; 649 650 } 650 651 651 652 if (bui_formatp->bui_nextents != XFS_BUI_MAX_FAST_EXTENTS) { 652 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 653 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 654 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 653 655 return -EFSCORRUPTED; 654 656 } 655 657 656 658 len = xfs_bui_log_format_sizeof(bui_formatp->bui_nextents); 657 659 if (item->ri_buf[0].i_len != len) { 658 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 660 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 661 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 659 662 return -EFSCORRUPTED; 660 663 } 661 664 ··· 697 694 698 695 bud_formatp = item->ri_buf[0].i_addr; 699 696 if (item->ri_buf[0].i_len != sizeof(struct xfs_bud_log_format)) { 700 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 697 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp, 698 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 701 699 return -EFSCORRUPTED; 702 700 } 703 701
+4 -2
fs/xfs/xfs_extfree_item.c
··· 216 216 } 217 217 return 0; 218 218 } 219 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL); 219 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, NULL, buf->i_addr, 220 + buf->i_len); 220 221 return -EFSCORRUPTED; 221 222 } 222 223 ··· 712 711 efi_formatp = item->ri_buf[0].i_addr; 713 712 714 713 if (item->ri_buf[0].i_len < xfs_efi_log_format_sizeof(0)) { 715 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 714 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 715 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 716 716 return -EFSCORRUPTED; 717 717 } 718 718
+11 -5
fs/xfs/xfs_refcount_item.c
··· 523 523 type = refc_type; 524 524 break; 525 525 default: 526 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); 526 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 527 + &cuip->cui_format, 528 + sizeof(cuip->cui_format)); 527 529 error = -EFSCORRUPTED; 528 530 goto abort_error; 529 531 } ··· 538 536 &new_fsb, &new_len, &rcur); 539 537 if (error == -EFSCORRUPTED) 540 538 XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 541 - refc, sizeof(*refc)); 539 + &cuip->cui_format, 540 + sizeof(cuip->cui_format)); 542 541 if (error) 543 542 goto abort_error; 544 543 ··· 661 658 cui_formatp = item->ri_buf[0].i_addr; 662 659 663 660 if (item->ri_buf[0].i_len < xfs_cui_log_format_sizeof(0)) { 664 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 661 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 662 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 665 663 return -EFSCORRUPTED; 666 664 } 667 665 668 666 len = xfs_cui_log_format_sizeof(cui_formatp->cui_nextents); 669 667 if (item->ri_buf[0].i_len != len) { 670 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 668 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 669 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 671 670 return -EFSCORRUPTED; 672 671 } 673 672 ··· 708 703 709 704 cud_formatp = item->ri_buf[0].i_addr; 710 705 if (item->ri_buf[0].i_len != sizeof(struct xfs_cud_log_format)) { 711 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 706 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp, 707 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 712 708 return -EFSCORRUPTED; 713 709 } 714 710
+7 -3
fs/xfs/xfs_rmap_item.c
··· 557 557 type = XFS_RMAP_FREE; 558 558 break; 559 559 default: 560 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL); 560 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 561 + &ruip->rui_format, 562 + sizeof(ruip->rui_format)); 561 563 error = -EFSCORRUPTED; 562 564 goto abort_error; 563 565 } ··· 665 663 rui_formatp = item->ri_buf[0].i_addr; 666 664 667 665 if (item->ri_buf[0].i_len < xfs_rui_log_format_sizeof(0)) { 668 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 666 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 667 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 669 668 return -EFSCORRUPTED; 670 669 } 671 670 672 671 len = xfs_rui_log_format_sizeof(rui_formatp->rui_nextents); 673 672 if (item->ri_buf[0].i_len != len) { 674 - XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp); 673 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, 674 + item->ri_buf[0].i_addr, item->ri_buf[0].i_len); 675 675 return -EFSCORRUPTED; 676 676 } 677 677