From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mike Christie Subject: [PATCH RFC] modify iscsi layer to support software iscsi targets Date: Wed, 23 Aug 2006 23:09:07 -0400 Message-ID: <44ED1853.3000603@cs.wisc.edu> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090401070708010403030504" Return-path: Received: from sabe.cs.wisc.edu ([128.105.6.20]:19888 "EHLO sabe.cs.wisc.edu") by vger.kernel.org with ESMTP id S1030269AbWHXEJM (ORCPT ); Thu, 24 Aug 2006 00:09:12 -0400 Sender: linux-scsi-owner@vger.kernel.org List-Id: linux-scsi@vger.kernel.org To: SCSI Mailing List Cc: FUJITA Tomonori This is a multi-part message in MIME format. --------------090401070708010403030504 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit The attached patch, from Tomo, takes a older version of the open-iscsi initiator code and modifies it so that a software target that hooks into tgt could reuse the data patch and transport class code. After talking with several people at OLS, we realized that many people do not agree as to where to implement a software iscsi target. There is the do it completely in userspace camp. This can be done and with net channels, network kevents or net splice on the horizon this option is appealing. The other option is to do it completely in the kernel. This has already been rejected with the IET submission and scst discussion and the tgt framework already pushes most of that code to userspace so there is no point in pursing this right now. And the last option would be something that hooks into iscsi layer in mainline and tgt. This is what the attached patch implements. It has the benefit that we can use the iscsi layer that is already in the kernel with little modification. That iscsi layer is optimized to run from the network sofirq and to be zero copy for the larger data transfers. The tgt framework provides zero copy on the target side so we get to take advantage of all that code. The disadvantage to this is that, probably in the future tgt should work with the kevent and other async apis that are being proposed so we should be working twords that goal right from the beginning. Also, where we feel we would be using the iscsi kernel code sort of how you would open a TCP socket and read and write to it from userspace today, many people feel that any target code that can be done in userspace should be done there. And for that argument we do not have answer. As we said below we can do this in userspace, but we wanted to reuse the initiator code when possible. The attached path was made against a older iscsi tree so do not bother reviewing it. I only attach it incase someone really wants to see the code. I wanted to get feedback from others before I either port it to the upstream iscsi code or reject it and help out on a completely userspace software iscsi target. --------------090401070708010403030504 Content-Type: application/x-bzip; name="add-iscsi-tgt.patch.bz2" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="add-iscsi-tgt.patch.bz2" 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 --------------090401070708010403030504--