mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
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>
This commit is contained in:
@@ -717,31 +717,37 @@ xlog_recover_attri_commit_pass2(
|
|||||||
/* Validate xfs_attri_log_format before the large memory allocation */
|
/* Validate xfs_attri_log_format before the large memory allocation */
|
||||||
len = sizeof(struct xfs_attri_log_format);
|
len = sizeof(struct xfs_attri_log_format);
|
||||||
if (item->ri_buf[0].i_len != len) {
|
if (item->ri_buf[0].i_len != len) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!xfs_attri_validate(mp, attri_formatp)) {
|
if (!xfs_attri_validate(mp, attri_formatp)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Validate the attr name */
|
/* Validate the attr name */
|
||||||
if (item->ri_buf[1].i_len !=
|
if (item->ri_buf[1].i_len !=
|
||||||
xlog_calc_iovec_len(attri_formatp->alfi_name_len)) {
|
xlog_calc_iovec_len(attri_formatp->alfi_name_len)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!xfs_attr_namecheck(attr_name, attri_formatp->alfi_name_len)) {
|
if (!xfs_attr_namecheck(attr_name, attri_formatp->alfi_name_len)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[1].i_addr, item->ri_buf[1].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Validate the attr value, if present */
|
/* Validate the attr value, if present */
|
||||||
if (attri_formatp->alfi_value_len != 0) {
|
if (attri_formatp->alfi_value_len != 0) {
|
||||||
if (item->ri_buf[2].i_len != xlog_calc_iovec_len(attri_formatp->alfi_value_len)) {
|
if (item->ri_buf[2].i_len != xlog_calc_iovec_len(attri_formatp->alfi_value_len)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr,
|
||||||
|
item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -834,7 +840,8 @@ xlog_recover_attrd_commit_pass2(
|
|||||||
|
|
||||||
attrd_formatp = item->ri_buf[0].i_addr;
|
attrd_formatp = item->ri_buf[0].i_addr;
|
||||||
if (item->ri_buf[0].i_len != sizeof(struct xfs_attrd_log_format)) {
|
if (item->ri_buf[0].i_len != sizeof(struct xfs_attrd_log_format)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -644,18 +644,21 @@ xlog_recover_bui_commit_pass2(
|
|||||||
bui_formatp = item->ri_buf[0].i_addr;
|
bui_formatp = item->ri_buf[0].i_addr;
|
||||||
|
|
||||||
if (item->ri_buf[0].i_len < xfs_bui_log_format_sizeof(0)) {
|
if (item->ri_buf[0].i_len < xfs_bui_log_format_sizeof(0)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bui_formatp->bui_nextents != XFS_BUI_MAX_FAST_EXTENTS) {
|
if (bui_formatp->bui_nextents != XFS_BUI_MAX_FAST_EXTENTS) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = xfs_bui_log_format_sizeof(bui_formatp->bui_nextents);
|
len = xfs_bui_log_format_sizeof(bui_formatp->bui_nextents);
|
||||||
if (item->ri_buf[0].i_len != len) {
|
if (item->ri_buf[0].i_len != len) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -694,7 +697,8 @@ xlog_recover_bud_commit_pass2(
|
|||||||
|
|
||||||
bud_formatp = item->ri_buf[0].i_addr;
|
bud_formatp = item->ri_buf[0].i_addr;
|
||||||
if (item->ri_buf[0].i_len != sizeof(struct xfs_bud_log_format)) {
|
if (item->ri_buf[0].i_len != sizeof(struct xfs_bud_log_format)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -216,7 +216,8 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, NULL, buf->i_addr,
|
||||||
|
buf->i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,7 +712,8 @@ xlog_recover_efi_commit_pass2(
|
|||||||
efi_formatp = item->ri_buf[0].i_addr;
|
efi_formatp = item->ri_buf[0].i_addr;
|
||||||
|
|
||||||
if (item->ri_buf[0].i_len < xfs_efi_log_format_sizeof(0)) {
|
if (item->ri_buf[0].i_len < xfs_efi_log_format_sizeof(0)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -523,7 +523,9 @@ xfs_cui_item_recover(
|
|||||||
type = refc_type;
|
type = refc_type;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
&cuip->cui_format,
|
||||||
|
sizeof(cuip->cui_format));
|
||||||
error = -EFSCORRUPTED;
|
error = -EFSCORRUPTED;
|
||||||
goto abort_error;
|
goto abort_error;
|
||||||
}
|
}
|
||||||
@@ -536,7 +538,8 @@ xfs_cui_item_recover(
|
|||||||
&new_fsb, &new_len, &rcur);
|
&new_fsb, &new_len, &rcur);
|
||||||
if (error == -EFSCORRUPTED)
|
if (error == -EFSCORRUPTED)
|
||||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
refc, sizeof(*refc));
|
&cuip->cui_format,
|
||||||
|
sizeof(cuip->cui_format));
|
||||||
if (error)
|
if (error)
|
||||||
goto abort_error;
|
goto abort_error;
|
||||||
|
|
||||||
@@ -658,13 +661,15 @@ xlog_recover_cui_commit_pass2(
|
|||||||
cui_formatp = item->ri_buf[0].i_addr;
|
cui_formatp = item->ri_buf[0].i_addr;
|
||||||
|
|
||||||
if (item->ri_buf[0].i_len < xfs_cui_log_format_sizeof(0)) {
|
if (item->ri_buf[0].i_len < xfs_cui_log_format_sizeof(0)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = xfs_cui_log_format_sizeof(cui_formatp->cui_nextents);
|
len = xfs_cui_log_format_sizeof(cui_formatp->cui_nextents);
|
||||||
if (item->ri_buf[0].i_len != len) {
|
if (item->ri_buf[0].i_len != len) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -703,7 +708,8 @@ xlog_recover_cud_commit_pass2(
|
|||||||
|
|
||||||
cud_formatp = item->ri_buf[0].i_addr;
|
cud_formatp = item->ri_buf[0].i_addr;
|
||||||
if (item->ri_buf[0].i_len != sizeof(struct xfs_cud_log_format)) {
|
if (item->ri_buf[0].i_len != sizeof(struct xfs_cud_log_format)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -557,7 +557,9 @@ xfs_rui_item_recover(
|
|||||||
type = XFS_RMAP_FREE;
|
type = XFS_RMAP_FREE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
&ruip->rui_format,
|
||||||
|
sizeof(ruip->rui_format));
|
||||||
error = -EFSCORRUPTED;
|
error = -EFSCORRUPTED;
|
||||||
goto abort_error;
|
goto abort_error;
|
||||||
}
|
}
|
||||||
@@ -663,13 +665,15 @@ xlog_recover_rui_commit_pass2(
|
|||||||
rui_formatp = item->ri_buf[0].i_addr;
|
rui_formatp = item->ri_buf[0].i_addr;
|
||||||
|
|
||||||
if (item->ri_buf[0].i_len < xfs_rui_log_format_sizeof(0)) {
|
if (item->ri_buf[0].i_len < xfs_rui_log_format_sizeof(0)) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = xfs_rui_log_format_sizeof(rui_formatp->rui_nextents);
|
len = xfs_rui_log_format_sizeof(rui_formatp->rui_nextents);
|
||||||
if (item->ri_buf[0].i_len != len) {
|
if (item->ri_buf[0].i_len != len) {
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
|
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user