xfs: actually abort log recovery on corrupt intent-done log items
If log recovery picks up intent-done log items that are not of the correct size it needs to abort recovery and fail the mount. Debug assertions are not good enough. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
Родитель
3c5aaaced9
Коммит
921ed96b4f
|
@ -751,12 +751,24 @@ xlog_recover_efd_commit_pass2(
|
||||||
xfs_lsn_t lsn)
|
xfs_lsn_t lsn)
|
||||||
{
|
{
|
||||||
struct xfs_efd_log_format *efd_formatp;
|
struct xfs_efd_log_format *efd_formatp;
|
||||||
|
int buflen = item->ri_buf[0].i_len;
|
||||||
|
|
||||||
efd_formatp = item->ri_buf[0].i_addr;
|
efd_formatp = item->ri_buf[0].i_addr;
|
||||||
ASSERT(item->ri_buf[0].i_len == xfs_efd_log_format32_sizeof(
|
|
||||||
efd_formatp->efd_nextents) ||
|
if (buflen < sizeof(struct xfs_efd_log_format)) {
|
||||||
item->ri_buf[0].i_len == xfs_efd_log_format64_sizeof(
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
|
||||||
efd_formatp->efd_nextents));
|
efd_formatp, buflen);
|
||||||
|
return -EFSCORRUPTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item->ri_buf[0].i_len != xfs_efd_log_format32_sizeof(
|
||||||
|
efd_formatp->efd_nextents) &&
|
||||||
|
item->ri_buf[0].i_len != xfs_efd_log_format64_sizeof(
|
||||||
|
efd_formatp->efd_nextents)) {
|
||||||
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
|
||||||
|
efd_formatp, buflen);
|
||||||
|
return -EFSCORRUPTED;
|
||||||
|
}
|
||||||
|
|
||||||
xlog_recover_release_intent(log, XFS_LI_EFI, efd_formatp->efd_efi_id);
|
xlog_recover_release_intent(log, XFS_LI_EFI, efd_formatp->efd_efi_id);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -707,7 +707,11 @@ xlog_recover_rud_commit_pass2(
|
||||||
struct xfs_rud_log_format *rud_formatp;
|
struct xfs_rud_log_format *rud_formatp;
|
||||||
|
|
||||||
rud_formatp = item->ri_buf[0].i_addr;
|
rud_formatp = item->ri_buf[0].i_addr;
|
||||||
ASSERT(item->ri_buf[0].i_len == sizeof(struct xfs_rud_log_format));
|
if (item->ri_buf[0].i_len != sizeof(struct xfs_rud_log_format)) {
|
||||||
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
|
||||||
|
rud_formatp, item->ri_buf[0].i_len);
|
||||||
|
return -EFSCORRUPTED;
|
||||||
|
}
|
||||||
|
|
||||||
xlog_recover_release_intent(log, XFS_LI_RUI, rud_formatp->rud_rui_id);
|
xlog_recover_release_intent(log, XFS_LI_RUI, rud_formatp->rud_rui_id);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче