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 896b0f956..2ce84c21c 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 41e0e7815..8a588e5a9 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 c8c833426..6ebb4c285 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 5672cd6d5..cbdc0f350 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 647ee17e4..881a7c94e 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)