|
@@ -3407,6 +3407,17 @@ xlog_verify_dest_ptr(
|
|
|
xfs_emerg(log->l_mp, "%s: invalid ptr", __func__);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Check to make sure the grant write head didn't just over lap the tail. If
|
|
|
+ * the cycles are the same, we can't be overlapping. Otherwise, make sure that
|
|
|
+ * the cycles differ by exactly one and check the byte count.
|
|
|
+ *
|
|
|
+ * This check is run unlocked, so can give false positives. Rather than assert
|
|
|
+ * on failures, use a warn-once flag and a panic tag to allow the admin to
|
|
|
+ * determine if they want to panic the machine when such an error occurs. For
|
|
|
+ * debug kernels this will have the same effect as using an assert but, unlinke
|
|
|
+ * an assert, it can be turned off at runtime.
|
|
|
+ */
|
|
|
STATIC void
|
|
|
xlog_verify_grant_tail(
|
|
|
struct log *log)
|
|
@@ -3414,17 +3425,22 @@ xlog_verify_grant_tail(
|
|
|
int tail_cycle, tail_blocks;
|
|
|
int cycle, space;
|
|
|
|
|
|
- /*
|
|
|
- * Check to make sure the grant write head didn't just over lap the
|
|
|
- * tail. If the cycles are the same, we can't be overlapping.
|
|
|
- * Otherwise, make sure that the cycles differ by exactly one and
|
|
|
- * check the byte count.
|
|
|
- */
|
|
|
xlog_crack_grant_head(&log->l_grant_write_head, &cycle, &space);
|
|
|
xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_blocks);
|
|
|
if (tail_cycle != cycle) {
|
|
|
- ASSERT(cycle - 1 == tail_cycle);
|
|
|
- ASSERT(space <= BBTOB(tail_blocks));
|
|
|
+ if (cycle - 1 != tail_cycle &&
|
|
|
+ !(log->l_flags & XLOG_TAIL_WARN)) {
|
|
|
+ xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
|
|
|
+ "%s: cycle - 1 != tail_cycle", __func__);
|
|
|
+ log->l_flags |= XLOG_TAIL_WARN;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (space > BBTOB(tail_blocks) &&
|
|
|
+ !(log->l_flags & XLOG_TAIL_WARN)) {
|
|
|
+ xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
|
|
|
+ "%s: space > BBTOB(tail_blocks)", __func__);
|
|
|
+ log->l_flags |= XLOG_TAIL_WARN;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|