INIT_LIST_HEAD(&tr->tr_ail2_list);
                tr->tr_first = sdp->sd_log_flush_head;
                if (unlikely (state == SFS_FROZEN))
-                       gfs2_assert_withdraw(sdp, !tr->tr_num_buf_new && !tr->tr_num_databuf_new);
+                       if (gfs2_assert_withdraw_delayed(sdp,
+                              !tr->tr_num_buf_new && !tr->tr_num_databuf_new))
+                               goto out;
        }
 
        if (unlikely(state == SFS_FROZEN))
-               gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke);
-       gfs2_assert_withdraw(sdp,
-                       sdp->sd_log_num_revoke == sdp->sd_log_committed_revoke);
+               if (gfs2_assert_withdraw_delayed(sdp, !sdp->sd_log_num_revoke))
+                       goto out;
+       if (gfs2_assert_withdraw_delayed(sdp,
+                       sdp->sd_log_num_revoke == sdp->sd_log_committed_revoke))
+               goto out;
 
        gfs2_ordered_write(sdp);
        if (gfs2_withdrawn(sdp))
 
  */
 
 void gfs2_assert_withdraw_i(struct gfs2_sbd *sdp, char *assertion,
-                           const char *function, char *file, unsigned int line)
+                           const char *function, char *file, unsigned int line,
+                           bool delayed)
 {
-       gfs2_lm(sdp,
-               "fatal: assertion \"%s\" failed\n"
-               "   function = %s, file = %s, line = %u\n",
-               assertion, function, file, line);
-       gfs2_withdraw(sdp);
+       if (gfs2_withdrawn(sdp))
+               return;
+
+       fs_err(sdp,
+              "fatal: assertion \"%s\" failed\n"
+              "   function = %s, file = %s, line = %u\n",
+              assertion, function, file, line);
+
+       /*
+        * If errors=panic was specified on mount, it won't help to delay the
+        * withdraw.
+        */
+       if (sdp->sd_args.ar_errors == GFS2_ERRORS_PANIC)
+               delayed = false;
+
+       if (delayed)
+               gfs2_withdraw_delayed(sdp);
+       else
+               gfs2_withdraw(sdp);
        dump_stack();
 }
 
 
 
 
 void gfs2_assert_withdraw_i(struct gfs2_sbd *sdp, char *assertion,
-                           const char *function, char *file, unsigned int line);
+                           const char *function, char *file, unsigned int line,
+                           bool delayed);
 
 #define gfs2_assert_withdraw(sdp, assertion) \
        ({ \
                bool _bool = (assertion); \
                if (unlikely(!_bool)) \
                        gfs2_assert_withdraw_i((sdp), #assertion, \
-                                       __func__, __FILE__, __LINE__); \
+                                       __func__, __FILE__, __LINE__, false); \
+               !_bool; \
+       })
+
+#define gfs2_assert_withdraw_delayed(sdp, assertion) \
+       ({ \
+               bool _bool = (assertion); \
+               if (unlikely(!_bool)) \
+                       gfs2_assert_withdraw_i((sdp), #assertion, \
+                                       __func__, __FILE__, __LINE__, true); \
                !_bool; \
        })