From 3191b962f6d7a540c09bb0856c7797331616b7fe Mon Sep 17 00:00:00 2001
From: Brian Behlendorf <behlendorf1@llnl.gov>
Date: Fri, 20 Nov 2009 09:59:58 -0800
Subject: [PATCH 1/4] Prevent gcc uninit compiler warning in
 zfs_range_unlock_reader().

---
 module/zfs/zfs_rlock.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/module/zfs/zfs_rlock.c b/module/zfs/zfs_rlock.c
index 4de8d8a2df..1e4988d7fd 100644
--- a/module/zfs/zfs_rlock.c
+++ b/module/zfs/zfs_rlock.c
@@ -460,7 +460,7 @@ static void
 zfs_range_unlock_reader(znode_t *zp, rl_t *remove)
 {
 	avl_tree_t *tree = &zp->z_range_avl;
-	rl_t *rl, *next;
+	rl_t *rl, *next = NULL;
 	uint64_t len;
 
 	/*

From 6fabeffd3b1012968f3983ad698165d10024c182 Mon Sep 17 00:00:00 2001
From: Brian Behlendorf <behlendorf1@llnl.gov>
Date: Fri, 20 Nov 2009 10:04:56 -0800
Subject: [PATCH 2/4] Additional ZVOL compatibility autoconf checks and zconfig
 ZVOL sanity test.

---
 config/kernel-bio-rw-syncio.m4       |  3 +-
 config/kernel-blk-end-request.m4     | 23 +++++++++++--
 config/kernel-blk-rq-bytes.m4        | 22 ++++++++++++-
 config/kernel-rq-for-each_segment.m4 | 20 ++++++++++++
 config/kernel.m4                     |  1 +
 scripts/zconfig.sh                   | 48 ++++++++++++++++++++++++++++
 6 files changed, 113 insertions(+), 4 deletions(-)
 create mode 100644 config/kernel-rq-for-each_segment.m4

diff --git a/config/kernel-bio-rw-syncio.m4 b/config/kernel-bio-rw-syncio.m4
index 93a32e659f..2c80f5c0ea 100644
--- a/config/kernel-bio-rw-syncio.m4
+++ b/config/kernel-bio-rw-syncio.m4
@@ -7,7 +7,8 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_RW_SYNCIO], [
 	ZFS_LINUX_TRY_COMPILE([
 		#include <linux/bio.h>
 	],[
-		int flags = BIO_RW_SYNCIO;
+		int flags;
+		flags = BIO_RW_SYNCIO;
 	],[
 		AC_MSG_RESULT(yes)
 		AC_DEFINE(HAVE_BIO_RW_SYNCIO, 1,
diff --git a/config/kernel-blk-end-request.m4 b/config/kernel-blk-end-request.m4
index 6719516c14..20ad1a9263 100644
--- a/config/kernel-blk-end-request.m4
+++ b/config/kernel-blk-end-request.m4
@@ -1,6 +1,8 @@
 dnl #
-dnl # 2.6.18 API change
-nl #
+dnl # 2.6.31 API change
+dnl # In 2.6.29 kernels blk_end_request() was a GPL-only symbol, this was
+dnl # changed in 2.6.31 so it may be used by non-GPL modules.
+dnl #
 AC_DEFUN([ZFS_AC_KERNEL_BLK_END_REQUEST], [
 	AC_MSG_CHECKING([whether blk_end_request() is available])
 	ZFS_LINUX_TRY_COMPILE([
@@ -15,4 +17,21 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_END_REQUEST], [
 	],[
 		AC_MSG_RESULT(no)
 	])
+
+	AC_MSG_CHECKING([whether blk_end_request() is GPL-only])
+	ZFS_LINUX_TRY_COMPILE([
+		#include <linux/module.h>
+		#include <linux/blkdev.h>
+		
+		MODULE_LICENSE("CDDL");
+	],[
+		struct request *req = NULL;
+		(void) blk_end_request(req, 0, 0);
+	],[
+		AC_MSG_RESULT(no)
+	],[
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_BLK_END_REQUEST_GPL_ONLY, 1,
+		          [blk_end_request() is GPL-only])
+	])
 ])
diff --git a/config/kernel-blk-rq-bytes.m4 b/config/kernel-blk-rq-bytes.m4
index 2655a8f007..da83405cbe 100644
--- a/config/kernel-blk-rq-bytes.m4
+++ b/config/kernel-blk-rq-bytes.m4
@@ -1,5 +1,8 @@
 dnl #
-dnl # 2.6.31 API change
+dnl # 2.6.29 API change
+dnl # In the 2.6.29 kernel blk_rq_bytes() was available as a GPL-only symbol.
+dnl # So we need to check the symbol license as well.  As of 2.6.31 the
+dnl blk_rq_bytes() helper was changed to a static inline which we can use.
 dnl #
 AC_DEFUN([ZFS_AC_KERNEL_BLK_RQ_BYTES], [
 	AC_MSG_CHECKING([whether blk_rq_bytes() is available])
@@ -15,4 +18,21 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_RQ_BYTES], [
 	],[
 		AC_MSG_RESULT(no)
 	])
+
+	AC_MSG_CHECKING([whether blk_rq_bytes() is GPL-only])
+	ZFS_LINUX_TRY_COMPILE([
+		#include <linux/module.h>
+		#include <linux/blkdev.h>
+
+		MODULE_LICENSE("CDDL");
+	],[
+		struct request *req = NULL;
+		(void) blk_rq_bytes(req);
+	],[
+		AC_MSG_RESULT(no)
+	],[
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_BLK_RQ_BYTES_GPL_ONLY, 1,
+		          [blk_rq_bytes() is GPL-only])
+	])
 ])
diff --git a/config/kernel-rq-for-each_segment.m4 b/config/kernel-rq-for-each_segment.m4
new file mode 100644
index 0000000000..15f030f350
--- /dev/null
+++ b/config/kernel-rq-for-each_segment.m4
@@ -0,0 +1,20 @@
+dnl #
+dnl # 2.6.x API change
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_RQ_FOR_EACH_SEGMENT], [
+	AC_MSG_CHECKING([whether rq_for_each_segment() is available])
+	ZFS_LINUX_TRY_COMPILE([
+		#include <linux/blkdev.h>
+	],[
+		struct bio_vec *bv;
+		struct req_iterator iter;
+		struct request *req = NULL;
+		rq_for_each_segment(bv, req, iter) { }
+	],[
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_RQ_FOR_EACH_SEGMENT, 1,
+		          [rq_for_each_segment() is available])
+	],[
+		AC_MSG_RESULT(no)
+	])
+])
diff --git a/config/kernel.m4 b/config/kernel.m4
index 415c928593..6ff4b05e51 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -19,6 +19,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
 	ZFS_AC_KERNEL_BLK_RQ_SECTORS
 	ZFS_AC_KERNEL_GET_DISK_RO
 	ZFS_AC_KERNEL_RQ_IS_SYNC
+	ZFS_AC_KERNEL_RQ_FOR_EACH_SEGMENT
 
 	dnl # Kernel build make options
 	dnl # KERNELMAKE_PARAMS="V=1"	# Enable verbose module build
diff --git a/scripts/zconfig.sh b/scripts/zconfig.sh
index 7a215dcee3..2968ad8dc0 100755
--- a/scripts/zconfig.sh
+++ b/scripts/zconfig.sh
@@ -115,4 +115,52 @@ zconfig_test2() {
 }
 zconfig_test2
 
+# ZVOL sanity check
+zconfig_test3() {
+	POOL_NAME=tank
+	ZVOL_NAME=fish
+	FULL_NAME=${POOL_NAME}/${ZVOL_NAME}
+	SRC_DIR=/bin/
+	TMP_FILE1=`mktemp`
+	TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
+
+	echo -n "test 3 - ZVOL sanity: "
+
+	# Create a pool and volume.
+	${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
+	${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2
+	${ZFS} create -V 400M ${FULL_NAME} || fail 3
+
+	# 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
+,812
+;
+;
+;
+EOF
+
+	# Format the partition with ext3.
+	/sbin/mkfs.ext3 /dev/${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
+	cp -RL ${SRC_DIR} /tmp/${ZVOL_NAME} || fail 8
+
+	# Verify the copied files match the original files.
+	diff -ur ${SRC_DIR} /tmp/${ZVOL_NAME}${SRC_DIR} || fail 9
+
+	# Remove the files, umount, destroy the volume and pool.
+	rm -Rf /tmp/${ZVOL_NAME}${SRC_DIR}* || fail 10
+	umount /tmp/${ZVOL_NAME} || fail 11
+	${ZFS} destroy ${FULL_NAME} || fail 12
+	${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 13
+	rm -f ${TMP_FILE1} || fail 14
+	${ZFS_SH} -u || fail 15
+
+	pass
+}
+zconfig_test3
+
 exit 0

From 23304dc8283f3cc20874a3f67a47cda6418dc871 Mon Sep 17 00:00:00 2001
From: Brian Behlendorf <behlendorf1@llnl.gov>
Date: Fri, 20 Nov 2009 10:12:41 -0800
Subject: [PATCH 3/4] Add 16 drive promise JBOD zpool configs for small test
 setup.

---
 scripts/udev-rules/99-zpool.rules.promise  | 41 ++++++++++++++++++++++
 scripts/zpool-config/promise-raid0-1x16.sh | 20 +++++++++++
 scripts/zpool-config/promise-raid10-8x2.sh | 20 +++++++++++
 scripts/zpool-config/promise-raidz-2x8.sh  | 20 +++++++++++
 scripts/zpool-config/promise-raidz2-2x8.sh | 20 +++++++++++
 5 files changed, 121 insertions(+)
 create mode 100644 scripts/udev-rules/99-zpool.rules.promise
 create mode 100644 scripts/zpool-config/promise-raid0-1x16.sh
 create mode 100644 scripts/zpool-config/promise-raid10-8x2.sh
 create mode 100644 scripts/zpool-config/promise-raidz-2x8.sh
 create mode 100644 scripts/zpool-config/promise-raidz2-2x8.sh

diff --git a/scripts/udev-rules/99-zpool.rules.promise b/scripts/udev-rules/99-zpool.rules.promise
new file mode 100644
index 0000000000..8a32a539b4
--- /dev/null
+++ b/scripts/udev-rules/99-zpool.rules.promise
@@ -0,0 +1,41 @@
+#
+# /etc/udev/rules.d/99-zpool.rules
+#
+
+ENV{DEVTYPE}=="disk", IMPORT{program}="path_id %p"
+
+# Full devices (*:pci*port:*:id-lun)
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:8-lun0",  SYMLINK+="disk/zpool/a1"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:9-lun0",  SYMLINK+="disk/zpool/a2"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:10-lun0", SYMLINK+="disk/zpool/a3"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:11-lun0", SYMLINK+="disk/zpool/a4"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:12-lun0", SYMLINK+="disk/zpool/a5"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:13-lun0", SYMLINK+="disk/zpool/a6"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:14-lun0", SYMLINK+="disk/zpool/a7"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:15-lun0", SYMLINK+="disk/zpool/a8"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:16-lun0", SYMLINK+="disk/zpool/b1"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:17-lun0", SYMLINK+="disk/zpool/b2"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:18-lun0", SYMLINK+="disk/zpool/b3"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:19-lun0", SYMLINK+="disk/zpool/b4"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:20-lun0", SYMLINK+="disk/zpool/b5"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:21-lun0", SYMLINK+="disk/zpool/b6"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:22-lun0", SYMLINK+="disk/zpool/b7"
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="*:07:00.0*0:*:23-lun0", SYMLINK+="disk/zpool/b8"
+
+# Partitions (*:pci*port:*:id-lun)
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:8-lun0",  SYMLINK+="disk/zpool/a1-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:9-lun0",  SYMLINK+="disk/zpool/a2-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:10-lun0", SYMLINK+="disk/zpool/a3-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:11-lun0", SYMLINK+="disk/zpool/a4-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:12-lun0", SYMLINK+="disk/zpool/a5-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:13-lun0", SYMLINK+="disk/zpool/a6-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:14-lun0", SYMLINK+="disk/zpool/a7-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:15-lun0", SYMLINK+="disk/zpool/a8-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:16-lun0", SYMLINK+="disk/zpool/b1-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:17-lun0", SYMLINK+="disk/zpool/b2-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:18-lun0", SYMLINK+="disk/zpool/b3-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:19-lun0", SYMLINK+="disk/zpool/b4-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:20-lun0", SYMLINK+="disk/zpool/b5-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:21-lun0", SYMLINK+="disk/zpool/b6-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:22-lun0", SYMLINK+="disk/zpool/b7-part%n"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="*:07:00.0*0:*:23-lun0", SYMLINK+="disk/zpool/b8-part%n"
diff --git a/scripts/zpool-config/promise-raid0-1x16.sh b/scripts/zpool-config/promise-raid0-1x16.sh
new file mode 100644
index 0000000000..0136fe3a22
--- /dev/null
+++ b/scripts/zpool-config/promise-raid0-1x16.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Flash (White Box) Raid-0 Configuration (1x16)
+#
+
+RANKS=8
+CHANNELS=2
+
+zpool_create() {
+	udev_setup ${UDEVDIR}/99-zpool.rules.promise
+	udev_raid0_setup ${RANKS} ${CHANNELS}
+
+	msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID0S[*]}
+	${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID0S[*]} || exit 1
+}
+
+zpool_destroy() {
+	msg ${ZPOOL} destroy ${ZPOOL_NAME}
+	${ZPOOL} destroy ${ZPOOL_NAME}
+}
diff --git a/scripts/zpool-config/promise-raid10-8x2.sh b/scripts/zpool-config/promise-raid10-8x2.sh
new file mode 100644
index 0000000000..a16f0d0f5c
--- /dev/null
+++ b/scripts/zpool-config/promise-raid10-8x2.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Flash (White Box) Raid-10 Configuration (10x2(1+1))
+#
+
+RANKS=8
+CHANNELS=2
+
+zpool_create() {
+	udev_setup ${UDEVDIR}/99-zpool.rules.promise
+	udev_raid10_setup ${RANKS} ${CHANNELS}
+
+	msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID10S[*]}
+	${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID10S[*]} || exit 1
+}
+
+zpool_destroy() {
+	msg ${ZPOOL} destroy ${ZPOOL_NAME}
+	${ZPOOL} destroy ${ZPOOL_NAME}
+}
diff --git a/scripts/zpool-config/promise-raidz-2x8.sh b/scripts/zpool-config/promise-raidz-2x8.sh
new file mode 100644
index 0000000000..0f6223f38e
--- /dev/null
+++ b/scripts/zpool-config/promise-raidz-2x8.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Flash (White Box) Raid-Z Configuration (2x8(7+1))
+#
+
+RANKS=8
+CHANNELS=2
+
+zpool_create() {
+	udev_setup ${UDEVDIR}/99-zpool.rules.promise
+	udev_raidz_setup ${RANKS} ${CHANNELS}
+
+	msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZS[*]}
+	${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZS[*]} || exit 1
+}
+
+zpool_destroy() {
+	msg ${ZPOOL} destroy ${ZPOOL_NAME}
+	${ZPOOL} destroy ${ZPOOL_NAME}
+}
diff --git a/scripts/zpool-config/promise-raidz2-2x8.sh b/scripts/zpool-config/promise-raidz2-2x8.sh
new file mode 100644
index 0000000000..5b642dd221
--- /dev/null
+++ b/scripts/zpool-config/promise-raidz2-2x8.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Flash (White Box) Raid-Z2 Configuration (2x8(6+2))
+#
+
+RANKS=8
+CHANNELS=2
+
+zpool_create() {
+	udev_setup ${UDEVDIR}/99-zpool.rules.promise
+	udev_raidz2_setup ${RANKS} ${CHANNELS}
+
+	msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZ2S[*]}
+	${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZ2S[*]} || exit 1
+}
+
+zpool_destroy() {
+	msg ${ZPOOL} destroy ${ZPOOL_NAME}
+	${ZPOOL} destroy ${ZPOOL_NAME}
+}

From 0160d32326ca3c6411c18d37083a7f44fc4a48bb Mon Sep 17 00:00:00 2001
From: Brian Behlendorf <behlendorf1@llnl.gov>
Date: Fri, 20 Nov 2009 10:16:37 -0800
Subject: [PATCH 4/4] Symbol spa_busy() not required in Linux port removing
 EXPORT_SYMBOL

---
 module/zfs/spa_misc.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/module/zfs/spa_misc.c b/module/zfs/spa_misc.c
index 18c4359075..f350106c58 100644
--- a/module/zfs/spa_misc.c
+++ b/module/zfs/spa_misc.c
@@ -1487,7 +1487,6 @@ EXPORT_SYMBOL(spa_get_space);
 EXPORT_SYMBOL(spa_get_dspace);
 EXPORT_SYMBOL(spa_get_asize);
 EXPORT_SYMBOL(spa_max_replication);
-EXPORT_SYMBOL(spa_busy);
 EXPORT_SYMBOL(spa_get_failmode);
 EXPORT_SYMBOL(spa_suspended);