mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-09-15 13:50:11 +03:00
ZIL: Force writing of open LWB on suspend
Under parallel workloads ZIL may delay writes of open LWBs that are not full enough. On suspend we do not expect anything new to appear since zil_get_commit_list() will not let it pass, only returning TXG number to wait for. But I suspect that waiting for the TXG commit without having the last LWB issued may not wait for its completion, resulting in panic described in #17509. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Rob Norris <rob.norris@klarasystems.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #17521
This commit is contained in:
parent
acf3871ef8
commit
347d68048a
@ -2901,19 +2901,14 @@ zil_process_commit_list(zilog_t *zilog, zil_commit_waiter_t *zcw, list_t *ilwbs)
|
||||
|
||||
ASSERT(MUTEX_HELD(&zilog->zl_issuer_lock));
|
||||
|
||||
/*
|
||||
* Return if there's nothing to commit before we dirty the fs by
|
||||
* calling zil_create().
|
||||
*/
|
||||
if (list_is_empty(&zilog->zl_itx_commit_list))
|
||||
return;
|
||||
|
||||
list_create(&nolwb_itxs, sizeof (itx_t), offsetof(itx_t, itx_node));
|
||||
list_create(&nolwb_waiters, sizeof (zil_commit_waiter_t),
|
||||
offsetof(zil_commit_waiter_t, zcw_node));
|
||||
|
||||
lwb = list_tail(&zilog->zl_lwb_list);
|
||||
if (lwb == NULL) {
|
||||
/*
|
||||
* Return if there's nothing to commit before we dirty the fs.
|
||||
*/
|
||||
if (list_is_empty(&zilog->zl_itx_commit_list))
|
||||
return;
|
||||
|
||||
lwb = zil_create(zilog);
|
||||
} else {
|
||||
/*
|
||||
@ -2941,6 +2936,10 @@ zil_process_commit_list(zilog_t *zilog, zil_commit_waiter_t *zcw, list_t *ilwbs)
|
||||
}
|
||||
}
|
||||
|
||||
list_create(&nolwb_itxs, sizeof (itx_t), offsetof(itx_t, itx_node));
|
||||
list_create(&nolwb_waiters, sizeof (zil_commit_waiter_t),
|
||||
offsetof(zil_commit_waiter_t, zcw_node));
|
||||
|
||||
while ((itx = list_remove_head(&zilog->zl_itx_commit_list)) != NULL) {
|
||||
lr_t *lrc = &itx->itx_lr;
|
||||
uint64_t txg = lrc->lrc_txg;
|
||||
@ -3110,7 +3109,8 @@ zil_process_commit_list(zilog_t *zilog, zil_commit_waiter_t *zcw, list_t *ilwbs)
|
||||
* possible, without significantly impacting the latency
|
||||
* of each individual itx.
|
||||
*/
|
||||
if (lwb->lwb_state == LWB_STATE_OPENED && !zilog->zl_parallel) {
|
||||
if (lwb->lwb_state == LWB_STATE_OPENED &&
|
||||
(!zilog->zl_parallel || zilog->zl_suspend > 0)) {
|
||||
zil_burst_done(zilog);
|
||||
list_insert_tail(ilwbs, lwb);
|
||||
lwb = zil_lwb_write_close(zilog, lwb, LWB_STATE_NEW);
|
||||
|
Loading…
Reference in New Issue
Block a user