|
@@ -1183,31 +1183,11 @@ xlog_verify_head(
|
|
|
ASSERT(0);
|
|
|
return 0;
|
|
|
}
|
|
|
-
|
|
|
- /*
|
|
|
- * Now verify the tail based on the updated head. This is
|
|
|
- * required because the torn writes trimmed from the head could
|
|
|
- * have been written over the tail of a previous record. Return
|
|
|
- * any errors since recovery cannot proceed if the tail is
|
|
|
- * corrupt.
|
|
|
- *
|
|
|
- * XXX: This leaves a gap in truly robust protection from torn
|
|
|
- * writes in the log. If the head is behind the tail, the tail
|
|
|
- * pushes forward to create some space and then a crash occurs
|
|
|
- * causing the writes into the previous record's tail region to
|
|
|
- * tear, log recovery isn't able to recover.
|
|
|
- *
|
|
|
- * How likely is this to occur? If possible, can we do something
|
|
|
- * more intelligent here? Is it safe to push the tail forward if
|
|
|
- * we can determine that the tail is within the range of the
|
|
|
- * torn write (e.g., the kernel can only overwrite the tail if
|
|
|
- * it has actually been pushed forward)? Alternatively, could we
|
|
|
- * somehow prevent this condition at runtime?
|
|
|
- */
|
|
|
- error = xlog_verify_tail(log, *head_blk, *tail_blk);
|
|
|
}
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
|
|
|
- return error;
|
|
|
+ return xlog_verify_tail(log, *head_blk, *tail_blk);
|
|
|
}
|
|
|
|
|
|
/*
|