[Stgt-devel] [PATCH v2] pass cdb length

Pete Wyckoff pw
Sun Feb 25 19:43:19 CET 2007


Oops.  Insufficient testing when refactoring patches.  Use this
one instead.
---

Large CDBs are needed for OSD commands.  Pass the length of the command
as well as the CDB itself.

Signed-off-by: Pete Wyckoff <pw at osc.edu>
---

 usr/iscsi/iscsid.c |    4 ++--
 usr/target.c       |    8 +++++---
 usr/target.h       |    3 ++-
 usr/tgtd.h         |    2 +-
 usr/tgtif.c        |    2 +-
 5 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
index 8ea1092..6726c7d 100644
--- a/usr/iscsi/iscsid.c
+++ b/usr/iscsi/iscsid.c
@@ -953,14 +953,14 @@ static int iscsi_scsi_cmd_execute(struct iscsi_task *task)
 				list_add_tail(&task->c_list, &task->conn->tx_clist);
 		} else
 			err = target_cmd_queue(conn->session->iscsi_nexus_id,
-					       req->cdb,
+					       req->cdb, 16,
 					       req->flags & ISCSI_FLAG_CMD_WRITE,
 					       uaddr, req->lun,
 					       ntohl(req->data_length),
 					       cmd_attr(task), req->itt);
 	} else
 		err = target_cmd_queue(conn->session->iscsi_nexus_id,
-				       req->cdb,
+				       req->cdb, 16,
 				       req->flags & ISCSI_FLAG_CMD_WRITE,
 				       uaddr, req->lun, ntohl(req->data_length),
 				       cmd_attr(task), req->itt);
diff --git a/usr/target.c b/usr/target.c
index c101b39..dc112d1 100644
--- a/usr/target.c
+++ b/usr/target.c
@@ -388,7 +388,7 @@ static void cmd_post_perform(struct tgt_cmd_queue *q, struct scsi_cmd *cmd)
 	}
 }
 
-int target_cmd_queue(uint64_t nid, uint8_t *scb, uint8_t rw,
+int target_cmd_queue(uint64_t nid, uint8_t *scb, int scblen, uint8_t rw,
 		     unsigned long uaddr,
 		     uint8_t *lun, uint32_t data_len,
 		     int attribute, uint64_t tag)
@@ -409,7 +409,7 @@ int target_cmd_queue(uint64_t nid, uint8_t *scb, uint8_t rw,
 
 	target = nexus->nexus_target;
 	/* TODO: preallocate cmd */
-	cmd = zalloc(sizeof(*cmd));
+	cmd = zalloc(sizeof(*cmd) + scblen);
 	if (!cmd)
 		return -ENOMEM;
 
@@ -419,7 +419,9 @@ int target_cmd_queue(uint64_t nid, uint8_t *scb, uint8_t rw,
 	cmd->tag = tag;
 	cmd->uaddr = uaddr;
 	cmd->len = data_len;
-	memcpy(cmd->scb, scb, sizeof(cmd->scb));
+	cmd->scb = (void *) (cmd + 1);
+	cmd->scblen = scblen;
+	memcpy(cmd->scb, scb, scblen);
 	memcpy(cmd->lun, lun, sizeof(cmd->lun));
 
 	cmd_hlist_insert(target, cmd);
diff --git a/usr/target.h b/usr/target.h
index aecee7c..e90b094 100644
--- a/usr/target.h
+++ b/usr/target.h
@@ -90,7 +90,8 @@ struct scsi_cmd {
 	uint64_t cmd_nexus_id;
 	uint32_t data_len;
 	uint64_t offset;
-	uint8_t scb[16];
+	uint8_t *scb;
+	int scblen;
 	uint8_t lun[8];
 	int attribute;
 	uint64_t tag;
diff --git a/usr/tgtd.h b/usr/tgtd.h
index eb9dd2e..b4d8146 100644
--- a/usr/tgtd.h
+++ b/usr/tgtd.h
@@ -103,7 +103,7 @@ extern int tgt_event_add(int fd, int events, event_handler_t handler, void *data
 extern void tgt_event_del(int fd);
 extern int tgt_event_modify(int fd, int events);
 
-extern int target_cmd_queue(uint64_t nid, uint8_t *scb, uint8_t rw,
+extern int target_cmd_queue(uint64_t nid, uint8_t *scb, int scblen, uint8_t rw,
 			    unsigned long uaddr,
 			    uint8_t *lun, uint32_t data_len,
 			    int attribute, uint64_t tag);
diff --git a/usr/tgtif.c b/usr/tgtif.c
index 76545f6..4c22863 100644
--- a/usr/tgtif.c
+++ b/usr/tgtif.c
@@ -132,7 +132,7 @@ retry:
 	switch (ev->hdr.type) {
 	case TGT_KEVENT_CMD_REQ:
 		target_cmd_queue(host_no_to_it_nexus(ev->p.cmd_req.host_no),
-				 ev->p.cmd_req.scb,
+				 ev->p.cmd_req.scb, 16,
 				 0, 0,
 /* 				 ev->k.cmd_req.uaddr, */
 				 ev->p.cmd_req.lun, ev->p.cmd_req.data_len,



More information about the stgt mailing list