Skip to content

Commit

Permalink
Call zvol_create_minors() in spa_open_common() when initializing pool
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Pawel Jakub Dawidek authored and behlendorf committed Jul 3, 2013
1 parent c76955e commit 526af78
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
13 changes: 13 additions & 0 deletions module/zfs/spa.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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;

Expand All @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}

Expand Down
3 changes: 0 additions & 3 deletions module/zfs/zfs_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1268,9 +1268,6 @@ zfs_ioc_pool_import(zfs_cmd_t *zc)
error = err;
}

if (error == 0)
zvol_create_minors(zc->zc_name);

nvlist_free(config);

if (props)
Expand Down

0 comments on commit 526af78

Please sign in to comment.