diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2016-10-30 20:30:08 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2017-03-30 23:34:58 -0400 |
commit | a4467018c2a7228f4ef58051f0511bd037bff264 (patch) | |
tree | bca6345c174d1f07e79dac7ff362b12ca3775f1a | |
parent | fa7e25cf13a6d0b82b5ed1008246f44d42e8422c (diff) |
iscsi-target: Propigate queue_data_in + queue_status errors
This patch changes iscsi-target to propagate iscsit_transport
->iscsit_queue_data_in() and ->iscsit_queue_status() callback
errors, back up into target-core.
This allows target-core to retry failed iscsit_transport
callbacks using internal queue-full logic.
Reported-by: Potnuri Bharat Teja <bharat@chelsio.com>
Reviewed-by: Potnuri Bharat Teja <bharat@chelsio.com>
Tested-by: Potnuri Bharat Teja <bharat@chelsio.com>
Cc: Potnuri Bharat Teja <bharat@chelsio.com>
Reported-by: Steve Wise <swise@opengridcomputing.com>
Cc: Steve Wise <swise@opengridcomputing.com>
Cc: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 3 | ||||
-rw-r--r-- | drivers/target/iscsi/iscsi_target_configfs.c | 13 | ||||
-rw-r--r-- | drivers/target/iscsi/iscsi_target_util.c | 5 | ||||
-rw-r--r-- | drivers/target/iscsi/iscsi_target_util.h | 2 |
4 files changed, 10 insertions, 13 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index a91802432f2f..e3f9ed3690b7 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -485,8 +485,7 @@ static void iscsit_get_rx_pdu(struct iscsi_conn *); | |||
485 | 485 | ||
486 | int iscsit_queue_rsp(struct iscsi_conn *conn, struct iscsi_cmd *cmd) | 486 | int iscsit_queue_rsp(struct iscsi_conn *conn, struct iscsi_cmd *cmd) |
487 | { | 487 | { |
488 | iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); | 488 | return iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); |
489 | return 0; | ||
490 | } | 489 | } |
491 | EXPORT_SYMBOL(iscsit_queue_rsp); | 490 | EXPORT_SYMBOL(iscsit_queue_rsp); |
492 | 491 | ||
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c index bf40f03755dd..344e8448869c 100644 --- a/drivers/target/iscsi/iscsi_target_configfs.c +++ b/drivers/target/iscsi/iscsi_target_configfs.c | |||
@@ -1398,11 +1398,10 @@ static u32 lio_sess_get_initiator_sid( | |||
1398 | static int lio_queue_data_in(struct se_cmd *se_cmd) | 1398 | static int lio_queue_data_in(struct se_cmd *se_cmd) |
1399 | { | 1399 | { |
1400 | struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); | 1400 | struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); |
1401 | struct iscsi_conn *conn = cmd->conn; | ||
1401 | 1402 | ||
1402 | cmd->i_state = ISTATE_SEND_DATAIN; | 1403 | cmd->i_state = ISTATE_SEND_DATAIN; |
1403 | cmd->conn->conn_transport->iscsit_queue_data_in(cmd->conn, cmd); | 1404 | return conn->conn_transport->iscsit_queue_data_in(conn, cmd); |
1404 | |||
1405 | return 0; | ||
1406 | } | 1405 | } |
1407 | 1406 | ||
1408 | static int lio_write_pending(struct se_cmd *se_cmd) | 1407 | static int lio_write_pending(struct se_cmd *se_cmd) |
@@ -1431,16 +1430,14 @@ static int lio_write_pending_status(struct se_cmd *se_cmd) | |||
1431 | static int lio_queue_status(struct se_cmd *se_cmd) | 1430 | static int lio_queue_status(struct se_cmd *se_cmd) |
1432 | { | 1431 | { |
1433 | struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); | 1432 | struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); |
1433 | struct iscsi_conn *conn = cmd->conn; | ||
1434 | 1434 | ||
1435 | cmd->i_state = ISTATE_SEND_STATUS; | 1435 | cmd->i_state = ISTATE_SEND_STATUS; |
1436 | 1436 | ||
1437 | if (cmd->se_cmd.scsi_status || cmd->sense_reason) { | 1437 | if (cmd->se_cmd.scsi_status || cmd->sense_reason) { |
1438 | iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); | 1438 | return iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); |
1439 | return 0; | ||
1440 | } | 1439 | } |
1441 | cmd->conn->conn_transport->iscsit_queue_status(cmd->conn, cmd); | 1440 | return conn->conn_transport->iscsit_queue_status(conn, cmd); |
1442 | |||
1443 | return 0; | ||
1444 | } | 1441 | } |
1445 | 1442 | ||
1446 | static void lio_queue_tm_rsp(struct se_cmd *se_cmd) | 1443 | static void lio_queue_tm_rsp(struct se_cmd *se_cmd) |
diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index b4640338f8d8..7d3e2fcc26a0 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c | |||
@@ -567,7 +567,7 @@ static void iscsit_remove_cmd_from_immediate_queue( | |||
567 | } | 567 | } |
568 | } | 568 | } |
569 | 569 | ||
570 | void iscsit_add_cmd_to_response_queue( | 570 | int iscsit_add_cmd_to_response_queue( |
571 | struct iscsi_cmd *cmd, | 571 | struct iscsi_cmd *cmd, |
572 | struct iscsi_conn *conn, | 572 | struct iscsi_conn *conn, |
573 | u8 state) | 573 | u8 state) |
@@ -578,7 +578,7 @@ void iscsit_add_cmd_to_response_queue( | |||
578 | if (!qr) { | 578 | if (!qr) { |
579 | pr_err("Unable to allocate memory for" | 579 | pr_err("Unable to allocate memory for" |
580 | " struct iscsi_queue_req\n"); | 580 | " struct iscsi_queue_req\n"); |
581 | return; | 581 | return -ENOMEM; |
582 | } | 582 | } |
583 | INIT_LIST_HEAD(&qr->qr_list); | 583 | INIT_LIST_HEAD(&qr->qr_list); |
584 | qr->cmd = cmd; | 584 | qr->cmd = cmd; |
@@ -590,6 +590,7 @@ void iscsit_add_cmd_to_response_queue( | |||
590 | spin_unlock_bh(&conn->response_queue_lock); | 590 | spin_unlock_bh(&conn->response_queue_lock); |
591 | 591 | ||
592 | wake_up(&conn->queues_wq); | 592 | wake_up(&conn->queues_wq); |
593 | return 0; | ||
593 | } | 594 | } |
594 | 595 | ||
595 | struct iscsi_queue_req *iscsit_get_cmd_from_response_queue(struct iscsi_conn *conn) | 596 | struct iscsi_queue_req *iscsit_get_cmd_from_response_queue(struct iscsi_conn *conn) |
diff --git a/drivers/target/iscsi/iscsi_target_util.h b/drivers/target/iscsi/iscsi_target_util.h index 8ff08856516a..9e4197af8708 100644 --- a/drivers/target/iscsi/iscsi_target_util.h +++ b/drivers/target/iscsi/iscsi_target_util.h | |||
@@ -31,7 +31,7 @@ extern int iscsit_find_cmd_for_recovery(struct iscsi_session *, struct iscsi_cmd | |||
31 | struct iscsi_conn_recovery **, itt_t); | 31 | struct iscsi_conn_recovery **, itt_t); |
32 | extern void iscsit_add_cmd_to_immediate_queue(struct iscsi_cmd *, struct iscsi_conn *, u8); | 32 | extern void iscsit_add_cmd_to_immediate_queue(struct iscsi_cmd *, struct iscsi_conn *, u8); |
33 | extern struct iscsi_queue_req *iscsit_get_cmd_from_immediate_queue(struct iscsi_conn *); | 33 | extern struct iscsi_queue_req *iscsit_get_cmd_from_immediate_queue(struct iscsi_conn *); |
34 | extern void iscsit_add_cmd_to_response_queue(struct iscsi_cmd *, struct iscsi_conn *, u8); | 34 | extern int iscsit_add_cmd_to_response_queue(struct iscsi_cmd *, struct iscsi_conn *, u8); |
35 | extern struct iscsi_queue_req *iscsit_get_cmd_from_response_queue(struct iscsi_conn *); | 35 | extern struct iscsi_queue_req *iscsit_get_cmd_from_response_queue(struct iscsi_conn *); |
36 | extern void iscsit_remove_cmd_from_tx_queues(struct iscsi_cmd *, struct iscsi_conn *); | 36 | extern void iscsit_remove_cmd_from_tx_queues(struct iscsi_cmd *, struct iscsi_conn *); |
37 | extern bool iscsit_conn_all_queues_empty(struct iscsi_conn *); | 37 | extern bool iscsit_conn_all_queues_empty(struct iscsi_conn *); |