From 5d4c60fabed88c17b30379b6c317f10cf466a723 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 6 Oct 2009 12:12:05 -0700 Subject: [PATCH 1/2] Use alternate /etc/zfs/zpool.cache file for in-tree tests Pass an alternate location via module option for the zpool.cache file used by the kernel. This allows us to write in-tree tests which do not modify any out-of-tree files we do not own. This is just standard good behavior for any test suite. Additionally, refine the existing test case to explicity use the cache file when looking for pools to import. And add a second test cache which is forced to probe the disks for available pools to import. --- scripts/Makefile.am | 4 +-- scripts/zconfig.sh | 60 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 977535130d..c8cf54d2fd 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -20,9 +20,9 @@ check: @$(ZFS) -u @echo @echo - @echo -n "====================================" + @echo -n "===================================" @echo -n " ZCONFIG " - @echo "====================================" + @echo "===================================" @echo @$(ZCONFIG) @echo diff --git a/scripts/zconfig.sh b/scripts/zconfig.sh index a90d984fc6..7a215dcee3 100755 --- a/scripts/zconfig.sh +++ b/scripts/zconfig.sh @@ -53,32 +53,66 @@ zconfig_test1() { POOL_NAME=test1 TMP_FILE1=`mktemp` TMP_FILE2=`mktemp` + TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` echo -n "test 1 - persistent zpool.cache: " # Create a pool save its status for comparison. - ${ZFS_SH} || fail 1 + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2 ${ZPOOL} status ${POOL_NAME} >${TMP_FILE1} || fail 3 # Unload/load the module stack to clear any configuration state - # then verify that the pool can be imported and is online. + # then verify the pool is defined in the cache file, it can be + # imported without error, and it matches the original pool. ${ZFS_SH} -u || fail 4 - ${ZFS_SH} || fail 5 - ${ZPOOL} import ${POOL_NAME} || fail 6 - ${ZPOOL} status ${POOL_NAME} >${TMP_FILE2} || fail 7 + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 5 + ${ZPOOL} import -c ${TMP_CACHE} | grep ${POOL_NAME} >/dev/null||fail 6 + ${ZPOOL} import -c ${TMP_CACHE} ${POOL_NAME} || fail 7 + ${ZPOOL} status ${POOL_NAME} >${TMP_FILE2} || fail 8 + cmp ${TMP_FILE1} ${TMP_FILE2} || fail 9 - # Compare the original and imported pool status they should match - cmp ${TMP_FILE1} ${TMP_FILE2} || fail 8 - - # Cleanup the test pool and temporary file - ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 9 - rm -f ${TMP_FILE1} ${TMP_FILE2} || fail 10 - ${ZFS_SH} -u || fail 11 + # Cleanup the test pool and temporary files + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 10 + rm -f ${TMP_FILE1} ${TMP_FILE2} ${TMP_CACHE} || fail 11 + ${ZFS_SH} -u || fail 12 pass } - zconfig_test1 +# Validate ZFS disk scanning and import w/out zpool.cache configuration. +zconfig_test2() { + POOL_NAME=test2 + TMP_FILE1=`mktemp` + TMP_FILE2=`mktemp` + TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` + + echo -n "test 2 - scan disks for pools to import: " + + # Create a pool save its status for comparison. + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2 + ${ZPOOL} status ${POOL_NAME} >${TMP_FILE1} || fail 3 + + # Unload/load the module stack to clear any configuration state + # then remove the cache file, probe the disks for pools, import + # the pool without error, and match it against the original pool. + ${ZFS_SH} -u || fail 4 + rm -f ${TMP_CACHE} || fail 5 + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 6 + ${ZPOOL} import | grep ${POOL_NAME} >/dev/null || fail 7 + ${ZPOOL} import ${POOL_NAME} || fail 8 + ${ZPOOL} status ${POOL_NAME} >${TMP_FILE2} || fail 9 + cmp ${TMP_FILE1} ${TMP_FILE2} || fail 10 + + # Cleanup the test pool and temporary files + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 11 + rm -f ${TMP_FILE1} ${TMP_FILE2} || fail 12 + ${ZFS_SH} -u || fail 13 + + pass +} +zconfig_test2 + exit 0 From 5bc2e9e592697327cc8fdf827e49c11ad812e462 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 6 Oct 2009 12:17:38 -0700 Subject: [PATCH 2/2] Add spa_config_path module option for alternate cache file. --- module/zfs/include/sys/spa_impl.h | 2 +- module/zfs/spa_config.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/module/zfs/include/sys/spa_impl.h b/module/zfs/include/sys/spa_impl.h index 84da684885..8a931a0531 100644 --- a/module/zfs/include/sys/spa_impl.h +++ b/module/zfs/include/sys/spa_impl.h @@ -181,7 +181,7 @@ struct spa { refcount_t spa_refcount; /* number of opens */ }; -extern const char *spa_config_path; +extern char *spa_config_path; #define BOOTFS_COMPRESS_VALID(compress) \ ((compress) == ZIO_COMPRESS_LZJB || \ diff --git a/module/zfs/spa_config.c b/module/zfs/spa_config.c index a589f07584..19dca52c12 100644 --- a/module/zfs/spa_config.c +++ b/module/zfs/spa_config.c @@ -62,7 +62,7 @@ static uint64_t spa_config_generation = 1; * This can be overridden in userland to preserve an alternate namespace for * userland pools when doing testing. */ -const char *spa_config_path = ZPOOL_CACHE; +char *spa_config_path = ZPOOL_CACHE; /* * Called when the module is first loaded, this routine loads the configuration @@ -450,4 +450,7 @@ EXPORT_SYMBOL(spa_all_configs); EXPORT_SYMBOL(spa_config_set); EXPORT_SYMBOL(spa_config_generate); EXPORT_SYMBOL(spa_config_update); + +module_param(spa_config_path, charp, 0444); +MODULE_PARM_DESC(spa_config_path, "SPA config file (/etc/zfs/zpool.cache)"); #endif