Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
[platform/kernel/linux-starfive.git] / fs / xfs / xfs_log_recover.c
index 17e923b..322eb2e 100644 (file)
@@ -2552,6 +2552,8 @@ xlog_recover_process_intents(
        for (lip = xfs_trans_ail_cursor_first(ailp, &cur, 0);
             lip != NULL;
             lip = xfs_trans_ail_cursor_next(ailp, &cur)) {
+               const struct xfs_item_ops       *ops;
+
                if (!xlog_item_is_intent(lip))
                        break;
 
@@ -2567,13 +2569,17 @@ xlog_recover_process_intents(
                 * deferred ops, you /must/ attach them to the capture list in
                 * the recover routine or else those subsequent intents will be
                 * replayed in the wrong order!
+                *
+                * The recovery function can free the log item, so we must not
+                * access lip after it returns.
                 */
                spin_unlock(&ailp->ail_lock);
-               error = lip->li_ops->iop_recover(lip, &capture_list);
+               ops = lip->li_ops;
+               error = ops->iop_recover(lip, &capture_list);
                spin_lock(&ailp->ail_lock);
                if (error) {
                        trace_xlog_intent_recovery_failed(log->l_mp, error,
-                                       lip->li_ops->iop_recover);
+                                       ops->iop_recover);
                        break;
                }
        }