[stgt] [PATCH] remove kernel driver support

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Mon Feb 14 07:12:21 CET 2011


TCM was merged and tcm's ibmvscsis driver is ready. We can remove
kernel driver support and the kernel drivers now.

Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
 Makefile            |    2 +-
 doc/README.ibmvstgt |  102 -------------
 usr/Makefile        |   12 --
 usr/bs_mmap.c       |  189 -----------------------
 usr/fc/fc.c         |   54 -------
 usr/ibmvio/Makefile |    4 -
 usr/ibmvio/ibmvio.c |  270 ---------------------------------
 usr/tgtif.c         |  412 ---------------------------------------------------
 8 files changed, 1 insertions(+), 1044 deletions(-)
 delete mode 100644 doc/README.ibmvstgt
 delete mode 100644 usr/bs_mmap.c
 delete mode 100644 usr/fc/fc.c
 delete mode 100644 usr/ibmvio/Makefile
 delete mode 100644 usr/ibmvio/ibmvio.c
 delete mode 100644 usr/tgtif.c

diff --git a/Makefile b/Makefile
index b0e9f83..39f1ac5 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ PREFIX ?= /usr
 export VERSION PREFIX
 
 # Export the feature switches so sub-make knows about them
-export ISCSI_RDMA IBMVIO FCOE FCP
+export ISCSI_RDMA FCOE
 
 .PHONY: all
 all: programs doc conf scripts
diff --git a/doc/README.ibmvstgt b/doc/README.ibmvstgt
deleted file mode 100644
index d77f932..0000000
--- a/doc/README.ibmvstgt
+++ /dev/null
@@ -1,102 +0,0 @@
-Starting
--------------
-If you want IBM VIO target driver, get kernel version 2.6.20, rebuild
-the kernel, and reboot with the new kernel. Note you need to enable
-SCSI_TGT, SCSI_SRP, and SCSI_IBMVSCSIS kernel options.
-
-host:~/tgt/usr$ make KERNELSRC=<kernel-src-directory> IBMVIO=1
-
-Make sure that everything is built successfully.
-
-Try the following commands:
-
-host:~/tgt$ su
-host:~/tgt# modprobe scsi_tgt
-host:~/tgt# modprobe libsrp
-host:~/tgt# modprobe ibmvstgt
-host:~/tgt# ./usr/tgtd
-
-See /var/log/kern.log (your Linux distributions may use the different
-log file name) to make sure that the kernel modules are loaded
-properly. You should see messages like the followings:
-
-Feb 27 19:37:52 lilac kernel: IBM eServer i/pSeries Virtual SCSI Target Driver
-Feb 27 19:37:52 lilac kernel: vio_register_driver: driver ibmvscsi registering
-Feb 27 19:37:52 lilac kernel: scsi1 : ibmvstgt
-
-You need the scsi host number (it is 1 in this example) in the next
-stage (configuration).
-
-
-Configuration
--------------
-Everyting is configured via the tgtadm management tool.
-
-The following example creates a target with id 1, adds a logical unit
-(backed by /dev/sdb1) with lun 0, and then bind the target with
-/sys/devices/vio/30000003.
-
-You need to targetname to create a new target just as a reference.
-
-host:~/tgt# ./usr/tgtadm --lld ibmvio --mode target --op new --tid 1 --targetname volume1
-host:~/tgt# ./usr/tgtadm --lld ibmvio --mode logicalunit --op new --tid 1 --lun 0 -b /dev/sdb1
-host:~/tgt# ./usr/tgtadm --lld ibmvio --mode target --op bind --tid 1 --bus vio,30000003
-
-
-Please see /var/log/daemon.log (your Linux distributions may use the
-different log file name again) to make sure that everything is
-fine. You should see something like the followings:
-
-Feb 27 22:36:40 lilac tgtd: dl_init(71) istgt library is not loaded.
-Feb 27 22:36:40 lilac tgtd: dl_init(71) ibmvstgt library is not loaded.
-Feb 27 22:37:08 lilac tgtd: tgt_target_create(572) Succeed to create a new target 1
-Feb 27 22:37:08 lilac tgtd: tgt_target_bind(517) Succeed to bind the target 1 to the scsi host 1
-Feb 27 22:37:08 lilac tgtd: tgt_device_create(238) Succeed to add a logical unit 0 to the target 1
-Now you are ready. Boot up VIO clients.
-
-
-History
--------------
-The following description was taken from the original ibmvscsis
-driver:
-
-http://lkml.org/lkml/2005/10/17/99
-
-
-This driver is a SCSI target that interoperates according to the PAPR
-(POWER Architecture Platform Requirements) document.  Currently it is
-specific to POWER logical partitioning, however in the future it would
-be nice to extend this to other virtualized environments.
-
-The architecture defines virtual adapters, whose configuration is
-reported in the Open Firmware device tree.  There area number of power
-hypervisor calls (such as h_reg_crq, to register the inter-OS queue)
-that support the virtual adapters.
-
-Messages are sent between partitions on a "Command/Response Queue"
-(CRQ), which is just a buffer of 16 byte entries in the receiver's
-Senders cannot access the buffer directly, but send messages by making
-a hypervisor call and passing in the 16 bytes.  The hypervisor puts
-the message in the next 16 byte space in round-robbin fashion, turns
-on the high order bit of the message (the valid bit), and generates an
-interrupt to the receiver (if interrupts are turned on.)  The receiver
-just turns off the valid bit when they have copied out the message.
-
-The VSCSI client builds a SCSI Remote Protocol (SRP) Information Unit
-(IU) (as defined in the T10 standard available at www.t10.org), gets a
-DMA address for the message, and sends it to the target as the payload
-of a CRQ message.  The target DMAs the SRP IU and processes it,
-including doing any additional data transfers.  When it is done, it
-DMAs the SRP response back to the same address as the request came
-from and sends a CRQ message back to inform the client that the
-request has completed.
-
-This target interoperates not only with the Linux client (ibmvscsi.c)
-but also with AIX and OS/400 clients.  Thus, while the implementation
-can be changed, the underlying behaviour (protocol) is fixed.
-
-Configuration of the target is done via sysfs.  The target driver maps
-either block devices (e.g. IDE CD drive, loopback file, etc) to SCSI
-LUNs, in which case it emulates the SCSI protocol and issues kernel
-block device calls, or maps real SCSI devices, in which case the SCSI
-commands are just passed on to the real SCSI device.
diff --git a/usr/Makefile b/usr/Makefile
index 3a75df4..ea175cd 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -8,12 +8,6 @@ ifneq ($(shell test -e /usr/include/sys/timerfd.h && echo 1),)
 CFLAGS += -DUSE_TIMERFD
 endif
 
-ifneq ($(IBMVIO),)
-CFLAGS += -DIBMVIO -DUSE_KERNEL
-TGTD_OBJS += $(addprefix ibmvio/, ibmvio.o)
-TGTD_OBJS += bs_mmap.o tgtif.o
-endif
-
 TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \
 		iscsid.o target.o chap.o sha1.o md5.o transport.o iscsi_tcp.o \
 		isns.o)
@@ -24,12 +18,6 @@ TGTD_OBJS += iscsi/iser.o iscsi/iser_text.o
 LIBS += -libverbs -lrdmacm
 endif
 
-ifneq ($(FCP),)
-CFLAGS += -DFCP -DUSE_KERNEL
-TGTD_OBJS += $(addprefix fc/, fc.o)
-TGTD_OBJS += bs_mmap.o tgtif.o
-endif
-
 ifneq ($(FCOE),)
 TGTD_OBJS += $(addprefix fcoe/,\
 	openfc_target.o \
diff --git a/usr/bs_mmap.c b/usr/bs_mmap.c
deleted file mode 100644
index f7718f2..0000000
--- a/usr/bs_mmap.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * mmap file backing store routine
- *
- * Copyright (C) 2006-2007 FUJITA Tomonori <tomof at acm.org>
- * Copyright (C) 2006-2007 Mike Christie <michaelc at cs.wisc.edu>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2 of the
- * License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/mman.h>
-
-#include "list.h"
-#include "util.h"
-#include "tgtd.h"
-#include "scsi.h"
-#include "bs_thread.h"
-
-static void bs_mmap_request(struct scsi_cmd *cmd)
-{
-	int ret;
-	uint32_t length;
-	int result = SAM_STAT_GOOD;
-	uint8_t key;
-	uint16_t asc;
-
-	ret = length = 0;
-	key = asc = 0;
-
-	if (cmd->scb[0] != SYNCHRONIZE_CACHE &&
-	    cmd->scb[0] != SYNCHRONIZE_CACHE_16)
-		eprintf("bug %x\n", cmd->scb[0]);
-
-	/* TODO */
-	length = (cmd->scb[0] == SYNCHRONIZE_CACHE) ? 0 : 0;
-
-	if (cmd->scb[1] & 0x2) {
-		result = SAM_STAT_CHECK_CONDITION;
-		key = ILLEGAL_REQUEST;
-		asc = ASC_INVALID_FIELD_IN_CDB;
-	} else {
-		ret = __sync_file_range(cmd->dev->fd, cmd->offset, length);
-		if (ret) {
-			result = SAM_STAT_CHECK_CONDITION;
-			key = MEDIUM_ERROR;
-			asc = ASC_READ_ERROR;
-		}
-	}
-
-	dprintf("io done %p %x %d %u\n", cmd, cmd->scb[0], ret, length);
-
-	scsi_set_result(cmd, result);
-
-	if (result != SAM_STAT_GOOD) {
-		eprintf("io error %p %x %d %d %" PRIu64 ", %m\n",
-			cmd, cmd->scb[0], ret, length, cmd->offset);
-		sense_data_build(cmd, key, asc);
-	}
-}
-
-static int bs_mmap_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
-{
-	*fd = backed_file_open(path, O_RDWR|O_LARGEFILE, size);
-	/* If we get access denied, try opening the file in readonly mode */
-	if (*fd == -1 && errno == EACCES) {
-		*fd = backed_file_open(path, O_RDONLY|O_LARGEFILE, size);
-		lu->attrs.readonly = 1;
-	}
-	if (*fd < 0)
-		return *fd;
-
-	return 0;
-}
-
-static void bs_mmap_close(struct scsi_lu *lu)
-{
-	close(lu->fd);
-}
-
-static int bs_mmap_init(struct scsi_lu *lu)
-{
-	struct bs_thread_info *info = BS_THREAD_I(lu);
-	return bs_thread_open(info, bs_mmap_request, NR_WORKER_THREADS);
-}
-
-static void bs_mmap_exit(struct scsi_lu *lu)
-{
-	struct bs_thread_info *info = BS_THREAD_I(lu);
-	bs_thread_close(info);
-}
-
-#define pgcnt(size, offset)	((((size) + ((offset) & (pagesize - 1))) + (pagesize - 1)) >> pageshift)
-
-static int bs_mmap_cmd_submit(struct scsi_cmd *cmd)
-{
-	struct scsi_lu *lu = cmd->dev;
-	int fd = lu->fd, ret = 0;
-	void *p;
-	uint64_t addr;
-	uint32_t length;
-
-	if (cmd->scb[0] == SYNCHRONIZE_CACHE ||
-	    cmd->scb[0] == SYNCHRONIZE_CACHE_16)
-		return bs_thread_cmd_submit(cmd);
-
-	length = (scsi_get_data_dir(cmd) == DATA_WRITE) ?
-		scsi_get_out_length(cmd) : scsi_get_in_length(cmd);
-
-	p = mmap64(NULL, pgcnt(length, cmd->offset) << pageshift,
-		   PROT_READ | PROT_WRITE, MAP_SHARED, fd,
-		   cmd->offset & ~((1ULL << pageshift) - 1));
-	if (p == MAP_FAILED) {
-		ret = -EINVAL;
-		eprintf("%u %" PRIu64 "\n", length, cmd->offset);
-	}
-
-	addr = (unsigned long)p + (cmd->offset & (pagesize - 1));
-
-	if (scsi_get_data_dir(cmd) == DATA_WRITE)
-		scsi_set_out_buffer(cmd, (void *)(unsigned long)addr);
-	else if (scsi_get_data_dir(cmd) == DATA_READ)
-		scsi_set_in_buffer(cmd, (void *)(unsigned long)addr);
-
-	dprintf("%" PRIx64 " %u %" PRIu64 "\n", addr, length, cmd->offset);
-
-	return ret;
-}
-
-static int bs_mmap_cmd_done(struct scsi_cmd *cmd)
-{
-	int err = 0;
-	uint64_t addr;
-	uint32_t len;
-
-	if (scsi_get_data_dir(cmd) == DATA_WRITE) {
-		addr = (unsigned long)scsi_get_out_buffer(cmd);
-		len = scsi_get_out_length(cmd);
-	} else if (scsi_get_data_dir(cmd) == DATA_READ) {
-		addr = (unsigned long)scsi_get_in_buffer(cmd);
-		len = scsi_get_in_length(cmd);
-	} else
-		return 0;
-
-	dprintf("%d %" PRIx64 " %d\n", cmd_mmapio(cmd), addr, len);
-
-	if (cmd_mmapio(cmd)) {
-		len = pgcnt(len, (addr & (pagesize - 1))) << pageshift;
-		addr &= ~(pagesize - 1);
-		err = munmap((void *) (unsigned long) addr, len);
-		if (err)
-			eprintf("%" PRIx64 " %d\n", addr, len);
-	}
-
-	return err;
-}
-
-static struct backingstore_template mmap_bst = {
-	.bs_name		= "mmap",
-	.bs_datasize		= sizeof(struct bs_thread_info),
-	.bs_init		= bs_mmap_init,
-	.bs_exit		= bs_mmap_exit,
-	.bs_open		= bs_mmap_open,
-	.bs_close		= bs_mmap_close,
-	.bs_cmd_submit		= bs_mmap_cmd_submit,
-	.bs_cmd_done		= bs_mmap_cmd_done,
-};
-
-__attribute__((constructor)) static void bs_mmap_constructor(void)
-{
-	register_backingstore_template(&mmap_bst);
-}
diff --git a/usr/fc/fc.c b/usr/fc/fc.c
deleted file mode 100644
index febb1e9..0000000
--- a/usr/fc/fc.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SCSI command processing specific to fibre channel drivers
- *
- * Copyright (C) 2007 FUJITA Tomonori <tomof at acm.org>
- * Copyright (C) 2007 Mike Christie <michaelc at cs.wisc.edu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <syscall.h>
-#include <unistd.h>
-#include <linux/fs.h>
-#include <scsi/scsi.h>
-#include <sys/mman.h>
-
-#include "list.h"
-#include "util.h"
-#include "tgtd.h"
-#include "target.h"
-#include "driver.h"
-#include "spc.h"
-#include "scsi.h"
-
-static struct tgt_driver fc = {
-	.name			= "fc",
-	.use_kernel		= 1,
-	.cmd_end_notify		= kspace_send_cmd_res,
-	.mgmt_end_notify	= kspace_send_tsk_mgmt_res,
-	.default_bst		= "mmap",
-};
-
-__attribute__((constructor)) static void fc_driver_constructor(void)
-{
-	register_driver(&fc);
-}
diff --git a/usr/ibmvio/Makefile b/usr/ibmvio/Makefile
deleted file mode 100644
index 81967bf..0000000
--- a/usr/ibmvio/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-CFLAGS += -O2 -fno-inline -Wall -fPIC -Wstrict-prototypes -I$(KERNELSRC)/include -I../../usr
-
-clean:
-	rm -f *.o
diff --git a/usr/ibmvio/ibmvio.c b/usr/ibmvio/ibmvio.c
deleted file mode 100644
index d5abb07..0000000
--- a/usr/ibmvio/ibmvio.c
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * SCSI command processing specific to IBM Virtual SCSI target Driver
- *
- * Copyright (C) 2005-2007 FUJITA Tomonori <tomof at acm.org>
- *
- * Based on:
- *
- * IBM eServer i/pSeries Virtual SCSI Target Driver
- * Copyright (C) 2003-2005 Dave Boutcher (boutcher at us.ibm.com) IBM Corp.
- *			   Santiago Leon (santil at us.ibm.com) IBM Corp.
- *			   Linda Xie (lxie at us.ibm.com) IBM Corp.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- */
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <syscall.h>
-#include <unistd.h>
-#include <linux/fs.h>
-#include <sys/mman.h>
-
-#include "list.h"
-#include "util.h"
-#include "tgtd.h"
-#include "target.h"
-#include "driver.h"
-#include "spc.h"
-#include "scsi.h"
-
-#define GETTARGET(x) ((int)((((uint64_t)(x)) >> 56) & 0x003f))
-#define GETBUS(x) ((int)((((uint64_t)(x)) >> 53) & 0x0007))
-#define GETLUN(x) ((int)((((uint64_t)(x)) >> 48) & 0x001f))
-
-struct inquiry_data {
-	uint8_t qual_type;
-	uint8_t rmb_reserve;
-	uint8_t version;
-	uint8_t aerc_naca_hisup_format;
-	uint8_t addl_len;
-	uint8_t sccs_reserved;
-	uint8_t bque_encserv_vs_multip_mchngr_reserved;
-	uint8_t reladr_reserved_linked_cmdqueue_vs;
-	char vendor[8];
-	char product[16];
-	char revision[4];
-	char vendor_specific[20];
-	char reserved1[2];
-	char version_descriptor[16];
-	char reserved2[22];
-	char unique[158];
-};
-
-#define	IBMVSTGT_HOSTDIR	"/sys/class/scsi_host/host"
-
-static int __ibmvio_inquiry(int host_no, struct scsi_cmd *cmd, uint8_t *data)
-{
-	struct inquiry_data *id = (struct inquiry_data *) data;
-	char system_id[256], path[256], buf[32];
-	int fd, err, partition_number;
-	unsigned int unit_address;
-	unsigned char device_type;
-	uint64_t lun = *((uint64_t *) cmd->lun);
-
-	device_type = (cmd->dev->attrs.qualifier & 0x7 ) << 5;
-	device_type |= (cmd->dev->attrs.device_type & 0x1f);
-
-	snprintf(path, sizeof(path), IBMVSTGT_HOSTDIR "%d/system_id", host_no);
-	fd = open(path, O_RDONLY);
-	memset(system_id, 0, sizeof(system_id));
-	err = read(fd, system_id, sizeof(system_id));
-	close(fd);
-
-	snprintf(path, sizeof(path), IBMVSTGT_HOSTDIR "%d/partition_number",
-		 host_no);
-	fd = open(path, O_RDONLY);
-	err = read(fd, buf, sizeof(buf));
-	partition_number = strtoul(buf, NULL, 10);
-	close(fd);
-
-	snprintf(path, sizeof(path), IBMVSTGT_HOSTDIR "%d/unit_address",
-		 host_no);
-	fd = open(path, O_RDONLY);
-	err = read(fd, buf, sizeof(buf));
-	unit_address = strtoul(buf, NULL, 0);
-	close(fd);
-
-	dprintf("%d %s %d %x %" PRIx64 "\n",
-		host_no, system_id, partition_number, unit_address, lun);
-
-	id->qual_type = device_type;
-	id->rmb_reserve = 0x00;
-	id->version = 0x84;	/* ISO/IE		  */
-	id->aerc_naca_hisup_format = 0x22;/* naca & fmt 0x02 */
-	id->addl_len = sizeof(*id) - 4;
-	id->bque_encserv_vs_multip_mchngr_reserved = 0x00;
-	id->reladr_reserved_linked_cmdqueue_vs = 0x02;/*CMDQ*/
-	memcpy(id->vendor, "IBM	    ", 8);
-	/* Don't even ask about the next bit.  AIX uses
-	 * hardcoded device naming to recognize device types
-	 * and their client won't  work unless we use VOPTA and
-	 * VDASD.
-	 */
-	if (device_type)
-		memcpy(id->product, "VOPTA blkdev    ", 16);
-	else
-		memcpy(id->product, "VDASD blkdev    ", 16);
-
-	memcpy(id->revision, "0001", 4);
-	snprintf(id->unique,sizeof(id->unique),
-		 "IBM-VSCSI-%s-P%d-%x-%d-%d-%d\n",
-		 system_id,
-		 partition_number,
-		 unit_address,
-		 GETBUS(lun),
-		 GETTARGET(lun),
-		 GETLUN(lun));
-
-	return sizeof(*id);
-}
-
-static int ibmvio_inquiry(int host_no, struct scsi_cmd *cmd)
-{
-	uint8_t *data, *scb = cmd->scb;
-	unsigned char key = ILLEGAL_REQUEST;
-	uint16_t asc = ASC_INVALID_FIELD_IN_CDB;
-	uint32_t len;
-
-	if (((scb[1] & 0x3) == 0x3) || (!(scb[1] & 0x3) && scb[2]))
-		goto sense;
-
-	dprintf("%x %x\n", scb[1], scb[2]);
-
-	if (scb[1] & 0x3)
-		return spc_inquiry(host_no, cmd);
-
-	data = scsi_get_in_buffer(cmd);
-
-	len = __ibmvio_inquiry(host_no, cmd, data);
-	len = min_t(int, len, scb[4]);
-
-	scsi_set_in_resid_by_actual(cmd, len);
-
-	if (cmd->dev->lun != cmd->dev_id)
-		data[0] = TYPE_NO_LUN;
-
-	return SAM_STAT_GOOD;
-sense:
-	scsi_set_in_resid_by_actual(cmd, 0);
-	sense_data_build(cmd, key, asc);
-	return SAM_STAT_CHECK_CONDITION;
-}
-
-static uint64_t make_lun(unsigned int bus, unsigned int target, unsigned int lun)
-{
-	uint16_t result = (0x8000 |
-			   ((target & 0x003f) << 8) |
-			   ((bus & 0x0007) << 5) |
-			   (lun & 0x001f));
-	return ((uint64_t) result) << 48;
-}
-
-static int ibmvio_report_luns(int host_no, struct scsi_cmd *cmd)
-{
-	struct scsi_lu *lu;
-	struct list_head *dev_list = &cmd->c_target->device_list;
-	uint64_t lun, *data;
-	int idx, alen, oalen, nr_luns, rbuflen = 4096;
-	uint8_t *lun_buf = cmd->lun;
-	unsigned char key = ILLEGAL_REQUEST;
-	uint16_t asc = ASC_INVALID_FIELD_IN_CDB;
-
-	alen = __be32_to_cpu(*(uint32_t *)&cmd->scb[6]);
-	if (alen < 16)
-		goto sense;
-
-	data = scsi_get_in_buffer(cmd);
-
-	alen &= ~(8 - 1);
-	oalen = alen;
-
-	if ((*((uint64_t *) lun_buf))) {
-		nr_luns = 1;
-		goto done;
-	}
-
-	alen -= 8;
-	rbuflen -= 8; /* FIXME */
-	idx = 2;
-	nr_luns = 1;
-
-	list_for_each_entry(lu, dev_list, device_siblings) {
-		lun = lu->lun;
-		lun = make_lun(0, lun & 0x003f, 0);
-		data[idx++] = __cpu_to_be64(lun);
-		if (!(alen -= 8))
-			break;
-		if (!(rbuflen -= 8)) {
-			fprintf(stderr, "FIXME: too many luns\n");
-			exit(-1);
-		}
-		nr_luns++;
-	}
-
-done:
-	*((uint32_t *) data) = __cpu_to_be32(nr_luns * 8);
-	scsi_set_in_resid_by_actual(cmd, min(oalen, nr_luns * 8 + 8));
-	return SAM_STAT_GOOD;
-sense:
-	scsi_set_in_resid_by_actual(cmd, 0);
-	sense_data_build(cmd, key, asc);
-	return SAM_STAT_CHECK_CONDITION;
-}
-
-#define        TGT_INVALID_DEV_ID      ~0ULL
-
-static uint64_t scsi_lun_to_int(uint8_t *p)
-{
-	uint64_t lun = TGT_INVALID_DEV_ID;
-
-	lun = *((uint64_t *) p);
-	dprintf("%" PRIx64 " %u %u %u\n", lun, GETTARGET(lun), GETBUS(lun), GETLUN(lun));
-
-	if (GETBUS(lun) || GETLUN(lun))
-		return TGT_INVALID_DEV_ID;
-	else
-		return GETTARGET(lun);
-}
-
-static int ibmvio_lu_create(struct scsi_lu *lu)
-{
-	struct device_type_operations *ops =  lu->dev_type_template.ops;
-
-	ops[INQUIRY].cmd_perform = ibmvio_inquiry;
-	ops[REPORT_LUNS].cmd_perform = ibmvio_report_luns;
-
-	return 0;
-}
-
-static struct tgt_driver ibmvio = {
-	.name			= "ibmvio",
-	.use_kernel		= 1,
-	.scsi_get_lun		= scsi_lun_to_int,
-	.lu_create		= ibmvio_lu_create,
-	.cmd_end_notify		= kspace_send_cmd_res,
-	.mgmt_end_notify	= kspace_send_tsk_mgmt_res,
-	.default_bst		= "mmap",
-};
-
-__attribute__((constructor)) static void ibmvio_driver_constructor(void)
-{
-	register_driver(&ibmvio);
-}
diff --git a/usr/tgtif.c b/usr/tgtif.c
deleted file mode 100644
index f29c11f..0000000
--- a/usr/tgtif.c
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
- * SCSI kernel and user interface
- *
- * Copyright (C) 2006-2007 FUJITA Tomonori <tomof at acm.org>
- * Copyright (C) 2006-2007 Mike Christie <michaelc at cs.wisc.edu>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2 of the
- * License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-#include <errno.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <inttypes.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/epoll.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/sysmacros.h>
-#include <linux/types.h>
-#ifndef aligned_u64
-#define aligned_u64 uint64_t __attribute__((aligned(8)))
-#endif
-#include <scsi/scsi_tgt_if.h>
-
-#include "list.h"
-#include "util.h"
-#include "tgtd.h"
-
-#define barrier() __asm__ __volatile__("": : :"memory")
-
-struct uring {
-	uint32_t idx;
-	char *buf;
-};
-
-static struct uring kuring, ukring;
-static int chrfd;
-
-static unsigned long tgt_ring_pages, tgt_max_events, tgt_event_per_page;
-
-static inline void ring_index_inc(struct uring *ring)
-{
-	ring->idx = (ring->idx == tgt_max_events - 1) ? 0 : ring->idx + 1;
-}
-
-static inline struct tgt_event *head_ring_hdr(struct uring *ring)
-{
-	uint32_t pidx, off, pos;
-
-	pidx = ring->idx / tgt_event_per_page;
-	off = ring->idx % tgt_event_per_page;
-	pos = pidx * pagesize + off * sizeof(struct tgt_event);
-
-	return (struct tgt_event *) (ring->buf + pos);
-}
-
-static int kreq_send(struct tgt_event *p)
-{
-	struct tgt_event *ev;
-
-	ev = head_ring_hdr(&ukring);
-	if (ev->hdr.status)
-		return -ENOMEM;
-
-	ring_index_inc(&ukring);
-
-	memcpy(ev, p, sizeof(*p));
-	barrier();
-	ev->hdr.status = 1;
-	write(chrfd, ev, 1);
-
-	return 0;
-}
-
-int kspace_send_tsk_mgmt_res(struct mgmt_req *mreq)
-{
-	struct tgt_event ev;
-
-	memset(&ev, 0, sizeof(ev));
-
-	ev.hdr.type = TGT_UEVENT_TSK_MGMT_RSP;
-	ev.p.tsk_mgmt_rsp.host_no = mreq->host_no;
-	ev.p.tsk_mgmt_rsp.itn_id = mreq->itn_id;
-	ev.p.tsk_mgmt_rsp.mid = mreq->mid;
-	ev.p.tsk_mgmt_rsp.result = mreq->result;
-
-	return kreq_send(&ev);
-}
-
-struct kscsi_cmd {
-	int host_no;
-	struct scsi_cmd scmd;
-};
-
-static inline struct kscsi_cmd *KCMD(struct scsi_cmd *cmd)
-{
-	return container_of(cmd, struct kscsi_cmd, scmd);
-}
-
-int kspace_send_cmd_res(uint64_t nid, int result, struct scsi_cmd *cmd)
-{
-	struct kscsi_cmd *kcmd;
-	struct tgt_event ev;
-
-	memset(&ev, 0, sizeof(ev));
-
-	dprintf("%p %u %u %d %p %p %u %" PRIu64 "\n", cmd,
-		scsi_get_out_length(cmd), scsi_get_in_length(cmd),
-		result,
-		scsi_get_out_buffer(cmd), scsi_get_in_buffer(cmd),
-		cmd->data_dir, cmd->tag);
-
-	kcmd = KCMD(cmd);
-
-	ev.hdr.type = TGT_UEVENT_CMD_RSP;
-	ev.p.cmd_rsp.host_no = kcmd->host_no;
-	ev.p.cmd_rsp.itn_id = cmd->cmd_itn_id;
-	if (scsi_get_data_dir(cmd) == DATA_WRITE) {
-		ev.p.cmd_rsp.uaddr = (unsigned long)scsi_get_out_buffer(cmd);
-		ev.p.cmd_rsp.len =
-			scsi_get_out_length(cmd) - scsi_get_out_resid(cmd);
-	} else {
-		ev.p.cmd_rsp.uaddr = (unsigned long)scsi_get_in_buffer(cmd);
-		ev.p.cmd_rsp.len =
-			scsi_get_in_length(cmd) - scsi_get_in_resid(cmd);
-	}
-	ev.p.cmd_rsp.sense_len = cmd->sense_len;
-	ev.p.cmd_rsp.sense_uaddr = (unsigned long) cmd->sense_buffer;
-	ev.p.cmd_rsp.result = result;
-	ev.p.cmd_rsp.rw = cmd->data_dir;
-	ev.p.cmd_rsp.tag = cmd->tag;
-
-	return kreq_send(&ev);
-}
-
-static void kern_queue_cmd(struct tgt_event *ev)
-{
-	int ret = -ENOMEM, tid, scb_len = 16;
-	struct kscsi_cmd *kcmd;
-	struct scsi_cmd *cmd;
-
-	tid = tgt_bound_target_lookup(ev->p.cmd_req.host_no);
-	if (tid < 0) {
-		eprintf("can't find a bound target %d\n",
-			ev->p.cmd_req.host_no);
-		return;
-	}
-
-	/* TODO: define scsi_kcmd and move mmap stuff */
-	kcmd = zalloc(sizeof(*kcmd) + scb_len);
-	if (!kcmd) {
-		eprintf("oom %d\n", ev->p.cmd_req.host_no);
-		return;
-	}
-
-	kcmd->host_no = ev->p.cmd_req.host_no;
-	cmd = &kcmd->scmd;
-	cmd->cmd_itn_id = ev->p.cmd_req.itn_id;
-	cmd->scb = (unsigned char *)cmd + sizeof(*cmd);
-	memcpy(cmd->scb, ev->p.cmd_req.scb, scb_len);
-	cmd->scb_len = scb_len;
-	memcpy(cmd->lun, ev->p.cmd_req.lun, sizeof(cmd->lun));
-
-	cmd->attribute = ev->p.cmd_req.attribute;
-	cmd->tag = ev->p.cmd_req.tag;
-
-	scsi_set_data_dir(cmd, scsi_data_dir_opcode(cmd->scb[0]));
-
-	if (scsi_get_data_dir(cmd) == DATA_WRITE)
-		scsi_set_out_length(cmd, ev->p.cmd_req.data_len);
-	else
-		scsi_set_in_length(cmd, ev->p.cmd_req.data_len);
-
-	if (!scsi_is_io_opcode(cmd->scb[0])) {
-		char *buf;
-		uint32_t data_len;
-
-		data_len = ev->p.cmd_req.data_len;
-		/*
-		 * fix spc, sbc, etc. they assume that buffer is long
-		 * enough.
-		 */
-		if (data_len < 4096)
-			data_len = 4096;
-
-		buf = valloc(data_len);
-		if (!buf)
-			goto free_kcmd;
-
-		if (scsi_get_data_dir(cmd) == DATA_WRITE)
-			scsi_set_out_buffer(cmd, buf);
-		else
-			scsi_set_in_buffer(cmd, buf);
-
-		memset(buf, 0, data_len);
-	}
-
-	ret = target_cmd_queue(tid, cmd);
-	if (ret)
-		goto free_kcmd;
-
-	return;
-free_kcmd:
-	/* TODO: send sense properly */
-	eprintf("can't queue this command %d\n", ret);
-	free(kcmd);
-}
-
-static void kern_cmd_done(struct tgt_event *ev)
-{
-	int tid;
-	/* temp hack */
-	struct scsi_cmd *cmd;
-
-	tid = tgt_bound_target_lookup(ev->p.cmd_done.host_no);
-	if (tid < 0) {
-		eprintf("can't find a bound target %d\n",
-			ev->p.cmd_done.host_no);
-		return;
-	}
-
-	cmd = target_cmd_lookup(tid, ev->p.cmd_done.itn_id, ev->p.cmd_done.tag);
-	if (cmd) {
-		target_cmd_done(cmd);
-		if (!cmd_mmapio(cmd)) {
-			if (scsi_get_data_dir(cmd) == DATA_WRITE)
-				free(scsi_get_out_buffer(cmd));
-			else
-				free(scsi_get_in_buffer(cmd));
-		}
-		free(KCMD(cmd));
-	} else
-		eprintf("unknow command %d %" PRIu64 " %" PRIu64 "\n",
-			tid, ev->p.cmd_done.itn_id, ev->p.cmd_done.tag);
-}
-
-static int kspace_send_it_nexus_res(int host_no, uint64_t itn_id,
-				    uint32_t function, int result)
-{
-	struct tgt_event ev;
-
-	memset(&ev, 0, sizeof(ev));
-
-	ev.hdr.type = TGT_UEVENT_IT_NEXUS_RSP;
-	ev.p.it_nexus_rsp.host_no = host_no;
-	ev.p.it_nexus_rsp.itn_id = itn_id;
-	ev.p.it_nexus_rsp.function = function;
-	ev.p.it_nexus_rsp.result = result;
-
-	return kreq_send(&ev);
-}
-
-static void kern_it_nexus_request(struct tgt_event *ev)
-{
-	int tid, ret, host_no;
-	uint32_t function = ev->p.it_nexus_req.function;
-	uint64_t itn_id = ev->p.it_nexus_req.itn_id;
-
-	host_no = ev->p.it_nexus_req.host_no;
-	tid = tgt_bound_target_lookup(host_no);
-	if (tid < 0) {
-		eprintf("can't find a bound target %d\n", host_no);
-		return;
-	}
-
-	if (function)
-		ret = it_nexus_destroy(tid, itn_id);
-	else
-		ret = it_nexus_create(tid, itn_id, host_no, NULL);
-
-	kspace_send_it_nexus_res(host_no, itn_id, function, ret);
-}
-
-static void kern_mgmt_request(struct tgt_event *ev)
-{
-	int tid;
-
-	tid = tgt_bound_target_lookup(ev->p.tsk_mgmt_req.host_no);
-	if (tid < 0) {
-		eprintf("can't find a bound target %d\n",
-			ev->p.tsk_mgmt_req.host_no);
-		return;
-	}
-
-	target_mgmt_request(tid, ev->p.tsk_mgmt_req.itn_id,
-			    ev->p.tsk_mgmt_req.mid,
-			    ev->p.tsk_mgmt_req.function,
-			    ev->p.tsk_mgmt_req.lun,
-			    ev->p.tsk_mgmt_req.tag,
-			    ev->p.cmd_done.host_no);
-}
-
-static void kern_event_handler(int fd, int events, void *data)
-{
-	struct tgt_event *ev;
-retry:
-	ev = head_ring_hdr(&kuring);
-	if (!ev->hdr.status)
-		return;
-
-	dprintf("event %u %u\n", kuring.idx, ev->hdr.type);
-
-	switch (ev->hdr.type) {
-	case TGT_KEVENT_CMD_REQ:
-		kern_queue_cmd(ev);
-		break;
-	case TGT_KEVENT_CMD_DONE:
-		kern_cmd_done(ev);
-		break;
-	case TGT_KEVENT_IT_NEXUS_REQ:
-		kern_it_nexus_request(ev);
-		break;
-	case TGT_KEVENT_TSK_MGMT_REQ:
-		kern_mgmt_request(ev);
-		break;
-	default:
-		eprintf("unknown event %u\n", ev->hdr.type);
-	}
-
-	ev->hdr.status = 0;
-	ring_index_inc(&kuring);
-
-	goto retry;
-}
-
-#define CHRDEV_PATH "/dev/tgt"
-
-static int tgt_miscdev_init(char *path, int *fd)
-{
-	int major, minor, err;
-	FILE *fp;
-	char buf[64];
-
-	fp = fopen("/sys/class/misc/tgt/dev", "r");
-	if (!fp) {
-		eprintf("Cannot open control path to the driver\n");
-		return -1;
-	}
-
-	if (!fgets(buf, sizeof(buf), fp))
-		goto out;
-
-	if (sscanf(buf, "%d:%d", &major, &minor) != 2)
-		goto out;
-
-	unlink(path);
-	err = mknod(path, (S_IFCHR | 0600), makedev(major, minor));
-	if (err)
-		goto out;
-
-	*fd = open(path, O_RDWR);
-	if (*fd < 0) {
-		eprintf("cannot open %s, %m\n", path);
-		goto out;
-	}
-
-	fclose(fp);
-
-	return 0;
-out:
-	fclose(fp);
-	return -errno;
-}
-
-int kreq_init(void)
-{
-	int err, size = TGT_RING_SIZE;
-	char *buf;
-
-	err = tgt_miscdev_init(CHRDEV_PATH, &chrfd);
-	if (err)
-		return err;
-
-	if (size < pagesize)
-		size = pagesize;
-
-	buf = mmap(NULL, size * 2, PROT_READ | PROT_WRITE, MAP_SHARED, chrfd, 0);
-	if (buf == MAP_FAILED) {
-		eprintf("fail to mmap, %m\n");
-		close(chrfd);
-		return -EINVAL;
-	}
-
-	tgt_ring_pages = size >> pageshift;
-	tgt_event_per_page = pagesize / sizeof(struct tgt_event);
-	tgt_max_events = tgt_event_per_page * tgt_ring_pages;
-
-	kuring.idx = ukring.idx = 0;
-	kuring.buf = buf;
-	ukring.buf = buf + size;
-
-	err = tgt_event_add(chrfd, EPOLLIN, kern_event_handler, NULL);
-	if (err)
-		close(chrfd);
-	return err;
-}
-- 
1.7.2.3

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list