From 4ca4dfe9bb6bc12f7724e706a0a166d42665ae5f Mon Sep 17 00:00:00 2001 From: "Ricardo M. Correia" Date: Mon, 2 Aug 2010 11:32:47 -0700 Subject: [PATCH 1/3] Fix taskq_dispatch() call in zio_taskq_dispatch(). The feature branch 'fix-taskq' in Linux's ZFS tree changes the taskq_dispatch() flag from TQ_SLEEP to TQ_NOSLEEP to avoid sleeping in some circumstances. However, this has the side effect that taskq_dispatch() now may fail, and since the return code was not even being checked, it could lead to zio's not being scheduled to execute. I'm fixing this in a simplistic but not very elegant way, by just looping until taskq_dispatch() succeeds. Signed-off-by: Ricardo M. Correia Signed-off-by: Brian Behlendorf --- module/zfs/zio.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/module/zfs/zio.c b/module/zfs/zio.c index 341f00306a..dc3400d3a6 100644 --- a/module/zfs/zio.c +++ b/module/zfs/zio.c @@ -1072,8 +1072,9 @@ zio_taskq_dispatch(zio_t *zio, enum zio_taskq_type q, boolean_t cutinline) q++; ASSERT3U(q, <, ZIO_TASKQ_TYPES); - (void) taskq_dispatch(spa->spa_zio_taskq[t][q], - (task_func_t *)zio_execute, zio, flags); + + while (taskq_dispatch(spa->spa_zio_taskq[t][q], + (task_func_t *)zio_execute, zio, flags) == 0); /* do nothing */ } static boolean_t From 858985a46e1f954131e6b6175412503943b21513 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Mon, 2 Aug 2010 13:15:00 -0700 Subject: [PATCH 2/3] Update zconfig.sh This change updates zconfig.sh to reference /dev/zvol/ instead of simply /dev/. It also extends the texts to verify correct minor device creation for import/export and module load/unload. --- scripts/zconfig.sh | 126 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 122 insertions(+), 4 deletions(-) diff --git a/scripts/zconfig.sh b/scripts/zconfig.sh index b74c57087a..a34e656daa 100755 --- a/scripts/zconfig.sh +++ b/scripts/zconfig.sh @@ -120,7 +120,7 @@ zconfig_test3() { TMP_FILE1=`mktemp` TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` - echo -n "test 3 - ZVOL sanity: " + echo -n "test 3 - zvol+ext3 sanity: " # Create a pool and volume. ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 @@ -129,7 +129,7 @@ zconfig_test3() { # Partition the volume, for a 400M volume there will be # 812 cylinders, 16 heads, and 63 sectors per track. - /sbin/sfdisk -q /dev/${FULL_NAME} << EOF &>${TMP_FILE1} || fail 4 + /sbin/sfdisk -q /dev/zvol/${FULL_NAME} << EOF &>${TMP_FILE1} || fail 4 ,812 ; ; @@ -137,11 +137,11 @@ zconfig_test3() { EOF # Format the partition with ext3. - /sbin/mkfs.ext3 /dev/${FULL_NAME}1 &>${TMP_FILE1} || fail 5 + /sbin/mkfs.ext3 /dev/zvol/${FULL_NAME}1 &>${TMP_FILE1} || fail 5 # Mount the ext3 filesystem and copy some data to it. mkdir -p /tmp/${ZVOL_NAME} || fail 6 - mount /dev/${FULL_NAME}1 /tmp/${ZVOL_NAME} || fail 7 + mount /dev/zvol/${FULL_NAME}1 /tmp/${ZVOL_NAME} || fail 7 cp -RL ${SRC_DIR} /tmp/${ZVOL_NAME} || fail 8 # Verify the copied files match the original files. @@ -159,4 +159,122 @@ EOF } zconfig_test3 +# zpool import/export device check (1 volume, 1 snapshot, 1 clone) +zconfig_test4() { + POOL_NAME=tank + ZVOL_NAME=volume + SNAP_NAME=snapshot + CLONE_NAME=clone + FULL_ZVOL_NAME=${POOL_NAME}/${ZVOL_NAME} + FULL_SNAP_NAME=${POOL_NAME}/${ZVOL_NAME}@${SNAP_NAME} + FULL_CLONE_NAME=${POOL_NAME}/${CLONE_NAME} + TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` + + echo -n "test 4 - zpool import/export device: " + + # Create a pool, volume, snapshot, and clone + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2 + ${ZFS} create -V 100M ${FULL_ZVOL_NAME} || fail 3 + ${ZFS} snapshot ${FULL_SNAP_NAME} || fail 4 + ${ZFS} clone ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 5 + + # Verify the devices were created + stat /dev/zvol/${POOL_NAME} &>/dev/null || fail 6 + stat /dev/zvol/${FULL_ZVOL_NAME} &>/dev/null || fail 7 + stat /dev/zvol/${FULL_SNAP_NAME} &>/dev/null || fail 8 + stat /dev/zvol/${FULL_CLONE_NAME} &>/dev/null || fail 9 + + # Export the pool + ${ZPOOL} export ${POOL_NAME} || fail 10 + + # Verify the devices were removed + stat /dev/zvol/${POOL_NAME} &>/dev/null && fail 11 + stat /dev/zvol/${FULL_ZVOL_NAME} &>/dev/null && fail 12 + stat /dev/zvol/${FULL_SNAP_NAME} &>/dev/null && fail 13 + stat /dev/zvol/${FULL_CLONE_NAME} &>/dev/null && fail 14 + + # Import the pool, wait 1 second for udev + ${ZPOOL} import ${POOL_NAME} && sleep 1 || fail 15 + + # Verify the devices were created + stat /dev/zvol/${POOL_NAME} &>/dev/null || fail 16 + stat /dev/zvol/${FULL_ZVOL_NAME} &>/dev/null || fail 17 + stat /dev/zvol/${FULL_SNAP_NAME} &>/dev/null || fail 18 + stat /dev/zvol/${FULL_CLONE_NAME} &>/dev/null || fail 19 + + # Destroy the pool and consequently the devices + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 20 + + # Verify the devices were removed + stat /dev/zvol/${POOL_NAME} &>/dev/null && fail 21 + stat /dev/zvol/${FULL_ZVOL_NAME} &>/dev/null && fail 22 + stat /dev/zvol/${FULL_SNAP_NAME} &>/dev/null && fail 23 + stat /dev/zvol/${FULL_CLONE_NAME} &>/dev/null && fail 24 + + ${ZFS_SH} -u || fail 25 + + pass +} +zconfig_test4 + +# zpool insmod/rmmod device check (1 volume, 1 snapshot, 1 clone) +zconfig_test5() { + POOL_NAME=tank + ZVOL_NAME=volume + SNAP_NAME=snapshot + CLONE_NAME=clone + FULL_ZVOL_NAME=${POOL_NAME}/${ZVOL_NAME} + FULL_SNAP_NAME=${POOL_NAME}/${ZVOL_NAME}@${SNAP_NAME} + FULL_CLONE_NAME=${POOL_NAME}/${CLONE_NAME} + TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` + + echo -n "test 5 - zpool insmod/rmmod device: " + + # Create a pool, volume, snapshot, and clone + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2 + ${ZFS} create -V 100M ${FULL_ZVOL_NAME} || fail 3 + ${ZFS} snapshot ${FULL_SNAP_NAME} || fail 4 + ${ZFS} clone ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 5 + + # Verify the devices were created + stat /dev/zvol/${POOL_NAME} &>/dev/null || fail 6 + stat /dev/zvol/${FULL_ZVOL_NAME} &>/dev/null || fail 7 + stat /dev/zvol/${FULL_SNAP_NAME} &>/dev/null || fail 8 + stat /dev/zvol/${FULL_CLONE_NAME} &>/dev/null || fail 9 + + # Unload the modules + ${ZFS_SH} -u || fail 10 + + # Verify the devices were removed + stat /dev/zvol/${POOL_NAME} &>/dev/null && fail 11 + stat /dev/zvol/${FULL_ZVOL_NAME} &>/dev/null && fail 12 + stat /dev/zvol/${FULL_SNAP_NAME} &>/dev/null && fail 13 + stat /dev/zvol/${FULL_CLONE_NAME} &>/dev/null && fail 14 + + # Load the modules, wait 1 second for udev + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" && sleep 1 || fail 15 + + # Verify the devices were created + stat /dev/zvol/${POOL_NAME} &>/dev/null || fail 16 + stat /dev/zvol/${FULL_ZVOL_NAME} &>/dev/null || fail 17 + stat /dev/zvol/${FULL_SNAP_NAME} &>/dev/null || fail 18 + stat /dev/zvol/${FULL_CLONE_NAME} &>/dev/null || fail 19 + + # Destroy the pool and consequently the devices + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 20 + + # Verify the devices were removed + stat /dev/zvol/${POOL_NAME} &>/dev/null && fail 21 + stat /dev/zvol/${FULL_ZVOL_NAME} &>/dev/null && fail 22 + stat /dev/zvol/${FULL_SNAP_NAME} &>/dev/null && fail 23 + stat /dev/zvol/${FULL_CLONE_NAME} &>/dev/null && fail 24 + + ${ZFS_SH} -u || fail 25 + + pass +} +zconfig_test5 + exit 0 From 5545adeadf17dc7ef4f85c3090205e382c7d7892 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Fri, 30 Jul 2010 21:40:49 -0700 Subject: [PATCH 3/3] Use sparse files for loopback+file configurations Using sparse files for the test configurations had atleast three significant advantages. 1) Actually test sparse files to ensure they work. 2) Drastically reduce required disk space for the regression test suite. This turns out to be fairly important when running the test suite in a virtualized environment. 3) Significantly speed of the test suite. Run time of zconfig.sh dropped from 2m:56s to 1m:00s on my test system, zpios-sanity.sh nows runs in only 0m:26s. --- scripts/zpool-config/file-raid0.sh | 4 ++-- scripts/zpool-config/file-raid10.sh | 4 ++-- scripts/zpool-config/file-raidz.sh | 4 ++-- scripts/zpool-config/file-raidz2.sh | 4 ++-- scripts/zpool-config/lo-raid0.sh | 4 ++-- scripts/zpool-config/lo-raid10.sh | 8 ++++---- scripts/zpool-config/lo-raidz.sh | 4 ++-- scripts/zpool-config/lo-raidz2.sh | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/scripts/zpool-config/file-raid0.sh b/scripts/zpool-config/file-raid0.sh index 14429c43d9..5ec80b05c1 100644 --- a/scripts/zpool-config/file-raid0.sh +++ b/scripts/zpool-config/file-raid0.sh @@ -12,8 +12,8 @@ zpool_create() { for FILE in ${FILES}; do msg "Creating ${FILE}" rm -f ${FILE} || exit 1 - dd if=/dev/zero of=${FILE} bs=1024k count=256 &>/dev/null || - die "Error $? creating ${FILE}" + dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \ + &>/dev/null || die "Error $? creating ${FILE}" done msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${FILES} diff --git a/scripts/zpool-config/file-raid10.sh b/scripts/zpool-config/file-raid10.sh index a632a4f4cd..ae7f0ae07b 100644 --- a/scripts/zpool-config/file-raid10.sh +++ b/scripts/zpool-config/file-raid10.sh @@ -13,8 +13,8 @@ zpool_create() { for FILE in ${FILES}; do msg "Creating ${FILE}" rm -f ${FILE} || exit 1 - dd if=/dev/zero of=${FILE} bs=1024k count=256 &>/dev/null || - die "Error $? creating ${FILE}" + dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \ + &>/dev/null || die "Error $? creating ${FILE}" done msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} \ diff --git a/scripts/zpool-config/file-raidz.sh b/scripts/zpool-config/file-raidz.sh index 9302c85e97..5b6c3ea2c2 100644 --- a/scripts/zpool-config/file-raidz.sh +++ b/scripts/zpool-config/file-raidz.sh @@ -12,8 +12,8 @@ zpool_create() { for FILE in ${FILES}; do msg "Creating ${FILE}" rm -f ${FILE} || exit 1 - dd if=/dev/zero of=${FILE} bs=1024k count=256 &>/dev/null || - die "Error $? creating ${FILE}" + dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \ + &>/dev/null || die "Error $? creating ${FILE}" done msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} raidz ${FILES} diff --git a/scripts/zpool-config/file-raidz2.sh b/scripts/zpool-config/file-raidz2.sh index 681352783c..bc0e5ec8af 100644 --- a/scripts/zpool-config/file-raidz2.sh +++ b/scripts/zpool-config/file-raidz2.sh @@ -12,8 +12,8 @@ zpool_create() { for FILE in ${FILES}; do msg "Creating ${FILE}" rm -f ${FILE} || exit 1 - dd if=/dev/zero of=${FILE} bs=1024k count=256 &>/dev/null || - die "Error $? creating ${FILE}" + dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \ + &>/dev/null || die "Error $? creating ${FILE}" done msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} raidz2 ${FILES} diff --git a/scripts/zpool-config/lo-raid0.sh b/scripts/zpool-config/lo-raid0.sh index d37d5138f7..321d9b1f71 100644 --- a/scripts/zpool-config/lo-raid0.sh +++ b/scripts/zpool-config/lo-raid0.sh @@ -14,8 +14,8 @@ zpool_create() { DEVICE=`unused_loop_device` msg "Creating ${FILE} using loopback device ${DEVICE}" rm -f ${FILE} || exit 1 - dd if=/dev/zero of=${FILE} bs=1024k count=256 &>/dev/null || - die "Error $? creating ${FILE}" + dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \ + &>/dev/null || die "Error $? creating ${FILE}" ${LOSETUP} ${DEVICE} ${FILE} || die "Error $? creating ${FILE} -> ${DEVICE} loopback" DEVICES="${DEVICES} ${DEVICE}" diff --git a/scripts/zpool-config/lo-raid10.sh b/scripts/zpool-config/lo-raid10.sh index 8d3672dd1b..f9c47cd1e1 100644 --- a/scripts/zpool-config/lo-raid10.sh +++ b/scripts/zpool-config/lo-raid10.sh @@ -16,8 +16,8 @@ zpool_create() { DEVICE=`unused_loop_device` msg "Creating ${FILE} using loopback device ${DEVICE}" rm -f ${FILE} || exit 1 - dd if=/dev/zero of=${FILE} bs=1024k count=256 &>/dev/null || - die "Error $? creating ${FILE}" + dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \ + &>/dev/null || die "Error $? creating ${FILE}" ${LOSETUP} ${DEVICE} ${FILE} || die "Error $? creating ${FILE} -> ${DEVICE} loopback" DEVICES_M1="${DEVICES_M1} ${DEVICE}" @@ -27,8 +27,8 @@ zpool_create() { DEVICE=`unused_loop_device` msg "Creating ${FILE} using loopback device ${DEVICE}" rm -f ${FILE} || exit 1 - dd if=/dev/zero of=${FILE} bs=1024k count=256 &>/dev/null || - die "Error $? creating ${FILE}" + dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \ + &>/dev/null || die "Error $? creating ${FILE}" ${LOSETUP} ${DEVICE} ${FILE} || die "Error $? creating ${FILE} -> ${DEVICE} loopback" DEVICES_M2="${DEVICES_M2} ${DEVICE}" diff --git a/scripts/zpool-config/lo-raidz.sh b/scripts/zpool-config/lo-raidz.sh index 6efcd1041a..509f6ee1d7 100644 --- a/scripts/zpool-config/lo-raidz.sh +++ b/scripts/zpool-config/lo-raidz.sh @@ -14,8 +14,8 @@ zpool_create() { DEVICE=`unused_loop_device` msg "Creating ${FILE} using loopback device ${DEVICE}" rm -f ${FILE} || exit 1 - dd if=/dev/zero of=${FILE} bs=1024k count=256 &>/dev/null || - die "Error $? creating ${FILE}" + dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \ + &>/dev/null || die "Error $? creating ${FILE}" ${LOSETUP} ${DEVICE} ${FILE} || die "Error $? creating ${FILE} -> ${DEVICE} loopback" DEVICES="${DEVICES} ${DEVICE}" diff --git a/scripts/zpool-config/lo-raidz2.sh b/scripts/zpool-config/lo-raidz2.sh index f59c7f2d65..6e61293c0b 100644 --- a/scripts/zpool-config/lo-raidz2.sh +++ b/scripts/zpool-config/lo-raidz2.sh @@ -14,8 +14,8 @@ zpool_create() { DEVICE=`unused_loop_device` msg "Creating ${FILE} using loopback device ${DEVICE}" rm -f ${FILE} || exit 1 - dd if=/dev/zero of=${FILE} bs=1024k count=256 &>/dev/null || - die "Error $? creating ${FILE}" + dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \ + &>/dev/null || die "Error $? creating ${FILE}" ${LOSETUP} ${DEVICE} ${FILE} || die "Error $? creating ${FILE} -> ${DEVICE} loopback" DEVICES="${DEVICES} ${DEVICE}"