ZIL: Replay blocks without next block pointer.

If we get next block allocation error during log write, we trigger
transaction commit.  But the block we have just completed is still
written and transactions it covers will be acknowledged normally.
If after that we ignore the block during replay just because it is
the last in the chain, we may not replay some transactions that we
have acknowledged as synced, that is not right.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by:	Alexander Motin <mav@FreeBSD.org>
Sponsored by:	iXsystems, Inc.
Closes #15132
This commit is contained in:
Alexander Motin 2023-08-11 12:04:44 -04:00 committed by GitHub
parent bdb7df4245
commit 8e20e0ff39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 2 additions and 2 deletions

View File

@ -290,7 +290,7 @@ zil_read_log_block(zilog_t *zilog, boolean_t decrypt, const blkptr_t *bp,
char *lr = (char *)(zilc + 1); char *lr = (char *)(zilc + 1);
if (memcmp(&cksum, &zilc->zc_next_blk.blk_cksum, if (memcmp(&cksum, &zilc->zc_next_blk.blk_cksum,
sizeof (cksum)) || BP_IS_HOLE(&zilc->zc_next_blk) || sizeof (cksum)) ||
zilc->zc_nused < sizeof (*zilc) || zilc->zc_nused < sizeof (*zilc) ||
zilc->zc_nused > size) { zilc->zc_nused > size) {
error = SET_ERROR(ECKSUM); error = SET_ERROR(ECKSUM);
@ -304,7 +304,7 @@ zil_read_log_block(zilog_t *zilog, boolean_t decrypt, const blkptr_t *bp,
zil_chain_t *zilc = (zil_chain_t *)(lr + size) - 1; zil_chain_t *zilc = (zil_chain_t *)(lr + size) - 1;
if (memcmp(&cksum, &zilc->zc_next_blk.blk_cksum, if (memcmp(&cksum, &zilc->zc_next_blk.blk_cksum,
sizeof (cksum)) || BP_IS_HOLE(&zilc->zc_next_blk) || sizeof (cksum)) ||
(zilc->zc_nused > (size - sizeof (*zilc)))) { (zilc->zc_nused > (size - sizeof (*zilc)))) {
error = SET_ERROR(ECKSUM); error = SET_ERROR(ECKSUM);
} else { } else {