If freeing an extent fails during recovery, then the filesystem
will be forced down with the EFI entry still on the AIL. This
will result in hanging the function xfs_ail_push_all_sync().
This patch is similar to the patches that removed the dquot and
inode in commits 32ce90a and dea9609.
Found by mounting an metadata dump that triggers a
XFS_WANT_CORRUPTED_RETURN() on log recovery.
Signed-off-by: Mark Tinguely <tinguely@xxxxxxx>
---
fs/xfs/xfs_log_recover.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
Index: b/fs/xfs/xfs_log_recover.c
===================================================================
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -3668,7 +3668,7 @@ xlog_recover_process_efi(
extp = &(efip->efi_format.efi_extents[i]);
error = xfs_free_extent(tp, extp->ext_start, extp->ext_len);
if (error)
- goto abort_error;
+ goto free_abort;
xfs_trans_log_efd_extent(tp, efdp, extp->ext_start,
extp->ext_len);
}
@@ -3677,6 +3677,9 @@ xlog_recover_process_efi(
error = xfs_trans_commit(tp, 0);
return error;
+free_abort:
+ set_bit(XFS_EFI_RECOVERED, &efip->efi_flags);
+ xfs_efi_release(efip, efip->efi_format.efi_nextents);
abort_error:
xfs_trans_cancel(tp, XFS_TRANS_ABORT);
return error;
|