Restore www directory

This commit is contained in:
Bart Van Assche
2019-09-14 18:12:01 -07:00
parent e16e4dbc21
commit 5fc080dddd
62 changed files with 4932 additions and 0 deletions

BIN
www/Gentoo-HOWTO.pdf Normal file

Binary file not shown.

39
www/bart_res.txt Normal file
View File

@@ -0,0 +1,39 @@
Setup:
Target: 2.6.29 kernel, 64 bit, Intel E8400 CPU @ 3.00GHz, 4 GB RAM, SCST trunk
revision 727 (which is close to the 1.0.1 release). A file of 1 GB residing
on a tmpfs filesystem has been exported via SCST.
Initiator: 2.6.29 kernel, 64 bit, Intel E6750 CPU @ 2.66 GHz, 2 GB RAM,
openSUSE 11.0 userspace.
Network: two MHGH28-XTC (MT26418) ConnectX InfiniBand HCA's connected back to
back, which are DDR PCIe 1.0 HCA's. The IPoIB stack was configured with the
default MTU of 2044 bytes on both interfaces and was using datagram mode.
ib_read_bw reported a throughput of 1394 MB/s for this network, and netperf
reported a TCP/IP throughput of 1200 MB/s (with default parameters).
Results:
Buffered I/O, block size of 512K (dd if=/dev/sdb of=/dev/null bs=512K):
write-test: iSCSI-SCST 243 MB/s; IET 192 MB/s.
read-test: iSCSI-SCST 291 MB/s; IET 223 MB/s.
Buffered I/O, block size of 4 KB (dd if=/dev/sdb of=/dev/null bs=4K):
write-test: iSCSI-SCST 43 MB/s; IET 42 MB/s.
read-test: iSCSI-SCST 288 MB/s; IET 221 MB/s.
Or: depending on the test scenario, SCST transfers data between 2% and
30% faster via the iSCSI protocol over this network than IET.
Note: at least for the tests with a block size of 4 KB, the initiator
system was the bottleneck, not the target system.
Something that is not relevant for this comparison, but interesting to
know: with the SRP implementation in SCST the maximal read throughput
is 1290 MB/s on the same setup.
Measured by Bart Van Assche

566
www/comparison.html Normal file
View File

@@ -0,0 +1,566 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SCSI targets comparison, iSCSI targets comparison">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SCSI Targets Comparison</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li id="current"><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Comparison</h1>
<ul class="sidemenu">
<li><a href="comparison.html">Features comparison</a></li>
<li><a href="scstvslio.html">SCST vs LIO/TCM</a></li>
<li><a href="scstvsstgt.html">SCST vs STGT</a></li>
<li><a href="mc_s.html">MC/S vs MPIO</a></li>
</ul>
</div>
<div id="main">
<h1>Features comparison between Linux SCSI targets</h1>
<p>This features comparison is intended to be a complete and fair feature-by-feature
comparison between the listed targets without any bias to SCST. If you see anything
wrong somewhere or anything missed, you are welcome to report it in scst-devel
mailing list and it will be corrected.
</p>
<p>Also Sebastian Riemer wrote a good summary in <a href="http://sourceforge.net/mailarchive/message.php?msg_id=30688206" rel="nofollow">his e-mail</a> (April 2013)</p>
<p><small>As on June 2011, briefly reviewed April 2013.</small></p>
<table bgcolor="#F0F0F0" border="1" cellspacing="1" cellpadding="7" style="text-align:center" width="620">
<tr>
<td>
</td><td><b><a href="http://scst.sourceforge.net/" title="http://scst.sourceforge.net/" rel="nofollow">SCST</a></b>
</td><td><b><a href="http://stgt.sourceforge.net/" title="http://stgt.sourceforge.net/" rel="nofollow">STGT</a></b>
</td><td><b><a href="http://iscsitarget.sourceforge.net/" title="http://iscsitarget.sourceforge.net/" rel="nofollow">IET</a></b>
</td><td><b><a href="scstvslio.html">LIO/TCM</a></b>
</td></tr>
<tr bgcolor="#E0E0E0">
<td colspan="5"> <b>General</b>
</td></tr>
<tr>
<td align="left"><b>Upstream kernel</b></td> <td> - </td> <td> - </td> <td> - </td> <td> <a href="scstvslio.html">Since 2.6.38</a></td>
</tr>
<tr>
<td align="left"><b>Generic Target Engine</b></td> <td> + </td> <td> + </td> <td> iSCSI only </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Architecture</b></td> <td> Kernel only</td> <td> User space only </td> <td> Split <sup>
<A HREF="#1">1</A>
</sup> </td> <td> Kernel only </td>
</tr>
<tr>
<td align="left"><b>Stability</b></td> <td> + </td> <td> + </td> <td> + </td> <td> Probably </td>
</tr>
<tr>
<td align="left"><b>Performance <sup><A HREF="#2">2</A></sup></b></td> <td> ***** <sup>
<A HREF="#3">3</A>
</sup></td> <td> ***</td> <td> **** </td> <td> ****- </td>
</tr>
<tr>
<th align="left"> Zero-copy passing data between target and
backend drivers</th> <td> + <sup>
<A HREF="#4">4</A>
</sup></td> <td> + <sup>
<A HREF="#5">5</A>
</sup> </td> <td> + </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Support for transports without expecting
transfer values (Wide (parallel) SCSI, SAS)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Interface with user space</b></td> <td> SysFS (or obsolete
ProcFS)</td> <td> Custom </td> <td> - </td> <td> ConfigFS/IOCTL/ProcFS </td>
</tr>
<tr bgcolor="#E0E0E0">
<td colspan="5"><b>Features</b>
</td></tr>
<tr>
<td align="left"><b>Target drivers in kernel space</b></td> <td> + </td> <td> - </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Target drivers in user space</b></td> <td>Via scst_local (e.g.
using STGT
pass-through)</td> <td> + </td> <td> - </td> <td>Via tcm_loop (e.g.
using STGT pass-through)</td>
</tr>
<tr>
<td align="left"><b>Backstorage handlers in kernel space</b></td> <td> + </td> <td> - </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Backstorage handlers in user space</b></td> <td>+</td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Advanced devices access control
<sup><A HREF="#7">7</A></sup></b></td> <td> + </td> <td> - </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Automatic sessions reassignment (changes in the
access control immediately seen by initiators)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Support for Asynchronous Event Notifications
(AEN)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Notifications for devices added/removed or
resized through AENs or Unit Attentions (initiators can instantly see
any target reconfiguration in a PnP-like manner)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Bidirectional Commands</b></td> <td> +</td> <td> + </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Extended CDB (size >16 bytes)</b></td> <td> +</td> <td> + </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Descriptor sense support</b></td> <td> + </td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>RESERVE/RELEASE
(Windows 2003 clustering)</b></td> <td> + </td> <td> + </td> <td> + </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Safe RESERVE/RELEASE implementation according to
SCSI requirements <sup><A HREF="#9">9</A></sup></b></td> <td> Safe </td> <td> Safe </td> <td> Safe from
v1.4.18</td> <td> Not safe </td>
</tr>
<tr>
<td align="left"><b>Safe implementation of Task Management commands
<sup><A HREF="#10">10</A></sup></b></td> <td> Safe </td> <td> Not safe </td> <td> Not safe </td> <td> LUN RESET - safe.
Other TM commands not
implemented. </td>
</tr>
<tr>
<td align="left"><b>Support for SCSI task attributes, including
ORDERED commands</b></td> <td> + </td> <td> + </td> <td> -, <br> data
corruption possible
<sup><A HREF="#11">
11</A></sup></td> <td> -, <br>data
corruption possible
<sup><A HREF="#11">
11</A></sup> </td>
</tr>
<tr>
<td align="left"><b>Persistent (SCSI-3) Reservations
(Windows 2008 clustering / RHEL5 I/O fencing)</b></td> <td> + </td> <td> + <br> (not all
functionality
implemented)</td> <td> - </td> <td> + </td>
<tr>
<td align="left"><b>Durable, i.e. transactional, save of Persistent
Through Power Loss Persistent Reservation data</b></td> <td> Durable </td> <td>Not supported</td> <td> - </td> <td> Not durable </td>
</tr>
<tr>
<td align="left"><b>ALUA</b></td> <td> +/- (Implicit
only)<sup>
<A HREF="#19">19</A>
</sup> </td> <td> - </td> <td> - </td> <td> +/-<sup><A HREF="#19">
19</A></sup></td>
</tr>
<tr>
<td align="left"><b>Failover Clustering</b></td> <td> + </td> <td> + </td> <td> + </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Different threading models to choose the best
performing</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>CPU affinity control</b></td> <td> + </td> <td> - </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>I/O context grouping between I/O threads (big
performance win with CFQ)</b></td> <td> + </td> <td> - </td> <td> + </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Per-initiator I/O context grouping (big
performance and fairness win if several initiators access the same
virtual or backend device on the target)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Protection against commands with
wrong transfer size or transfer direction (may lead to crash or
hard lockup of the target)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Protection against crashing target by making it
to allocate too much memory for buffers and go into OOM state
</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Caching of allocated buffers</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Latencies measurement facility</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Configuration tool with ability to automatically
apply changes in the config file on fly without any restarts</b></td> <td> scstadmin </td> <td> - </td> <td> - </td> <td> rtsadmin? </td>
</tr>
<tr>
<td align="left"><b>SCSI MIBs</b></td> <td> - </td> <td> - </td> <td> - </td> <td> +-
<sup><A HREF="#12">12</A></sup></td>
</tr>
<tr bgcolor="#E0E0E0">
<td colspan="5"> <b>Supported transports and hardware</b>
</td></tr>
<tr>
<td align="left"><b>iSCSI</b></td> <td> + </td> <td> + </td> <td> + </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>QLogic (Fibre Channel and FCoE)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> +</td>
</tr>
<tr>
<td align="left"><b>Emulex (Fibre Channel and FCoE)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>SRP</b></td> <td> + </td> <td> - </td> <td> - </td> <td> Preliminary </td>
</tr>
<tr>
<td align="left"><b>iSER</b></td> <td> + </td> <td> + </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Marvell (SAS)</b></td> <td> Beta </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>FCoE</b></td> <td> + </td> <td>Under
development</td> <td> - </td> <td> Alpha </td>
</tr>
<tr>
<td align="left"><b>LSI (Parallel (Wide) SCSI and Fibre Channel)
</b></td> <td> Alpha </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>LSI (SAS)</b></td> <td> Preliminary
(not completed) </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>IBM pSeries Virtual SCSI</b></td> <td> + </td> <td> + </td> <td> - </td> <td> Preliminary </td>
</tr>
<tr>
<td align="left"><b>Local access to emulated backstorage devices
<sup><A HREF="#6">6</A></sup></b></td> <td> scst_local </td> <td> - </td> <td> - </td> <td> tcm_loop </td>
</tr>
<tr bgcolor="#E0E0E0">
<td colspan="5"> <b>Supported backstorage</b>
</td></tr>
<tr>
<td align="left"><b>Kernel side FILEIO</b></td> <td> + </td> <td> - </td> <td> + </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Kernel side BLOCKIO</b></td> <td> + </td> <td> - </td> <td> + </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>User space FILEIO</b></td> <td> + </td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>O_DIRECT FILEIO</b></td> <td> fileio_tgt </td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Async FILEIO</b></td> <td> - </td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Native RAMDISK</b></td> <td> - </td> <td> - </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>SCSI pass-through
<sup><A HREF="#13">13</A></sup></b></td> <td> + </td> <td> Single
initiator only, not
enforced<sup>
<A HREF="#14">14</A>
</sup> </td> <td> - </td> <td> Single initiator only, not enforced,
limited functionality for tapes
<sup><A HREF="#14">14</A></sup></td>
</tr>
<tr>
<td align="left"><b>Zero-copy data read/write to/from backstorage
</b></td> <td>BLOCKIO, user space
FILEIO in O_DIRECT mode,
pass-through <sup>
<A HREF="#15">15</A>
</sup></td> <td> - <sup>
<A HREF="#5">5</A>
</sup> </td> <td> BLOCKIO </td> <td> BLOCKIO, pass-
through </td>
</tr>
<tr>
<td align="left"><b>Cache safe<sup><A HREF="#8">8</A></sup>
FILEIO</b></td> <td> Safe </td> <td>Safe only RDWR
backend</td> <td> Safe </td> <td> Safe </td>
</tr>
<tr>
<td align="left"><b>Cache safe<sup><A HREF="#8">8</A></sup>
BLOCKIO</b></td> <td> Safe </td> <td> - </td> <td> Not safe </td> <td> Safe </td>
</tr>
<tr>
<td align="left"><b>4k sectors support in pass-through mode</b></td> <td> + </td> <td> - </td> <td> - </td> <td> ? </td>
</tr>
<tr>
<td align="left"><b>4k, 2k, 1k and 512 byte sectors emulation
in modes, other than pass-through</b></td> <td> + </td> <td> + </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Virtual CD devices emulation from ISO files
</b></td> <td> + </td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Possibility to write to emulated from ISO files
CD devices</b></td> <td> - </td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Emulation of virtual tape and media changer
devices (VTL)</b></td> <td> - </td> <td>Experimental</td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Thin provisioning support</b></td> <td>+<br></td> <td> ? </td> <td> - </td> <td> + </td>
</tr>
<tr bgcolor="#E0E0E0">
<td colspan="5"> <b>iSCSI Target</b>
</td></tr>
<tr>
<td align="left"><b>Architecture</b></td> <td> Split <sup>
<A HREF="#1">1</A>
</sup> </td> <td> User space
only </td> <td> Split <sup>
<A HREF="#1">1</A>
</sup></td> <td> Kernel only </td>
</tr>
<tr>
<td align="left"><b>Interface with user space</b></td> <td>SysFS (or obsolete
ProcFS)/
IOCTL/Netlink</td> <td> - </td> <td>IOCTL/ProcFS/
Netlink</td> <td> ConfigFS/IOCTL/ProcFS </td>
</tr>
<tr>
<td align="left"><b>Zero-copy data send/receive</b></td> <td> Send only<sup>
<A HREF="#16">16</A>
</sup> </td> <td> In some cases,
send only <sup>
<A HREF="#5">5</A>
</sup> </td> <td> Send only</td> <td> Send only </td>
</tr>
<tr>
<td align="left"><b><a href="mc_s.html">Multiple connections per
session (MS/C)</a></b></td> <td> - </td> <td> - </td> <td>+</td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Max ErrorRecoveryLevel</b></td> <td> 0 </td> <td> 0 </td> <td> 0 </td> <td> 2 </td>
</tr>
<tr>
<td align="left"><b>Support for limiting number of initiators
allowed to connect to a target</b></td> <td> + </td> <td> - </td> <td> + </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Per-portal targets visibility control</b></td> <td> + </td> <td> - </td> <td> + </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Per-initiators targets visibility control</b></td> <td> + </td> <td> + </td> <td> + </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Support for AHS</b></td> <td> + </td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Support for iSCSI redirects</b></td> <td> + </td> <td> + </td> <td> + </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Bidirectional Commands</b></td> <td> + </td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Extended CDB (size >16 bytes)</b></td> <td> + </td> <td> + </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Support for AENs (initiators can instantly see any
target reconfiguration in a PnP-like manner)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Support for iSNS</b></td> <td> + </td> <td> + </td> <td> + </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Safe implementation of Task Management commands
<sup><A HREF="#10">10</A></sup></b></td> <td> Safe </td> <td> Not safe </td> <td> Not safe </td> <td> ABORT TASK - not safe,
LUN RESET - safe,
other TM commands not
implemented. </td>
</tr>
<tr>
<td align="left"><b>Safe implementation of connections and sessions
reinstatement <sup><A HREF="#17">17</A></sup></b></td> <td> Safe </td> <td> Not safe </td> <td> Not safe </td> <td> Not safe </td>
</tr>
<tr>
<td align="left"><b>Usage of hardware instructions for digest
calculations, if available</b></td> <td> + </td> <td> - </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Each connection multithreaded digest calculation
</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
<tr>
<td align="left"><b>Safe restart <sup><A HREF="#18">18</A></sup>
</b></td> <td> Safe </td> <td> ? </td> <td> Not safe before
v1.4.18. After -
probably safe.</td> <td> ?</td>
</tr>
<tr>
<td align="left"><b>iSCSI MIBs</b></td> <td> - </td> <td> - </td> <td> - </td> <td> +-
<sup><A HREF="#12">12</A></sup></td>
</tr>
<tr bgcolor="#E0E0E0">
<td colspan="5"> <b>Local access target</b>
</td></tr>
<tr>
<td align="left"><b>Bidirectional support</b></td> <td> + </td> <td> - </td> <td> - </td> <td> + </td>
</tr>
<tr>
<td align="left"><b>Support for AENs (initiators can instantly see any
target reconfiguration in a PnP-like manner)</b></td> <td> + </td> <td> - </td> <td> - </td> <td> - </td>
</tr>
</table>
<br>
<p><strong><big><u>REMARKS:</u></big></strong></p>
<p><A NAME="1"></A> 1. All iSCSI management implemented in user space and actual data transfers in kernel space without user space involved.</p>
<p><A NAME="2"></A> 2. The result "in average" is listed. One target can be better somewhere, another one somewhere else. Although manual tuning of target and
system parameters tends the restore the difference listed in the comparison. You can find example measurements <a href="vl_res.txt">here</a>,
<a href="bart_res.txt">here</a> and <a href="tomasz_res.txt">here</a>.</p>
<p><A NAME="3"></A> 3. All SCST and its drivers' kernel patches supposed to be applied and SCST with the drivers built in the release or performance build.
Without the kernel patches SCST performance will be at "****+" level, except for the case, when user space backstorage handler used
with iSCSI-SCST iSCSI target driver, where performance will be at "***+" level.</p>
<p><A NAME="4"></A> 4 In SCST data are always passed in zero-copy manner between target and backend drivers without need for any
additional kernel patches, except in case, when local access (scst_local) used with user space backend. </p>
<p><A NAME="5"></A> 5. Some zero-copy functionality isn't available from user space, sometimes fundamentally.
For instance, zero-copy FILEIO with page cache or zero-copy send to a socket. Also STGT can't use splice() for in-kernel
target drivers, because it has memory management in user space. To use splice() with socket-based user space target drivers
STGT would need a deep redesign of internal interactions between target drivers, core and backend handlers. But in
some cases STGT can use zero-copy sendfile().</p>
<p><A NAME="6"></A> 6. "Local access to emulated backstorage devices" means that you can access emulated by a SCSI target devices
locally on the target host. For instance, you can mount your ISO image from emulated by the target
CDROM device locally on the target host.</p>
<p><A NAME="7"></A> 7. "Advanced devices access control" means that different initiators can see different sets
of devices from the same target. This feature is required for hardware targets, which don't have ability
to create virtual targets.</p>
<p><A NAME="8"></A> 8. "Cache safe" means that cache synchronization commands (SYNCHRONIZE_CACHE and FUA attribute) from initiators perform
what they expected to perform, i.e. push all the requested blocks from all caches, including devices' caches,
to non-volatile media.</p>
<p><A NAME="9"></A> 9. SCSI requires that if an initiator clears reservation held by another initiator, the reservation holder must be notified
about the reservation clearance. Otherwise, several initiators can at the same time change supposed to be protected by the
reservation data, which can corrupt them. This is what was called
<a href="http://communities.vmware.com/thread/53797?tstart=0&amp;start=15">"Russian roulette with your data"</a> on the VMware
community forum by someone working for VMware. But, sure, it can affect not only VMware, but also any other cluster
implementation, relying on this functionality.</p>
<p><A NAME="10"></A> 10. After a task management command completed and before the corresponding response was sent to the initiator, who sent that task management
command, all the affected SCSI commands must get into a state, where they can't affect following after
the tasks management response commands from this initiator. This is the safe implementation.
The unsafe implementation only marks all the affected
SCSI commands as aborted and then immediately send task management response to the initiator. This implementation only
guarantees that the initiator will never receive responses from those commands, but it doesn't
guarantee that none of those commands will get executed by backstorage <strong>*AFTER*</strong> any
SCSI command, which initiator will send after it received the task management response thinking
that all the aborted commands actually fully aborted. This could lead to a data corruption.</p>
<p><A NAME="11"></A> 11. Both IET and LIO report in INQUIRY command response support for full task management model. But they process ORDERED
commands the same way as SIMPLE commands, i.e. allow free reorder of them before they get executed. That violates SCSI standard
and can lead to a data corruption to any application relying on commands order provided by ORDERED attribute.</p>
<p><A NAME="12"></A> 12. LIO exports the information needed for an RFC 4455 implementation, but requires additional RFC 4455 implementing module.
At the moment, there is no open source implementation of such module.</p>
<p><A NAME="13"></A> 13. SCSI pass-through mode allows to export your local SCSI-capable device. For instance with it you can share your parallel
SCSI tape or SATA DVD-RW device to your iSCSI network.</p>
<p><A NAME="14"></A> 14. STGT and LIO don't emulate all the necessary SCSI host functionality to allow to share SCSI devices
in pass-through mode to several initiators, although LIO has some necessary processing, but not all.
They can only pass SCSI commands from initiators to
SCSI devices and responses back. This is safe only with a single initiator. This limitation
isn't enforced anyhow and both STGT and LIO don't issue any warning about it, so an user will not be notified about this
limitation and can quietly corrupt his/her data. You can find more technical information about it
<a href="http://www.mail-archive.com/linux-scsi@vger.kernel.org/msg06911.html">here</a>.
Also LIO in pass-through mode doesn't do necessary sense processing for tape devices to
correctly return residual information, so tapes can used with it with limited functionality.</p>
<p><A NAME="15"></A> 15. You can find a proposal how to implement zero-copy FILEIO in SCST on the <a href="contributing.html#ZC_READ">
Contributing</a> page.</p>
<p><A NAME="16"></A> 16. Doesn't need any kernel patch, except in the case, when used with user space backend.</p>
<p><A NAME="17"></A> 17. Connections and sessions reinstatement is, basically, a kind of Task Management command, because it implies commands aborting.
So, similarly to the safe task management above, a safe implementation of connections and sessions reinstatement
must not accept SCSI commands from new connection/session until all the SCSI commands in
being reinstated connection/session get into a state, where they can't affect new commands.</p>
<p><A NAME="18"></A> 18. "Safe restart" means that after the iSCSI target restart, all the connected initiators will seamlessly restore all existing before
the restart connections. "Not safe" means that, most likely, the connected initiators will fail to restore
existing connections with some errors. However, your iSCSI initiator also should be able to handle the safe restart. For instance,
old (pre-CentOS/RHEL 5) open-iscsi has problems in this area. But the latest versions do it pretty well.</p>
<p><A NAME="19"></A> 19. Generic implementation, i.e. not coupled to any particular cluster implementation, which means it is needed additional effort
to used with each particular cluster setup.</p>
</div>
</div>
</div>
<!-- wrap ends here -->
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018 <b><font color="#EC981F">Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font color="#EC981F">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

229
www/contributing.html Normal file
View File

@@ -0,0 +1,229 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SCST Contributing</title>
</head>
<body>
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li id="current"><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<div id="content-wrap">
<div id="main">
<h1>Contributing to SCST</h1>
<p>If you would like to contribute to SCST development, you can do in many ways:</p>
<ul>
<li><span>By sending <a href="http://sourceforge.net/donate/index.php?group_id=110471">donations</a>.
They will be spent on further work making SCST better, including buying new hardware, as well as on providing
better support and troubleshooting for you. If you want to donate another amount, than listed on the
provided buttons, you can directly edit URL they are pointing to.</span></li>
<li><span>By sending patches, which fix bugs or implement new functionality.
See below a list of possible SCST improvements with some possible
implementation ideas.</span></li>
<li><span>By writing or updating various documentation to keep it complete and up to date.
For instance, <a href="scst_pg.html">SCST internals description</a> document is
in some areas quite outdated. Particularly, many functions were renamed since
time, when it was written. It would be good to bring it up to date.</span></li>
<li><span>By reporting bugs or other problems.</span></li>
</ul>
<h1>Possible SCST extensions and improvements</h1>
<A NAME="ASYNC_FILEIO"></A><h3>Asynchronous FILEIO in scst_vdisk handler</h3>
<p>At the moment scst_vdisk handler for FILEIO uses regular synchronous read/write() calls
and makes deep queue depth by using multiple threads. This is not too high performance
model of operations. It would be much better to use asynchronous I/O with not blocking
I/O calls.</p>
<p>In the user space native AIO is available for many years, but only very recently ability to
use it was added in the kernel. Changing FILEIO to use the new interface should significantly
(up to multiple times) increase performance of FILEIO devices.</p>
<A NAME="O_DIRECT"></A><h3>Support for O_DIRECT in scst_vdisk handler</h3>
<p>At the moment, scst_vdisk handler doesn't support O_DIRECT option and possibility to set it
was disabled. This limitation caused by Linux kernel expectation that memory supplied to
read() and write() functions with O_DIRECT flag is mapped to some user space application.
Having O_DIRECT together with above asynchronous FILEIO would be another significant
performance boost for modern solid state devices. For instance, in fio utility
direct AIO long ago proven to be the fastest way to benchmark storage.</p>
<p>It is relatively easy to remove that limitation. Function dio_refill_pages()
should be modified to check before calling get_user_pages() if current->mm is not NULL.
If it is NULL, then, instead of calling get_user_pages(), dio->pages should be filled
by pages, taken directly from dio->curr_user_address. Each such page should be referenced
by page_cache_get(). That's all.</p>
<A NAME="SG_LIMIT"></A><h3>Solve SG IO count limitation issue in pass-through mode</h3>
<p>In the pass-through mode (i.e. using the pass-through device handlers like
scst_tape, etc.) SCSI commands, coming from remote initiators,
are passed to local SCSI hardware on target as is, without any
modifications. As any other hardware, the local SCSI hardware can not
handle commands with amount of data and/or segments count in
scatter-gather array bigger some values. For some commands SCST can
split them on subcommands and, hence, workaround this problem, but it isn't
always possible. For instance, for tapes splitting write commands may mean
corrupting the tape data.</p>
<p>If you have this issue you will see
symptoms like small transfers work well, but large transfers stall and
messages like: "Unable to complete command due to SG IO count
limitation" are printed in the kernel logs.</p>
<p>The only complete way to fix this problem is to allocate data buffers with number
of entries inside the SG IO count limitation. In <a href="sgv_big_order_alloc.diff">sgv_big_order_alloc.diff</a>
you can find a possible way to solve this issue.</p>
<p>You can also look at patch
<a href="sgv_big_order_alloc-sfw5-rc3.diff">sgv_big_order_alloc-sfw5-rc3.diff</a>
created by Frank Zago for SCST 2.0.0. It was submitted too late to be included in it.
Update for SCST trunk is welcome!</p>
<p>Note, scst_disk handler already implements a workaround for it.</p>
<A NAME="MEM_REG"></A><h3>Memory registration</h3>
<p>In some cases a target driver might need to register memory used for data buffers in the
hardware. At the moment, none of SCST target drivers, including InfiniBand SRP target driver,
need that feature. But in case if in future there is a need in such a feature, it can be easily
added by extending SCST SGV cache. The SCST SGV cache is a memory management
subsystem in SCST. It doesn't free to the system each data buffer,
which is not used anymore, but keeps it for a while to let it be reused by the
next consecutive command to reduce command processing latency and, hence, improve performance.</p>
<p>To support memory buffers registrations, it can be extended by the following way:</p>
<p>1. Struct scst_tgt_template would be extended to have 2 new callbacks:</p>
<ul>
<li><span>int register_buffer(struct scst_cmd *cmd)</span></li>
<li><span>int unregister_buffer(unsigned long mem_priv, void *scst_priv)</span></li>
</ul>
<p>2. SCST core would be extended to have 4 new functions:</p>
<ul>
<li><span>int scst_mem_registered(struct scst_cmd *cmd)</span></li>
<li><span>int scst_mem_deregistered(void *scst_priv)</span></li>
<li><span>int scst_set_mem_priv(struct scst_cmd *cmd, unsigned long mem_priv)</span></li>
<li><span>unsigned long scst_get_mem_priv(struct scst_cmd *cmd)</span></li>
</ul>
<p>3. The workflow would be the following:</p>
<ol>
<li><span>If target driver defined register_buffer() and unregister_buffer() callbacks,
SCST core would allocate a dedicated SGV cache for each instance of struct scst_tgt,
i.e. target.</span></li>
<li><span>When there would be an SGV cache miss in memory buffer for a command allocation,
SCST would check if register_buffer() callback was defined in the target driver's template
and, if yes, would call it.</span></li>
<li><span>In register_buffer() callback the target driver would do necessary actions to
start registration of the commands memory buffer.</span></li>
<li><span>Upon register_buffer() callback returns, SCST core would suspend processing the
corresponding command and would switch to the next commands processing.</span></li>
<li><span>After the memory registration finished, the target driver would call scst_set_mem_priv()
to associate the memory buffer with some internal data.</span></li>
<li><span>Then the target driver would call scst_mem_registered() and SCST would resume processing
the command. Functions scst_set_mem_priv() and scst_mem_registered() can be called from inside register_buffer().
In this case SCST core would continue processing the command immediately without suspending.</span></li>
<li><span>After the command finished, the corresponding memory buffer would remain in the
SGV cache in the registered state and would be reused by the next commands. For each of them
the target driver can at any time figure out the associated with the registered buffer data
by using scst_get_mem_priv().</span></li>
<li><span>When the SGV cache decide that there is a time to free the memory buffer, it would
call the target driver's unregister_buffer() callback.</span></li>
<li><span>In this callback the target driver would do necessary actions to start deregistration of the
commands memory buffer.</span></li>
<li><span>Upon unregister_buffer() callback returns, SGV cache would suspend freeing the corresponding buffer
and would switch to other deals it has.</span></li>
<li><span>After the memory deregistration finished, the target driver would call scst_mem_deregistered()
and pass to it scst_priv pointer, received in unregister_buffer(). Then the memory buffer
would be freed by the SGV cache. Function scst_mem_deregistered() can be called from inside unregister_buffer().
In this case SGV cache would free the buffer immediately without suspending.
</span></li>
</ol>
<A NAME="NON_SCSI_TGT"></A><h3>SCST usage with non-SCSI transports</h3>
<p>SCST might also be used with non-SCSI speaking transports, like NBD or AoE. Such cooperation
would allow them to use SCST-emulated backend.</p>
<p>For user space targets this is trivial: they simply should use SCST-emulated devices locally
via scst_local module.</p>
<p>For in-kernel non-SCSI target driver it's a bit more complicated. They should implement a small layer,
which would translate their internal READ/WRITE requests to corresponding SCSI commands and, on the
way back, SCSI status and sense codes to their internal status codes.</p>
<A NAME="GET_CONFIGURATION"></A><h3>GET CONFIGURATION command</h3>
<p>SCSI command GET CONFIGURATION is mandatory for SCSI multimedia devices, like CD/DVD-ROMs or
recorders, see MMC standard. Currently SCST lacks support for it, which leads to problems
with some programs depending on the result of GET CONFIGURATION command execution.</p>
<p>It would be good to add support for it in the SCST core.</p>
</div>
</div>
</div>
<!-- wrap ends here -->
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018 <b><font color="#EC981F">Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font color="#EC981F">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

99
www/downloads.html Normal file
View File

@@ -0,0 +1,99 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="Generic SCSI Target Subsystem for Linux">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SCST Downloads</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li><a href="targets.html">Drivers</a></li>
<li id="current"><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="main">
<h1>SCST Downloads</h1>
<p>The latest stable version of SCST is 3.3.
The latest updates for that version are
available on the 3.3.x branch in the SVN
repository.</p>
<p>You can also download prebuilt SCST modules for
<a href="http://linuxsoft.cern.ch/cern/slc5X/x86_64/yum/extras/repoview">Scientific Linux CERN 5</a> (RHEL5-based),
<a href="https://launchpad.net/~ast/+archive/scst2">Ubuntu</a>,
<a href="http://www.motschke.de/debian/packages">Debian</a>,
<a href="http://alpine.nethq.org/distfiles/alpine-scst-110210-x86_64.iso">Alpine Linux</a> and
<a href="http://download.opensuse.org/repositories/home:/oertel/">openSUSE</a>
(<a href="https://build.opensuse.org/package/view_file?file=scst.spec&amp;package=scst&amp;project=home%3Aoertel">spec</a>).</p>
<p>Since recently, SCST allows to build Debian packages using "make dpkg" command. Previous instructions how to build
SCST DKMS package for Debian-based systemd-enabled Linuxes you can find
<a href="https://sites.google.com/site/nandydandyoracle/scst/scst-debian-dkms-package-build-from-source-ubuntu-17-04">here</a>.</p>
<p>As a complete SCST-based system you can try <a href="http://www.esos-project.com/">Enterprise Storage OS (ESOS)</a>.</p>
<p>There is also a well done user space port, which you can find <a href="https://github.com/DavidButterfield/SCST-Usermode-Adaptation">here</a>.</p>
<p>The latest development version of SCST is 3.4. You can download it as well as target drivers and user space
utilities directly from the SCST SVN. You can access it using either
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/trunk">web-based SVN repository viewer</a> or using anonymous access:</p>
<p><code>svn checkout svn://svn.code.sf.net/p/scst/svn/trunk scst-trunk</code></p>
<p>Also you can find in the SCST SVN the latest updates for the stable branches. More information about accessing SVN repository may be found
<a href="https://sourceforge.net/p/forge/documentation/svn/">here</a>. Or, alternatively, you can download it as a GNU tarball from
<a href="http://sourceforge.net/p/scst/svn/HEAD/tarball?path=/branches/3.3.x">here</a>.</p>
<p>History of the pre-SVN SCST development is available in SCST CVS repository, which is accessible using
<a href="http://scst.cvs.sourceforge.net">web-based CVS repository viewer</a>, or anonymous CVS access.</p>
<p class="post-footer align-right">
<a href="http://sourceforge.net/project/showfiles.php?group_id=110471" class="readmore">Download released versions</a>
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
<a href="https://github.com/bvanassche/scst" class="readmore">Official git mirror</a>
</p>
</div>
</div>
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

View File

@@ -0,0 +1,97 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SCSI target in user space">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>FILEIO Target SCST Handler</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>FILEIO_TGT handler</h1>
<p>User space program fileio_tgt uses interface of SCST's scst_user dev
handler and allows to see how it works in various modes.
Fileio_tgt provides mostly the same functionality as the kernel space
SCST's scst_vdisk handler with the only exceptions that it supports
O_DIRECT mode and doesn't support BLOCKIO one. O_DIRECT mode is
basically the same as BLOCKIO, but also supports files, so for some
loads it could be significantly faster, than the regular FILEIO access.
All the words about BLOCKIO mode from SCST's README file apply to
O_DIRECT mode as well.</p>
<p>You can find the latest development version of this handler in the SCST SVN. See the download page how to setup
access to it.</p>
<p class="post-footer align-right">
<a href="downloads.html" class="readmore">Download</a>
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
</p>
</div>
</div>
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018 <b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

BIN
www/images/LPe16002.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

357
www/images/Orange.css Normal file
View File

@@ -0,0 +1,357 @@
* { margin: 0; padding: 0; }
body {
margin: 0; padding: 0;
font: 71%/1.5em Verdana, 'Trebuchet MS', Arial, Sans-serif;
background: url(headerbg-orange.gif) repeat-x;
color: #666666;
text-align: center;
}
/* links */
a {
background: inherit;
color: #EC981F;
}
a:hover {
background: inherit;
color: #806B4D;
}
/* headers */
h1, h2, h3, .companysubtitles {
font: bold 1em 'Trebuchet MS', Tahoma, Sans-serif;
text-transform: uppercase;
color: #555;
}
h1 { font-size: 1.5em; }
h2 { font-size: 1.3em; }
h3 { font-size: 1.2em; text-transform: none;}
.companysubtitles { font-size: 1.3em; }
#main h1, #rightbar h1 {
padding: 10px 0 5px 5px;
margin: 0 0 0 10px;
text-transform: uppercase;
border-bottom: 1px solid #f2f2f2;
}
#sidebar h1 {
padding: 10px 0px 5px 30px;
background: url(square_arrow.gif) no-repeat 2px 12px;
margin: 0;
text-transform: uppercase;
}
p, h1, h2, h3, h4, .companysubtitles { margin: 10px 15px; }
ul, ol {
margin: 10px 30px;
padding: 0 15px;
color: #EC981F;
}
ul span, ol span { color: #666666; }
/* images */
/* img { border: 2px solid #CCC; } */
img.float-right { margin: 5px 0px 5px 15px; }
img.float-left { margin: 5px 15px 5px 0px; }
a img { border: 0px solid #EC981F; }
a:hover img { border: 0px solid #806B4D !important;border: 0px solid #EC981F; }
code {
margin: 5px 0;
padding: 10px;
text-align: left;
display: block;
overflow: auto;
font: 500 1em/1.5em 'Lucida Console', 'courier new', monospace;
background: #FAFAFA;
border: 1px solid #f2f2f2;
border-left: 3px solid #EC981F;
}
acronym { cursor: help;border-bottom: 1px solid #777; }
blockquote {
margin: 15px;
padding: 0 0 0 32px;
background: #FAFAFA url(quote.gif) no-repeat 5px 10px !important;
background-position: 8px 10px;
border: 1px solid #f2f2f2;
border-left: 3px solid #EC981F;
font-weight: bold;
}
/* form elements */
form {
margin:10px; padding: 0;
border: 1px solid #f2f2f2;
background-color: #FAFAFA;
}
label {
display:block;
font-weight:bold;
margin:5px 0;
}
input {
padding: 4px;
border:1px solid #eee;
font: normal 1em/1.5em Verdana, sans-serif;
color:#777;
}
textarea {
width:350px;
padding:4px;
font: normal 1em/1.5em Verdana, sans-serif;
border:1px solid #eee;
height:100px;
display:block;
color:#777;
}
input.button {
margin: 0;
font: bold 1em Arial, Sans-serif;
border: 1px solid #CCC;
background: #FFF;
padding: 2px 3px;
color: #333;
}
/* search form */
form.searchform {
background: transparent;
border: none;
margin: 0; padding: 0;
}
form.searchform input.textbox {
margin: 0;
width: 120px;
border: 1px solid #CCC;
background: #FFF;
color: #333;
vertical-align: top;
}
form.searchform input.button {
width: 55px;
vertical-align: top;
}
/*****************/
/* Layout */
/*****************/
#wrap {
margin: 0 auto;
width: 908px;
text-align: left;
background: #FFF;
}
#content-wrap {
clear:both;
margin: 0; padding:0;
width: 908px;
}
/* header */
#header {
position: relative;
background: url(headerbg-orange.gif) repeat-x 0% 0%;
height: 84px;
}
div.logoimg {
position: relative;
background: url(logo.gif) no-repeat;
top: 15px;
height: 50px;
}
#header h1#logo {
position: absolute;
margin: 0; padding: 0;
font: bolder 4.1em 'Trebuchet MS', Arial, Sans-serif;
letter-spacing: -2px;
color: #CCC;
/*text-transform: lowercase;*/
/* change the values of top and Left to adjust the position of the logo*/
top: 0; left: 55px;
}
#header h2#slogan {
position: absolute;
margin: 0; padding: 0;
font: bold 2em 'Trebuchet MS', Arial, Sans-serif;
text-transform: none;
color: #FFF;
/* change the values of top and Left to adjust the position of the slogan*/
top: 30px; left:65px;
}
#header .searchform {
position: absolute;
top: 5px; right: 3px;
}
/* main column */
#main {
float: left;
margin-left: 15px;
padding: 0;
/*width: 54%;*/
width: 72%;
/*border-left: 1px solid #f2f2f2;
*/
}
#main2 {
float: left;
margin-left: 15px;
padding: 0;
width: 96%;
}
.post-footer {
background-color: #FAFAFA;
padding: 5px; margin-top: 20px;
font-size: 95%;
border: 1px solid #f2f2f2;
}
.post-footer .date {
background: url(clock.gif) no-repeat left center;
padding-left: 20px; margin: 0 10px 0 5px;
}
.post-footer .comments {
background: url(comment.gif) no-repeat left center;
padding-left: 20px; margin: 0 10px 0 5px;
}
.post-footer .readmore {
background: url(page.gif) no-repeat left center;
padding-left: 20px; margin: 0 10px 0 5px;
}
/* sideabar */
#sidebar {
float: left;
width: 24%;
margin: 0; padding: 0;
display: inline;
}
#sidebar ul.sidemenu {
list-style: none;
text-align: left;
margin: 0 0 8px 0;
padding-right: 0;
text-decoration: none;
}
#sidebar ul.sidemenu li {
border-bottom: 1px solid #EFF0F1;
background: url(arrow.gif) no-repeat 2px 5px;
padding: 2px 5px 2px 20px;
}
* html body #sidebar ul.sidemenu li { height: 1%; }
#sidebar ul.sidemenu a {
font-weight: bold;
background-image: none;
text-decoration: none;
}
/* rightbar */
#rightbar {
float: right;
width: 24%;
padding: 0; margin: 0;
}
/* footer */
#footer {
clear: both;
background: #FFF url(footerbg.gif) repeat-x left top;
border-top: 1px solid #F2F2F2;
text-align: center;
height: 50px;
}
#footer a {
text-decoration: none;
font-weight: bold;
}
/* menu */
#menu {
clear: both;
margin: 0; padding: 0;
}
#menu ul {
position: relative;
bottom: 4px;
margin: 0; padding: 0;
float: left;
font: bold 1.4em 'Trebuchet MS', Tahoma, Arial, Sans-serif;
width: 850px;/* 775px; */
border: 1px solid #808080;
border-width: 0 0 4px 0;
list-style: none;
}
#menu ul li{
display: inline;
}
#menu ul li a {
position: relative; bottom: -4px;
float: left;
color: #808080;
padding: 0px 10px;
text-decoration: none;
background: white url(menudivide.gif) repeat-y right top;
border-bottom: 4px solid #808080;
}
#menu ul li a:hover{
color: black;
background-color: #F3F3F3;
border-bottom: 4px solid #FFA600;
}
#menu ul li#current a{
color: #333;
background-color: #F3F3F3;
border-bottom: 4px solid #FFA600;
}
#menu ul li#sponsorship a{
color: red;
}
#menu ul li#sp_current a{
color: red;
background-color: #F3F3F3;
border-bottom: 4px solid #FFA600;
}
/* Font colors */
font.names { color: #EC981F ; }
/* Company Logo Boxes */
.companybox {
border-color : #FFFFFF;
border : 0px #FFFFFF;
border-top : #999999 0pt solid;
border-left : #999999 0pt solid;
border-right : #999999 0pt solid;
border-bottom : #999999 0pt solid;
text-align: left;
padding: 10px 10px 10px 10px;
}
/* Alignment classes */
.float-left { float: left;}
.float-right { float: right; }
.align-left { text-align: left; }
.align-right { text-align: right; }
.align-center { text-align: center; }
.align-justify { text-align: justify; }
/* display classes */
.clear { clear: both; }
.block { display: block; }
.hide { display: none; }
.orange { color: #FFA600; }
.tab { padding: 0px 0px 0px 16px; }

BIN
www/images/arrow.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 B

BIN
www/images/avago.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
www/images/clock.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

BIN
www/images/comment.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

BIN
www/images/fig1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
www/images/fig2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
www/images/fig3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
www/images/fig4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
www/images/footerbg.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

BIN
www/images/headerbg.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

BIN
www/images/init_scst.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
www/images/iss.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
www/images/logo.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
www/images/menubg.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 B

BIN
www/images/menudivide.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

BIN
www/images/page.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

BIN
www/images/quote.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

BIN
www/images/square_arrow.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

BIN
www/images/t_emulex.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
www/images/t_fcoe.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
www/images/t_lsi.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
www/images/t_qlogic.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
www/images/t_rdma.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
www/images/t_sas.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
www/images/t_unsupported.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

52
www/images/tooltips.js Normal file
View File

@@ -0,0 +1,52 @@
var d = document;
var offsetfromcursorY=15 // y offset of tooltip
var ie=d.all && !window.opera;
var ns6=d.getElementById && !d.all;
var tipobj,op;
function tooltip(el,txt) {
tipobj=d.getElementById('mess');
tipobj.innerHTML = txt;
op = 0.1;
tipobj.style.opacity = op;
tipobj.style.display="block";
tipobj.style.visibility="visible";
el.onmousemove=positiontip;
appear();
}
function hide_info(el) {
d.getElementById('mess').style.visibility='hidden';
d.getElementById('mess').style.display='none';
el.onmousemove='';
}
function ietruebody(){
return (d.compatMode && d.compatMode!="BackCompat")? d.documentElement : d.body
}
function positiontip(e) {
var curX=(ns6)?e.pageX : event.clientX+ietruebody().scrollLeft;
var curY=(ns6)?e.pageY : event.clientY+ietruebody().scrollTop;
var winwidth=ie? ietruebody().clientWidth : window.innerWidth-20
var winheight=ie? ietruebody().clientHeight : window.innerHeight-20
var rightedge=ie? winwidth-event.clientX : winwidth-e.clientX;
var bottomedge=ie? winheight-event.clientY-offsetfromcursorY : winheight-e.clientY-offsetfromcursorY;
if (rightedge < tipobj.offsetWidth) tipobj.style.left=curX-tipobj.offsetWidth+"px";
else tipobj.style.left=curX+"px";
if (bottomedge < tipobj.offsetHeight) tipobj.style.top=curY-tipobj.offsetHeight-offsetfromcursorY+"px"
else tipobj.style.top=curY+offsetfromcursorY+"px";
}
function appear() {
if(op < 0.9) {
op += 0.07;
tipobj.style.opacity = op;
tipobj.style.filter = 'alpha(opacity='+op*100+')';
t = setTimeout('appear()', 30);
}
}

207
www/index.html Normal file
View File

@@ -0,0 +1,207 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="Generic SCSI Target Subsystem for Linux, SCST, SCSI target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<meta name="verify-v1" content="N5TwpSXr8cNkQf0gvE3F3sv+TPHL15k4dTo+ZQCeV9Q=">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SCST: A Generic SCSI Target Subsystem for Linux</title>
</head>
<body>
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id="slogan">Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li id="current"><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<div id="content-wrap">
<div id="main">
<h1>Generic SCSI Target Subsystem for Linux</h1>
<p>The generic SCSI target subsystem for Linux (SCST) allows creation of sophisticated storage devices
from any Linux box. Those
devices can provide advanced
functionality, like replication, thin provisioning,
deduplication, high availability,
automatic backup, etc. Another class of such devices
are Virtual Tape Libraries (VTL)
as well as other disk-based backup solutions.</p>
<p>SCST devices can use any link which supports
SCSI-style data exchange: <strong>iSCSI</strong>, <strong>Fibre Channel</strong>, <strong>FCoE</strong>,
<strong>SAS</strong>,
<strong>InfiniBand (SRP)</strong>, <strong>Wide (parallel) SCSI</strong>, etc.</p>
<p>It might
well be that your favorite storage appliance is running SCST in the firmware.</p>
<p>SCST project consists from a set of subprojects: generic SCSI target mid-layer itself (SCST core)
with a set of device handlers as well as target drivers
and user space utilities.
<h1>Features of SCST Core</h1>
<ul>
<li><span>SCST core provides unified,
consistent interface between SCSI target drivers and
Linux kernel as well as between Linux kernel and storage backend
handlers, connecting target drivers with real or emulated storage backend.</span></li>
<li><span>SCST core performs all required pre- and post- processing of incoming requests as well as
necessary error recovery.</span></li>
<li><span>SCST core undertakes most problems, related to execution contexts, thus practically eliminating one of the most
complicated problem in the kernel drivers development. For example, target drivers for Marvell
SAS adapters or for InfiniBand SRP are less 3000 lines of code long.</span></li>
<li><span>Very low overhead and fine-grained locks allow to reach the
maximum performance and scalability. Particularly, incoming requests can be processed in
the caller's context or in one of the internal SCST core's tasklets without any
extra context switches.</span></li>
<li><span>Device handlers architecture allows various I/O
modes in backstorage handling. For example, pass-through device handlers allow to export real
SCSI hardware and vdisk device handler allows to export files as virtual disks.</span></li>
<li><span>Advanced per-initiator devices visibility management (LUN masking) allows different
initiators to see different set of devices with different access permissions. For instance,
initiator A could see exported from target T devices X and Y read-writable, and initiator B from
the same target T could see devices Y read-only and Z read-writable.
This feature is required for hardware targets, which don't have ability to create
virtual targets (SAS adapters, for instance).</span></li>
<li><span>SCST core emulates necessary functionality of SCSI host adapter, because from remote initiators' point of view
a SCSI target acts as a SCSI host with its own devices. This is especially important in pass-through mode with
one to many relationship, i.e. when multiple initiators can connect to the exported pass-through
devices. You can find more deep elaboration why it is needed in <a href="http://www.mail-archive.com/linux-scsi@vger.kernel.org/msg06911.html">this</a>
message in thread "Question for pass-through target design" in linux-scsi mailing list. Some of the emulated functions are the following:</span>
<ul>
<li><span>Generation of necessary UNIT ATTENTIONs, their storage and delivery to all connected
remote initiators.</span></li>
<li><span>RESERVE/RELEASE functionality.</span></li>
<li><span>All types of RESETs and other task management functions.</span></li>
<li><span>REPORT LUNS command as well as SCSI address space management in order to have consistent
address space on all remote initiators, since local SCSI devices could not know about each
other to report via REPORT LUNS command. Additionally, SCST core responds with error on all
commands to non-existing devices and provides access control, so different remote
initiators could see different set of devices.</span></li>
<li><span>Other necessary functionality (task attributes, etc.) as specified in SCSI standards.</span></li>
</ul>
</li>
<li><span>SCST core has multithreaded design and complete SMP support, so, if necessary, all your CPU cores will participate in the commands
processing.</span></li>
<li><span>Well documented.</span></li>
</ul>
<p>Interoperability between remote and local SCSI initiators (i.e. sd, st, etc.) is the additional issue that SCST is going to
address (it is not implemented yet). It is necessary, because local SCSI initiators can change the state of the
device, for example RESERVE the device, or some of its parameters and that could be done behind SCST, i.e. remote initiators
will not know about it, which could
lead to various problems, including data corruption. Thus, RESERVE/RELEASE commands, locally generated
UNIT ATTENTIONs, etc. should be intercepted and passed through SCST core.</p>
<p>You can find comparison of SCST with other SCSI targets on the <a href="comparison.html">Comparison</a> page.
Some highlights what it can mean for end users you can find on the <a href="target_iscsi.html">iSCSI-SCST</a> page.
<h1>SCST core supports the following I/O modes</h1>
<ul>
<li><span>Pass-through mode with one to many relationship, i.e. when multiple initiators can
connect to the exported pass-through devices, for virtually all SCSI devices types: disks (type 0),
tapes (type 1), processors (type 3), CDROMs (type 5), MO disks (type 7), medium changers (type 8) and RAID
controllers (type 0xC). In this mode you can, for instance, share your parallel SCSI tape or SATA
DVD-RW device to your iSCSI network.</span></li>
<li><span>FILEIO mode, which allows to use files on file systems or block devices as virtual
remotely available SCSI disks or CDROMs with benefits of the Linux cache.</span></li>
<li><span>BLOCKIO mode, which performs direct block IO with a block device, bypassing
page-cache for all operations. This mode works well with high-end storage HBAs and for applications that
either do not need caching between application and disk or need the large block throughput.</span></li>
<li><span>User space mode using scst_user device handler, which allows to implement in the
user space high performance virtual SCSI devices. Comparing with fully in-kernel dev handlers
this mode has very low overhead (few %%).</span></li>
<li><span>Performance testing device handlers as well as NULLIO mode to provide
a way for direct performance measurements without overhead of actual data
transfers from/to underlying SCSI devices.
</span></li>
</ul>
<h1>Certification</h1>
<p>SCST core engine has passed VMware certification as part of
<a href="http://scalecomputing.com/products">Scale&rsquo;s Intelligent Clustered Storage</a> technology
and <a href="http://www.iss-integration.com/supercore.html">ISS STORCIUM</a> solution. It also has passed
VMware and Microsoft certification as part of <a href="https://www.sandisk.com/business/datacenter/products/flash-software/ion-accelerator">SanDisk ION Accelerator</a>
and storage arrays developed by <a href="http://www.open-e.com/">Open-E, Inc</a>.</p>
<p>In October 2012 Hewlett-Packard ProLiant BL465c Gen8 witrh SCST-based storage earned the maximum
score 59.99@62 tiles in <a href="http://www.vmware.com/a/vmmark">VMmark Version 2.1.1</a>.
In June 2016 this result was updated by <a href="http://www.vmware.com/content/dam/digitalmarketing/vmware/en/pdf/vmmark/2016-06-07-HPE-ProLiant-DL580G9.pdf">HPE ProLiant DL580 Gen9</a></p>
</div>
<div id="rightbar">
<h1>Documentation</h1>
<p><a href="scst_pg.html">HTML</a></p>
<p><a href="scst_pg.pdf">PDF</a></p>
<p><a href="http://events.linuxfoundation.org/sites/events/files/slides/lcna15_bvanassche.pdf">SCST overview slides</a></p>
<p><a href="http://monklinux.blogspot.com/2012/02/scst-configuration-how-to-using-gentoo.html">Gentoo HOWTO</a></p>
<p><a href="iscsi-scst-howto.txt">HOWTO For iSCSI-SCST</a></p>
<p><a href="SCST_Gentoo_HOWTO.txt">Gentoo HOWTO For iSCSI-SCST</a></p>
<p><a href="qla2x00t-howto.html">HOWTO For QLogic Target Driver</a></p>
<p><a href="sgv_cache.html">SCST SGV Cache Description</a></p>
<p><a href="http://scst.sourceforge.net/scst_user_spec.pdf">SCST user space device handler interface description</a></p>
<h1>Articles</h1>
<p>By Marc Smith:</p>
<p><a href="http://marcitland.blogspot.com/2011/03/accelerating-vdi-using-scst-and-ssds.html">Accelerating VDI Using SCST and SSDs</a></p>
<p><a href="http://marcitland.blogspot.com/2013/04/building-using-highly-available-esos.html">Building &amp Using a Highly Available ESOS Disk Array</a></p>
<p><a href="http://marcitland.blogspot.com/2014/07/open-storage-dual-controller-oss-disk.html">Open Storage: Dual-Controller OSS Disk Array</a></p>
<h1>SCST 0.9.6 graphs</h1>
<p><a href="images/init_scst.png">init_scst</a></p>
<p><a href="images/scst_cmd_thread.png">scst_cmd_thread</a></p>
<p><a href="images/scst_mgmt_cmd_thread.png">scst_mgmt_cmd_thread</a></p>
<p><a href="images/scst_mgmt_thread.png">scst_mgmt_thread</a></p>
<p>all by Ming Zhang</p>
<h1>QUESTIONS</h1>
<p>If you have any questions you can ask them via<br><a href="http://lists.sourceforge.net/lists/listinfo/scst-devel">
scst-devel mailing list</a><br><br>
See <a href="http://sourceforge.net/mail/?group_id=110471">mailing lists page</a> for more info about SCST mailing
lists.</p>
<h1></h1>
<p><a href="http://sourceforge.net/donate/index.php?group_id=110471">
<img src="http://images.sourceforge.net/images/project-support.jpg" width="88" height="32" border="0" alt="Support This Project"> </a></p>
<h1></h1>
<p><a href="http://validator.w3.org/check?uri=referer">
<img src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Transitional" height="31" width="88"></a>
</p>
<p><a href="http://jigsaw.w3.org/css-validator/check/referer">
<img style="border:0;width:88px;height:31px" src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
</p>
</div>
</div>
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

21
www/iscsi-scst/index.html Normal file
View File

@@ -0,0 +1,21 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<object><noscript>
<meta http-equiv="Refresh" content="0; URL=http://scst.sourceforge.net/target_iscsi.html">
</noscript></object>
<title>Old iSCSI-SCST page</title>
</head>
<body>
<script language="JavaScript1.1" type="text/javascript">
<!--
location.replace("http://scst.sourceforge.net/target_iscsi.html");
//-->
</script>
</body>
</html>

View File

@@ -0,0 +1,61 @@
MaxOutstandingR2T iSCSI parameter and its
influence on performance in case of high
latency links.
Let's consider we have a 1Gbps network between initiator and target with
10ms latency (a good near distance WAN/Internet to another building in
the same town). We want to send backup from the initiator to a tape or
tape library on the target. We are limited to send only 1 write command
at time, because our tape doesn't allow more. We will send 2MB of data
in each command.
Our initiator and target negotiated typical values InitialR2T No,
ImmediateData Yes, FirstBurstLength 65536, MaxBurstLength 262144. Other
parameters don't matter for our task, except MaxOutstandingR2T. Let we
can run 2 pieces of iSCSI target software on the target: one supporting
only MaxOutstandingR2T 1 and another one supporting MaxOutstandingR2T >1.
The first target negotiated MaxOutstandingR2T 1, the second one - 16.
10ms means that a 1 byte packet send from the initiator reaches the
target in 5ms time. Then 5ms in the opposite direction. 1Gbps bandwidth
means that 64K of data transferred from the initiator to the target in
about 0.5ms. The maximum throuput we can have with 1Gbps link is about
120MB/s.
For sake of simplification we will suppose the targets will process
requests and the initiator will process responses quick enough, so we
can ignore additional latency the processing on both sides adds.
Since each R2T request must contain less than MaxBurstLength data, we
need ((2MB - 64K)/256K) = 8 R2T requests to send. The first 64K will be
sent as immediate/unsolicited data without explicit R2T request.
1. The first target with MaxOutstandingR2T 1.
MaxOutstandingR2T 1 means that only one R2T request can be active on
time. I.e., the next request for data transfer can be sent after the
previous one completed and all the data received.
Thus, on the first target each command will be completed on time:
5 + 0.5 + (5 + 5 + 256K/64K * 0.5) * 7 + (5 + 5 + (256K - 64K)/64K *
0.5) + 5 = 106ms, i.e. 9 IOPS, which is 18MB/s. Remember, we have
120MB/s link.
2. The second target with MaxOutstandingR2T 16.
With MaxOutstandingR2T 16 the second target can send all R2T requests at
once and the first R2T can be sent before immediate/unsolicited data
received.
Thus, on the second target each command will be completed on time:
5 + 5 + 5 + 256K/64K * 0.5 * 7 + (256K-64K)/64K * 0.5 + 5 = 35.5ms,
i.e. 28 IOPS, which is 56MB/s.
Thus, the second target with MaxOutstandingR2T 16 will perform on 56/18 = 311%
better that the first target with MaxOutstandingR2T 1.

266
www/mc_s.html Normal file
View File

@@ -0,0 +1,266 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="MC/S, MC/S vs MPIO, multiple connections per session">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>MC/S vs MPIO</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li id="current"><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Comparison</h1>
<ul class="sidemenu">
<li><a href="comparison.html">Features comparison</a></li>
<li><a href="scstvslio.html">SCST vs LIO/TCM</a></li>
<li><a href="scstvsstgt.html">SCST vs STGT</a></li>
<li><a href="mc_s.html">MC/S vs MPIO</a></li>
</ul>
</div>
<div id="main">
<h1>MC/S vs MPIO</h1>
<p>MC/S (Multiple Connections per Session) is a feature of iSCSI
protocol, which allows to combine several connections inside a single
session for performance and failover purposes. Let's consider what
practical value this feature has comparing with OS level multipath
(MPIO) and try to answer why none of Open Source OS'es neither still
support it, despite of many years since iSCSI protocol started
being actively used, nor going to implement it in the future.</p>
<p>MC/S is done on the iSCSI level, while MPIO is done on the higher
level. Hence, all MPIO infrastructure is shared among all SCSI
transports, including Fibre Channel, SAS, etc. </p>
<p>MC/S was designed at time, when most OS'es didn't have standard OS level
multipath. Instead, each vendor had its own implementation, which
created huge interoperability problems. So, one of the goals of MC/S was
to address this issue and standardize the multipath area in a single standard. But
nowadays almost all OS'es has OS level multipath implemented using
standard SCSI facilities, hence this purpose of MC/S isn't valid anymore.</p>
<p>Usually it is claimed, than MC/S has the following 2 advantages over MPIO:</p>
<ol>
<li><span>Faster failover recovery.</span></li>
<li><span>Better performance.</span></li>
</ol>
<p>Let's look how realistic those claims are.</p>
<h2>Failover recovery time</h2>
<p>Let's consider a single target exporting a single device over 2 links.</p>
<p>For MC/S failover recovery is quite simple: all outstanding SCSI
commands reassigned to another connection. No other actions are
necessary, because session (i.e. I_T Nexus) remains the same.
Consequently, all reservations and other SCSI states as well as other
initiators connected to the device remain unaffected.</p>
<p>For MPIO failover recovery is much more complicated. This is because
it involves transfer of all outstanding commands and SCSI states from one
I_T Nexus to another. The first thing, which initiator will do for
that is to abort all outstanding commands on the faulted
I_T Nexus. There are 2 approaches for that: CLEAR TASK SET and LUN RESET
task management functions. </p>
<p>CLEAR TASK SET function aborts all commands on the device.
Unfortunately, it has limitations: it isn't always supported by device
and having single task set shared over initiators isn't always
appropriate for application.</p>
<p>LUN RESET function resets the device.</p>
<p>Both CLEAR TASK SET and LUN RESET functions can somehow harm
other initiators, because all commands from all initiators, not only
from one doing the failover recovery, will be aborted. Additionally, LUN
RESET resets all SCSI settings for all connected initiators to the
initial state and, if device had reservation from any initiator, it will
be cleared.
<p>But the harm is minimal:</p>
<ul>
<li><span> With TAS bit set on Control Mode page, all the aborted commands will
be returned to all affected initiators with TASK ABORTED status, so they
can simply immediately retry them. For CLEAR TASK SET if TAS isn't set
all affected initiators will be notified by Unit Attention COMMANDS
CLEARED BY ANOTHER INITIATOR, so they also can immediately retry all
outstanding commands.</span></li>
<li><span>In case of the device reset the affected initiators will be notified via
the corresponding Unit Attention about reset of
all SCSI settings to the initial state. Then the initiators can do necessary
recovery actions. Usually no recovery actions are needed, except for the
reservation holder, whose reservation was cleared. For it recovery might
be not trivial. But Persistent Reservations solve this issue, because
they are not cleared by the device reset.</span></li>
</ul>
<p>Thus, with Persistent Reservations or using CLEAR TASK SET function
additional failover recovery time, which MPIO has comparing to MC/S,
is time to wait for reset or commands abort finished and time to
retry all the aborted commands. On a properly configured system it
should be less than few seconds, which is well acceptable on practice.
If Linux storage stack improved to allow to abort all submitted to it
commands (currently only wait for their completion is possible), then
time to abort all the commands can be decreased to a fraction of second. </p>
<h2>Performance</h2>
<p>At first, neither MC/S, nor MPIO can improve performance if there is
only one SCSI command sent to target at time. For instance, in case of
tape backup and restore. Both MC/S and MPIO work on the commands level,
so can't split data transfers for a single command over several links.
Only bonding (also known as NIC teaming or Link Aggregation) can improve
performance in this case, because it works on the link level.</p>
<p>MC/S over several links preserves commands execution order, i.e. with
it commands executed in the same order as they were submitted. MPIO
can't preserve this order, because it can't see, which command on which
link was submitted earlier. Delays in links processing can change
commands order in the place where target receives them.</p>
<p>Since initiators usually send commands in the optimal for performance
order, reordering can somehow hurt performance. But this can happen only with
naive target implementation, which can't recover the optimal commands execution
order. Currently Linux is not naive and quite good on this area. See, for
instance, section "SEQUENTIAL ACCESS OVER MPIO" in <a
href="vl_res.txt">those measurements</a>. Don't look at the absolute
numbers, look at %% of performance improvement using the second link.
The result equivalent to 200 MB/s over 2 1Gbps links, which is close to
possible maximum.</p>
<p>If free commands reorder is forbidden for a device, either
by use of ORDERED tag, or if the Queue Algorithm Modifier in the Control
Mode Page is set to 0, then MPIO will have to maintain commands order by
sending commands over only a single link. But on practice this case is
really rare and 99.(9)% of OS'es and applications allow free commands
reorder and it is enabled by default.</p>
<p>From other side, strictly preserving commands order as MC/S does has a
downside as well. It can lead to so called "commands ordering
bottleneck", when newer commands have to wait before one or more older
commands get executed, although it would be better for performance to
reorder them. As result, MPIO sometimes has better performance, than
MC/S, especially in setups, where maximum IOPS number is important. See,
for instance,
<a href="http://article.gmane.org/gmane.linux.scsi/16311">here</a>.
</p>
<h2>When MC/S is better than MPIO</h2>
<p>For sake of completeness, we should mention that there are marginal cases, where MPIO can't be used or will not
provide any benefit, but MC/S can be successful:</p>
<ol>
<li><span>When strict commands order is required.</span></li>
<li><span>When aborted commands can't be retried.</span></li>
</ol>
<p>For disks both of them are always false. However for some tape drives
and backup applications one or both can be true. But on practice:</p>
<ul>
<li><span>There are neither known tape drives, nor backup
applications, which can use multiple outstanding commands at
time. All them support and use only one single outstanding
command at time. MC/S can't increase performance for them, only
bonding can. So, in this case there no difference between MC/S
and MPIO.</span></li>
<li><span>The lack of ability to retry commands is rather a
limitation of legacy tape drives, which support only implicit
address commands, not of MPIO. Modern tape drives and backup
applications can use explicit address commands, which you can
abort and then retry, hence they are compatible with MPIO.</span></li>
</ul>
<h2>Conclusion</h2>
<p>Thus:</p>
<ol>
<li><span>Cost to develop MC/S is high, but benefits of it are marginal and with future MPIO
improvements can be fully eliminated.</span></li>
<li><span>MPIO allows to utilize existing infrastructure for all
transports, not only iSCSI.
</span></li>
<li><span>All transports can benefit from improvements in MPIO.</span></li>
<li><span>With MPIO there is no need to create multiple layers doing very similar
functionality.</span></li>
<li><span> MPIO doesn't have commands ordering bottleneck, which MC/S has. </span></li>
</ol>
<p>Simply, MC/S is rather a workaround done on the wrong level for some deficiencies of existing SCSI standards used for MPIO,
namely the lack of possibility to group several I_T Nexuses with ability to reassign commands
between them and preserve commands order among them. If in future those features added in the SCSI standards, MC/S will
not be needed at all, hence, all investments in it will be voided. No surprise then that no
Open Source OS'es neither support, nor going to implement it. Moreover,
when back to 2005 there was an attempt to add MC/S capable iSCSI initiator in Linux, it was
rejected. See for more details <a href="http://article.gmane.org/gmane.linux.scsi/15769">here</a>
and <a href="http://article.gmane.org/gmane.linux.scsi/16301">here</a>.
</p>
</div>
</div>
</div>
<!-- wrap ends here -->
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018 <b><font color="#EC981F">Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font color="#EC981F">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

95
www/scst_admin.html Normal file
View File

@@ -0,0 +1,95 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="scst admin">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SCST Admin Utility</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>SCST administration utility</h1>
<p>SCST administration utility scstadmin developed by Mark Buechler.</p>
<p>With it you can manually or automatically using either plain text config file, or MySQL database configure every aspect of SCST.</p>
<p>Especially useful feature of scstadmin is ability to figure out and apply <strong>on the fly</strong> on the currently
running system changes in scst.conf file. In other words, you can have SCST subsystem running with configuration from file
scst.conf, then you edit this file, e.g. add new devices, then scstadmin will figure out that you added those devices
and add them to SCST.</p>
<p class="post-footer align-right">
<a href="downloads.html" class="readmore">Download</a>
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
</p>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
</div>
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

119
www/scstvslio.html Normal file
View File

@@ -0,0 +1,119 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SCST vs LIO/TCM</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li id="current"><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Comparison</h1>
<ul class="sidemenu">
<li><a href="comparison.html">Features comparison</a></li>
<li><a href="scstvslio.html">SCST vs LIO/TCM</a></li>
<li><a href="scstvsstgt.html">SCST vs STGT</a></li>
<li><a href="mc_s.html">MC/S vs MPIO</a></li>
</ul>
</div>
<div id="main">
<h1>SCST vs LIO/TCM</h1>
<p><a href="http://linux-iscsi.org/" rel="nofollow">LIO</a>,
from recently being renamed to TCM, is another independent from SCST implementation
of SCSI target framework for Linux. It's started as PyX iSCSI target and then was
accommodated to other transports. But it's still in many kinds iSCSI-oriented.
You can find an example when people are not happy with it
<a href="http://thread.gmane.org/gmane.linux.scsi/65703/focus=66749">here</a>.</p>
<p>LIO maintainer, Nicholas Bellinger, is very good in building personal relationships and promoting LIO,
although often using misleading half, less-then-half and simply deceitful statements
about LIO current state, capabilities and future directions as well as about its competitor, SCST.
For instance, he setup LIO targets comparison page with obviously wrong statements about SCST, like
that it isn't fully zero copy or it isn't a generic target engine (while LIO, of course, is fully
zero-copy and fully generic target engine). Any
<a href="http://sourceforge.net/mailarchive/message.php?msg_id=21741080">attempts</a>
to correct it were simply ignored.</p>
<p>With those tricks Nicholas Bellinger was capable to attract key Linux kernel developers, and
they suddenly changed their opinion about Linux SCSI target subsystem in the opposite direction.
They previously asserted that
in-kernel SCSI target is the wrong direction, SCSI target must be in the user space, so
STGT is what everybody needed. Now their opinion is that SCSI target driver should be in the kernel space
and the only target good for them is LIO, doesn't matter that:</p>
<ol>
<li><span>SCST is a lot more mature and advanced</span></li>
<li><span>SCST from the beginning is a generic SCSI target</span></li>
<li><span>SCST has a lot more features</span></li>
<li><span>SCST has better performance</span></li>
<li><span>SCST has a lot more users</span></li>
<li><span>SCST has much bigger community</span></li>
</ol>
<p>So, rejecting base principles of the Linux kernel community that the best code should win, the worst
code was chosen.</p>
<p>You can find more background behind choosing LIO as the mainline kernel SCSI target
subsystem if you read <a href="http://thread.gmane.org/gmane.linux.kernel/1078109/focus=1078310">this thread</a>
as well as searching for targets related topics in Linux kernel and Linux SCSI mailing lists.</p>
<p>Particularly notable is that James Bottomley from the beginning was telling that SCST
can't be merged in the mainline kernel, because it doesn't offer a drop in replacement for STGT
to avoid having 2 target infrastructures in the kernel at the same time. But, since LIO can't
offer user space backend drivers and doesn't have ibmvstgt driver analog, for LIO the drop in replacement wasn't
a requirement, so 2.6.38+ kernels successfully have both STGT and LIO.</p>
</div>
</div>
</div>
<!-- wrap ends here -->
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018 <b><font color="#EC981F">Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font color="#EC981F">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

99
www/scstvsstgt.html Normal file
View File

@@ -0,0 +1,99 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SCST vs STGT">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SCST vs STGT</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li id="current"><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Comparison</h1>
<ul class="sidemenu">
<li><a href="comparison.html">Features comparison</a></li>
<li><a href="scstvslio.html">SCST vs LIO/TCM</a></li>
<li><a href="scstvsstgt.html">SCST vs STGT</a></li>
<li><a href="mc_s.html">MC/S vs MPIO</a></li>
</ul>
</div>
<div id="main">
<h1>SCST vs STGT</h1>
<p><a href="http://stgt.sourceforge.net/">STGT</a> is alternative, independent from SCST implementation
of SCSI target framework for Linux. It has different architecture, where SCSI target state machine is placed in
the user space, while in SCST all the processing done in the kernel. Such architecture as STGT has was acknowledged
by the Linux SCSI subsystem maintainers as a "right" one, so kernel's part of STGT quickly
found its way to the kernel.</p>
<p>But such architecture has several inherent problems. Among them performance and complexity.
See <a href="http://lkml.org/lkml/2008/12/10/245">description</a> for the set of patches, submitted for
the first iteration of in-kernel inclusion review and comments in Linux kernel mailing list.</p>
<p>See also the following important discussions:</p>
<ul>
<li><span><a href="http://news.gmane.org/find-root.php?message_id=%3ce2e108260801170127w2937b2afg9bef324efa945e43%40mail.gmail.com%3e">
"Performance of SCST versus STGT"</a> for performance comparison.</span></li>
<li><span><a href="http://news.gmane.org/find-root.php?message_id=%3c463F36AC.3010207%40vlnb.net%3e">
"Question for pass-through target design"</a></span></li>
<li><span><a href="http://news.gmane.org/find-root.php?message_id=%3c43987F75.2000301%40vlnb.net%3e">
"Stgt a new version of iscsi target?"</a>, especially pay attention to
<a href="http://article.gmane.org/gmane.linux.scsi/21073">this</a> message why STGT's architecture was considered "right".
</span></li>
</ul>
<p>Time has proved that STGT is too weak to satisfy modern storage requirements. Now it is obsolete and
soon going to be removed from the mainline kernel.</p>
</div>
</div>
</div>
<!-- wrap ends here -->
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018 <b><font color="#EC981F">Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font color="#EC981F">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

View File

@@ -0,0 +1,596 @@
Index: scst/include/scst_sgv.h
===================================================================
--- scst/include/scst_sgv.h (revision 3134)
+++ scst/include/scst_sgv.h (working copy)
@@ -82,12 +82,14 @@ void sgv_pool_put(struct sgv_pool *pool)
void sgv_pool_flush(struct sgv_pool *pool);
void sgv_pool_set_allocator(struct sgv_pool *pool,
- struct page *(*alloc_pages_fn)(struct scatterlist *, gfp_t, void *),
- void (*free_pages_fn)(struct scatterlist *, int, void *));
+ struct page *(*alloc_pages_fn)(struct scatterlist *,
+ gfp_t, int, void *),
+ void (*free_pages_fn)(struct scatterlist *, int, int, void *));
struct scatterlist *sgv_pool_alloc(struct sgv_pool *pool, unsigned int size,
gfp_t gfp_mask, int flags, int *count,
- struct sgv_pool_obj **sgv, struct scst_mem_lim *mem_lim, void *priv);
+ struct sgv_pool_obj **sgv, struct scst_mem_lim *mem_lim, void *priv,
+ int max_sg_count);
void sgv_pool_free(struct sgv_pool_obj *sgv, struct scst_mem_lim *mem_lim);
void *sgv_get_priv(struct sgv_pool_obj *sgv);
Index: scst/src/scst_mem.h
===================================================================
--- scst/src/scst_mem.h (revision 3134)
+++ scst/src/scst_mem.h (working copy)
@@ -37,6 +37,8 @@ struct sgv_pool_obj {
int cache_num;
int pages;
+ int alloc_order;
+
/* jiffies, protected by sgv_pool_lock */
unsigned long time_stamp;
@@ -66,9 +68,9 @@ struct sgv_pool_cache_acc {
*/
struct sgv_pool_alloc_fns {
struct page *(*alloc_pages_fn)(struct scatterlist *sg, gfp_t gfp_mask,
- void *priv);
+ int alloc_order, void *priv);
void (*free_pages_fn)(struct scatterlist *sg, int sg_count,
- void *priv);
+ int alloc_order, void *priv);
};
/*
Index: scst/src/scst_lib.c
===================================================================
--- scst/src/scst_lib.c (revision 3134)
+++ scst/src/scst_lib.c (working copy)
@@ -4454,7 +4454,6 @@ int scst_alloc_space(struct scst_cmd *cm
int atomic = scst_cmd_atomic(cmd);
int flags;
struct scst_tgt_dev *tgt_dev = cmd->tgt_dev;
- static int ll;
TRACE_ENTRY();
@@ -4465,40 +4464,23 @@ int scst_alloc_space(struct scst_cmd *cm
flags |= SGV_POOL_ALLOC_NO_CACHED;
cmd->sg = sgv_pool_alloc(tgt_dev->pool, cmd->bufflen, gfp_mask, flags,
- &cmd->sg_cnt, &cmd->sgv, &cmd->dev->dev_mem_lim, NULL);
+ &cmd->sg_cnt, &cmd->sgv, &cmd->dev->dev_mem_lim, NULL,
+ tgt_dev->max_sg_cnt);
if (cmd->sg == NULL)
goto out;
- if (unlikely(cmd->sg_cnt > tgt_dev->max_sg_cnt)) {
- if ((ll < 10) || TRACING_MINOR()) {
- PRINT_INFO("Unable to complete command due to "
- "SG IO count limitation (requested %d, "
- "available %d, tgt lim %d)", cmd->sg_cnt,
- tgt_dev->max_sg_cnt, cmd->tgt->sg_tablesize);
- ll++;
- }
- goto out_sg_free;
- }
+ EXTRACHECKS_BUG_ON(cmd->sg_cnt > tgt_dev->max_sg_cnt);
if (cmd->data_direction != SCST_DATA_BIDI)
goto success;
cmd->out_sg = sgv_pool_alloc(tgt_dev->pool, cmd->out_bufflen, gfp_mask,
flags, &cmd->out_sg_cnt, &cmd->out_sgv,
- &cmd->dev->dev_mem_lim, NULL);
+ &cmd->dev->dev_mem_lim, NULL, tgt_dev->max_sg_cnt);
if (cmd->out_sg == NULL)
goto out_sg_free;
- if (unlikely(cmd->out_sg_cnt > tgt_dev->max_sg_cnt)) {
- if ((ll < 10) || TRACING_MINOR()) {
- PRINT_INFO("Unable to complete command due to "
- "SG IO count limitation (OUT buffer, requested "
- "%d, available %d, tgt lim %d)", cmd->out_sg_cnt,
- tgt_dev->max_sg_cnt, cmd->tgt->sg_tablesize);
- ll++;
- }
- goto out_out_sg_free;
- }
+ EXTRACHECKS_BUG_ON(cmd->out_sg_cnt > tgt_dev->max_sg_cnt);
success:
res = 0;
@@ -4507,12 +4489,6 @@ out:
TRACE_EXIT();
return res;
-out_out_sg_free:
- sgv_pool_free(cmd->out_sgv, &cmd->dev->dev_mem_lim);
- cmd->out_sgv = NULL;
- cmd->out_sg = NULL;
- cmd->out_sg_cnt = 0;
-
out_sg_free:
sgv_pool_free(cmd->sgv, &cmd->dev->dev_mem_lim);
cmd->sgv = NULL;
Index: scst/src/scst_mem.c
===================================================================
--- scst/src/scst_mem.c (revision 3134)
+++ scst/src/scst_mem.c (working copy)
@@ -110,8 +110,8 @@ static void sgv_dtor_and_free(struct sgv
TRACE_MEM("Destroying sgv obj %p", obj);
if (obj->sg_count != 0) {
- pool->alloc_fns.free_pages_fn(obj->sg_entries,
- obj->sg_count, obj->allocator_priv);
+ pool->alloc_fns.free_pages_fn(obj->sg_entries, obj->sg_count,
+ obj->alloc_order, obj->allocator_priv);
}
if (obj->sg_entries != obj->sg_entries_data) {
if (obj->trans_tbl !=
@@ -522,11 +522,13 @@ out:
}
static void sgv_free_sys_sg_entries(struct scatterlist *sg, int sg_count,
- void *priv)
+ int alloc_order, void *priv)
{
int i;
+ const int num_pages = 1 << alloc_order;
- TRACE_MEM("sg=%p, sg_count=%d", sg, sg_count);
+ TRACE_MEM("sg=%p, sg_count=%d, alloc_order=%d",
+ sg, sg_count, alloc_order);
for (i = 0; i < sg_count; i++) {
struct page *p = sg_page(&sg[i]);
@@ -538,36 +540,23 @@ static void sgv_free_sys_sg_entries(stru
(unsigned long)p, len, pages);
while (pages > 0) {
- int order = 0;
-
-/*
- * __free_pages() doesn't like freeing pages with not that order with
- * which they were allocated, so disable this small optimization.
- */
-#if 0
- if (len > 0) {
- while (((1 << order) << PAGE_SHIFT) < len)
- order++;
- len = 0;
- }
-#endif
TRACE_MEM("free_pages(): order %d, page %lx",
- order, (unsigned long)p);
+ alloc_order, (unsigned long)p);
- __free_pages(p, order);
+ __free_pages(p, alloc_order);
- pages -= 1 << order;
- p += 1 << order;
+ pages -= num_pages;
+ p += num_pages;
}
}
}
-static struct page *sgv_alloc_sys_pages(struct scatterlist *sg,
- gfp_t gfp_mask, void *priv)
+static struct page *sgv_alloc_sys_pages(struct scatterlist *sg, gfp_t gfp_mask,
+ int alloc_order, void *priv)
{
- struct page *page = alloc_pages(gfp_mask, 0);
+ struct page *page = alloc_pages(gfp_mask, alloc_order);
- sg_set_page(sg, page, PAGE_SIZE, 0);
+ sg_set_page(sg, page, PAGE_SIZE << alloc_order, 0);
TRACE_MEM("page=%p, sg=%p, priv=%p", page, sg, priv);
if (page == NULL) {
TRACE(TRACE_OUT_OF_MEM, "%s", "Allocation of "
@@ -579,7 +568,7 @@ static struct page *sgv_alloc_sys_pages(
static int sgv_alloc_sg_entries(struct scatterlist *sg, int pages,
gfp_t gfp_mask, enum sgv_clustering_types clustering_type,
struct trans_tbl_ent *trans_tbl,
- const struct sgv_pool_alloc_fns *alloc_fns, void *priv)
+ const struct sgv_pool_alloc_fns *alloc_fns, int alloc_order, void *priv)
{
int sg_count = 0;
int pg, i, j;
@@ -594,7 +583,7 @@ static int sgv_alloc_sg_entries(struct s
gfp_mask |= __GFP_ZERO;
#endif
- for (pg = 0; pg < pages; pg++) {
+ for (pg = 0; pg < pages; pg += 1 << alloc_order) {
void *rc;
#ifdef CONFIG_SCST_DEBUG_OOM
if (((gfp_mask & __GFP_NOFAIL) != __GFP_NOFAIL) &&
@@ -603,7 +592,7 @@ static int sgv_alloc_sg_entries(struct s
else
#endif
rc = alloc_fns->alloc_pages_fn(&sg[sg_count], gfp_mask,
- priv);
+ alloc_order, priv);
if (rc == NULL)
goto out_no_mem;
@@ -623,8 +612,8 @@ static int sgv_alloc_sg_entries(struct s
if (merged == -1)
sg_count++;
- TRACE_MEM("pg=%d, merged=%d, sg_count=%d", pg, merged,
- sg_count);
+ TRACE_MEM("pg=%d, merged=%d, sg_count=%d",
+ pg, merged, sg_count);
}
if ((clustering_type != sgv_no_clustering) && (trans_tbl != NULL)) {
@@ -645,7 +634,7 @@ out:
return sg_count;
out_no_mem:
- alloc_fns->free_pages_fn(sg, sg_count, priv);
+ alloc_fns->free_pages_fn(sg, sg_count, alloc_order, priv);
sg_count = 0;
goto out;
}
@@ -704,32 +693,16 @@ out_free:
goto out;
}
-static struct sgv_pool_obj *sgv_get_obj(struct sgv_pool *pool, int cache_num,
- int pages, gfp_t gfp_mask, bool get_new)
+static struct sgv_pool_obj *sgv_create_obj(struct sgv_pool *pool,
+ int cache_num,
+ int pages, gfp_t gfp_mask,
+ int locked)
{
struct sgv_pool_obj *obj;
- spin_lock_bh(&pool->sgv_pool_lock);
-
- if (unlikely(get_new)) {
- /* Used only for buffers preallocation */
- goto get_new;
- }
-
- if (likely(!list_empty(&pool->recycling_lists[cache_num]))) {
- obj = list_entry(pool->recycling_lists[cache_num].next,
- struct sgv_pool_obj, recycling_list_entry);
-
- list_del(&obj->sorted_recycling_list_entry);
- list_del(&obj->recycling_list_entry);
-
- pool->inactive_cached_pages -= pages;
-
- spin_unlock_bh(&pool->sgv_pool_lock);
- goto out;
- }
+ if (!locked)
+ spin_lock_bh(&pool->sgv_pool_lock);
-get_new:
if (pool->cached_entries == 0) {
TRACE_MEM("Adding pool %p to the active list", pool);
spin_lock_bh(&sgv_pools_lock);
@@ -759,6 +732,57 @@ get_new:
spin_unlock_bh(&pool->sgv_pool_lock);
}
+ return obj;
+}
+
+/* FZ Notes: cache_num == order, and we should have pages = 1 << cache_num. */
+static struct sgv_pool_obj *sgv_get_obj(struct sgv_pool *pool, int cache_num,
+ int pages, gfp_t gfp_mask,
+ int max_sg_count, bool get_new)
+{
+ struct sgv_pool_obj *obj;
+
+ spin_lock_bh(&pool->sgv_pool_lock);
+
+ if (unlikely(get_new)) {
+ /* Used only for buffers preallocation */
+ /* TODO: caller of that should now call
+ * sgv_create_obj, and this will go away. */
+ goto get_new;
+ }
+
+ if (likely(!list_empty(&pool->recycling_lists[cache_num]))) {
+ list_for_each_entry(obj, &pool->recycling_lists[cache_num],
+ recycling_list_entry) {
+
+ TRACE_MEM("obj %p, sg_count %d (max %d)", obj,
+ obj->sg_count, max_sg_count);
+
+ if (unlikely(obj->sg_count > max_sg_count))
+ continue;
+
+ obj = list_entry(pool->recycling_lists[cache_num].next,
+ struct sgv_pool_obj,
+ recycling_list_entry);
+
+ list_del(&obj->sorted_recycling_list_entry);
+ list_del(&obj->recycling_list_entry);
+
+ pool->inactive_cached_pages -= pages;
+
+ spin_unlock_bh(&pool->sgv_pool_lock);
+
+ /* FZ: note entirely sure of that check. Need
+ * to investigate. */
+ /*EXTRACHECKS_BUG_ON(obj->alloc_order <= cache_num);*/
+
+ goto out;
+ }
+ }
+
+get_new:
+ obj = sgv_create_obj(pool, cache_num, pages, gfp_mask, true);
+
out:
return obj;
}
@@ -908,14 +932,17 @@ static void sgv_uncheck_allowed_mem(stru
*/
struct scatterlist *sgv_pool_alloc(struct sgv_pool *pool, unsigned int size,
gfp_t gfp_mask, int flags, int *count,
- struct sgv_pool_obj **sgv, struct scst_mem_lim *mem_lim, void *priv)
+ struct sgv_pool_obj **sgv, struct scst_mem_lim *mem_lim, void *priv,
+ int max_sg_count)
{
struct sgv_pool_obj *obj;
int cache_num, pages, cnt;
struct scatterlist *res = NULL;
int pages_to_alloc;
+ int alloc_order;
int no_cached = flags & SGV_POOL_ALLOC_NO_CACHED;
bool allowed_mem_checked = false, hiwmk_checked = false;
+ int tmp;
TRACE_ENTRY();
@@ -958,7 +985,7 @@ struct scatterlist *sgv_pool_alloc(struc
allowed_mem_checked = true;
obj = sgv_get_obj(pool, cache_num, pages_to_alloc, gfp_mask,
- flags & SGV_POOL_ALLOC_GET_NEW);
+ max_sg_count, flags & SGV_POOL_ALLOC_GET_NEW);
if (unlikely(obj == NULL)) {
TRACE(TRACE_OUT_OF_MEM, "Allocation of "
"sgv_pool_obj failed (size %d)", size);
@@ -967,7 +994,30 @@ struct scatterlist *sgv_pool_alloc(struc
if (obj->sg_count != 0) {
TRACE_MEM("Cached obj %p", obj);
- atomic_inc(&pool->cache_acc[cache_num].hit_alloc);
+
+ if (unlikely(max_sg_count < obj->sg_count)) {
+ TRACE_MEM("Too many SG entries %d (max %d)",
+ obj->sg_count, max_sg_count);
+
+ sgv_put_obj(obj);
+
+ obj = sgv_create_obj(pool, cache_num,
+ pages_to_alloc, gfp_mask,
+ false);
+ if (obj &&
+ unlikely(max_sg_count < obj->sg_count)) {
+ sgv_put_obj(obj);
+ obj = NULL;
+ }
+
+ if (obj == NULL) {
+ TRACE(TRACE_OUT_OF_MEM, "Allocation of "
+ "sgv_pool_obj failed (size %d)",
+ size);
+ goto out_fail;
+ }
+ } else
+ atomic_inc(&pool->cache_acc[cache_num].hit_alloc);
goto success;
}
@@ -1045,16 +1095,44 @@ struct scatterlist *sgv_pool_alloc(struc
TRACE_MEM("Big or no_cached obj %p (size %d)", obj, sz);
}
- obj->sg_count = sgv_alloc_sg_entries(obj->sg_entries,
- pages_to_alloc, gfp_mask, pool->clustering_type,
- obj->trans_tbl, &pool->alloc_fns, priv);
- if (unlikely(obj->sg_count <= 0)) {
- obj->sg_count = 0;
- if ((flags & SGV_POOL_RETURN_OBJ_ON_ALLOC_FAIL) &&
- (cache_num >= 0))
- goto out_return1;
- else
- goto out_fail_free_sg_entries;
+ /* Allocate the scatter gather entries. Since the memory we
+ * request may fit in too many entries, we try to start with
+ * an order big enough. That will save some useless
+ * allocations. */
+ alloc_order = 0;
+ tmp = pages_to_alloc;
+ while (tmp > max_sg_count) {
+ tmp >>= 1;
+ alloc_order++;
+ }
+
+ while (1) {
+ obj->sg_count = sgv_alloc_sg_entries(obj->sg_entries,
+ pages_to_alloc,
+ gfp_mask,
+ pool->clustering_type,
+ obj->trans_tbl,
+ &pool->alloc_fns,
+ alloc_order, priv);
+ if (unlikely(obj->sg_count <= 0)) {
+ obj->sg_count = 0;
+ if ((flags & SGV_POOL_RETURN_OBJ_ON_ALLOC_FAIL) &&
+ (cache_num >= 0))
+ goto out_return1;
+ else
+ goto out_fail_free_sg_entries;
+ }
+
+ obj->alloc_order = alloc_order;
+
+ if (likely(obj->sg_count <= max_sg_count))
+ break;
+
+ obj->owner_pool->alloc_fns.free_pages_fn(obj->sg_entries,
+ obj->sg_count,
+ obj->alloc_order,
+ obj->allocator_priv);
+ alloc_order++;
}
if (cache_num >= 0) {
@@ -1230,7 +1308,7 @@ void sgv_pool_free(struct sgv_pool_obj *
sgv_put_obj(obj);
} else {
obj->owner_pool->alloc_fns.free_pages_fn(obj->sg_entries,
- obj->sg_count, obj->allocator_priv);
+ obj->sg_count, obj->alloc_order, obj->allocator_priv);
kfree(obj);
sgv_hiwmk_uncheck(pages);
}
@@ -1289,7 +1367,7 @@ struct scatterlist *scst_alloc(int size,
* So, let's always don't use clustering.
*/
cnt = sgv_alloc_sg_entries(res, pages, gfp_mask, sgv_no_clustering,
- NULL, &sys_alloc_fns, NULL);
+ NULL, &sys_alloc_fns, 0, NULL);
if (cnt <= 0)
goto out_free;
@@ -1326,7 +1404,7 @@ void scst_free(struct scatterlist *sg, i
sgv_hiwmk_uncheck(count);
- sgv_free_sys_sg_entries(sg, count, NULL);
+ sgv_free_sys_sg_entries(sg, count, 0, NULL);
kfree(sg);
return;
}
@@ -1580,8 +1658,9 @@ static void sgv_pool_destroy(struct sgv_
* See the SGV pool documentation for more details.
*/
void sgv_pool_set_allocator(struct sgv_pool *pool,
- struct page *(*alloc_pages_fn)(struct scatterlist *, gfp_t, void *),
- void (*free_pages_fn)(struct scatterlist *, int, void *))
+ struct page *(*alloc_pages_fn)(struct scatterlist *, gfp_t,
+ int, void *),
+ void (*free_pages_fn)(struct scatterlist *, int, int, void *))
{
pool->alloc_fns.alloc_pages_fn = alloc_pages_fn;
pool->alloc_fns.free_pages_fn = free_pages_fn;
Index: scst/src/dev_handlers/scst_user.c
===================================================================
--- scst/src/dev_handlers/scst_user.c (revision 3134)
+++ scst/src/dev_handlers/scst_user.c (working copy)
@@ -163,9 +163,9 @@ static int dev_user_disk_done(struct scs
static int dev_user_tape_done(struct scst_cmd *cmd);
static struct page *dev_user_alloc_pages(struct scatterlist *sg,
- gfp_t gfp_mask, void *priv);
+ gfp_t gfp_mask, int alloc_order, void *priv);
static void dev_user_free_sg_entries(struct scatterlist *sg, int sg_count,
- void *priv);
+ int alloc_order, void *priv);
static void dev_user_add_to_ready(struct scst_user_cmd *ucmd);
@@ -392,7 +392,7 @@ static void dev_user_free_ucmd(struct sc
}
static struct page *dev_user_alloc_pages(struct scatterlist *sg,
- gfp_t gfp_mask, void *priv)
+ gfp_t gfp_mask, int alloc_order, void *priv)
{
struct scst_user_cmd *ucmd = (struct scst_user_cmd *)priv;
int offset = 0;
@@ -401,8 +401,11 @@ static struct page *dev_user_alloc_pages
/* *sg supposed to be zeroed */
- TRACE_MEM("ucmd %p, ubuff %lx, ucmd->cur_data_page %d", ucmd,
- ucmd->ubuff, ucmd->cur_data_page);
+ TRACE_MEM("ucmd %p, ubuff %lx, ucmd->cur_data_page %d, alloc_order %d",
+ ucmd, ucmd->ubuff, ucmd->cur_data_page, alloc_order);
+
+ if (unlikely(alloc_order != 0))
+ goto out;
if (ucmd->cur_data_page == 0) {
TRACE_MEM("ucmd->first_page_offset %d",
@@ -495,7 +498,7 @@ static void __dev_user_free_sg_entries(s
}
static void dev_user_free_sg_entries(struct scatterlist *sg, int sg_count,
- void *priv)
+ int alloc_order, void *priv)
{
struct scst_user_cmd *ucmd = (struct scst_user_cmd *)priv;
@@ -582,7 +585,8 @@ static int dev_user_alloc_sg(struct scst
ucmd->buff_cached = cached_buff;
cmd->sg = sgv_pool_alloc(pool, bufflen, gfp_mask, flags, &cmd->sg_cnt,
- &ucmd->sgv, &dev->udev_mem_lim, ucmd);
+ &ucmd->sgv, &dev->udev_mem_lim, ucmd,
+ cmd->tgt_dev->max_sg_cnt);
if (cmd->sg != NULL) {
struct scst_user_cmd *buf_ucmd =
(struct scst_user_cmd *)sgv_get_priv(ucmd->sgv);
@@ -614,20 +618,7 @@ static int dev_user_alloc_sg(struct scst
cmd, cmd->out_sg, cmd->out_sg_cnt, cmd->sg_cnt);
}
- if (unlikely(cmd->sg_cnt > cmd->tgt_dev->max_sg_cnt)) {
- static int ll;
- if ((ll < 10) || TRACING_MINOR()) {
- PRINT_INFO("Unable to complete command due to "
- "SG IO count limitation (requested %d, "
- "available %d, tgt lim %d)",
- cmd->sg_cnt, cmd->tgt_dev->max_sg_cnt,
- cmd->tgt->sg_tablesize);
- ll++;
- }
- cmd->sg = NULL;
- /* sgv will be freed in dev_user_free_sgv() */
- res = -1;
- }
+ EXTRACHECKS_BUG_ON(cmd->sg_cnt > cmd->tgt_dev->max_sg_cnt);
} else {
TRACE_MEM("Buf not alloced (ucmd %p, h %d, buff_cached, %d, "
"sg_cnt %d, ubuff %lx, sgv %p", ucmd, ucmd->h,
@@ -3137,6 +3128,14 @@ static int dev_user_prealloc_buffer(stru
TRACE_ENTRY();
+ {
+ /* The SGV patch cannot support that feature because
+ * we don't know either the target or the number of SG
+ * buffer of the target. */
+ res = -EINVAL;
+ goto out;
+ }
+
mutex_lock(&dev_priv_mutex);
dev = (struct scst_user_dev *)file->private_data;
res = dev_user_check_reg(dev);
@@ -3188,7 +3187,7 @@ static int dev_user_prealloc_buffer(stru
pool = dev->pool;
sg = sgv_pool_alloc(pool, bufflen, GFP_KERNEL, SGV_POOL_ALLOC_GET_NEW,
- &sg_cnt, &ucmd->sgv, &dev->udev_mem_lim, ucmd);
+ &sg_cnt, &ucmd->sgv, &dev->udev_mem_lim, ucmd, 0);
if (sg != NULL) {
struct scst_user_cmd *buf_ucmd =
(struct scst_user_cmd *)sgv_get_priv(ucmd->sgv);

View File

@@ -0,0 +1,445 @@
In the pass-through mode (i.e. using the pass-through device handlers
scst_disk, scst_tape, etc) SCSI commands, coming from remote initiators,
are passed to local SCSI hardware on target as is, without any
modifications. As any other hardware, the local SCSI hardware can not
handle commands with amount of data and/or segments count in
scatter-gather array bigger some values. If you have this issue you will
see symptoms like small transfers work well, but large ones stall and
messages like: "Unable to complete command due to SG IO count
limitation" are printed in the kernel logs.
This is proposed patch to solve that. It allows SGV cache do allocation
of pages with order > 0, i.e. more than 1 page per SG entry.
Compile tested only.
Index: scst/include/scst.h
===================================================================
--- scst/include/scst.h (revision 558)
+++ scst/include/scst.h (working copy)
@@ -2649,12 +2649,13 @@ struct sgv_pool *sgv_pool_create(const c
void sgv_pool_destroy(struct sgv_pool *pool);
void sgv_pool_set_allocator(struct sgv_pool *pool,
- struct page *(*alloc_pages_fn)(struct scatterlist *, gfp_t, void *),
- void (*free_pages_fn)(struct scatterlist *, int, void *));
+ struct page *(*alloc_pages_fn)(struct scatterlist *, gfp_t, void *, int),
+ void (*free_pages_fn)(struct scatterlist *, int, void *, int));
struct scatterlist *sgv_pool_alloc(struct sgv_pool *pool, unsigned int size,
gfp_t gfp_mask, int flags, int *count,
- struct sgv_pool_obj **sgv, struct scst_mem_lim *mem_lim, void *priv);
+ struct sgv_pool_obj **sgv, struct scst_mem_lim *mem_lim, void *priv,
+ int max_sg_count);
void sgv_pool_free(struct sgv_pool_obj *sgv, struct scst_mem_lim *mem_lim);
void *sgv_get_priv(struct sgv_pool_obj *sgv);
Index: scst/src/scst_mem.h
===================================================================
--- scst/src/scst_mem.h (revision 558)
+++ scst/src/scst_mem.h (working copy)
@@ -36,6 +36,8 @@ struct sgv_pool_obj {
/* if <0 - pages, >0 - order */
int order_or_pages;
+ int alloc_order;
+
struct {
/* jiffies, protected by pool_mgr_lock */
unsigned long time_stamp;
@@ -67,9 +69,9 @@ struct sgv_pool_cache_acc {
struct sgv_pool_alloc_fns {
struct page *(*alloc_pages_fn)(struct scatterlist *sg, gfp_t gfp_mask,
- void *priv);
+ void *priv, int alloc_order);
void (*free_pages_fn)(struct scatterlist *sg, int sg_count,
- void *priv);
+ void *priv, int alloc_order);
};
struct sgv_pool {
Index: scst/src/scst_lib.c
===================================================================
--- scst/src/scst_lib.c (revision 558)
+++ scst/src/scst_lib.c (working copy)
@@ -1663,34 +1663,18 @@ int scst_alloc_space(struct scst_cmd *cm
flags |= SCST_POOL_ALLOC_NO_CACHED;
cmd->sg = sgv_pool_alloc(tgt_dev->pool, cmd->bufflen, gfp_mask, flags,
- &cmd->sg_cnt, &cmd->sgv, &cmd->dev->dev_mem_lim, NULL);
+ &cmd->sg_cnt, &cmd->sgv, &cmd->dev->dev_mem_lim, NULL,
+ tgt_dev->max_sg_cnt);
if (cmd->sg == NULL)
goto out;
- if (unlikely(cmd->sg_cnt > tgt_dev->max_sg_cnt)) {
- static int ll;
- if (ll < 10) {
- PRINT_INFO("Unable to complete command due to "
- "SG IO count limitation (requested %d, "
- "available %d, tgt lim %d)", cmd->sg_cnt,
- tgt_dev->max_sg_cnt, cmd->tgt->sg_tablesize);
- ll++;
- }
- goto out_sg_free;
- }
+ EXTRACHECKS_BUG_ON(cmd->sg_cnt > tgt_dev->max_sg_cnt);
res = 0;
out:
TRACE_EXIT();
return res;
-
-out_sg_free:
- sgv_pool_free(cmd->sgv, &cmd->dev->dev_mem_lim);
- cmd->sgv = NULL;
- cmd->sg = NULL;
- cmd->sg_cnt = 0;
- goto out;
}
void scst_release_space(struct scst_cmd *cmd)
Index: scst/src/scst_mem.c
===================================================================
--- scst/src/scst_mem.c (revision 558)
+++ scst/src/scst_mem.c (working copy)
@@ -118,7 +118,7 @@ out_head:
}
static void scst_free_sys_sg_entries(struct scatterlist *sg, int sg_count,
- void *priv)
+ void *priv, int alloc_order)
{
int i;
@@ -134,7 +134,7 @@ static void scst_free_sys_sg_entries(str
(unsigned long)p, len, pages);
while (pages > 0) {
- int order = 0;
+ int order = alloc_order;
/*
* __free_pages() doesn't like freeing pages with not that order with
@@ -159,9 +159,9 @@ static void scst_free_sys_sg_entries(str
}
static struct page *scst_alloc_sys_pages(struct scatterlist *sg,
- gfp_t gfp_mask, void *priv)
+ gfp_t gfp_mask, void *priv, int alloc_order)
{
- struct page *page = alloc_pages(gfp_mask, 0);
+ struct page *page = alloc_pages(gfp_mask, alloc_order);
sg_set_page(sg, page, PAGE_SIZE, 0);
TRACE_MEM("page=%p, sg=%p, priv=%p", page, sg, priv);
@@ -174,10 +174,10 @@ static struct page *scst_alloc_sys_pages
static int scst_alloc_sg_entries(struct scatterlist *sg, int pages,
gfp_t gfp_mask, int clustered, struct trans_tbl_ent *trans_tbl,
- const struct sgv_pool_alloc_fns *alloc_fns, void *priv)
+ const struct sgv_pool_alloc_fns *alloc_fns, void *priv, int alloc_order)
{
int sg_count = 0;
- int pg, i, j;
+ int pg, i, j, pg_inc = 1 << alloc_order;
int merged = -1;
TRACE_MEM("pages=%d, clustered=%d", pages, clustered);
@@ -189,7 +189,7 @@ static int scst_alloc_sg_entries(struct
gfp_mask |= __GFP_ZERO;
#endif
- for (pg = 0; pg < pages; pg++) {
+ for (pg = 0; pg < pages; pg += pg_inc) {
void *rc;
#ifdef CONFIG_SCST_DEBUG_OOM
if (((gfp_mask & __GFP_NOFAIL) != __GFP_NOFAIL) &&
@@ -198,7 +198,7 @@ static int scst_alloc_sg_entries(struct
else
#endif
rc = alloc_fns->alloc_pages_fn(&sg[sg_count], gfp_mask,
- priv);
+ priv, alloc_order);
if (rc == NULL)
goto out_no_mem;
if (clustered) {
@@ -229,7 +229,7 @@ out:
return sg_count;
out_no_mem:
- alloc_fns->free_pages_fn(sg, sg_count, priv);
+ alloc_fns->free_pages_fn(sg, sg_count, priv, alloc_order);
sg_count = 0;
goto out;
}
@@ -292,7 +292,7 @@ static void sgv_dtor_and_free(struct sgv
{
if (obj->sg_count != 0) {
obj->owner_pool->alloc_fns.free_pages_fn(obj->sg_entries,
- obj->sg_count, obj->allocator_priv);
+ obj->sg_count, obj->allocator_priv, obj->alloc_order);
}
if (obj->sg_entries != obj->sg_entries_data) {
if (obj->trans_tbl !=
@@ -308,6 +308,36 @@ static void sgv_dtor_and_free(struct sgv
return;
}
+static struct sgv_pool_obj *sgv_pool_cached_create(struct sgv_pool *pool,
+ int order, gfp_t gfp_mask, bool locked)
+{
+ struct sgv_pool_obj *obj;
+ int pages = 1 << order;
+
+ if (!locked)
+ spin_lock_bh(&sgv_pools_mgr.mgr.pool_mgr_lock);
+
+ pool->acc.cached_entries++;
+ pool->acc.cached_pages += pages;
+
+ spin_unlock_bh(&sgv_pools_mgr.mgr.pool_mgr_lock);
+
+ obj = kmem_cache_alloc(pool->caches[order],
+ gfp_mask & ~(__GFP_HIGHMEM|GFP_DMA));
+ if (likely(obj)) {
+ memset(obj, 0, sizeof(*obj));
+ obj->order_or_pages = order;
+ obj->owner_pool = pool;
+ } else {
+ spin_lock_bh(&sgv_pools_mgr.mgr.pool_mgr_lock);
+ pool->acc.cached_entries--;
+ pool->acc.cached_pages -= pages;
+ spin_unlock_bh(&sgv_pools_mgr.mgr.pool_mgr_lock);
+ }
+
+ return obj;
+}
+
static struct sgv_pool_obj *sgv_pool_cached_get(struct sgv_pool *pool,
int order, gfp_t gfp_mask)
{
@@ -332,23 +362,7 @@ static struct sgv_pool_obj *sgv_pool_cac
goto out;
}
- pool->acc.cached_entries++;
- pool->acc.cached_pages += pages;
-
- spin_unlock_bh(&sgv_pools_mgr.mgr.pool_mgr_lock);
-
- obj = kmem_cache_alloc(pool->caches[order],
- gfp_mask & ~(__GFP_HIGHMEM|GFP_DMA));
- if (likely(obj)) {
- memset(obj, 0, sizeof(*obj));
- obj->order_or_pages = order;
- obj->owner_pool = pool;
- } else {
- spin_lock_bh(&sgv_pools_mgr.mgr.pool_mgr_lock);
- pool->acc.cached_entries--;
- pool->acc.cached_pages -= pages;
- spin_unlock_bh(&sgv_pools_mgr.mgr.pool_mgr_lock);
- }
+ obj = sgv_pool_cached_create(pool, order, gfp_mask, true);
out:
return obj;
@@ -546,12 +560,13 @@ static void scst_uncheck_allowed_mem(str
struct scatterlist *sgv_pool_alloc(struct sgv_pool *pool, unsigned int size,
gfp_t gfp_mask, int flags, int *count,
- struct sgv_pool_obj **sgv, struct scst_mem_lim *mem_lim, void *priv)
+ struct sgv_pool_obj **sgv, struct scst_mem_lim *mem_lim, void *priv,
+ int max_sg_count)
{
struct sgv_pool_obj *obj;
int order, pages, cnt;
struct scatterlist *res = NULL;
- int pages_to_alloc;
+ int pages_to_alloc, alloc_order;
struct kmem_cache *cache;
int no_cached = flags & SCST_POOL_ALLOC_NO_CACHED;
bool allowed_mem_checked = false, hiwmk_checked = false;
@@ -605,7 +620,23 @@ struct scatterlist *sgv_pool_alloc(struc
if (obj->sg_count != 0) {
TRACE_MEM("Cached sgv_obj %p", obj);
EXTRACHECKS_BUG_ON(obj->order_or_pages != order);
- atomic_inc(&pool->cache_acc[order].hit_alloc);
+
+ if (unlikely(max_sg_count < obj->sg_count)) {
+ TRACE_MEM("Too many SG entries %d (max %d)",
+ obj->sg_count, max_sg_count);
+
+ sgv_pool_cached_put(obj);
+
+ obj = sgv_pool_cached_create(pool, order,
+ gfp_mask, false);
+ if (obj == NULL) {
+ TRACE(TRACE_OUT_OF_MEM, "Allocation of "
+ "sgv_pool_obj failed (size %d)",
+ size);
+ goto out_fail;
+ }
+ } else
+ atomic_inc(&pool->cache_acc[order].hit_alloc);
goto success;
}
@@ -682,15 +713,27 @@ struct scatterlist *sgv_pool_alloc(struc
TRACE_MEM("Big or no_cached sgv_obj %p (size %d)", obj, sz);
}
- obj->sg_count = scst_alloc_sg_entries(obj->sg_entries,
- pages_to_alloc, gfp_mask, pool->clustered, obj->trans_tbl,
- &pool->alloc_fns, priv);
- if (unlikely(obj->sg_count <= 0)) {
- obj->sg_count = 0;
- if ((flags & SCST_POOL_RETURN_OBJ_ON_ALLOC_FAIL) && cache)
- goto out_return1;
- else
- goto out_fail_free_sg_entries;
+ alloc_order = 0;
+ while (1) {
+ obj->sg_count = scst_alloc_sg_entries(obj->sg_entries,
+ pages_to_alloc, gfp_mask, pool->clustered,
+ obj->trans_tbl, &pool->alloc_fns, priv, alloc_order);
+ if (unlikely(obj->sg_count <= 0)) {
+ obj->sg_count = 0;
+ if ((flags & SCST_POOL_RETURN_OBJ_ON_ALLOC_FAIL) && cache)
+ goto out_return1;
+ else
+ goto out_fail_free_sg_entries;
+ }
+ obj->alloc_order = alloc_order;
+
+ if (max_sg_count >= obj->sg_count)
+ break;
+
+ obj->owner_pool->alloc_fns.free_pages_fn(obj->sg_entries,
+ obj->sg_count, obj->allocator_priv,
+ obj->alloc_order);
+ alloc_order++;
}
if (cache) {
@@ -815,7 +858,7 @@ void sgv_pool_free(struct sgv_pool_obj *
sgv_pool_cached_put(sgv);
} else {
sgv->owner_pool->alloc_fns.free_pages_fn(sgv->sg_entries,
- sgv->sg_count, sgv->allocator_priv);
+ sgv->sg_count, sgv->allocator_priv, sgv->alloc_order);
pages = (sgv->sg_count != 0) ? -sgv->order_or_pages : 0;
kfree(sgv);
sgv_pool_hiwmk_uncheck(pages);
@@ -861,7 +904,7 @@ struct scatterlist *scst_alloc(int size,
* So, always don't use clustering.
*/
*count = scst_alloc_sg_entries(res, pages, gfp_mask, 0, NULL,
- &sys_alloc_fns, NULL);
+ &sys_alloc_fns, NULL, 0);
if (*count <= 0)
goto out_free;
@@ -888,7 +931,7 @@ void scst_free(struct scatterlist *sg, i
sgv_pool_hiwmk_uncheck(count);
- scst_free_sys_sg_entries(sg, count, NULL);
+ scst_free_sys_sg_entries(sg, count, NULL, 0);
kfree(sg);
return;
}
@@ -1060,8 +1103,8 @@ void sgv_pool_deinit(struct sgv_pool *po
}
void sgv_pool_set_allocator(struct sgv_pool *pool,
- struct page *(*alloc_pages_fn)(struct scatterlist *, gfp_t, void *),
- void (*free_pages_fn)(struct scatterlist *, int, void *))
+ struct page *(*alloc_pages_fn)(struct scatterlist *, gfp_t, void *, int),
+ void (*free_pages_fn)(struct scatterlist *, int, void *, int))
{
pool->alloc_fns.alloc_pages_fn = alloc_pages_fn;
pool->alloc_fns.free_pages_fn = free_pages_fn;
Index: scst/src/dev_handlers/scst_user.c
===================================================================
--- scst/src/dev_handlers/scst_user.c (revision 559)
+++ scst/src/dev_handlers/scst_user.c (working copy)
@@ -168,9 +168,9 @@ static int dev_user_disk_done(struct scs
static int dev_user_tape_done(struct scst_cmd *cmd);
static struct page *dev_user_alloc_pages(struct scatterlist *sg,
- gfp_t gfp_mask, void *priv);
+ gfp_t gfp_mask, void *priv, int alloc_order);
static void dev_user_free_sg_entries(struct scatterlist *sg, int sg_count,
- void *priv);
+ void *priv, int alloc_order);
static void dev_user_add_to_ready(struct scst_user_cmd *ucmd);
@@ -368,7 +368,7 @@ static void dev_user_free_ucmd(struct sc
}
static struct page *dev_user_alloc_pages(struct scatterlist *sg,
- gfp_t gfp_mask, void *priv)
+ gfp_t gfp_mask, void *priv, int alloc_order)
{
struct scst_user_cmd *ucmd = (struct scst_user_cmd *)priv;
int offset = 0;
@@ -377,8 +377,11 @@ static struct page *dev_user_alloc_pages
/* *sg supposed to be zeroed */
- TRACE_MEM("ucmd %p, ubuff %lx, ucmd->cur_data_page %d", ucmd,
- ucmd->ubuff, ucmd->cur_data_page);
+ TRACE_MEM("ucmd %p, ubuff %lx, ucmd->cur_data_page %d, alloc_order %d",
+ ucmd, ucmd->ubuff, ucmd->cur_data_page, alloc_order);
+
+ if (unlikely(alloc_order != 0))
+ goto out;
if (ucmd->cur_data_page == 0) {
TRACE_MEM("ucmd->first_page_offset %d",
@@ -468,7 +471,7 @@ static void __dev_user_free_sg_entries(s
}
static void dev_user_free_sg_entries(struct scatterlist *sg, int sg_count,
- void *priv)
+ void *priv, int alloc_order)
{
struct scst_user_cmd *ucmd = (struct scst_user_cmd *)priv;
@@ -537,7 +540,8 @@ static int dev_user_alloc_sg(struct scst
ucmd->buff_cached = cached_buff;
cmd->sg = sgv_pool_alloc(dev->pool, bufflen, gfp_mask, flags,
- &cmd->sg_cnt, &ucmd->sgv, &dev->udev_mem_lim, ucmd);
+ &cmd->sg_cnt, &ucmd->sgv, &dev->udev_mem_lim, ucmd,
+ cmd->tgt_dev->max_sg_cnt);
if (cmd->sg != NULL) {
struct scst_user_cmd *buf_ucmd =
(struct scst_user_cmd *)sgv_get_priv(ucmd->sgv);
@@ -559,21 +563,7 @@ static int dev_user_alloc_sg(struct scst
"last_len %d, l %d)", ucmd, cached_buff, ucmd->ubuff,
last_len, cmd->sg[cmd->sg_cnt-1].length);
- if (unlikely(cmd->sg_cnt > cmd->tgt_dev->max_sg_cnt)) {
- static int ll;
- if (ll < 10) {
- PRINT_INFO("Unable to complete command due to "
- "SG IO count limitation (requested %d, "
- "available %d, tgt lim %d)",
- cmd->sg_cnt,
- cmd->tgt_dev->max_sg_cnt,
- cmd->tgt->sg_tablesize);
- ll++;
- }
- cmd->sg = NULL;
- /* sgv will be freed in dev_user_free_sgv() */
- res = -1;
- }
+ EXTRACHECKS_BUG_ON(cmd->sg_cnt > cmd->tgt_dev->max_sg_cnt);
} else {
TRACE_MEM("Buf not alloced (ucmd %p, h %d, buff_cached, %d, "
"sg_cnt %d, ubuff %lx, sgv %p", ucmd, ucmd->h,

101
www/target_emulex.html Normal file
View File

@@ -0,0 +1,101 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="Fibre Channel target, Emulex target, FC target, FCoE target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>Emulex FC/FCoE target driver</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>Target driver for Emulex FC/FCoE</h1>
<p><img src="images/LPe16002.jpg" width="100" height="120" class="float-left" alt="SCST Emulex">
<p>The Emulex OneCore Storage FC/FCoE driver (ocs_fc_scst) is developed and maintained by Broadcom. It is available on the
<a href="https://www.broadcom.com/products/storage/fibre-channel-host-bus-adapters/onecore-storage-sdk" class="readmore">OneCore Storage SDK</a> page.</p>
<p>The Emulex OneCore Storage SDK supports the Service Level Interface 4 (SLI-4) API and is compatible with the latest generation of Emulex 8 and 16 Gb/s Fibre Channel HBAs (LPe15000 and LPe16000 series),
as well as the latest generation of 10 and 40 Gb/s FCoE UCNAs (OCe14000-series). It supports both target and initiator mode of operation and a number of advanced features: NPIV, T10-PI, etc.</p>
<p>If you intend to use persistent reservations with this target driver, you may need to apply: <a href="https://sourceforge.net/p/scst/mailman/message/35682659/" class="readmore">this patch</a>.</p>
<p>Note: The drivers on <a href="http://sourceforge.net/projects/lpfcxxxx/" class="readmore">SourceForge Emulex Drivers</a>
are very old, not maintained and not recommended for new designs.</p>
<br><br>
<p class="post-footer align-right">
<a href="https://www.broadcom.com/products/storage/fibre-channel-host-bus-adapters/onecore-storage-sdk" class="readmore">Emulex OneCore Storage Drivers</a>
</p>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
<!-- content-wrap ends here -->
</div>
<!-- wrap ends here -->
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

95
www/target_fcoe.html Normal file
View File

@@ -0,0 +1,95 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="Fibre Channel Over Ethernet target, FCoE target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>FCoE Target Driver</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>FCoE target</h1>
<p><img src="images/t_fcoe.gif" width="100" height="120" class="float-left" alt="SCST Fcoe">
SCST Fibre Channel over Ethernet (FCoE) target is developed by Open-FCoE team and Joe Eykholt.
Since February 2010 the main development place of it is SCST SVN repository.
</p>
<p>You can download the latest development version from the SCST SVN repository. See the download
page how to setup access to it.
</p><br><br><br><br>
<p class="post-footer align-right">
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
<a href="http://www.open-fcoe.org/" class="readmore">Open-FCoE Site</a>
</p>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
<!-- content-wrap ends here -->
</div>
<!-- wrap ends here -->
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

96
www/target_ibmvscsi.html Normal file
View File

@@ -0,0 +1,96 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SRP target, RDMA target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SRP Target Driver</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>IBM Virtual SCSI Target</h1>
<p>The virtual SCSI (VSCSI) protocol as defined in <a href="http://www.power.org" class="readmore">Power Architecture Standard</a>
is a protocol that allows one logical partition (LPAR) to access SCSI targets provided by another LPAR.
The LPAR that provides one or more SCSI targets is called the VIO server or
VIOS. The ibmvstgt driver is a VIOS driver that makes it possible to access
exported target devices via the VSCSI protocol.</p>
<p>This driver is based on ibmvstgt driver, but comparing to the original ibmvstgt has a number of important fixes and improvements.
The port was made by Bart Van Assche.</p>
<p>You can download it from the SCST SVN repository. See the download page how to setup access to it.</p>
<br><br><br>
<p class="post-footer align-right">
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
</p>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
<!-- content-wrap ends here -->
</div>
<!-- wrap ends here -->
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

109
www/target_iscsi.html Normal file
View File

@@ -0,0 +1,109 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="iSCSI target, iSCSI-SCST">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>iSCSI Target Driver</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="http://scst.sourceforge.net">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>ISCSI target driver iSCSI-SCST with iSER support</h1>
<p>ISCSI-SCST is an iSCSI target driver for SCST. It was originated from
<a href="http://iscsitarget.sourceforge.net/">IET</a>, but then became a deep rework of it with a lot of fixes and improvements in all areas of
performance, stability and functionality.</p>
<p>The latest improvement was addition of iSER support,
thanks a lot to Yan Burman and Mellanox Technologies!</p>
<p>If you are an IET user before installation carefully read README files of both iSCSI-SCST and
the SCST core. You can also use a migration tool developed by Scalable Informatics Inc., which will
convert your IET machine to an iSCSI-SCST machine. See README for more details.</p>
<p>You can find the latest development version of this driver in the SCST SVN. See the download page how to setup
access to it.</p>
<h1>Certification</h1>
<p>ISCSI-SCST has passed VMware certification as part of
<a href="http://scalecomputing.com/products">Scale&rsquo;s Intelligent Clustered Storage</a> technology developed by
<a href="http://scalecomputing.com">Scale Computing</a> as well as VMware and Microsoft certification as part of
storage arrays developed by <a href="http://www.open-e.com/">Open-E, Inc</a> and
Starboard Storage.</p>
<p class="post-footer align-right">
<a href="iscsi-scst-howto.txt" class="readmore">HOWTO</a>
<a href="http://community.mellanox.com/docs/DOC-1479" class="readmore">iSER HOWTO</a>
<a href="SCST_Gentoo_HOWTO.txt" class="readmore">Gentoo HOWTO</a>
<a href="downloads.html" class="readmore">Download</a>
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
</p>
</div>
</div>
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

104
www/target_local.html Normal file
View File

@@ -0,0 +1,104 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SCSI target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>Local Target Driver</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>Target driver for local access</h1>
<p>This driver allows you to access devices that are exported via SCST
directly on the same Linux system that they are exported from. </p>
<p>It makes no assumptions in the code about the device types on the target, so
any device handlers that you load in SCST will be visible, including tapes
and so forth.</p>
<p>Additionally, this driver allows creation of fully functional target drivers in user space.
See README for more details.</p>
<p>This driver was made by Richard Sharpe.</p>
<p>You can download
the latest development version from the SCST SVN repository. See the
download page how to setup access to it. </p><br><br><br>
<p class="post-footer align-right">
<a href="downloads.html" class="readmore">Download</a>
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
</p>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
<!-- content-wrap ends here -->
</div>
<!-- wrap ends here -->
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

99
www/target_lsi.html Normal file
View File

@@ -0,0 +1,99 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="Parallel SCSI target, Wide SCSI target, SAS target, LSI target, Fibre Channel target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>LSI Target Driver</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>Target driver for LSI/MPT adapters</h1>
<p><img src="images/t_lsi.gif" width="100" height="120" class="float-left" alt="SCST LSI">
Target driver for LSI/MPT adapters was originally developed by Hu Gang, then Erik Habbinga has continued the development. </p>
<p>It supports parallel SCSI (SPI), including Wide SCSI, and Fibre Channel, but also should work with SAS. This driver is on the
alpha stage and available for download from the SCST SVN repository. See the download page how to setup access to it.
</p>
<p>Recently Theodore Vaida updated it for the latest hardware generation, including 12G support. You can download current version
from <a href="https://github.com/exactassembly/meta-xa-stm">Github</a>.</p>
<br><br><br>
<p class="post-footer align-right">
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
<a href="https://github.com/exactassembly/meta-xa-stm" class="readmore">Github</a>
</p>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
<!-- content-wrap ends here -->
</div>
<!-- wrap ends here -->
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

93
www/target_mvsas.html Normal file
View File

@@ -0,0 +1,93 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SCSI target, SAS target, Marvell target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>Marvell SAS Target Driver</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>Target driver for Marvell SAS adapters</h1>
<p><img src="images/t_sas.gif" width="100" height="120" class="float-left" alt="SCST Marvell SAS">
<p>Target driver for Marvell SAS adapters is developed by Marvell and Andy Yan. It is fully functional
SAS target driver.</p>
<p>It is on the beta stage. You can download it from the SCST SVN repository. See the download page how
to setup access to it. </p><br><br><br>
<p class="post-footer align-right">
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
</p>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
<!-- content-wrap ends here -->
</div>
<!-- wrap ends here -->
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names">Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

129
www/target_old.html Normal file
View File

@@ -0,0 +1,129 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SCST Old Unsupported Target Drivers">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>Old Unsupported SCST Target Drivers</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>Target driver for QLogic ISP chipsets</h1>
<p><img src="images/t_unsupported.gif" width="100" height="120" class="float-left" alt="SCST Unsupported">
This is an SCST driver for ISP QLogic chipsets commonly used in many SCSI and FC host bus adapters.
It is based on Matthew Jacob's (<a href="http://www.feral.com">http://www.feral.com</a>)
multiplatform driver for ISP chipsets. Update for SCST was made by Stanislaw Gruszka for Open-E Inc.</p>
<p>The latest release is 1.0.2. It supports kernel versions between 2.6.16 and 2.6.32.</p>
<p>This driver is obsoleted in favor of qla2x00t.</p>
<br>
<h1>Old target driver for QLogic qla2x00t adapters for 2.4 kernels</h1>
<p><img src="images/t_unsupported.gif" width="100" height="120" class="float-left" alt="SCST Unsupported">
Old target driver for QLogic qla2x00t adapters is capable to work on 2.4 kernels.
It has all required features and looks to be quite stable. It is designed to work in conjunction with the
initiator driver, which is intended to perform all the initialization and shutdown tasks. In the current release as
a base for the initiator driver was taken Red Hat's driver from the stock 2.4.20 kernel. Then it was patched to
enable the target mode and provide all necessary callbacks, and it's still able to work as initiator only. Mode,
when a host acts as the initiator and the target simultaneously, is also supported. This driver is obsoleted in
favor of 2.6-based driver.</p>
<p>The latest version is 0.9.3.4. Requires Linux kernel versions 2.4.20 or higher and SCST version 0.9.3-pre4 or
higher. If you are lucky, it works also on 2.6 kernels, see README file for details. Tested on i386 only, but
should work on any other supported by Linux platform.</p>
<p>Currently it is <strong>not supported</strong> and listed here for historical reasons only.</p>
<br>
<h1>Target drivers for Adaptec 7xxx and QLogic QLA12xx adapters</h1>
<p><img src="images/t_unsupported.gif" width="100" height="120" class="float-left" alt="SCST Unsupported">
Target drivers for Adaptec 7xxx and QLogic QLA12xx adapters have been developed by Hu Gang and they available for
download from <a href="http://bj.soulinfo.com/~hugang/scst/tgt/">http://bj.soulinfo.com/~hugang/scst/tgt/</a>.
These drivers are not completed, but looks to be a good starting point if you are going to use one of these adapters.
SCST team don't have the appropriate hardware, therefore have not tested and don't support these drivers.
Send all questions to <strong>Hu Gang < hugang at soulinfo com ></strong>. If some of these drivers don't compile for
you, try again with SCST version 0.9.3-pre2.</p><br><br>
<br>
<h1>Patches for UNH-iSCSI Target 1.5.03 and 1.6.00 to SCST</h1>
<p><img src="images/t_unsupported.gif" width="100" height="120" class="float-left" alt="SCST Unsupported">
SCST is much more advanced, than the internal mid-level of <a href="http://sourceforge.net/projects/unh-iscsi">
UNH-iSCSI target driver</a>. With SCST the iSCSI target benefits from all its features and gets ability to use all
its advantages, like high performance and scalability, SMP support, required SCSI functionality emulation, etc.</p>
<p>Since the interface between SCST and the target drivers is based on work, done by UNH IOL, it was relatively
simple to update UNH-iSCSI target to work over SCST. Mostly it was "search and replace" job. The built-in
scsi_target remains available as a compile-time option.</p>
<p>Requires Linux kernel versions 2.4.20 or higher or 2.6.7 or higher and SCST version 0.9.2 or higher.</p>
<p>Currently it is <strong>not supported</strong> and listed here for historical reasons only.</p>
<!-- content-wrap ends here -->
</div>
</div>
<!-- wrap ends here -->
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

114
www/target_qla2x00t.html Normal file
View File

@@ -0,0 +1,114 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="Fibre Channel Target, FC target, QLogic Target, 4Gbps target, 8Gbps target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>QLogic Fibre Channel Target Driver</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>Target driver qla2x00t for QLogic FC adapters</h1>
<p><img src="images/t_qlogic.gif" width="100" height="120" class="float-left" alt="SCST QLogic">
This is target driver for QLogic qla2xxx (22xx++) Fibre Channel adapters.</p>
<p>This driver starting from version 3.1 supports 16G Hilda QLogic
chip based adapters (post-Hilda QLogic chips not supported) and has many other important improvements.
This driver should also support FCoE, but that has never been verified.
It has passed intensive internal SanDisk tests. It is stable and production ready.
This driver is in stable maintenance mode in favor of the
QLogic git tree driver (see below). This is the recommended driver to use in production at the moment.
</p>
<p>You can find the latest updates for this driver in the SVN trunk.</p>
<p>The latest QLogic maintained version of this driver with full support
of the latest QLogic chips for both FC and FCoE, including 32G FC, you can find in
git://git.qlogic.com/scst-qla2xxx-unified.git.
It is maintained by QLogic, hence located in the QLogic's git. See SVN root README
for instructions how to integrate it into the SCST build tree.</p>
<p>Version released in March 2018 seems to be well functional and stable.
However, NPIV, T10-PI as well as modifying port name is not yet supported.
Also, this driver does not support old adapters (same as the in-kernel qla2xxx it is based on).</p>
<p class="post-footer align-right">
<a href="qla2x00t-howto.html" class="readmore">HOWTO</a>
<a href="https://blog.it-kb.ru/2018/03/12/configure-the-server-with-qlogic-fc-hba-on-debian-linux-9-and-scst-fc-target-as-storage-for-csv-volumes-in-the-hyper-v-cluster-for-highly-available-virtual-machines/" class="readmore"> Russian HOWTO</a>
<a href="downloads.html" class="readmore">Download</a>
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/trunk" class="readmore">SCST SVN trunk</a>
<a href="scst-qla2xxx-unified-20180330.tgz" class="readmore">QLA git snapshot</a>
</p>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
<!-- content-wrap ends here -->
</div>
<!-- wrap ends here -->
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

95
www/target_srp.html Normal file
View File

@@ -0,0 +1,95 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SRP target, RDMA target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SRP Target Driver</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>Infiniband SCSI RDMA protocol (SRP) target driver</h1>
<p><img src="images/t_rdma.gif" width="100" height="120" class="float-left" alt="SCST SRP">
SCSI RDMA Protocol (SRP) target driver has been developed by Vu Pham. Since March
2008 the main development place of the SRP target driver is SCST SVN repository.
It is maintained by Bart Van Assche.</p>
<p>This driver is mainline Linux kernel ready and going to be pushed to it
together with other SCST patches.</p>
<br><br><br>
<p class="post-footer align-right">
<a href="downloads.html" class="readmore">Download</a>
<a href="http://sourceforge.net/p/scst/svn/HEAD/tree/" class="readmore">SCST SVN Repository</a>
</p>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
<!-- content-wrap ends here -->
</div>
<!-- wrap ends here -->
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

96
www/targets.html Normal file
View File

@@ -0,0 +1,96 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SCST, SCSI target, iSCSI target, Fibre Channel target, FC target, SRP target, RDMA target, LSI target, SAS target, FCoE target">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SCST SCSI Target Drivers &amp Utilities</title>
</head>
<body>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li id="current"><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="sidebar">
<h1>Target Drivers</h1>
<ul class="sidemenu">
<li><a href="target_iscsi.html">ISCSI-SCST with iSER</a></li>
<li><a href="target_qla2x00t.html">QLogic FC qla2x00t</a></li>
<li><a href="target_srp.html">SCSI RDMA Protocol (SRP)</a></li>
<li><a href="target_mvsas.html">Marvell SAS adapters</a></li>
<li><a href="target_emulex.html">Emulex FC/FCoE</a></li>
<li><a href="target_lsi.html">LSI/MPT adapters</a></li>
<li><a href="target_fcoe.html">FCoE Target</a></li>
<li><a href="target_local.html">Local Target Driver</a></li>
<li><a href="target_ibmvscsi.html">IBM pSeries Virtual SCSI</a></li>
<li><a href="target_old.html">Old Unsupported</a></li>
</ul>
<h1>User utilities</h1>
<ul class="sidemenu">
<li><a href="scst_admin.html">SCST Admin Utility</a></li>
<li><a href="handler_fileio_tgt.html">FILEIO_TGT handler</a></li>
</ul>
</div>
<div id="main">
<h1>SCST Target Drivers</h1>
<p>SCST has target drivers for:</p>
<ul>
<li><span>iSCSI with iSER</span></li>
<li><span>Fibre Channel QLogic qla2xxx series</span></li>
<li><span>Infiniband SCSI RDMA Protocol (SRP)</span></li>
<li><span>Marvell SAS adapters</span></li>
<li><span>Emulex FC/FCoE</span></li>
<li><span>LSI/MPT adapters (parallel SCSI, including Wide Ultra320, SAS, Fibre Channel)</span></li>
<li><span>FCoE</span></li>
<li><span>Local access</span></li>
<li><span>IBM pSeries Virtual SCSI</span></li>
<li><span>...</span></li>
</ul>
<table border=0><tr><td height="300px">&nbsp;</td></tr></table>
</div>
</div>
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

52
www/tomasz_res.txt Normal file
View File

@@ -0,0 +1,52 @@
The target is running Debian Lenny 64bit userspace on an Intel Celeron 2.93GHz CPU, 2 GB RAM.
Initiator is running Debian Etch 64 bit userspace, open-iscsi 2.0-869, Intel Xeon 3050/2.13GHz, 8 GB RAM.
Each test was repeated 6 times, "sync" was made and caches were dropped on both sides before each test was started.
dd parameters were like below, so 6.6 GB of data was read each time:
dd if=/dev/sdag of=/dev/null bs=64k count=100000
Data was read from two block devices:
- /dev/md0, which is RAID-1 on two ST31500341AS 1.5 TB drives
- encrypted dm-crypt device which is on top of /dev/md0
Encrypted device was created with the following additional options passed to cryptsetup
(it provides the most performance on systems where CPU is a bottleneck, but with decreased
security when compared to default options):
-c aes-ecb-plain -s 128
Generally, CPU on the target was a bottleneck, so I also tested the load on target.
md0, crypt columns - averages from dd
us, sy, id, wa - averages from vmstat
1. Disk speeds on the target
Raw performance: 102.17 MB/s
Raw performance (encrypted): 50.21 MB/s
2. Read-ahead on the initiator: 256 (default); md0, crypt - MB/s
md0 us sy id wa | crypt us sy id wa
STGT 50.63 4% 45% 18% 33% | 32.52 3% 62% 16% 19%
SCST (debug + no patches) 43.75 0% 26% 30% 44% | 42.05 0% 84% 1% 15%
SCST (fullperf + patches) 45.18 0% 25% 33% 42% | 44.12 0% 81% 2% 17%
3. Read-ahead on the initiator: 16384; md0, crypt - MB/s
md0 us sy id wa | crypt us sy id wa
STGT 56.43 3% 55% 2% 40% | 46.90 3% 90% 3% 4%
SCST (debug + no patches) 73.85 0% 58% 1% 41% | 42.70 0% 85% 0% 15%
SCST (fullperf + patches) 76.27 0% 63% 1% 36% | 42.52 0% 85% 0% 15%
Measured by Tomasz Chmielewski

181
www/users.html Normal file
View File

@@ -0,0 +1,181 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="Keywords" content="SCST users">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Daniel Fernandes">
<meta name="Robots" content="index,follow">
<link rel="stylesheet" href="images/Orange.css" type="text/css">
<title>SCST Users</title>
</head>
<body>
<script language="javascript" src="images/tooltips.js" type="text/javascript"></script>
<div id="mess" style="position: absolute; left: 0; top: 0; display: none; padding: 3px; font-size: 13px; font-family: sans-serif; background: #ffffad; color: #26261f; border: 1px solid #909090"></div>
<!-- wrap starts here -->
<div id="wrap">
<div id="header">
<div class="logoimg"></div><h1 id="logo"><span class="orange"></span></h1>
<h2 id=slogan>Generic SCSI Target Subsystem for Linux</h2>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="http://www.sourceforge.net/projects/scst">Main</a></li>
<li><a href="http://sourceforge.net/news/?group_id=110471">News</a></li>
<li><a href="targets.html">Drivers</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="comparison.html">Comparison</a></li>
<li id="current"><a href="users.html">Users</a></li>
</ul>
</div>
<!-- content-wrap starts here -->
<div id="content-wrap">
<div id="main2">
<h1>SCST Users</h1>
<br>
<span class="companysubtitles">Companies developed SCST target drivers for their adapters</span>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin: 10px 15px;">
<tr>
<td class="companybox" width="33%">
<a href="http://www.avagotech.com/products/server-storage/fibre-channel-host-bus-adapters/onecore-storage-sdk"><img src="images/avago.jpg" alt="Emulex"></a></td>
<td class="companybox" width="33%" bgcolor="#0071bb">
<a href="https://cavium.com/"><img src="https://cavium.com/images/cavium-logo.png" style="width: 180px; height: 40px" alt="Cavium"></a></td>
<td class="companybox" width="33%">
<a href="http://www.marvell.com"><img src="http://www.marvell.com/assets/img/logo.png" alt="Marvell Technology Group"></a></td>
</tr>
<tr>
<td class="companybox" width="33%">
<a href="http://www.mellanox.com"><img src="http://ir.mellanox.com/common/alerts/MLNX/default/logo.gif" alt="Mellanox Technologies"></a></td>
</tr>
</table>
<br><br>
<span class="companysubtitles">Companies using SCST in their products and solutions</span>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin: 10px 15px;">
<tr>
<td class="companybox" width="33%">
<a href="https://www.onestopsystems.com/"><img src="https://www.onestopsystems.com/sites/default/files/onestopsystems-logo.png" style="width: 180px; height: 60px" alt="One Stop Systems"></a></td>
<td class="companybox" width="33%">
<a href="http://www.axxana.com"><img src="axxana.png" alt="Axxana"></a></td>
<td class="companybox" width="33%">
<a href="http://www.bloombase.com"><img src="http://www.bloombase.com/img/bloombase_2008_logo.png" alt="Bloombase"></a></td>
</tr>
<tr>
<td class="companybox" width="33%">
<a href="http://www.datadomain.com"><img src="http://www.emc.com/images/header/logo-emc.gif" alt="Data Domain"></a></td>
<td class="companybox" width="33%">
<font size="3" color="black">Enjellic Systems Development</font></td>
<td class="companybox" width="33%">
<a href="http://www.hp.com"><img src="hp_logo.jpg" alt="Hewlett-Packard"></a></td>
</tr>
<tr>
<td class="companybox" width="33%" bgcolor="#3a3c41">
<a href="http://www.ibm.com"><img src="http://www.ibm.com/i/v16/t/ibm-logo.gif" alt="IBM"></a></td>
<td class="companybox" width="33%">
<a href="http://www.inmage.com/"><img src="http://www.inmage.com/uploads/inmage/logo.jpg" alt="InMage"></a></td>
<td class="companybox" width="33%">
<a href="http://www.iss-integration.com/supercore.html"><img src="images/iss.jpg" alt="Intelligent Systems Services Inc."></a></td>
</tr>
<tr>
<td class="companybox" width="33%">
<a href="http://www.kaminario.com/"><img src="kaminario.png" alt="Kaminario"></a></td>
<td class="companybox" width="33%">
<a href="http://www.logicworks.net"><img src="logicworks.png" alt="Logicworks"></a></td>
<td class="companybox" width="33%">
<a href="http://www.open-e.com"><img src="http://www.open-e.com/site_media/theme_images/logo_open_e.jpg" alt="Open-E, Inc."></a></td>
</tr>
<tr>
<td class="companybox" width="33%">
<a href="http://www.openfiler.com"><img src="openfiler.png" alt="Openfiler"></a></td>
<td class="companybox" width="33%">
<a href="http://docs.oracle.com/cd/E57980_12/E53251_01/E53251_01.pdf"><img src="oracle_logo.jpg" style="width: 213px; height: 70px" alt="Oracle" onmouseover="tooltip(this, 'Oracle MaxRep for SAN');" onmouseout="hide_info(this);"></a></td>
<td class="companybox" width="33%">
<a href="https://github.com/gstanden/orabuntu-lxc"><img src="ORABUNTU_LOGO.png" style="width: 180px; height: 80px" alt="Orabuntu-lxc"></a></td>
</tr>
<tr>
<td class="companybox" width="33%" bgcolor="#3a3c41">
<a href="http://www.osnexus.com"><img src="http://static1.squarespace.com/static/545a62d4e4b02643996231f0/t/545aa6d4e4b018968b9a709f/1444157883463/?format=1500w" style="width: 180px; height: 40px" alt="OS NEXUS"></a></td>
<td class="companybox" width="33%" bgcolor="black">
<a href="http://www.pranah.com"><img src="http://www.pranah.com/images/logo_pranah.png" alt="Pranah Storage Technologies"></a></td>
<td class="companybox" width="33%">
<a href="http://www.proxmox.com"><img src="https://www.proxmox.com/images/proxmox/Proxmox_logo_standard_hex_400px.png" style="width: 180px; height: 40px" alt="Proxmox"></a></td>
</tr>
<tr>
<td class="companybox" width="33%">
<a href="http://www.qstar.com"><img src="http://www.qstar.com/wp-content/uploads/2017/10/Q_star_logo_small.png" alt="QStar Technologies"></a></td>
<td class="companybox" width="33%">
<a href="http://www.scalableinformatics.com"><img src="scale_inf.png" alt="Scalable Informatics"></a></td>
<td class="companybox" width="33%">
<a href="http://www.scalecomputing.com"><img src="https://www.scalecomputing.com/uploads/general-images/social_posts_logo.png" style="width: 180px; height: 80px" alt="Scale Computing"></a></td>
</tr>
<tr>
<td class="companybox" width="33%">
<a href="http://www.small-tree.com"><img src="https://www.small-tree.com/images/site/logo.gif" alt="Small Tree Communications"></a></td>
<td class="companybox" width="33%">
<a href="http://www.soul.com.cn"><img src="http://www.soul.com.cn/images/logo.jpg" alt="Soul Information Technology Co., Ltd."></a></td>
<td class="companybox" width="33%">
<a href="http://www.starwindsoftware.com"><img src="starwind_logo.png" alt="StarWind Software"></a></td>
</tr>
<tr>
<td class="companybox" width="33%">
<a href="http://systemfabricworks.com"><img src="http://www.systemfabricworks.com/wp-content/uploads/2016/08/sfw-logo1d.png" style="width: 140px; height: 100px" alt="System Fabric Works, Inc."></a></td>
<td class="companybox" width="33%">
<a href="http://www.techophil.com/"><img src="http://techophil.com/logo.png" alt="TechoPhil Ltd"></a></td>
</tr>
</table>
<br><br>
<span class="companysubtitles">Companies using SCST for their internal storage infrastructure</span>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin: 10px 15px;">
<tr>
<td class="companybox" width="33%">
<a href="http://www.datacrunch.net"><img src="http://www.datacrunch.net/images/general/dc_logo.png" alt="DataCrunch Company"></a></td>
<td class="companybox" width="33%">
<a href="http://www.ism.nl"><img src="http://www.ism.nl/media/562622/ism-logo.png" alt="ISM eCompany"></a></td>
<td class="companybox" width="33%">
<a href="http://www.seakr.com"><img src="http://www.millertechnologygroup.com/images/logos/seakrengineeringlogo.gif" alt="SEAKR Engineering, Inc."></a></td>
</tr>
</table>
<br>
<p>If your company is using SCST in its products, solutions or internal storage infrastructure,
please contact vst at vlnb net and we will be proud to add you on this page. Also, if your company has certified its
SCST-powered product or solution, we will be proud to write on our pages that SCST engine has successfully
passed the certification tests. This is the least appreciation your company can do for SCST.</p>
<table border=0><tr><td height="15px">&nbsp;</td></tr></table>
</div>
</div>
</div>
<!-- footer starts here -->
<div id="footer">
<p>&copy; Copyright 2004 - 2018<b><font class="names"> Vladislav Bolkhovitin &amp others</font></b>&nbsp;&nbsp;
Design by: <b><font class="names">Daniel Fernandes</font></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
</div>
<!-- footer ends here -->
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://apps.sourceforge.net/piwik/scst/" : "http://apps.sourceforge.net/piwik/scst/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
piwik_action_name = '';
piwik_idsite = 1;
piwik_url = pkBaseURL + "piwik.php";
piwik_log(piwik_action_name, piwik_idsite, piwik_url);
</script>
<object><noscript><p><img src="http://apps.sourceforge.net/piwik/scst/piwik.php?idsite=1" alt="piwik"></p></noscript></object>
<!-- End Piwik Tag -->
</body>
</html>

220
www/vl_res.txt Normal file
View File

@@ -0,0 +1,220 @@
Setup:
Target: HT 2.4GHz Xeon, x86_32, 2GB of memory limited to 256MB by kernel
command line to have less test data footprint, 75GB 15K RPM SCSI disk as
backstorage, dual port 1Gbps E1000 Intel network card, 2.6.29 kernel.
Initiator: 1.7GHz Xeon, x86_32, 1GB of memory limited to 256MB by kernel
command line to have less test data footprint, dual port 1Gbps E1000
Intel network card, 2.6.27 kernel, open-iscsi 2.0-870-rc3.
The target exported a 5GB file on XFS for FILEIO and 5GB partition for
BLOCKIO.
All the tests were ran 3 times and average written. All the values are
in MB/s. The tests were ran with CFQ and deadline IO schedulers on the
target. All other parameters on both target and initiator were default.
==================================================================
I. SEQUENTIAL ACCESS OVER SINGLE LINE
1. # dd if=/dev/sdX of=/dev/null bs=512K count=2000
ISCSI-SCST IET STGT
NULLIO: 106 105 103
FILEIO/CFQ: 82 57 55
FILEIO/deadline 69 69 67
BLOCKIO/CFQ 81 28 -
BLOCKIO/deadline 80 66 -
------------------------------------------------------------------
2. # dd if=/dev/zero of=/dev/sdX bs=512K count=2000
I didn't do other write tests, because I have data on those devices.
ISCSI-SCST IET STGT
NULLIO: 114 114 114
------------------------------------------------------------------
3. /dev/sdX formatted in ext3 and mounted in /mnt on the initiator. Then
# dd if=/mnt/q of=/dev/null bs=512K count=2000
were ran (/mnt/q was created before by the next test)
ISCSI-SCST IET STGT
FILEIO/CFQ: 94 66 46
FILEIO/deadline 74 74 72
BLOCKIO/CFQ 95 35 -
BLOCKIO/deadline 94 95 -
------------------------------------------------------------------
4. /dev/sdX formatted in ext3 and mounted in /mnt on the initiator. Then
# dd if=/dev/zero of=/mnt/q bs=512K count=2000
were ran (/mnt/q was created by the next test before)
ISCSI-SCST IET STGT
FILEIO/CFQ: 97 91 88
FILEIO/deadline 98 96 90
BLOCKIO/CFQ 112 110 -
BLOCKIO/deadline 112 110 -
------------------------------------------------------------------
Conclusions:
1. ISCSI-SCST FILEIO on buffered READs on 27% faster than IET (94 vs
74). With CFQ the difference is 42% (94 vs 66).
2. ISCSI-SCST FILEIO on buffered READs on 30% faster than STGT (94 vs
72). With CFQ the difference is 104% (94 vs 46).
3. ISCSI-SCST BLOCKIO on buffered READs has about the same performance
as IET, but with CFQ it's on 170% faster (95 vs 35).
4. Buffered WRITEs are not so interesting, because they are async. with
many outstanding commands at time, hence latency insensitive, but even
here ISCSI-SCST always a bit faster than IET.
5. STGT always the worst, sometimes considerably.
6. BLOCKIO on buffered WRITEs is constantly faster, than FILEIO, so,
definitely, there is a room for future improvement here.
7. For some reason assess on file system is considerably better, than
the same device directly.
==================================================================
II. Mostly random "realistic" access.
For this test I used io_trash utility. This utility emulates DB-like
access. For more details see http://lkml.org/lkml/2008/11/17/444. To
show value of target-side caching in this test target was ran with full
2GB of memory. I ran io_trash with the following parameters: "2 2 ./
500000000 50000000 10 4096 4096 300000 10 90 0 10". Total execution
time was measured.
ISCSI-SCST IET STGT
FILEIO/CFQ: 4m45s 5m 5m17s
FILEIO/deadline 5m20s 5m22s 5m35s
BLOCKIO/CFQ 23m3s 23m5s -
BLOCKIO/deadline 23m15s 23m25s -
Conclusions:
1. FILEIO on 500% (five times!) faster than BLOCKIO
2. STGT, as usually, always the worst
3. Deadline always a bit slower
==================================================================
III. SEQUENTIAL ACCESS OVER MPIO
Unfortunately, my dual port network card isn't capable of simultaneous
data transfers, so I had to do some "modeling" and put my network
devices in 100Mbps mode. To make this model more realistic I also used
my old IDE 5200RPM hard drive capable to produce locally 35MB/s
throughput. So I modeled the case of double 1Gbps links with 350MB/s
backstorage, if all the following rules satisfied:
- Both links a capable of simultaneous data transfers
- There is sufficient amount of CPU power on both initiator and target
to cover requirements for the data transfers.
All the tests were done with iSCSI-SCST only.
1. # dd if=/dev/sdX of=/dev/null bs=512K count=2000
NULLIO: 23
FILEIO/CFQ: 20
FILEIO/deadline 20
BLOCKIO/CFQ 20
BLOCKIO/deadline 17
Single line NULLIO is 12.
So, there is a 96% on NULLIO and 83% with HDD storage improvement using
2 lines. With 1Gbps 20MB/s should be equivalent of 200MB/s. Quite good!
==================================================================
Connection to the target were made with the following iSCSI parameters:
# iscsi-scst-adm --op show --tid=1 --sid=0x10000013d0200
InitialR2T=No
ImmediateData=Yes
MaxConnections=1
MaxRecvDataSegmentLength=2097152
MaxXmitDataSegmentLength=131072
MaxBurstLength=2097152
FirstBurstLength=262144
DefaultTime2Wait=2
DefaultTime2Retain=0
MaxOutstandingR2T=1
DataPDUInOrder=Yes
DataSequenceInOrder=Yes
ErrorRecoveryLevel=0
HeaderDigest=None
DataDigest=None
OFMarker=No
IFMarker=No
OFMarkInt=Reject
IFMarkInt=Reject
# ietadm --op show --tid=1 --sid=0x10000013d0200
InitialR2T=No
ImmediateData=Yes
MaxConnections=1
MaxRecvDataSegmentLength=262144
MaxXmitDataSegmentLength=131072
MaxBurstLength=2097152
FirstBurstLength=262144
DefaultTime2Wait=2
DefaultTime2Retain=20
MaxOutstandingR2T=1
DataPDUInOrder=Yes
DataSequenceInOrder=Yes
ErrorRecoveryLevel=0
HeaderDigest=None
DataDigest=None
OFMarker=No
IFMarker=No
OFMarkInt=Reject
IFMarkInt=Reject
# tgtadm --op show --mode session --tid 1 --sid 1
MaxRecvDataSegmentLength=2097152
MaxXmitDataSegmentLength=131072
HeaderDigest=None
DataDigest=None
InitialR2T=No
MaxOutstandingR2T=1
ImmediateData=Yes
FirstBurstLength=262144
MaxBurstLength=2097152
DataPDUInOrder=Yes
DataSequenceInOrder=Yes
ErrorRecoveryLevel=0
IFMarker=No
OFMarker=No
DefaultTime2Wait=2
DefaultTime2Retain=0
OFMarkInt=Reject
IFMarkInt=Reject
MaxConnections=1
RDMAExtensions=No
TargetRecvDataSegmentLength=262144
InitiatorRecvDataSegmentLength=262144
MaxOutstandingUnexpectedPDUs=0
Measured by Vladislav Bolkhovitin