]> git.openfabrics.org - ~aditr/compat-rdma-docs.git/commitdiff
Updated SRP Target README
authorVu Pham <vuhuong@mellanox.com>
Sun, 7 Mar 2010 09:18:49 +0000 (11:18 +0200)
committerVladimir Sokolovsky <vlad@mellanox.co.il>
Sun, 7 Mar 2010 09:18:49 +0000 (11:18 +0200)
Updated to reflect new scst-1.0.1.1 package, and address
bug #78193 in flow manager.

Signed-off-by: Vu Pham <vuhuong@mellanox.com>
SRPT_README.txt

index 8d13e8e7d0b4f35b1afe9f6daaed9c6ab2cea441..2a6ef59f0c9be59b342a7413807c195f8612f68f 100644 (file)
-SCSI RDMA Protocol (SRP) Target driver for Linux\r
-=================================================\r
-\r
-SRP Target driver is designed to work directly on top of OpenFabrics\r
-OFED-1.x software stack (http://www.openfabrics.org) or Infiniband\r
-drivers in Linux kernel tree (kernel.org). It also interfaces with \r
-Generic SCSI target mid-level driver - SCST (http://scst.sourceforge.net)\r
-\r
-By interfacing with SCST driver we are able to work and support a lot IO\r
-modes on real or virtual devices in the backend\r
-1. scst_disk  -- interfacing with scsi sub-system to claim and export real\r
-scsi devices ie. disks, hardware raid volumes, tape library as SRP's luns\r
-\r
-2. scst_vdisk -- fileio and blockio modes. This allows you to turn software\r
-raid volumes, LVM volumes, IDE disks, block devices and normal files into\r
-SRP's luns\r
-\r
-3. NULLIO mode will allow you to measure the performance without sending IOs\r
-to *real* devices\r
-\r
-\r
-Prerequisites\r
--------------\r
-0. Supported distributions: RHEL 5.3/5.4, SLES 10 sp2, SLES 11 \r
-\r
-Note: On distribution default kernels you can run scst_vdisk blockio mode\r
-      to have good performance. You can also run scst_disk ie. scsi pass-thru\r
-      mode; however, you have to compile scst with -DSTRICT_SERIALIZING \r
-      enabled and this does not yield good performance.\r
-      It is required to recompile the kernel to have good performance with\r
-      scst_disk ie. scsi pass-thru mode\r
-\r
-1. Download and install SCST driver.\r
-\r
-a. download scst-1.0.1.tar.gz from this URL\r
-   http://scst.sourceforge.net/downloads.html\r
-\r
-b. untar and install scst-1.0.1\r
-   $ tar zxvf scst-1.0.1.tar.gz\r
-   $ cd scst-1.0.1\r
-  \r
-   For RedHat 5.2/5.3/5.4 and SLES 11:\r
-   $ make && make install\r
-\r
-   For SLES 10 sp2\r
-   . Save the following patch to /tmp/scst_sles10_sp2.patch\r
-\r
-/************************  Start scst_sless_spX.patch *********************/\r
-\r
-diff -Naur scst-1.0.1/src/scst_lib.c scst-1.0.1.wk/src/scst_lib.c\r
---- scst-1.0.1/src/scst_lib.c  2009-04-27 12:14:21.000000000 -0700\r
-+++ scst-1.0.1.wk/src/scst_lib.c       2009-08-14 13:53:40.000000000 -0700\r
-@@ -1680,7 +1680,7 @@\r
-       return res;\r
- }\r
\r
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)\r
- static void scst_req_done(struct scsi_cmnd *scsi_cmd)\r
- {\r
-       struct scsi_request *req;\r
-@@ -1743,7 +1743,7 @@\r
-       TRACE_EXIT();\r
-       return;\r
- }\r
--#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) */\r
-+#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) */\r
- static void scst_send_release(struct scst_device *dev)\r
- {\r
-       struct scsi_device *scsi_dev;\r
-@@ -1790,7 +1790,7 @@\r
-       TRACE_EXIT();\r
-       return;\r
- }\r
--#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) */\r
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) */\r
\r
- /* scst_mutex supposed to be held */\r
- static void scst_clear_reservation(struct scst_tgt_dev *tgt_dev)\r
-@@ -2038,7 +2038,7 @@\r
-       sBUG_ON(cmd->inc_blocking || cmd->needs_unblocking ||\r
-               cmd->dec_on_dev_needed);\r
\r
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)\r
- #if defined(CONFIG_SCST_EXTRACHECKS)\r
-       if (cmd->scsi_req) {\r
-               PRINT_ERROR("%s: %s", __func__, "Cmd with unfreed "\r
-@@ -2212,7 +2212,7 @@\r
-       return;\r
- }\r
\r
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)\r
- int scst_alloc_request(struct scst_cmd *cmd)\r
- {\r
-       int res = 0;\r
-diff -Naur scst-1.0.1/src/scst_main.c scst-1.0.1.wk/src/scst_main.c\r
---- scst-1.0.1/src/scst_main.c 2009-04-27 12:13:59.000000000 -0700\r
-+++ scst-1.0.1.wk/src/scst_main.c      2009-08-14 13:56:17.000000000 -0700\r
-@@ -1672,7 +1672,7 @@\r
\r
-       TRACE_ENTRY();\r
\r
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)\r
-       {\r
-               struct scsi_request *req;\r
-               BUILD_BUG_ON(SCST_SENSE_BUFFERSIZE !=\r
-diff -Naur scst-1.0.1/src/scst_priv.h scst-1.0.1.wk/src/scst_priv.h\r
---- scst-1.0.1/src/scst_priv.h 2009-04-27 12:14:12.000000000 -0700\r
-+++ scst-1.0.1.wk/src/scst_priv.h      2009-08-14 16:29:11.000000000 -0700\r
-@@ -27,7 +27,7 @@\r
- #include <scsi/scsi_device.h>\r
- #include <scsi/scsi_host.h>\r
\r
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)\r
- #include <scsi/scsi_request.h>\r
- #endif\r
\r
-@@ -322,7 +322,7 @@\r
- void scst_check_retries(struct scst_tgt *tgt);\r
- void scst_tgt_retry_timer_fn(unsigned long arg);\r
\r
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)\r
- int scst_alloc_request(struct scst_cmd *cmd);\r
- void scst_release_request(struct scst_cmd *cmd);\r
\r
-diff -Naur scst-1.0.1/src/scst_targ.c scst-1.0.1.wk/src/scst_targ.c\r
---- scst-1.0.1/src/scst_targ.c 2009-04-27 12:14:27.000000000 -0700\r
-+++ scst-1.0.1.wk/src/scst_targ.c      2009-08-14 13:55:23.000000000 -0700\r
-@@ -1272,7 +1272,7 @@\r
-       return context;\r
- }\r
\r
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)\r
- static inline struct scst_cmd *scst_get_cmd(struct scsi_cmnd *scsi_cmd,\r
-                                           struct scsi_request **req)\r
- {\r
-@@ -1324,7 +1324,7 @@\r
-       TRACE_EXIT();\r
-       return;\r
- }\r
--#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) */\r
-+#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) */\r
- static void scst_cmd_done(void *data, char *sense, int result, int resid)\r
- {\r
-       struct scst_cmd *cmd;\r
-@@ -1346,7 +1346,7 @@\r
-       TRACE_EXIT();\r
-       return;\r
- }\r
--#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) */\r
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) */\r
\r
- static void scst_cmd_done_local(struct scst_cmd *cmd, int next_state,\r
-       enum scst_exec_context pref_context)\r
-@@ -1875,7 +1875,7 @@\r
- static int scst_do_real_exec(struct scst_cmd *cmd)\r
- {\r
-       int res = SCST_EXEC_NOT_COMPLETED;\r
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16)\r
-       int rc;\r
- #endif\r
-       bool atomic = scst_cmd_atomic(cmd);\r
-@@ -1942,7 +1942,7 @@\r
-       }\r
- #endif\r
\r
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)\r
-       if (unlikely(scst_alloc_request(cmd) != 0)) {\r
-               if (atomic) {\r
-                       res = SCST_EXEC_NEED_THREAD;\r
-@@ -1993,7 +1993,7 @@\r
-       scst_set_cmd_error(cmd, SCST_LOAD_SENSE(scst_sense_hardw_error));\r
-       goto out_done;\r
\r
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)\r
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)\r
- out_busy:\r
-       scst_set_busy(cmd);\r
-       /* go through */\r
-/************************  End scst_sless10_sp2.patch ***********************/\r
-\r
-   . patch -p1 < /tmp/scst_sles10_sp2.patch\r
-   . make && make install\r
-\r
-c. Save the following patch into /tmp/scst.patch.\r
-   If you run SLES 11 you can skip steps (c,d) and go directly to step (2)\r
-\r
-/************************  Start scst.patch *********************/\r
-diff -Naur scst/scst.h scst.wk/scst.h\r
---- scst/scst.h        2009-08-14 17:09:47.000000000 -0700\r
-+++ scst.wk/scst.h     2009-08-14 17:01:28.000000000 -0700\r
-@@ -2581,7 +2581,7 @@\r
- void scst_aen_done(struct scst_aen *aen);\r
\r
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)\r
--\r
-+#ifndef RHEL_RELEASE_CODE\r
- static inline struct page *sg_page(struct scatterlist *sg)\r
- {\r
-       return sg->page;\r
-@@ -2610,6 +2610,7 @@\r
-       sg->length = len;\r
- }\r
\r
-+#endif\r
- #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24) */\r
\r
- static inline void sg_clear(struct scatterlist *sg)\r
-/************************  End scst.patch *********************/\r
-\r
-d. patch scst.h file with /tmp/scsi_tgt.patch\r
-   $ cd /usr/local/include/scst;\r
-   $ patch -p1 < /tmp/scst.patch\r
-\r
-2. Download/install OFED-1.5 - SRP target is part of OFED\r
-\r
-Note: if your system already have OFED stack installed, you need to remove\r
-      all the previous built RPMs and reinstall\r
-      \r
-   $ cd ~/OFED-1.5\r
-   $ rm RPMS/*\r
-   $ ./install.pl -c ofed.conf\r
-\r
-a. download OFED packages from this URL\r
-   http://www.openfabrics.org/downloads/OFED/\r
-\r
-b. install OFED - remember to choose srpt=y\r
-   $ cd ~/OFED-1.5\r
-   $ ./install.pl\r
-\r
-\r
-How-to run\r
------------\r
-A. On srp target machine\r
-\r
-1. Please refer to SCST's README for loading scst driver and its dev_handlers\r
-drivers (scst_disk, scst_vdisk block or file IO mode, nullio, ...)\r
-\r
-Note: In any mode you always need to have lun 0 in any group's device list\r
-      Then you can have any lun number following lun 0 (it does not required\r
-      have lun number in order except that the first lun is always 0)\r
-\r
-      Setting SRPT_LOAD=yes in /etc/infiniband/openib.conf is not good enough\r
-      It only load ib_srpt module and does not load scst and its dev_handlers\r
\r
-Example 1: working with VDISK BLOCKIO mode\r
-           (using md0 device, sda, and cciss/c1d0)\r
-a. modprobe scst\r
-b. modprobe scst_vdisk\r
-c. echo "open vdisk0 /dev/md0 BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk\r
-d. echo "open vdisk1 /dev/sda BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk\r
-e. echo "open vdisk2 /dev/cciss/c1d0 BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk\r
-f. echo "add vdisk0 0" >/proc/scsi_tgt/groups/Default/devices\r
-g. echo "add vdisk1 1" >/proc/scsi_tgt/groups/Default/devices\r
-h. echo "add vdisk2 2" >/proc/scsi_tgt/groups/Default/devices\r
-\r
-Example 2: working with real back-end scsi disks in scsi pass-thru mode\r
-a. modprobe scst\r
-b. modprobe scst_disk\r
-c. cat /proc/scsi_tgt/scsi_tgt\r
-ibstor00:~ # cat /proc/scsi_tgt/scsi_tgt \r
-Device (host:ch:id:lun or name)                             Device handler\r
-0:0:0:0                                                     dev_disk\r
-4:0:0:0                                                     dev_disk\r
-5:0:0:0                                                     dev_disk\r
-6:0:0:0                                                     dev_disk\r
-7:0:0:0                                                     dev_disk\r
-\r
-Now you want to exclude the first scsi disk and expose the last 4 scsi disks\r
-as IB/SRP luns for I/O\r
-\r
-echo "add 4:0:0:0 0" >/proc/scsi_tgt/groups/Default/devices\r
-echo "add 5:0:0:0 1" >/proc/scsi_tgt/groups/Default/devices\r
-echo "add 6:0:0:0 2" >/proc/scsi_tgt/groups/Default/devices\r
-echo "add 7:0:0:0 3" >/proc/scsi_tgt/groups/Default/devices\r
-\r
-Example 3: working with scst_vdisk FILEIO mode\r
-           (using md0 device and file 10G-file)\r
-a. modprobe scst\r
-b. modprobe scst_vdisk\r
-c. echo "open vdisk0 /dev/md0" > /proc/scsi_tgt/vdisk/vdisk\r
-d. echo "open vdisk1 /10G-file" > /proc/scsi_tgt/vdisk/vdisk\r
-e. echo "add vdisk0 0" >/proc/scsi_tgt/groups/Default/devices\r
-f. echo "add vdisk1 1" >/proc/scsi_tgt/groups/Default/devices\r
-\r
-2. modprobe ib_srpt\r
-\r
-B. On initiator machines you can manualy do the following steps:\r
-\r
-1. modprobe ib_srp\r
-2. ipsrpdm -c -d /dev/infiniband/umadX \r
-   (to discover new SRP target)\r
-   umad0: port 1 of the first HCA\r
-   umad1: port 2 of the first HCA\r
-   umad2: port 1 of the second HCA\r
-3. echo {new target info} > /sys/class/infiniband_srp/srp-mthca0-1/add_target\r
-4. fdisk -l (will show new discovered scsi disks)\r
-\r
-Example:\r
-Assume that you use port 1 of first HCA in the system ie. mthca0\r
-\r
-[root@lab104 ~]# ibsrpdm -c -d /dev/infiniband/umad0\r
-id_ext=0002c90200226cf4,ioc_guid=0002c90200226cf4,\r
-dgid=fe800000000000000002c90200226cf5,pkey=ffff,service_id=0002c90200226cf4\r
-[root@lab104 ~]# echo id_ext=0002c90200226cf4,ioc_guid=0002c90200226cf4,\r
-dgid=fe800000000000000002c90200226cf5,pkey=ffff,service_id=0002c90200226cf4 >\r
-/sys/class/infiniband_srp/srp-mthca0-1/add_target\r
-\r
-OR\r
-\r
-+ You can edit /etc/infiniband/openib.conf to load srp driver and srp HA daemon\r
-automatically ie. set SRP_LOAD=yes, and SRPHA_ENABLE=yes\r
-+ To set up and use high availability feature you need dm-multipath driver\r
-and multipath tool\r
-+ Please refer to OFED-1.x SRP's user manual for more in-details instructions\r
-on how-to enable/use HA feature\r
-\r
-Here is an example of srp target setup file\r
---------------------------------------------\r
-\r
-#!/bin/sh\r
-\r
-modprobe scst scst_threads=1\r
-modprobe scst_vdisk scst_vdisk_ID=100\r
-\r
-echo "open vdisk0 /dev/cciss/c1d0 BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk\r
-echo "open vdisk1 /dev/sdb BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk\r
-echo "open vdisk2 /dev/sdc BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk\r
-echo "open vdisk3 /dev/sdd BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk\r
-echo "add vdisk0 0" > /proc/scsi_tgt/groups/Default/devices\r
-echo "add vdisk1 1" > /proc/scsi_tgt/groups/Default/devices\r
-echo "add vdisk2 2" > /proc/scsi_tgt/groups/Default/devices\r
-echo "add vdisk3 3" > /proc/scsi_tgt/groups/Default/devices\r
-\r
-modprobe ib_srpt\r
-\r
-echo "add "mgmt"" > /proc/scsi_tgt/trace_level\r
-echo "add "mgmt_dbg"" > /proc/scsi_tgt/trace_level\r
-echo "add "out_of_mem"" > /proc/scsi_tgt/trace_level\r
-\r
-\r
-How-to unload/shutdown\r
------------------------\r
-\r
-1. Unload ib_srpt\r
- $ modprobe -r ib_srpt\r
-2. Unload scst and its dev_handlers first\r
- $ modprobe -r scst_vdisk scst\r
-3. Unload ofed\r
- $ /etc/rc.d/openibd stop\r
+SCSI RDMA Protocol (SRP) Target driver for Linux
+=================================================
+
+SRP Target driver is designed to work directly on top of OpenFabrics
+OFED-1.x software stack (http://www.openfabrics.org) or Infiniband
+drivers in Linux kernel tree (kernel.org). It also interfaces with 
+Generic SCSI target mid-level driver - SCST (http://scst.sourceforge.net)
+
+By interfacing with SCST driver we are able to work and support a lot IO
+modes on real or virtual devices in the backend
+
+1. scst_disk  -- interfacing with scsi sub-system to claim and export real
+   scsi devices ie. disks, hardware raid volumes, tape library as SRP's luns
+
+2. scst_vdisk -- fileio and blockio modes. This allows you to turn software
+   raid volumes, LVM volumes, IDE disks, block devices and normal files into
+   SRP's luns
+
+3. NULLIO mode will allow you to measure the performance without sending IOs
+   to *real* devices
+
+
+Prerequisites
+-------------
+0. Supported distributions: RHEL 5.2/5.3/5.4, SLES 10 sp2, SLES 11 
+
+NOTES: On distribution default kernels you can run scst_vdisk blockio mode
+       to have good performance. You can also run scst_disk ie. scsi pass-thru
+       mode; however, you have to compile scst with -DSTRICT_SERIALIZING 
+       enabled and this does not yield good performance.
+       It is required to recompile the kernel to have good performance with
+       scst_disk ie. scsi pass-thru mode
+
+1. Download and install SCST driver (supported version 1.0.1.1)
+
+1a. Download scst-1.0.1.1.tar.gz from this URL
+    http://scst.sourceforge.net/downloads.html
+
+1b. untar and install scst-1.0.1.1
+
+    $ tar zxvf scst-1.0.1.1.tar.gz
+    $ cd scst-1.0.1.1
+  
+    THIS STEP IS SPECIFIC FOR SLES 10 sp2 distribution:
+    . Save the following patch to /tmp/scst_sles10_sp2.patch
+
+/************************  Start scst_sless_sp2.patch *********************/
+
+diff -Naur scst-1.0.1.1-orig/src/scst_lib.c scst-1.0.1.1/src/scst_lib.c
+--- scst-1.0.1.1-orig/src/scst_lib.c   2010-03-05 18:17:22.000000000 -0800
++++ scst-1.0.1.1/src/scst_lib.c        2010-03-05 18:22:50.000000000 -0800
+@@ -1680,7 +1680,7 @@
+       return res;
+ }
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
+ static void scst_req_done(struct scsi_cmnd *scsi_cmd)
+ {
+       struct scsi_request *req;
+@@ -1743,7 +1743,7 @@
+       TRACE_EXIT();
+       return;
+ }
+-#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) */
++#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) */
+ static void scst_send_release(struct scst_device *dev)
+ {
+       struct scsi_device *scsi_dev;
+@@ -1790,7 +1790,7 @@
+       TRACE_EXIT();
+       return;
+ }
+-#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) */
++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) */
+ /* scst_mutex supposed to be held */
+ static void scst_clear_reservation(struct scst_tgt_dev *tgt_dev)
+@@ -2038,7 +2038,7 @@
+       sBUG_ON(cmd->inc_blocking || cmd->needs_unblocking ||
+               cmd->dec_on_dev_needed);
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
+ #if defined(CONFIG_SCST_EXTRACHECKS)
+       if (cmd->scsi_req) {
+               PRINT_ERROR("%s: %s", __func__, "Cmd with unfreed "
+@@ -2212,7 +2212,7 @@
+       return;
+ }
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
+ int scst_alloc_request(struct scst_cmd *cmd)
+ {
+       int res = 0;
+diff -Naur scst-1.0.1.1-orig/src/scst_main.c scst-1.0.1.1/src/scst_main.c
+--- scst-1.0.1.1-orig/src/scst_main.c  2010-03-05 18:17:22.000000000 -0800
++++ scst-1.0.1.1/src/scst_main.c       2010-03-05 18:34:48.000000000 -0800
+@@ -1676,7 +1676,7 @@
+       TRACE_ENTRY();
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
+       {
+               struct scsi_request *req;
+               BUILD_BUG_ON(SCST_SENSE_BUFFERSIZE !=
+diff -Naur scst-1.0.1.1-orig/src/scst_priv.h scst-1.0.1.1/src/scst_priv.h
+--- scst-1.0.1.1-orig/src/scst_priv.h  2010-03-05 18:17:22.000000000 -0800
++++ scst-1.0.1.1/src/scst_priv.h       2010-03-05 18:35:07.000000000 -0800
+@@ -27,7 +27,7 @@
+ #include <scsi/scsi_device.h>
+ #include <scsi/scsi_host.h>
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
+ #include <scsi/scsi_request.h>
+ #endif
+@@ -322,7 +322,7 @@
+ void scst_check_retries(struct scst_tgt *tgt);
+ void scst_tgt_retry_timer_fn(unsigned long arg);
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
+ int scst_alloc_request(struct scst_cmd *cmd);
+ void scst_release_request(struct scst_cmd *cmd);
+diff -Naur scst-1.0.1.1-orig/src/scst_targ.c scst-1.0.1.1/src/scst_targ.c
+--- scst-1.0.1.1-orig/src/scst_targ.c  2010-03-05 18:17:22.000000000 -0800
++++ scst-1.0.1.1/src/scst_targ.c       2010-03-05 18:36:03.000000000 -0800
+@@ -1273,7 +1273,7 @@
+       return context;
+ }
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
+ static inline struct scst_cmd *scst_get_cmd(struct scsi_cmnd *scsi_cmd,
+                                           struct scsi_request **req)
+ {
+@@ -1325,7 +1325,7 @@
+       TRACE_EXIT();
+       return;
+ }
+-#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) */
++#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) */
+ static void scst_cmd_done(void *data, char *sense, int result, int resid)
+ {
+       struct scst_cmd *cmd;
+@@ -1347,7 +1347,7 @@
+       TRACE_EXIT();
+       return;
+ }
+-#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) */
++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) */
+ static void scst_cmd_done_local(struct scst_cmd *cmd, int next_state,
+       enum scst_exec_context pref_context)
+@@ -1881,7 +1881,7 @@
+ static int scst_do_real_exec(struct scst_cmd *cmd)
+ {
+       int res = SCST_EXEC_NOT_COMPLETED;
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16)
+       int rc;
+ #endif
+       bool atomic = scst_cmd_atomic(cmd);
+@@ -1948,7 +1948,7 @@
+       }
+ #endif
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
+       if (unlikely(scst_alloc_request(cmd) != 0)) {
+               if (atomic) {
+                       res = SCST_EXEC_NEED_THREAD;
+@@ -1999,7 +1999,7 @@
+       scst_set_cmd_error(cmd, SCST_LOAD_SENSE(scst_sense_hardw_error));
+       goto out_done;
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
+ out_busy:
+       scst_set_busy(cmd);
+       /* go through */
+
+/************************  End scst_sless10_sp2.patch ***********************/
+
+    . $ patch -p1 < /tmp/scst_sles10_sp2.patch
+
+
+    For all distributions:
+
+    $ make && make install
+
+1c. Creating file /tmp/scst.patch.
+
+    NOTES: FOR SLES 11 distribution, skip this step and go directly to step (2)
+
+    . Other distributions please save the following patch to /tmp/scst.patch
+
+/************************  Start scst.patch *********************/
+diff -Naur scst/scst.h scst.wk/scst.h
+--- scst/scst.h        2009-08-14 17:09:47.000000000 -0700
++++ scst.wk/scst.h     2009-08-14 17:01:28.000000000 -0700
+@@ -2581,7 +2581,7 @@
+ void scst_aen_done(struct scst_aen *aen);
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
+-
++#ifndef RHEL_RELEASE_CODE
+ static inline struct page *sg_page(struct scatterlist *sg)
+ {
+       return sg->page;
+@@ -2610,6 +2610,7 @@
+       sg->length = len;
+ }
++#endif
+ #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24) */
+ static inline void sg_clear(struct scatterlist *sg)
+/************************  End scst.patch *********************/
+
+
+1d. patch scst.h header file with /tmp/scst.patch
+
+    $ cd /usr/local/include/scst
+    $ patch -p1 < /tmp/scst.patch
+
+
+2. Download/install OFED-1.5.1 package - SRP target is part of OFED package
+
+NOTES: if your system already have OFED stack installed, you need to remove
+       all the previous built RPMs and reinstall
+      
+   $ cd ~/OFED-1.5.1
+   $ rm RPMS/*
+   $ ./install.pl -c ofed.conf
+
+2a. download OFED packages from this URL
+    http://www.openfabrics.org/downloads/OFED/OFED-1.5.1/
+
+2b. install OFED - remember to choose srpt=y
+
+   $ cd ~/OFED-1.5.1
+   $ ./install.pl
+
+
+How-to run
+-----------
+
+A. On srp target machine
+
+A1. Please refer to SCST's README for loading scst driver and its dev_handlers
+    drivers (scst_disk, scst_vdisk block or file IO mode, nullio, ...)
+    SCST's README locates in ~/scst-1.0.1.1/ directory
+
+NOTES: In any mode you always need to have lun 0 in any group's device list
+       Then you can have any lun number following lun 0 (it does not required
+       have lun number in order except that the first lun is always 0)
+
+       Setting SRPT_LOAD=yes in /etc/infiniband/openib.conf is not good enough
+       It only load ib_srpt module and does not load scst and its dev_handlers
+
+       SCST's scst_disk module (pass-thru mode) does not run on default
+       distribution kernels (kernels come with RHEL 5.2/5.3/5.4 & SLES 11)
+       because it requires to patch and recompile the kernel. It can only
+       run with vanilla kernels.
+Example 1: working with VDISK BLOCKIO mode
+           (using md0 device, sda, and cciss/c1d0)
+a. modprobe scst
+b. modprobe scst_vdisk
+c. echo "open vdisk0 /dev/md0 BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk
+d. echo "open vdisk1 /dev/sda BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk
+e. echo "open vdisk2 /dev/cciss/c1d0 BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk
+f. echo "add vdisk0 0" >/proc/scsi_tgt/groups/Default/devices
+g. echo "add vdisk1 1" >/proc/scsi_tgt/groups/Default/devices
+h. echo "add vdisk2 2" >/proc/scsi_tgt/groups/Default/devices
+
+Example 2: working with real back-end scsi disks in scsi pass-thru mode
+a. modprobe scst
+b. modprobe scst_disk
+c. cat /proc/scsi_tgt/scsi_tgt
+ibstor00:~ # cat /proc/scsi_tgt/scsi_tgt 
+Device (host:ch:id:lun or name)                             Device handler
+0:0:0:0                                                     dev_disk
+4:0:0:0                                                     dev_disk
+5:0:0:0                                                     dev_disk
+6:0:0:0                                                     dev_disk
+7:0:0:0                                                     dev_disk
+
+Now you want to exclude the first scsi disk and expose the last 4 scsi disks
+as IB/SRP luns for I/O
+
+echo "add 4:0:0:0 0" >/proc/scsi_tgt/groups/Default/devices
+echo "add 5:0:0:0 1" >/proc/scsi_tgt/groups/Default/devices
+echo "add 6:0:0:0 2" >/proc/scsi_tgt/groups/Default/devices
+echo "add 7:0:0:0 3" >/proc/scsi_tgt/groups/Default/devices
+
+Example 3: working with scst_vdisk FILEIO mode
+           (using md0 device and file 10G-file)
+a. modprobe scst
+b. modprobe scst_vdisk
+c. echo "open vdisk0 /dev/md0" > /proc/scsi_tgt/vdisk/vdisk
+d. echo "open vdisk1 /10G-file" > /proc/scsi_tgt/vdisk/vdisk
+e. echo "add vdisk0 0" >/proc/scsi_tgt/groups/Default/devices
+f. echo "add vdisk1 1" >/proc/scsi_tgt/groups/Default/devices
+
+A2. modprobe ib_srpt
+
+
+B. On initiator machines you can manualy do the following steps:
+
+B1. modprobe ib_srp
+B2. ipsrpdm -c -d /dev/infiniband/umadX 
+   (to discover new SRP target)
+    umad0: port 1 of the first HCA
+    umad1: port 2 of the first HCA
+    umad2: port 1 of the second HCA
+B3. echo {new target info} > /sys/class/infiniband_srp/srp-mthca0-1/add_target
+B4. fdisk -l (will show new discovered scsi disks)
+
+Example:
+Assume that you use port 1 of first HCA in the system ie. mthca0
+
+[root@lab104 ~]# ibsrpdm -c -d /dev/infiniband/umad0
+id_ext=0002c90200226cf4,ioc_guid=0002c90200226cf4,
+dgid=fe800000000000000002c90200226cf5,pkey=ffff,service_id=0002c90200226cf4
+[root@lab104 ~]# echo id_ext=0002c90200226cf4,ioc_guid=0002c90200226cf4,
+dgid=fe800000000000000002c90200226cf5,pkey=ffff,service_id=0002c90200226cf4 >
+/sys/class/infiniband_srp/srp-mthca0-1/add_target
+
+OR
+
++ You can edit /etc/infiniband/openib.conf to load srp driver and srp HA daemon
+automatically ie. set SRP_LOAD=yes, and SRPHA_ENABLE=yes
++ To set up and use high availability feature you need dm-multipath driver
+and multipath tool
++ Please refer to OFED-1.x SRP's user manual for more in-details instructions
+on how-to enable/use HA feature
+
+
+Here is an example of srp target setup file
+--------------------------------------------
+
+*********************** srpt.sh *****************************************
+#!/bin/sh
+modprobe scst scst_threads=1
+modprobe scst_vdisk scst_vdisk_ID=100
+
+echo "open vdisk0 /dev/cciss/c1d0 BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk
+echo "open vdisk1 /dev/sdb BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk
+echo "open vdisk2 /dev/sdc BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk
+echo "open vdisk3 /dev/sdd BLOCKIO" > /proc/scsi_tgt/vdisk/vdisk
+echo "add vdisk0 0" > /proc/scsi_tgt/groups/Default/devices
+echo "add vdisk1 1" > /proc/scsi_tgt/groups/Default/devices
+echo "add vdisk2 2" > /proc/scsi_tgt/groups/Default/devices
+echo "add vdisk3 3" > /proc/scsi_tgt/groups/Default/devices
+
+modprobe ib_srpt
+
+echo "add "mgmt"" > /proc/scsi_tgt/trace_level
+echo "add "mgmt_dbg"" > /proc/scsi_tgt/trace_level
+echo "add "out_of_mem"" > /proc/scsi_tgt/trace_level
+
+*********************** End srpt.sh **************************************
+
+
+How-to unload/shutdown
+-----------------------
+
+1. Unload ib_srpt
+ $ modprobe -r ib_srpt
+2. Unload scst and its dev_handlers
+ $ modprobe -r scst_vdisk scst
+3. Unload ofed
+ $ /etc/rc.d/openibd stop