diff options
author | Pawel Jakub Dawidek <[email protected]> | 2013-05-28 07:50:38 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2013-07-03 09:22:44 -0700 |
commit | 526af78550eb5ccf80ce11e7a9c26f203ae671b0 (patch) | |
tree | ceb4fbcf66950f9898c3018ed8b0fe58d61289e4 /module/zfs/spa.c | |
parent | c76955eaa5477a71f711e6865a923e7055f8b3cb (diff) |
Call zvol_create_minors() in spa_open_common() when initializing pool
There is an extremely odd bug that causes zvols to fail to appear on
some systems, but not others. Recently, I was able to consistently
reproduce this issue over a period of 1 month. The issue disappeared
after I applied this change from FreeBSD.
This is from FreeBSD's pool version 28 import, which occurred in
revision 219089.
Ported-by: Richard Yao <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Issue #441
Issue #599
Diffstat (limited to 'module/zfs/spa.c')
-rw-r--r-- | module/zfs/spa.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/module/zfs/spa.c b/module/zfs/spa.c index e986e924d..65f78b784 100644 --- a/module/zfs/spa.c +++ b/module/zfs/spa.c @@ -64,6 +64,7 @@ #include <sys/zfs_ioctl.h> #include <sys/dsl_scan.h> #include <sys/zfeature.h> +#include <sys/zvol.h> #ifdef _KERNEL #include <sys/bootprops.h> @@ -2856,6 +2857,7 @@ spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy, spa_load_state_t state = SPA_LOAD_OPEN; int error; int locked = B_FALSE; + int firstopen = B_FALSE; *spapp = NULL; @@ -2879,6 +2881,8 @@ spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy, if (spa->spa_state == POOL_STATE_UNINITIALIZED) { zpool_rewind_policy_t policy; + firstopen = B_TRUE; + zpool_get_rewind_policy(nvpolicy ? nvpolicy : spa->spa_config, &policy); if (policy.zrp_request & ZPOOL_DO_REWIND) @@ -2953,6 +2957,11 @@ spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy, mutex_exit(&spa_namespace_lock); } +#ifdef _KERNEL + if (firstopen) + zvol_create_minors(spa->spa_name); +#endif + *spapp = spa; return (0); @@ -4010,6 +4019,10 @@ spa_import(const char *pool, nvlist_t *config, nvlist_t *props, uint64_t flags) mutex_exit(&spa_namespace_lock); spa_history_log_version(spa, LOG_POOL_IMPORT); +#ifdef _KERNEL + zvol_create_minors(pool); +#endif + return (0); } |