mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
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:
parent
c1801cbe59
commit
bb31ded68b
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user