[kernel] r8653 - in dists/trunk/linux-2.6/debian: . patches/features/all patches/series
Bastian Blank
waldi at alioth.debian.org
Mon May 21 13:17:54 UTC 2007
Author: waldi
Date: Mon May 21 13:17:54 2007
New Revision: 8653
Log:
Add it_nexus support for scsi-target.
* debian/changelog: Update.
* debian/patches/features/all/drivers-scsi-target-it_nexus-1.patch,
debian/patches/features/all/drivers-scsi-target-it_nexus-2.patch: Add.
* debian/patches/series/1~experimental.1: Update.
Added:
dists/trunk/linux-2.6/debian/patches/features/all/drivers-scsi-target-it_nexus-1.patch
dists/trunk/linux-2.6/debian/patches/features/all/drivers-scsi-target-it_nexus-2.patch
Modified:
dists/trunk/linux-2.6/debian/changelog
dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog (original)
+++ dists/trunk/linux-2.6/debian/changelog Mon May 21 13:17:54 2007
@@ -2,8 +2,9 @@
* [powerpc]: Disable prep.
* [powerpc]: Disable apm emulation.
+ * Add it_nexus support for scsi-target.
- -- Bastian Blank <waldi at debian.org> Sun, 20 May 2007 14:16:47 +0200
+ -- Bastian Blank <waldi at debian.org> Sun, 20 May 2007 22:15:47 +0200
linux-2.6 (2.6.21-3) UNRELEASED; urgency=low
Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-scsi-target-it_nexus-1.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-scsi-target-it_nexus-1.patch Mon May 21 13:17:54 2007
@@ -0,0 +1,418 @@
+# Status: Waiting in linux-2.6-target tree
+
+diff --git a/drivers/scsi/scsi_tgt_if.c b/drivers/scsi/scsi_tgt_if.c
+index ca22ddf..9815a1a 100644
+--- a/drivers/scsi/scsi_tgt_if.c
++++ b/drivers/scsi/scsi_tgt_if.c
+@@ -102,7 +102,8 @@ static int tgt_uspace_send_event(u32 type, struct tgt_event *p)
+ return 0;
+ }
+
+-int scsi_tgt_uspace_send_cmd(struct scsi_cmnd *cmd, struct scsi_lun *lun, u64 tag)
++int scsi_tgt_uspace_send_cmd(struct scsi_cmnd *cmd, u64 itn_id,
++ struct scsi_lun *lun, u64 tag)
+ {
+ struct Scsi_Host *shost = scsi_tgt_cmd_to_host(cmd);
+ struct tgt_event ev;
+@@ -110,6 +111,7 @@ int scsi_tgt_uspace_send_cmd(struct scsi_cmnd *cmd, struct scsi_lun *lun, u64 ta
+
+ memset(&ev, 0, sizeof(ev));
+ ev.p.cmd_req.host_no = shost->host_no;
++ ev.p.cmd_req.itn_id = itn_id;
+ ev.p.cmd_req.data_len = cmd->request_bufflen;
+ memcpy(ev.p.cmd_req.scb, cmd->cmnd, sizeof(ev.p.cmd_req.scb));
+ memcpy(ev.p.cmd_req.lun, lun, sizeof(ev.p.cmd_req.lun));
+@@ -127,7 +129,7 @@ int scsi_tgt_uspace_send_cmd(struct scsi_cmnd *cmd, struct scsi_lun *lun, u64 ta
+ return err;
+ }
+
+-int scsi_tgt_uspace_send_status(struct scsi_cmnd *cmd, u64 tag)
++int scsi_tgt_uspace_send_status(struct scsi_cmnd *cmd, u64 itn_id, u64 tag)
+ {
+ struct Scsi_Host *shost = scsi_tgt_cmd_to_host(cmd);
+ struct tgt_event ev;
+@@ -135,6 +137,7 @@ int scsi_tgt_uspace_send_status(struct scsi_cmnd *cmd, u64 tag)
+
+ memset(&ev, 0, sizeof(ev));
+ ev.p.cmd_done.host_no = shost->host_no;
++ ev.p.cmd_done.itn_id = itn_id;
+ ev.p.cmd_done.tag = tag;
+ ev.p.cmd_done.result = cmd->result;
+
+@@ -149,14 +152,15 @@ int scsi_tgt_uspace_send_status(struct scsi_cmnd *cmd, u64 tag)
+ return err;
+ }
+
+-int scsi_tgt_uspace_send_tsk_mgmt(int host_no, int function, u64 tag,
+- struct scsi_lun *scsilun, void *data)
++int scsi_tgt_uspace_send_tsk_mgmt(int host_no, u64 itn_id, int function,
++ u64 tag, struct scsi_lun *scsilun, void *data)
+ {
+ struct tgt_event ev;
+ int err;
+
+ memset(&ev, 0, sizeof(ev));
+ ev.p.tsk_mgmt_req.host_no = host_no;
++ ev.p.tsk_mgmt_req.itn_id = itn_id;
+ ev.p.tsk_mgmt_req.function = function;
+ ev.p.tsk_mgmt_req.tag = tag;
+ memcpy(ev.p.tsk_mgmt_req.lun, scsilun, sizeof(ev.p.tsk_mgmt_req.lun));
+@@ -172,6 +176,29 @@ int scsi_tgt_uspace_send_tsk_mgmt(int host_no, int function, u64 tag,
+ return err;
+ }
+
++int scsi_tgt_uspace_send_it_nexus_request(int host_no, u64 itn_id,
++ int function, char *initiator_id)
++{
++ struct tgt_event ev;
++ int err;
++
++ memset(&ev, 0, sizeof(ev));
++ ev.p.it_nexus_req.host_no = host_no;
++ ev.p.it_nexus_req.function = function;
++ ev.p.it_nexus_req.itn_id = itn_id;
++ if (initiator_id)
++ strncpy(ev.p.it_nexus_req.initiator_id, initiator_id,
++ sizeof(ev.p.it_nexus_req.initiator_id));
++
++ dprintk("%d %x %llx\n", host_no, function, (unsigned long long)itn_id);
++
++ err = tgt_uspace_send_event(TGT_KEVENT_IT_NEXUS_REQ, &ev);
++ if (err)
++ eprintk("tx buf is full, could not send\n");
++
++ return err;
++}
++
+ static int event_recv_msg(struct tgt_event *ev)
+ {
+ int err = 0;
+@@ -179,6 +206,7 @@ static int event_recv_msg(struct tgt_event *ev)
+ switch (ev->hdr.type) {
+ case TGT_UEVENT_CMD_RSP:
+ err = scsi_tgt_kspace_exec(ev->p.cmd_rsp.host_no,
++ ev->p.cmd_rsp.itn_id,
+ ev->p.cmd_rsp.result,
+ ev->p.cmd_rsp.tag,
+ ev->p.cmd_rsp.uaddr,
+@@ -189,9 +217,15 @@ static int event_recv_msg(struct tgt_event *ev)
+ break;
+ case TGT_UEVENT_TSK_MGMT_RSP:
+ err = scsi_tgt_kspace_tsk_mgmt(ev->p.tsk_mgmt_rsp.host_no,
++ ev->p.tsk_mgmt_rsp.itn_id,
+ ev->p.tsk_mgmt_rsp.mid,
+ ev->p.tsk_mgmt_rsp.result);
+ break;
++ case TGT_UEVENT_IT_NEXUS_RSP:
++ err = scsi_tgt_kspace_it_nexus_rsp(ev->p.it_nexus_rsp.host_no,
++ ev->p.it_nexus_rsp.itn_id,
++ ev->p.it_nexus_rsp.result);
++ break;
+ default:
+ eprintk("unknown type %d\n", ev->hdr.type);
+ err = -EINVAL;
+diff --git a/drivers/scsi/scsi_tgt_lib.c b/drivers/scsi/scsi_tgt_lib.c
+index 2570f48..f16621c 100644
+--- a/drivers/scsi/scsi_tgt_lib.c
++++ b/drivers/scsi/scsi_tgt_lib.c
+@@ -46,6 +46,7 @@ struct scsi_tgt_cmd {
+
+ struct list_head hash_list;
+ struct request *rq;
++ u64 itn_id;
+ u64 tag;
+ };
+
+@@ -185,12 +186,13 @@ static void scsi_tgt_cmd_destroy(struct work_struct *work)
+ }
+
+ static void init_scsi_tgt_cmd(struct request *rq, struct scsi_tgt_cmd *tcmd,
+- u64 tag)
++ u64 itn_id, u64 tag)
+ {
+ struct scsi_tgt_queuedata *qdata = rq->q->queuedata;
+ unsigned long flags;
+ struct list_head *head;
+
++ tcmd->itn_id = itn_id;
+ tcmd->tag = tag;
+ tcmd->bio = NULL;
+ INIT_WORK(&tcmd->work, scsi_tgt_cmd_destroy);
+@@ -301,14 +303,14 @@ EXPORT_SYMBOL_GPL(scsi_tgt_cmd_to_host);
+ * @scsilun: scsi lun
+ * @tag: unique value to identify this command for tmf
+ */
+-int scsi_tgt_queue_command(struct scsi_cmnd *cmd, struct scsi_lun *scsilun,
+- u64 tag)
++int scsi_tgt_queue_command(struct scsi_cmnd *cmd, u64 itn_id,
++ struct scsi_lun *scsilun, u64 tag)
+ {
+ struct scsi_tgt_cmd *tcmd = cmd->request->end_io_data;
+ int err;
+
+- init_scsi_tgt_cmd(cmd->request, tcmd, tag);
+- err = scsi_tgt_uspace_send_cmd(cmd, scsilun, tag);
++ init_scsi_tgt_cmd(cmd->request, tcmd, itn_id, tag);
++ err = scsi_tgt_uspace_send_cmd(cmd, itn_id, scsilun, tag);
+ if (err)
+ cmd_hashlist_del(cmd);
+
+@@ -326,7 +328,7 @@ static void scsi_tgt_cmd_done(struct scsi_cmnd *cmd)
+
+ dprintk("cmd %p %lu\n", cmd, rq_data_dir(cmd->request));
+
+- scsi_tgt_uspace_send_status(cmd, tcmd->tag);
++ scsi_tgt_uspace_send_status(cmd, tcmd->itn_id, tcmd->tag);
+
+ if (cmd->request_buffer)
+ scsi_free_sgtable(cmd->request_buffer, cmd->sglist_len);
+@@ -459,7 +461,7 @@ static struct request *tgt_cmd_hash_lookup(struct request_queue *q, u64 tag)
+ return rq;
+ }
+
+-int scsi_tgt_kspace_exec(int host_no, int result, u64 tag,
++int scsi_tgt_kspace_exec(int host_no, u64 itn_id, int result, u64 tag,
+ unsigned long uaddr, u32 len, unsigned long sense_uaddr,
+ u32 sense_len, u8 rw)
+ {
+@@ -541,21 +543,22 @@ done:
+ return err;
+ }
+
+-int scsi_tgt_tsk_mgmt_request(struct Scsi_Host *shost, int function, u64 tag,
+- struct scsi_lun *scsilun, void *data)
++int scsi_tgt_tsk_mgmt_request(struct Scsi_Host *shost, u64 itn_id,
++ int function, u64 tag, struct scsi_lun *scsilun,
++ void *data)
+ {
+ int err;
+
+ /* TODO: need to retry if this fails. */
+- err = scsi_tgt_uspace_send_tsk_mgmt(shost->host_no, function,
+- tag, scsilun, data);
++ err = scsi_tgt_uspace_send_tsk_mgmt(shost->host_no, itn_id,
++ function, tag, scsilun, data);
+ if (err < 0)
+ eprintk("The task management request lost!\n");
+ return err;
+ }
+ EXPORT_SYMBOL_GPL(scsi_tgt_tsk_mgmt_request);
+
+-int scsi_tgt_kspace_tsk_mgmt(int host_no, u64 mid, int result)
++int scsi_tgt_kspace_tsk_mgmt(int host_no, u64 itn_id, u64 mid, int result)
+ {
+ struct Scsi_Host *shost;
+ int err = -EINVAL;
+@@ -573,7 +576,60 @@ int scsi_tgt_kspace_tsk_mgmt(int host_no, u64 mid, int result)
+ goto done;
+ }
+
+- err = shost->hostt->tsk_mgmt_response(mid, result);
++ err = shost->hostt->tsk_mgmt_response(shost, itn_id, mid, result);
++done:
++ scsi_host_put(shost);
++ return err;
++}
++
++int scsi_tgt_it_nexus_create(struct Scsi_Host *shost, u64 itn_id,
++ char *initiator)
++{
++ int err;
++
++ /* TODO: need to retry if this fails. */
++ err = scsi_tgt_uspace_send_it_nexus_request(shost->host_no, itn_id, 0,
++ initiator);
++ if (err < 0)
++ eprintk("The i_t_neuxs request lost, %d %llx!\n",
++ shost->host_no, (unsigned long long)itn_id);
++ return err;
++}
++EXPORT_SYMBOL_GPL(scsi_tgt_it_nexus_create);
++
++int scsi_tgt_it_nexus_destroy(struct Scsi_Host *shost, u64 itn_id)
++{
++ int err;
++
++ /* TODO: need to retry if this fails. */
++ err = scsi_tgt_uspace_send_it_nexus_request(shost->host_no,
++ itn_id, 1, NULL);
++ if (err < 0)
++ eprintk("The i_t_neuxs request lost, %d %llx!\n",
++ shost->host_no, (unsigned long long)itn_id);
++ return err;
++}
++EXPORT_SYMBOL_GPL(scsi_tgt_it_nexus_destroy);
++
++int scsi_tgt_kspace_it_nexus_rsp(int host_no, u64 itn_id, int result)
++{
++ struct Scsi_Host *shost;
++ int err = -EINVAL;
++
++ dprintk("%d %d %llx\n", host_no, result, (unsigned long long) mid);
++
++ shost = scsi_host_lookup(host_no);
++ if (IS_ERR(shost)) {
++ printk(KERN_ERR "Could not find host no %d\n", host_no);
++ return err;
++ }
++
++ if (!shost->uspace_req_q) {
++ printk(KERN_ERR "Not target scsi host %d\n", host_no);
++ goto done;
++ }
++
++ err = shost->hostt->it_nexus_response(shost, itn_id, result);
+ done:
+ scsi_host_put(shost);
+ return err;
+diff --git a/drivers/scsi/scsi_tgt_priv.h b/drivers/scsi/scsi_tgt_priv.h
+index e9e6db1..cb92888 100644
+--- a/drivers/scsi/scsi_tgt_priv.h
++++ b/drivers/scsi/scsi_tgt_priv.h
+@@ -15,12 +15,18 @@ do { \
+ extern void scsi_tgt_if_exit(void);
+ extern int scsi_tgt_if_init(void);
+
+-extern int scsi_tgt_uspace_send_cmd(struct scsi_cmnd *cmd, struct scsi_lun *lun,
+- u64 tag);
+-extern int scsi_tgt_uspace_send_status(struct scsi_cmnd *cmd, u64 tag);
+-extern int scsi_tgt_kspace_exec(int host_no, int result, u64 tag,
+- unsigned long uaddr, u32 len, unsigned long sense_uaddr,
+- u32 sense_len, u8 rw);
+-extern int scsi_tgt_uspace_send_tsk_mgmt(int host_no, int function, u64 tag,
++extern int scsi_tgt_uspace_send_cmd(struct scsi_cmnd *cmd, u64 it_nexus_id,
++ struct scsi_lun *lun, u64 tag);
++extern int scsi_tgt_uspace_send_status(struct scsi_cmnd *cmd, u64 it_nexus_id,
++ u64 tag);
++extern int scsi_tgt_kspace_exec(int host_no, u64 it_nexus_id, int result, u64 tag,
++ unsigned long uaddr, u32 len,
++ unsigned long sense_uaddr, u32 sense_len, u8 rw);
++extern int scsi_tgt_uspace_send_tsk_mgmt(int host_no, u64 it_nexus_id,
++ int function, u64 tag,
+ struct scsi_lun *scsilun, void *data);
+-extern int scsi_tgt_kspace_tsk_mgmt(int host_no, u64 mid, int result);
++extern int scsi_tgt_kspace_tsk_mgmt(int host_no, u64 it_nexus_id,
++ u64 mid, int result);
++extern int scsi_tgt_uspace_send_it_nexus_request(int host_no, u64 it_nexus_id,
++ int function, char *initiator);
++extern int scsi_tgt_kspace_it_nexus_rsp(int host_no, u64 it_nexus_id, int result);
+diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
+index 68f461b..5530bc2 100644
+--- a/include/scsi/scsi_host.h
++++ b/include/scsi/scsi_host.h
+@@ -146,7 +146,10 @@ struct scsi_host_template {
+ void (*done)(struct scsi_cmnd *));
+
+ /* Used as callback for the completion of task management request. */
+- int (* tsk_mgmt_response)(u64 mid, int result);
++ int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64 mid, int result);
++
++ /* Used as callback for the completion of i_t_nexus request. */
++ int (* it_nexus_response)(struct Scsi_Host *, u64, int);
+
+ /*
+ * This is an error handling strategy routine. You don't need to
+diff --git a/include/scsi/scsi_tgt.h b/include/scsi/scsi_tgt.h
+index 4f44279..d0fefb9 100644
+--- a/include/scsi/scsi_tgt.h
++++ b/include/scsi/scsi_tgt.h
+@@ -11,9 +11,11 @@ struct scsi_lun;
+ extern struct Scsi_Host *scsi_tgt_cmd_to_host(struct scsi_cmnd *);
+ extern int scsi_tgt_alloc_queue(struct Scsi_Host *);
+ extern void scsi_tgt_free_queue(struct Scsi_Host *);
+-extern int scsi_tgt_queue_command(struct scsi_cmnd *, struct scsi_lun *, u64);
+-extern int scsi_tgt_tsk_mgmt_request(struct Scsi_Host *, int, u64, struct scsi_lun *,
+- void *);
++extern int scsi_tgt_queue_command(struct scsi_cmnd *, u64, struct scsi_lun *, u64);
++extern int scsi_tgt_tsk_mgmt_request(struct Scsi_Host *, u64, int, u64,
++ struct scsi_lun *, void *);
+ extern struct scsi_cmnd *scsi_host_get_command(struct Scsi_Host *,
+ enum dma_data_direction, gfp_t);
+ extern void scsi_host_put_command(struct Scsi_Host *, struct scsi_cmnd *);
++extern int scsi_tgt_it_nexus_create(struct Scsi_Host *, u64, char *);
++extern int scsi_tgt_it_nexus_destroy(struct Scsi_Host *, u64);
+diff --git a/include/scsi/scsi_tgt_if.h b/include/scsi/scsi_tgt_if.h
+index 4cf9dff..f2ee7c2 100644
+--- a/include/scsi/scsi_tgt_if.h
++++ b/include/scsi/scsi_tgt_if.h
+@@ -23,13 +23,15 @@
+ #define __SCSI_TARGET_IF_H
+
+ /* user -> kernel */
+-#define TGT_UEVENT_CMD_RSP 0x0001
+-#define TGT_UEVENT_TSK_MGMT_RSP 0x0002
++#define TGT_UEVENT_CMD_RSP 0x0001
++#define TGT_UEVENT_IT_NEXUS_RSP 0x0002
++#define TGT_UEVENT_TSK_MGMT_RSP 0x0003
+
+ /* kernel -> user */
+-#define TGT_KEVENT_CMD_REQ 0x1001
+-#define TGT_KEVENT_CMD_DONE 0x1002
+-#define TGT_KEVENT_TSK_MGMT_REQ 0x1003
++#define TGT_KEVENT_CMD_REQ 0x1001
++#define TGT_KEVENT_CMD_DONE 0x1002
++#define TGT_KEVENT_IT_NEXUS_REQ 0x1003
++#define TGT_KEVENT_TSK_MGMT_REQ 0x1004
+
+ struct tgt_event_hdr {
+ uint16_t version;
+@@ -46,6 +48,7 @@ struct tgt_event {
+ struct {
+ int host_no;
+ int result;
++ aligned_u64 itn_id;
+ aligned_u64 tag;
+ aligned_u64 uaddr;
+ aligned_u64 sense_uaddr;
+@@ -55,15 +58,22 @@ struct tgt_event {
+ } cmd_rsp;
+ struct {
+ int host_no;
+- aligned_u64 mid;
+ int result;
++ aligned_u64 itn_id;
++ aligned_u64 mid;
+ } tsk_mgmt_rsp;
+-
++ struct {
++ __s32 host_no;
++ __s32 result;
++ aligned_u64 itn_id;
++ __u32 function;
++ } it_nexus_rsp;
+
+ /* kernel -> user */
+ struct {
+ int host_no;
+ uint32_t data_len;
++ aligned_u64 itn_id;
+ uint8_t scb[16];
+ uint8_t lun[8];
+ int attribute;
+@@ -71,16 +81,25 @@ struct tgt_event {
+ } cmd_req;
+ struct {
+ int host_no;
+- aligned_u64 tag;
+ int result;
++ aligned_u64 itn_id;
++ aligned_u64 tag;
+ } cmd_done;
+ struct {
+ int host_no;
+ int function;
++ aligned_u64 itn_id;
+ aligned_u64 tag;
+ uint8_t lun[8];
+ aligned_u64 mid;
+ } tsk_mgmt_req;
++ struct {
++ __s32 host_no;
++ __u32 function;
++ aligned_u64 itn_id;
++ __u32 max_cmds;
++ __u8 initiator_id[16];
++ } it_nexus_req;
+ } p;
+ } __attribute__ ((aligned (sizeof(uint64_t))));
+
Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-scsi-target-it_nexus-2.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-scsi-target-it_nexus-2.patch Mon May 21 13:17:54 2007
@@ -0,0 +1,135 @@
+# Status: Waiting in linux-2.6-target tree
+
+diff --git a/drivers/scsi/ibmvscsi/ibmvstgt.c b/drivers/scsi/ibmvscsi/ibmvstgt.c
+index 6d223dd..ee4fb8d 100644
+--- a/drivers/scsi/ibmvscsi/ibmvstgt.c
++++ b/drivers/scsi/ibmvscsi/ibmvstgt.c
+@@ -68,6 +68,8 @@ struct vio_port {
+ unsigned long liobn;
+ unsigned long riobn;
+ struct srp_target *target;
++
++ u64 itn_id;
+ };
+
+ static struct workqueue_struct *vtgtd;
+@@ -200,7 +202,8 @@ retry:
+ if (!test_and_set_bit(V_FLYING, &iue->flags)) {
+ spin_unlock_irqrestore(&target->lock, flags);
+ cmd = iue->sbuf->buf;
+- err = srp_cmd_queue(shost, cmd, iue, 0);
++ err = srp_cmd_queue(shost, cmd, iue,
++ (unsigned long)shost, 0);
+ if (err) {
+ eprintk("cannot queue cmd %p %d\n", cmd, err);
+ srp_iu_put(iue);
+@@ -359,6 +362,16 @@ static void process_login(struct iu_entry *iue)
+ union viosrp_iu *iu = vio_iu(iue);
+ struct srp_login_rsp *rsp = &iu->srp.login_rsp;
+ uint64_t tag = iu->srp.rsp.tag;
++ int ret;
++ struct Scsi_Host *shost = iue->target->shost;
++ struct srp_target *target = host_to_srp_target(shost);
++ struct vio_port *vport = target_to_port(target);
++
++ if (!vport->itn_id) {
++ ret = scsi_tgt_it_nexus_create(shost, (unsigned long) shost, NULL);
++ if (!ret)
++ vport->itn_id = (unsigned long) shost;
++ }
+
+ /* TODO handle case that requested size is wrong and
+ * buffer format is wrong
+@@ -412,7 +425,9 @@ static int process_tsk_mgmt(struct iu_entry *iue)
+ fn = 0;
+ }
+ if (fn)
+- scsi_tgt_tsk_mgmt_request(iue->target->shost, fn,
++ scsi_tgt_tsk_mgmt_request(iue->target->shost,
++ (unsigned long)iue->target->shost,
++ fn,
+ iu->srp.tsk_mgmt.task_tag,
+ (struct scsi_lun *) &iu->srp.tsk_mgmt.lun,
+ iue);
+@@ -721,7 +736,8 @@ static int ibmvstgt_eh_abort_handler(struct scsi_cmnd *sc)
+ return 0;
+ }
+
+-static int ibmvstgt_tsk_mgmt_response(u64 mid, int result)
++static int ibmvstgt_tsk_mgmt_response(struct Scsi_Host *shost,
++ u64 itn_id, u64 mid, int result)
+ {
+ struct iu_entry *iue = (struct iu_entry *) ((void *) mid);
+ union viosrp_iu *iu = vio_iu(iue);
+@@ -747,6 +763,17 @@ static int ibmvstgt_tsk_mgmt_response(u64 mid, int result)
+ return 0;
+ }
+
++static int ibmvstgt_it_nexus_response(struct Scsi_Host *shost, u64 itn_id,
++ int result)
++{
++ struct srp_target *target = host_to_srp_target(shost);
++ struct vio_port *vport = target_to_port(target);
++
++ if (result)
++ vport->itn_id = 0;
++ return 0;
++}
++
+ static ssize_t system_id_show(struct class_device *cdev, char *buf)
+ {
+ return snprintf(buf, PAGE_SIZE, "%s\n", system_id);
+@@ -786,6 +813,7 @@ static struct scsi_host_template ibmvstgt_sht = {
+ .transfer_response = ibmvstgt_cmd_done,
+ .eh_abort_handler = ibmvstgt_eh_abort_handler,
+ .tsk_mgmt_response = ibmvstgt_tsk_mgmt_response,
++ .it_nexus_response = ibmvstgt_it_nexus_response,
+ .shost_attrs = ibmvstgt_attrs,
+ .proc_name = TGT_NAME,
+ };
+@@ -837,8 +865,8 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id)
+ err = scsi_add_host(shost, target->dev);
+ if (err)
+ goto destroy_queue;
+- return 0;
+
++ return 0;
+ destroy_queue:
+ crq_queue_destroy(target);
+ free_srp_target:
+diff --git a/drivers/scsi/libsrp.c b/drivers/scsi/libsrp.c
+index 5631c19..70fad38 100644
+--- a/drivers/scsi/libsrp.c
++++ b/drivers/scsi/libsrp.c
+@@ -391,7 +391,7 @@ static int vscsis_data_length(struct srp_cmd *cmd, enum dma_data_direction dir)
+ }
+
+ int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info,
+- u64 addr)
++ u64 itn_id, u64 addr)
+ {
+ enum dma_data_direction dir;
+ struct scsi_cmnd *sc;
+@@ -427,7 +427,8 @@ int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info,
+ sc->request_bufflen = len;
+ sc->request_buffer = (void *) (unsigned long) addr;
+ sc->tag = tag;
+- err = scsi_tgt_queue_command(sc, (struct scsi_lun *) &cmd->lun, cmd->tag);
++ err = scsi_tgt_queue_command(sc, itn_id, (struct scsi_lun *)&cmd->lun,
++ cmd->tag);
+ if (err)
+ scsi_host_put_command(shost, sc);
+
+diff --git a/include/scsi/libsrp.h b/include/scsi/libsrp.h
+index d143171..ba615e4 100644
+--- a/include/scsi/libsrp.h
++++ b/include/scsi/libsrp.h
+@@ -59,7 +59,7 @@ extern void srp_target_free(struct srp_target *);
+ extern struct iu_entry *srp_iu_get(struct srp_target *);
+ extern void srp_iu_put(struct iu_entry *);
+
+-extern int srp_cmd_queue(struct Scsi_Host *, struct srp_cmd *, void *, u64);
++extern int srp_cmd_queue(struct Scsi_Host *, struct srp_cmd *, void *, u64, u64);
+ extern int srp_transfer_data(struct scsi_cmnd *, struct srp_cmd *,
+ srp_rdma_t, int, int);
+
Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1 (original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1 Mon May 21 13:17:54 2007
@@ -38,3 +38,5 @@
+ features/fintek-f75375.patch
+ features/alpha/isa-mapping-support.patch
+ bugfix/powerpc/libgcc-__ucmpdi2.patch
++ features/all/drivers-scsi-target-it_nexus-1.patch
++ features/all/drivers-scsi-target-it_nexus-2.patch
More information about the Kernel-svn-changes
mailing list