mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 11:18:52 +03:00
OpenZFS 3821 - Race in rollback, zil close, and zil flush
Authored by: George Wilson <george.wilson@delphix.com> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Dan Kimmel <dan.kimmel@delphix.com> Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com> Reviewed by: Andriy Gapon <avg@FreeBSD.org> Approved by: Richard Lowe <richlowe@richlowe.net> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Ported-by: George Melikov <mail@gmelikov.ru> OpenZFS-issue: https://www.illumos.org/issues/3821 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/43297f9 Closes #5905
This commit is contained in:
committed by
Brian Behlendorf
parent
56a6054d55
commit
55922e73b4
@@ -615,9 +615,16 @@ dsl_pool_sync_done(dsl_pool_t *dp, uint64_t txg)
|
||||
{
|
||||
zilog_t *zilog;
|
||||
|
||||
while ((zilog = txg_list_remove(&dp->dp_dirty_zilogs, txg))) {
|
||||
while ((zilog = txg_list_head(&dp->dp_dirty_zilogs, txg))) {
|
||||
dsl_dataset_t *ds = dmu_objset_ds(zilog->zl_os);
|
||||
/*
|
||||
* We don't remove the zilog from the dp_dirty_zilogs
|
||||
* list until after we've cleaned it. This ensures that
|
||||
* callers of zilog_is_dirty() receive an accurate
|
||||
* answer when they are racing with the spa sync thread.
|
||||
*/
|
||||
zil_clean(zilog, txg);
|
||||
(void) txg_list_remove_this(&dp->dp_dirty_zilogs, zilog, txg);
|
||||
ASSERT(!dmu_objset_is_dirty(zilog->zl_os, txg));
|
||||
dmu_buf_rele(ds->ds_dbuf, zilog);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user