[PATCH] [LIO-Target 6/10]: Add iscsi_allocate_se_cmd() and se_cmd_t usage

5 views
Skip to first unread message

Nicholas A. Bellinger

unread,
Dec 9, 2008, 11:29:18 PM12/9/08
to Linux-iSCSI.org Target Dev
>From 9e614ff68539f7e8271a5ac866743f4ef7b6b760 Mon Sep 17 00:00:00 2001
From: Nicholas Bellinger <n...@linux-iscsi.org>
Date: Tue, 9 Dec 2008 19:39:37 -0800
Subject: [PATCH] [LIO-Target]: Add iscsi_allocate_se_cmd() and se_cmd_t usage

This patch adds iscsi_allocate_se_cmd() (called from iscsi_handle_scsi_cmd())
to allocate se_cmd_t and iscsi_cmd_t for a single ISCSI_INIT_SCSI_CMND CDB.

Also, update iscsi_check_unsolicited_dataout() and iscsi_fe_sendpage_sg()
to use se_cmd_t.

Also, this patch adds lio_release_cmd_to_pool() for struct target_core_fabric_ops,
and updates for se_cmd_t changes in __iscsi_release_cmd_to_pool(). Same for
lio_release_cmd_direct() and iscsi_release_cmd_direct().

Signed-off-by: Nicholas A. Bellinger <n...@linux-iscsi.org>
---
drivers/lio-core/iscsi_target_util.c | 142 +++++++++++++++++++++-------------
drivers/lio-core/iscsi_target_util.h | 11 ++-
2 files changed, 98 insertions(+), 55 deletions(-)

diff --git a/drivers/lio-core/iscsi_target_util.c b/drivers/lio-core/iscsi_target_util.c
index 6f12b99..491409a 100644
--- a/drivers/lio-core/iscsi_target_util.c
+++ b/drivers/lio-core/iscsi_target_util.c
@@ -58,12 +58,16 @@
#include <iscsi_target.h>
#include <iscsi_parameters.h>

+#include <target_core_fabric_ops.h>
+#include <target_core_configfs.h>
+
#ifdef DEBUG_ERL
#include <iscsi_target_debugerl.h>
#endif /* DEBUG_ERL */

#undef ISCSI_TARGET_UTIL_C

+extern struct target_fabric_configfs *lio_target_fabric_configfs;
extern iscsi_global_t *iscsi_global;
extern int iscsi_check_acl_for_lun (se_device_t *, iscsi_conn_t *);
extern int iscsi_add_nopin (iscsi_conn_t *, int);
@@ -312,31 +316,24 @@ extern void iscsi_free_r2ts_from_list (
return;
}

-/* iscsi_allocate_cmd():
+/* __iscsi_allocate_cmd():
*
*
*/
-inline iscsi_cmd_t *iscsi_allocate_cmd (iscsi_conn_t *conn)
+extern iscsi_cmd_t *iscsi_allocate_cmd (
+ iscsi_conn_t *conn)
{
iscsi_cmd_t *cmd;

if (!(cmd = iscsi_get_cmd_from_pool(SESS(conn)))) {
if (!(cmd = (iscsi_cmd_t *)
- kmalloc(sizeof(iscsi_cmd_t), GFP_ATOMIC))) {
+ kzalloc(sizeof(iscsi_cmd_t), GFP_ATOMIC))) {
TRACE_ERROR("Unable to allocate memory"
" for iscsi_cmd_t.\n");
return(NULL);
}
- memset(cmd, 0, sizeof(iscsi_cmd_t));
}

- if (!(cmd->t_task = (se_transport_task_t *) kmalloc(
- sizeof(se_transport_task_t), GFP_ATOMIC))) {
- TRACE_ERROR("Unable to allocate cmd->t_task\n");
- return(NULL);
- }
- memset(cmd->t_task, 0, sizeof(se_transport_task_t));
-
cmd->conn = conn;
init_MUTEX_LOCKED(&cmd->reject_sem);
init_MUTEX_LOCKED(&cmd->unsolicited_data_sem);
@@ -346,6 +343,32 @@ inline iscsi_cmd_t *iscsi_allocate_cmd (iscsi_conn_t *conn)
spin_lock_init(&cmd->error_lock);
spin_lock_init(&cmd->r2t_lock);

+ return(cmd);
+}
+
+/*
+ * Called from iscsi_handle_scsi_cmd()
+ */
+extern iscsi_cmd_t *iscsi_allocate_se_cmd (
+ iscsi_conn_t *conn,
+ u32 data_length,
+ int data_direction)
+{
+ iscsi_cmd_t *cmd;
+ se_cmd_t *se_cmd;
+
+ if (!(cmd = iscsi_allocate_cmd(conn)))
+ return(NULL);
+
+ cmd->data_direction = data_direction;
+ cmd->data_length = data_length;
+ /*
+ * Use struct target_fabric_configfs->tf_ops for lio_target_fabric_configfs
+ */
+ if (!(se_cmd = transport_alloc_se_cmd(&lio_target_fabric_configfs->tf_ops,
+ (void *)cmd, data_length, data_direction)))
+ goto out;
+#if 0
INIT_LIST_HEAD(&T_TASK(cmd)->t_task_list);
init_MUTEX_LOCKED(&T_TASK(cmd)->transport_lun_fe_stop_sem);
init_MUTEX_LOCKED(&T_TASK(cmd)->transport_lun_stop_sem);
@@ -353,8 +376,11 @@ inline iscsi_cmd_t *iscsi_allocate_cmd (iscsi_conn_t *conn)
init_MUTEX_LOCKED(&T_TASK(cmd)->t_transport_passthrough_sem);
init_MUTEX_LOCKED(&T_TASK(cmd)->t_transport_passthrough_wsem);
spin_lock_init(&T_TASK(cmd)->t_state_lock);
-
+#endif
return(cmd);
+out:
+ iscsi_release_cmd_to_pool(cmd);
+ return(NULL);
}

/* iscsi_allocate_tmr_req():
@@ -612,6 +638,7 @@ ooo_cmdsn:
extern int iscsi_check_unsolicited_dataout (iscsi_cmd_t *cmd, unsigned char *buf)
{
iscsi_conn_t *conn = CONN(cmd);
+ se_cmd_t *se_cmd = SE_CMD(cmd);
struct iscsi_init_scsi_data_out *hdr =
(struct iscsi_init_scsi_data_out *) buf;

@@ -620,7 +647,7 @@ extern int iscsi_check_unsolicited_dataout (iscsi_cmd_t *cmd, unsigned char *buf
if (SESS_OPS_C(conn)->InitialR2T) {
TRACE_ERROR("Received unexpected unsolicited data"
" while InitialR2T=Yes, protocol error.\n");
- iscsi_send_check_condition_and_sense(cmd,
+ iscsi_send_check_condition_and_sense(se_cmd,
UNEXPECTED_UNSOLICITED_DATA, 0);
return(-1);
}
@@ -631,7 +658,7 @@ extern int iscsi_check_unsolicited_dataout (iscsi_cmd_t *cmd, unsigned char *buf
" for this Unsolicited DataOut Burst.\n",
(cmd->first_burst_len + hdr->length),
SESS_OPS_C(conn)->FirstBurstLength);
- iscsi_send_check_condition_and_sense(cmd,
+ iscsi_send_check_condition_and_sense(se_cmd,
INCORRECT_AMOUNT_OF_DATA, 0);
return(-1);
}
@@ -647,7 +674,7 @@ extern int iscsi_check_unsolicited_dataout (iscsi_cmd_t *cmd, unsigned char *buf
" not equal ExpXferLen %u.\n",
(cmd->first_burst_len + hdr->length),
SESS_OPS_C(conn)->FirstBurstLength, cmd->data_length);
- iscsi_send_check_condition_and_sense(cmd,
+ iscsi_send_check_condition_and_sense(se_cmd,
INCORRECT_AMOUNT_OF_DATA, 0);
return(-1);
}
@@ -1085,9 +1112,7 @@ extern iscsi_cmd_t *iscsi_get_cmd_from_pool (iscsi_session_t *sess)
extern void iscsi_release_cmd_direct (iscsi_cmd_t *cmd)
{
iscsi_free_r2ts_from_list(cmd);
-
- if (cmd->iov_data)
- kfree(cmd->iov_data);
+
if (cmd->buf_ptr)
kfree(cmd->buf_ptr);
if (cmd->pdu_list)
@@ -1095,12 +1120,6 @@ extern void iscsi_release_cmd_direct (iscsi_cmd_t *cmd)
if (cmd->seq_list)
kfree(cmd->seq_list);

- if (cmd->cmd_flags & ICF_CMD_PASSTHROUGH)
- kfree(cmd->iscsi_lun);
-
- if (T_TASK(cmd))
- kfree(T_TASK(cmd));
-
memset(cmd, 0, sizeof(iscsi_cmd_t));

kfree(cmd);
@@ -1108,35 +1127,37 @@ extern void iscsi_release_cmd_direct (iscsi_cmd_t *cmd)
return;
}

+extern void lio_release_cmd_direct (se_cmd_t *se_cmd)
+{
+ iscsi_release_cmd_direct((iscsi_cmd_t *)se_cmd->se_fabric_cmd_ptr);
+}
+
+#warning FIXME: iscsi_dec_nacl_count() is broken
extern void iscsi_dec_nacl_count (iscsi_node_acl_t *nacl, iscsi_cmd_t *cmd)
{
se_dev_entry_t *deve;

if (!cmd)
return;
-
+#if 0
deve = &nacl->device_list[cmd->orig_fe_lun];
spin_lock_bh(&nacl->device_list_lock);
deve->deve_cmds--;
spin_unlock_bh(&nacl->device_list_lock);
+#else
+ BUG();
+#endif

return;
}

-/* iscsi_release_cmd_to_pool():
+/* __iscsi_release_cmd_to_pool():
*
*
*/
-inline void iscsi_release_cmd_to_pool (iscsi_cmd_t *cmd, iscsi_session_t *sess)
+extern void __iscsi_release_cmd_to_pool (iscsi_cmd_t *cmd, iscsi_session_t *sess)
{
- __u32 iov_data_count = 0;
iscsi_conn_t *conn = CONN(cmd);
- struct iovec *iov = NULL;
-
- if (cmd->orig_iov_data_count) {
- iov = cmd->iov_data;
- iov_data_count = cmd->orig_iov_data_count;
- }

iscsi_free_r2ts_from_list(cmd);

@@ -1149,16 +1170,8 @@ inline void iscsi_release_cmd_to_pool (iscsi_cmd_t *cmd, iscsi_session_t *sess)

if (conn)
iscsi_remove_cmd_from_tx_queues(cmd, conn);
-
- if (T_TASK(cmd))
- kfree(T_TASK(cmd));
-
- memset(cmd, 0, sizeof(iscsi_cmd_t));

- if (iov_data_count) {
- cmd->iov_data = iov;
- cmd->orig_iov_data_count = iov_data_count;
- }
+ memset(cmd, 0, sizeof(iscsi_cmd_t));

spin_lock_bh(&sess->pool_lock);
if (!sess->pool_head && !sess->pool_tail)
@@ -1173,6 +1186,30 @@ inline void iscsi_release_cmd_to_pool (iscsi_cmd_t *cmd, iscsi_session_t *sess)
return;
}

+extern void iscsi_release_cmd_to_pool (iscsi_cmd_t *cmd)
+{
+ if (!CONN(cmd) && !cmd->sess) {
+#if 0
+ TRACE_ERROR("Releasing cmd: %p ITT: 0x%08x i_state: 0x%02x,"
+ " deferred_i_state: 0x%02x directly\n", cmd,
+ CMD_TFO(se_cmd)->get_task_tag(se_cmd),
+ CMD_TFO(se_cmd)->get_cmd_state(se_cmd),
+ cmd->deferred_i_state);
+#endif
+ iscsi_release_cmd_direct(cmd);
+ } else {
+ __iscsi_release_cmd_to_pool(cmd, (CONN(cmd)) ?
+ CONN(cmd)->sess : cmd->sess);
+ }
+
+ return;
+}
+
+extern void lio_release_cmd_to_pool (se_cmd_t *se_cmd)
+{
+ iscsi_release_cmd_to_pool((iscsi_cmd_t *)se_cmd->se_fabric_cmd_ptr);
+}
+
/* iscsi_release_all_cmds_in_pool():
*
*
@@ -1189,8 +1226,6 @@ extern void iscsi_release_all_cmds_in_pool (iscsi_session_t *sess)

if (cmd->buf_ptr)
kfree(cmd->buf_ptr);
- if (cmd->iov_data)
- kfree(cmd->iov_data);
if (cmd->pdu_list)
kfree(cmd->pdu_list);
if (cmd->seq_list)
@@ -2296,8 +2331,8 @@ send_data:
tx_size = cmd->tx_size;

if (!use_misc) {
- iov = &cmd->iov_data[0];
- iov_count = cmd->iov_data_count;
+ iov = &SE_CMD(cmd)->iov_data[0];
+ iov_count = SE_CMD(cmd)->iov_data_count;
} else {
iov = &cmd->iov_misc[0];
iov_count = cmd->iov_misc_count;
@@ -2317,13 +2352,14 @@ send_data:
}

extern int iscsi_fe_sendpage_sg (
- iscsi_unmap_sg_t *u_sg,
+ se_unmap_sg_t *u_sg,
iscsi_conn_t *conn)
{
int tx_sent;
- iscsi_cmd_t *cmd = u_sg->cmd;
+ iscsi_cmd_t *cmd = (iscsi_cmd_t *)u_sg->fabric_cmd;
+ se_cmd_t *se_cmd = SE_CMD(cmd);
u32 len = cmd->tx_size, pg_len, se_len, se_off, tx_size;
- struct iovec *iov = &cmd->iov_data[0];
+ struct iovec *iov = &se_cmd->iov_data[0];
struct page *page;
se_mem_t *se_mem = u_sg->cur_se_mem;

@@ -2403,7 +2439,7 @@ send_pg:
break;

if (!(se_len -= tx_sent)) {
- list_for_each_entry_continue(se_mem, T_TASK(cmd)->t_mem_list, se_list)
+ list_for_each_entry_continue(se_mem, T_TASK(se_cmd)->t_mem_list, se_list)
break;

if (!se_mem) {
@@ -2423,7 +2459,7 @@ send_pg:

send_padding:
if (u_sg->padding) {
- struct iovec *iov_p = &cmd->iov_data[cmd->iov_data_count-2];
+ struct iovec *iov_p = &se_cmd->iov_data[se_cmd->iov_data_count-2];

tx_sent = tx_data(conn, iov_p, 1, u_sg->padding);
if (u_sg->padding != tx_sent) {
@@ -2437,7 +2473,7 @@ send_padding:

send_datacrc:
if (CONN_OPS(conn)->DataDigest) {
- struct iovec *iov_d = &cmd->iov_data[cmd->iov_data_count-1];
+ struct iovec *iov_d = &se_cmd->iov_data[se_cmd->iov_data_count-1];

tx_sent = tx_data(conn, iov_d, 1, CRC_LEN);
if (CRC_LEN != tx_sent) {
diff --git a/drivers/lio-core/iscsi_target_util.h b/drivers/lio-core/iscsi_target_util.h
index c4226a6..18afd1c 100644
--- a/drivers/lio-core/iscsi_target_util.h
+++ b/drivers/lio-core/iscsi_target_util.h
@@ -31,6 +31,9 @@

#define MARKER_SIZE 8

+struct se_cmd_s;
+struct se_unmap_sg_s;
+
extern void iscsi_attach_cmd_to_queue (iscsi_conn_t *, iscsi_cmd_t *);
extern void iscsi_remove_cmd_from_conn_list (iscsi_cmd_t *, iscsi_conn_t *);
extern void iscsi_ack_from_expstatsn (iscsi_conn_t *, __u32);
@@ -42,6 +45,7 @@ extern iscsi_r2t_t *iscsi_get_r2t_from_list (iscsi_cmd_t *);
extern void iscsi_free_r2t (iscsi_r2t_t *, iscsi_cmd_t *);
extern void iscsi_free_r2ts_from_list (iscsi_cmd_t *);
extern iscsi_cmd_t *iscsi_allocate_cmd (iscsi_conn_t *);
+extern iscsi_cmd_t *iscsi_allocate_se_cmd (iscsi_conn_t *, u32, int);
extern iscsi_tmr_req_t *iscsi_allocate_tmr_req (void);
extern int iscsi_decide_list_to_build (iscsi_cmd_t *, __u32);
extern iscsi_seq_t *iscsi_get_seq_holder_for_datain (iscsi_cmd_t *, __u32);
@@ -61,8 +65,11 @@ extern void iscsi_remove_cmd_from_tx_queues (iscsi_cmd_t *, iscsi_conn_t *);
extern void iscsi_free_queue_reqs_for_conn (iscsi_conn_t *);
extern iscsi_cmd_t *iscsi_get_cmd_from_pool (iscsi_session_t *);
extern void iscsi_release_cmd_direct (iscsi_cmd_t *);
+extern void lio_release_cmd_direct (struct se_cmd_s *);
extern void iscsi_dec_nacl_count (iscsi_node_acl_t *, iscsi_cmd_t *);
-extern void iscsi_release_cmd_to_pool (iscsi_cmd_t *, iscsi_session_t *);
+extern void __iscsi_release_cmd_to_pool (iscsi_cmd_t *, iscsi_session_t *);
+extern void iscsi_release_cmd_to_pool (iscsi_cmd_t *);
+extern void lio_release_cmd_to_pool (struct se_cmd_s *);
extern void iscsi_release_all_cmds_in_pool (iscsi_session_t *);
extern __u64 iscsi_pack_lun (unsigned int);
extern __u32 iscsi_unpack_lun (unsigned char *);
@@ -91,7 +98,7 @@ extern void iscsi_stop_nopin_response_timer (iscsi_conn_t *);
extern void iscsi_start_nopin_timer (iscsi_conn_t *);
extern void iscsi_stop_nopin_timer (iscsi_conn_t *);
extern int iscsi_send_tx_data (iscsi_cmd_t *, iscsi_conn_t *, int);
-extern int iscsi_fe_sendpage_sg (iscsi_unmap_sg_t *, iscsi_conn_t *);
+extern int iscsi_fe_sendpage_sg (struct se_unmap_sg_s *, iscsi_conn_t *);
extern int iscsi_tx_login_rsp (iscsi_conn_t *, __u8, __u8);
extern void iscsi_print_session_params (iscsi_session_t *);
extern int iscsi_print_dev_to_proc (char *, char **, off_t, int);
--
1.5.4.1

Reply all
Reply to author
Forward
0 new messages