Files
scst/iscsi-scst
Vladislav Bolkhovitin 00bca6ce75 Patch from Bart Van Assche <bart.vanassche@gmail.com>:
By this time I have reworked the update of scripts/generate-kernel-patch'>scripts/generate-kernel-patch. 
These are the changes that were already present in version 1 of this patch 
and that have been kept in this patch:
- The SCST code has been moved from drivers/scsi/scsi_tgt to drivers/scst.
- Moved SCST header files from include/scsi_tgt to include/scst.
- Added iscsi-scst in drivers/scst/iscsi-scst.

For the time being the generate-kernel-patch does no longer try to add the 
qla2x00t driver in drivers/scst/qla2x00-target -- I have not yet been able to 
figure out how to get qla2x00t/qla2x00-target compiled without the initiator 
code.

Just as in version 1 of this patch, the following files in the Subversion 
repository have been renamed to reflect the above changes:
- Renamed scst/kernel/in-tree/Makefile.scsi.Linux-2.6.24.patch'>scst/kernel/in-tree/Makefile.scsi.Linux-2.6.24.patch to
scst/kernel/in-tree/Makefile.drivers.Linux-2.6.24.patch'>scst/kernel/in-tree/Makefile.drivers.Linux-2.6.24.patch.
- Renamed Kconfig'>scst/kernel/in-tree/Kconfig.scsi.Linux-2.6.24.patch to
scst/kernel/in-tree/Kconfig.drivers.Linux-2.6.24.patch'>scst/kernel/in-tree/Kconfig.drivers.Linux-2.6.24.patch.
- Renamed scst/kernel/in-tree/Makefile.scsi_tgt'>scst/kernel/in-tree/Makefile.scsi_tgt to
scst/kernel/in-tree/Makefile.scst'>scst/kernel/in-tree/Makefile.scst.
- Renamed scst/kernel/in-tree/Kconfig.scsi_tgt'>scst/kernel/in-tree/Kconfig.scsi_tgt to
scst/kernel/in-tree/Kconfig.scst'>scst/kernel/in-tree/Kconfig.scst.

Because of the above changes the include path specified in the following
Makefiles had to be changed:
- scst/kernel/in-tree/Makefile.dev_handlers'>scst/kernel/in-tree/Makefile.dev_handlers
- srpt/src/Makefile.in_kernel'>srpt/src/Makefile.in_kernel

Other changes:
- I have added menu/endmenu entries in file scst/kernel/in-tree/Kconfig.scst
such that the SCST entries become visible when running make xconfig or make
menuconfig.
- Elaborated the SCST help texts a little bit (in file
scst/kernel/in-tree/Kconfig.scst).

New in version 2 of this patch:
- Moved remaining patches in the generate-kernel-patch script to separate 
files.
- Added support for the 2.6.25 kernel.

This patch has been tested as follows:

mkdir -p tmp
cd tmp
rm -rf linux-2.6.25.3 /lib/modules/2.6.25.3-scst
tar xjf ~vanasscb/software/downloads/linux-2.6.25.3.tar.bz2
cd linux-2.6.25.3
cp ../.config-2.6.25 .
(cd ~vanasscb/software/scst
&& ~vanasscb/software/scst/scripts/generate-kernel-patch \
2.6.25) | patch -p1
make oldconfig
diff ../.config .
make xconfig
make menuconfig
make -j5 bzImage modules
make modules_install install
cp -r /lib/firmware/$(uname -r) /lib/firmware/2.6.25.3-scst
update-initramfs -k 2.6.25.3-scst -c
reboot
modprobe iscsi-scst
modprobe ib_srpt
lsmod | grep -E 'scst|ib_srpt'
dmesg

Signed-off-by: bart.vanassche@gmail.com 


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@373 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2008-05-15 15:00:21 +00:00
..
2008-05-15 09:35:20 +00:00
2007-08-15 09:28:54 +00:00
2008-05-15 09:35:20 +00:00
2007-08-15 09:28:54 +00:00
2007-08-15 09:28:54 +00:00

iSCSI SCST target driver
========================

Version 0.9.6/XXXX, XX XXX 200X
-------------------------------

This driver is a forked with all respects version of iSCSI Enterprise
Target (IET) (http://iscsitarget.sourceforge.net/) with updates to work
over SCST as well as with many improvements and bugfixes (see ChangeLog
file). The reason of fork is that the necessary changes are intrusive
and with the current IET merge policy, where only simple bugfix-like
patches, which doesn't touch the core code, could be merged, it is very
unlikely that they will be merged in the main IET trunk.

To let it be installed and work at the same host together with IET
simultaneously all the driver's modules and files were renamed:

 * ietd.conf -> iscsi-scstd.conf
 * ietadm -> iscsi-scst-adm
 * ietd -> iscsi-scstd
 * iscsi-target -> iscsi-scst
 * iscsi-target.ko -> iscsi-scst.ko

This version is compatible with SCST version 0.9.6 and higher.

Tested on 2.6.21.1 kernel, but it should also work on other versions,
starting from 2.6.16.x.

Installation
------------

Basically as in README-IET, where file names are changed as specified
above.

If during compilation you see message like "*** No rule to make target
`xxx.h', needed by `yyy.o'.  Stop.", then your autogenerated
dependencies don't match your compiler configuration anymore. You should
run "make extraclean" to remove them. On the next compilation they will
be regenerated.

If you experience problems during kernel module load or running, check
your system and/or kernel logs (or run dmesg command for the few most
recent kernel messages).

To use full power of TCP zero-copy transmit functions, especially
dealing with user space supplied via scst_user module memory, iSCSI-SCST
needs to be notified when Linux networking finished data transmission.
Patch put_page_callback-<kernel-version>.patch provides such
functionality. The corresponding version of it should be applied on your
kernel. This is highly recommended, but not required. Basically, you
should consider using of this patch as some optimization, which IET
doesn't have, so if you don't use it, you will just revert to the
original IET behavior, when for data transmission:

 - For in-kernel allocated memory (scst_vdisk and pass-through
   handlers) usage of SGV cache on transmit path (READ-type commands)
   will be disabled. The performance hit will be not big, but performance
   will still remain better, than for IET, because SGV cache will remain
   used on receive path while IET doesn't have such feature.

 - For user space allocated memory (scst_user handler) all transmitted
   data will be additionally copied into temporary TCP buffers. The
   performance hit will be quite noticeable.

Note, that if your network hardware does not support TX offload
functions of has them disabled, then TCP zero-copy transmit functions on
your system will not be used by Linux networking in any case, so
put_page_callback patch will not be able to improve performance for you.
You can check your network hardware offload capabilities by command
"ethtool -k ethX", where X is the network device number. At least
"tx-checksumming" and "scatter-gather" should be enabled.

If you have in your kernel log error messages like:

iscsi-scst: ***ERROR*** net_priv isn't NULL and != ref_cmd

with the corresponding kernel BUG dump, then put_page_callback patch you
use isn't sufficient for your kernel. This might be because the kernel
you use has some additional patches applied, which affect the
functionality, which put_page_callback patch provides. For example,
Fedora or Gentoo use kernels, which, although have version number like
2.6.18, are greatly differ from the "vanilla" kernel 2.6.18,
maintained by Linus Torvalds for that the put_page_callback patch was
created. In this case I would recommend you either:

 - Search net/ in your kernel source for "put_page" and "get_page" functions.
   If you find any in some place, except in net/sunrpc/svc.c and
   net/core/pktgen.c, then, most likely, you found the reason of your
   problem. Replace them by "net_put_page" and "net_get_page"
   correspondingly and try again. If the problem is solved, then please
   prepare a new put_page_callback patch and send it to the SCST mailing
   list scst-devel@lists.sourceforge.net.

or

 - Unapply this patch and use iSCSI-SCST without it. Also report this
   problem to the SCST mailing list scst-devel@lists.sourceforge.net.

Usage
-----

ISCSI parameters like iSNS, CHAP and target parameters are configured in
iscsi-scstd.conf. All LUN information is configured using the regular
SCST interface. The LUN information in iscsi-scstd.conf will be ignored.
This is because now responsibilities are divided (as it should be)
between the target driver (iSCSI-SCST) and the SCST core as it logically
should be: the target driver is responsible for handling targets and
their parameters, SCST core is responsible for handling backstorage.

If you need to configure different LUs for different targets you should
create for each target group "Default_target_name", where "target_name"
means name of the target, for example:
"Default_iqn.2007-05.com.example:storage.disk1.sys1.xyz", and add there
all necessary LUNs. Check SCST README file for details.

Check SCST README file how to tune for the best performance.

If under high load you experience I/O stalls or see in the kernel log
abort or reset messages, then try to reduce QueuedCommands parameter in
iscsi-scstd.conf file for the corresponding target to some lower value,
like 8 (default is 32). See also SCST README file for more details about
that issue.

CAUTION:  Working of target and initiator on the same host isn't
========  supported. See SCST README file for details.

Compilation options
-------------------

There are the following compilation options, that could be commented
in/out in the kernel's module Makefile:

 - DEBUG - turns on some debugging code, including some logging. Makes
   the driver considerably bigger and slower, producing large amount of
   log data.

 - TRACING - turns on ability to log events. Makes the driver considerably
   bigger and lead to some performance loss.

 - EXTRACHECKS - adds extra validity checks in the various places.

 - DEBUG_DIGEST_FAILURES - simulates digest failures in random places.

Known issues
------------

Currently some iscsi-scst-adm functionality is broken. But, from one
side, at the moment I don't have time to look at it and and, from other
side, in contrast to IET, in iSCSI-SCST this utility doesn't worth much,
since all devices management is done using SCST's /proc interface.
What's remained for iscsi-scst-adm is managing iSCSI targets and their
parameters, but in any case changing of any negotiable iSCSI parameter
needs renegotiation, i.e. the corresponding session restart, i.e.
iSCSI-SCST restart. But, if you decide to fix iscsi-scst-adm, I will
appreciate your patches.

Creating version of put_page_callback patch for your kernel
-----------------------------------------------------------

If you need your own version of put_page_callback patch for your custom
kernel, for which there is no prepared version, you can create it
yourself. This is pretty mechanical work, you don't need to understand
how it works, you only need to do the following two steps:

1. Apply the closest version of put_page_callback-<kernel-version>.patch
on your kernel. Resolve only failed hanks from include/ and
net/core/utils.c, ignore other failures.

2. Search net/ in your kernel source for "put_page" and "get_page"
functions. Replace them by "net_put_page" and "net_get_page"
correspondingly. 

That's all. Then please send your new
put_page_callback-<kernel-version>.patch to the SCST mailing list
scst-devel@lists.sourceforge.net.

Credits
-------

Thanks to:

 * IET developers for IET

 * Ming Zhang <blackmagic02881@gmail.com> for fixes

 * Krzysztof Blaszkowski <kb@sysmikro.com.pl> for many fixes

 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> for comments and help in
   debugging

 * Tomasz Chmielewski <mangoo@wpkg.org> for testing and suggestions
 
Vladislav Bolkhovitin <vst@vlnb.net>, http://scst.sourceforge.net