diff options
author | Tom Caputi <[email protected]> | 2018-08-20 16:42:17 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-08-27 10:16:28 -0700 |
commit | 47ab01a18f55f89be7b3f340b6ec9101bf9e231c (patch) | |
tree | d76615b0403fdd1ba8439b1d57c2e76a0ff8639b /include | |
parent | 8c4fb36a24d4fd88382e454b13751a5adfea0806 (diff) |
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 <[email protected]>
Signed-off-by: Tom Caputi <[email protected]>
Closes #7753
Closes #7795
Diffstat (limited to 'include')
-rw-r--r-- | include/sys/dsl_dataset.h | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/include/sys/dsl_dataset.h b/include/sys/dsl_dataset.h index abd178e30..dbe4cb706 100644 --- a/include/sys/dsl_dataset.h +++ b/include/sys/dsl_dataset.h @@ -395,7 +395,6 @@ int dsl_dataset_space_written(dsl_dataset_t *oldsnap, dsl_dataset_t *new, uint64_t *usedp, uint64_t *compp, uint64_t *uncompp); int dsl_dataset_space_wouldfree(dsl_dataset_t *firstsnap, dsl_dataset_t *last, uint64_t *usedp, uint64_t *compp, uint64_t *uncompp); -boolean_t dsl_dataset_is_dirty(dsl_dataset_t *ds); int dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf); |