xfs
[Top] [All Lists]

[PATCH] xfs: free the efi AIL entry on log recovery failure

To: xfs@xxxxxxxxxxx
Subject: [PATCH] xfs: free the efi AIL entry on log recovery failure
From: Mark Tinguely <tinguely@xxxxxxx>
Date: Thu, 05 Dec 2013 15:40:07 -0600
Delivered-to: xfs@xxxxxxxxxxx
User-agent: quilt/0.51-1
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;


<Prev in Thread] Current Thread [Next in Thread>