From 4759342a5eeabe168e0f658ba53e858566073085 Mon Sep 17 00:00:00 2001 From: Jorgen Lundman Date: Wed, 16 Feb 2022 08:54:25 +0900 Subject: [PATCH] Add spa _os() hooks Add hooks for when spa is created, exported, activated and deactivated. Used by macOS to attach iokit, and lock kext as busy (to stop unloads). Userland, Linux, and, FreeBSD have empty stubs. Reviewed-by: Brian Behlendorf Signed-off-by: Jorgen Lundman Closes #12801 --- include/sys/spa.h | 5 +++++ lib/libzpool/kernel.c | 24 ++++++++++++++++++++++++ module/os/freebsd/zfs/spa_os.c | 24 ++++++++++++++++++++++++ module/os/linux/zfs/spa_misc_os.c | 24 ++++++++++++++++++++++++ module/zfs/spa.c | 11 +++++++++++ 5 files changed, 88 insertions(+) diff --git a/include/sys/spa.h b/include/sys/spa.h index 896b0f9563..2ce84c21cb 100644 --- a/include/sys/spa.h +++ b/include/sys/spa.h @@ -1183,6 +1183,11 @@ extern int spa_wait_tag(const char *name, zpool_wait_activity_t activity, extern void spa_notify_waiters(spa_t *spa); extern void spa_wake_waiters(spa_t *spa); +extern void spa_import_os(spa_t *spa); +extern void spa_export_os(spa_t *spa); +extern void spa_activate_os(spa_t *spa); +extern void spa_deactivate_os(spa_t *spa); + /* module param call functions */ int param_set_deadman_ziotime(ZFS_MODULE_PARAM_ARGS); int param_set_deadman_synctime(ZFS_MODULE_PARAM_ARGS); diff --git a/lib/libzpool/kernel.c b/lib/libzpool/kernel.c index 41e0e7815c..8a588e5a9b 100644 --- a/lib/libzpool/kernel.c +++ b/lib/libzpool/kernel.c @@ -1405,3 +1405,27 @@ zfsvfs_update_fromname(const char *oldname, const char *newname) { (void) oldname, (void) newname; } + +void +spa_import_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_export_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_activate_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_deactivate_os(spa_t *spa) +{ + (void) spa; +} diff --git a/module/os/freebsd/zfs/spa_os.c b/module/os/freebsd/zfs/spa_os.c index c8c8334261..6ebb4c285e 100644 --- a/module/os/freebsd/zfs/spa_os.c +++ b/module/os/freebsd/zfs/spa_os.c @@ -268,3 +268,27 @@ spa_history_zone(void) { return ("freebsd"); } + +void +spa_import_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_export_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_activate_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_deactivate_os(spa_t *spa) +{ + (void) spa; +} diff --git a/module/os/linux/zfs/spa_misc_os.c b/module/os/linux/zfs/spa_misc_os.c index 5672cd6d5c..cbdc0f350a 100644 --- a/module/os/linux/zfs/spa_misc_os.c +++ b/module/os/linux/zfs/spa_misc_os.c @@ -108,3 +108,27 @@ spa_history_zone(void) { return ("linux"); } + +void +spa_import_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_export_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_activate_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_deactivate_os(spa_t *spa) +{ + (void) spa; +} diff --git a/module/zfs/spa.c b/module/zfs/spa.c index 647ee17e4c..881a7c94eb 100644 --- a/module/zfs/spa.c +++ b/module/zfs/spa.c @@ -1315,6 +1315,8 @@ spa_activate(spa_t *spa, spa_mode_t mode) spa_error_entry_compare, sizeof (spa_error_entry_t), offsetof(spa_error_entry_t, se_avl)); + spa_activate_os(spa); + spa_keystore_init(&spa->spa_keystore); /* @@ -1451,6 +1453,9 @@ spa_deactivate(spa_t *spa) thread_join(spa->spa_did); spa->spa_did = 0; } + + spa_deactivate_os(spa); + } /* @@ -6031,6 +6036,8 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props, spa->spa_minref = zfs_refcount_count(&spa->spa_refcount); spa->spa_load_state = SPA_LOAD_NONE; + spa_import_os(spa); + mutex_exit(&spa_namespace_lock); return (0); @@ -6214,6 +6221,8 @@ spa_import(char *pool, nvlist_t *config, nvlist_t *props, uint64_t flags) zvol_create_minors_recursive(pool); + spa_import_os(spa); + return (0); } @@ -6461,6 +6470,8 @@ spa_export_common(const char *pool, int new_state, nvlist_t **oldconfig, } export_spa: + spa_export_os(spa); + if (new_state == POOL_STATE_DESTROYED) spa_event_notify(spa, NULL, NULL, ESC_ZFS_POOL_DESTROY); else if (new_state == POOL_STATE_EXPORTED)