mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 19:28:53 +03:00
Always wait for txg sync when umounting dataset
Currently, when unmounting a filesystem, ZFS will only wait for a txg sync if the dataset is dirty and not readonly. However, this can be problematic in cases where a dataset is remounted readonly immediately before being unmounted, which often happens when the system is being shut down. Since encrypted datasets require that all I/O is completed before the dataset is disowned, this issue causes problems when write I/Os leak into the txgs after the dataset is disowned, which can happen when sync=disabled. While looking into fixes for this issue, it was discovered that dsl_dataset_is_dirty() does not return B_TRUE when the dataset has been removed from the txg dirty datasets list, but has not actually been processed yet. Furthermore, the implementation is comletely different from dmu_objset_is_dirty(), adding to the confusion. Rather than relying on this function, this patch forces the umount code path (and the remount readonly code path) to always perform a txg sync on read-write datasets and removes the function altogether. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Tom Caputi <tcaputi@datto.com> Closes #7753 Closes #7795
This commit is contained in:
committed by
Brian Behlendorf
parent
8c4fb36a24
commit
47ab01a18f
+4
-5
@@ -1193,10 +1193,10 @@ zvol_shutdown_zv(zvol_state_t *zv)
|
||||
zv->zv_dn = NULL;
|
||||
|
||||
/*
|
||||
* Evict cached data
|
||||
* Evict cached data. We must write out any dirty data before
|
||||
* disowning the dataset.
|
||||
*/
|
||||
if (dsl_dataset_is_dirty(dmu_objset_ds(zv->zv_objset)) &&
|
||||
!(zv->zv_flags & ZVOL_RDONLY))
|
||||
if (!(zv->zv_flags & ZVOL_RDONLY))
|
||||
txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0);
|
||||
(void) dmu_objset_evict_dbufs(zv->zv_objset);
|
||||
}
|
||||
@@ -1489,8 +1489,7 @@ zvol_ioctl(struct block_device *bdev, fmode_t mode,
|
||||
invalidate_bdev(bdev);
|
||||
rw_enter(&zv->zv_suspend_lock, RW_READER);
|
||||
|
||||
if (dsl_dataset_is_dirty(dmu_objset_ds(zv->zv_objset)) &&
|
||||
!(zv->zv_flags & ZVOL_RDONLY))
|
||||
if (!(zv->zv_flags & ZVOL_RDONLY))
|
||||
txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0);
|
||||
|
||||
rw_exit(&zv->zv_suspend_lock);
|
||||
|
||||
Reference in New Issue
Block a user