]> git.proxmox.com Git - mirror_zfs.git/commit
Fix a race condition in dsl_dataset_sync() when activating features
authorGeorge Amanakis <gamanakis@gmail.com>
Tue, 14 Feb 2023 00:37:46 +0000 (01:37 +0100)
committerGitHub <noreply@github.com>
Tue, 14 Feb 2023 00:37:46 +0000 (16:37 -0800)
commit34ce4c42ffdcd8933768533343d8b29f9612fbae
tree4fddc60d23b6e1e19377985ac5c036609c8e87bf
parent13312e2fa107b2a10595d67de82ecdf74db317ed
Fix a race condition in dsl_dataset_sync() when activating features

The zio returned from arc_write() in dmu_objset_sync() uses
zio_nowait(). However we may reach the end of dsl_dataset_sync()
which checks if we need to activate features in the filesystem
without knowing if that zio has even run through the ZIO pipeline yet.
In that case we will flag features to be activated in
dsl_dataset_block_born() but dsl_dataset_sync() has already
completed its run and those features will not actually be activated.
Mitigate this by moving the feature activation code in
dsl_dataset_sync_done(). Also add new ASSERTs in
dsl_scan_visitbp() checking if a block contradicts any filesystem
flags.

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Signed-off-by: George Amanakis <gamanakis@gmail.com>
Closes #13816
include/sys/dsl_dataset.h
module/zfs/dmu_send.c
module/zfs/dsl_dataset.c
module/zfs/dsl_scan.c