Commit b98b809c authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
 "Four non-core fixes.

  Two are reverts of target fixes which turned out to have unwanted side
  effects, one is a revert of an RDMA fix with the same problem and the
  final one fixes an incorrect warning about memory allocation failures
  in megaraid_sas (the driver actually reduces the allocation size until
  it succeeds)"
Signed-off-by: default avatarJames E.J. Bottomley <jejb@linux.ibm.com>

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: Revert "target: iscsi: Wait for all commands to finish before freeing a session"
  scsi: Revert "RDMA/isert: Fix a recently introduced regression related to logout"
  scsi: megaraid_sas: silence a warning
  scsi: Revert "target/core: Inline transport_lun_remove_cmd()"
parents 5b442b1a 807b9515
...@@ -2575,6 +2575,17 @@ isert_wait4logout(struct isert_conn *isert_conn) ...@@ -2575,6 +2575,17 @@ isert_wait4logout(struct isert_conn *isert_conn)
} }
} }
static void
isert_wait4cmds(struct iscsi_conn *conn)
{
isert_info("iscsi_conn %p\n", conn);
if (conn->sess) {
target_sess_cmd_list_set_waiting(conn->sess->se_sess);
target_wait_for_sess_cmds(conn->sess->se_sess);
}
}
/** /**
* isert_put_unsol_pending_cmds() - Drop commands waiting for * isert_put_unsol_pending_cmds() - Drop commands waiting for
* unsolicitate dataout * unsolicitate dataout
...@@ -2622,6 +2633,7 @@ static void isert_wait_conn(struct iscsi_conn *conn) ...@@ -2622,6 +2633,7 @@ static void isert_wait_conn(struct iscsi_conn *conn)
ib_drain_qp(isert_conn->qp); ib_drain_qp(isert_conn->qp);
isert_put_unsol_pending_cmds(conn); isert_put_unsol_pending_cmds(conn);
isert_wait4cmds(conn);
isert_wait4logout(isert_conn); isert_wait4logout(isert_conn);
queue_work(isert_release_wq, &isert_conn->release_work); queue_work(isert_release_wq, &isert_conn->release_work);
......
...@@ -623,7 +623,8 @@ megasas_alloc_request_fusion(struct megasas_instance *instance) ...@@ -623,7 +623,8 @@ megasas_alloc_request_fusion(struct megasas_instance *instance)
fusion->io_request_frames = fusion->io_request_frames =
dma_pool_alloc(fusion->io_request_frames_pool, dma_pool_alloc(fusion->io_request_frames_pool,
GFP_KERNEL, &fusion->io_request_frames_phys); GFP_KERNEL | __GFP_NOWARN,
&fusion->io_request_frames_phys);
if (!fusion->io_request_frames) { if (!fusion->io_request_frames) {
if (instance->max_fw_cmds >= (MEGASAS_REDUCE_QD_COUNT * 2)) { if (instance->max_fw_cmds >= (MEGASAS_REDUCE_QD_COUNT * 2)) {
instance->max_fw_cmds -= MEGASAS_REDUCE_QD_COUNT; instance->max_fw_cmds -= MEGASAS_REDUCE_QD_COUNT;
...@@ -661,7 +662,7 @@ megasas_alloc_request_fusion(struct megasas_instance *instance) ...@@ -661,7 +662,7 @@ megasas_alloc_request_fusion(struct megasas_instance *instance)
fusion->io_request_frames = fusion->io_request_frames =
dma_pool_alloc(fusion->io_request_frames_pool, dma_pool_alloc(fusion->io_request_frames_pool,
GFP_KERNEL, GFP_KERNEL | __GFP_NOWARN,
&fusion->io_request_frames_phys); &fusion->io_request_frames_phys);
if (!fusion->io_request_frames) { if (!fusion->io_request_frames) {
......
...@@ -1165,9 +1165,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -1165,9 +1165,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
hdr->cmdsn, be32_to_cpu(hdr->data_length), payload_length, hdr->cmdsn, be32_to_cpu(hdr->data_length), payload_length,
conn->cid); conn->cid);
if (target_get_sess_cmd(&cmd->se_cmd, true) < 0) target_get_sess_cmd(&cmd->se_cmd, true);
return iscsit_add_reject_cmd(cmd,
ISCSI_REASON_WAITING_FOR_LOGOUT, buf);
cmd->sense_reason = transport_lookup_cmd_lun(&cmd->se_cmd, cmd->sense_reason = transport_lookup_cmd_lun(&cmd->se_cmd,
scsilun_to_int(&hdr->lun)); scsilun_to_int(&hdr->lun));
...@@ -2004,9 +2002,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -2004,9 +2002,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
conn->sess->se_sess, 0, DMA_NONE, conn->sess->se_sess, 0, DMA_NONE,
TCM_SIMPLE_TAG, cmd->sense_buffer + 2); TCM_SIMPLE_TAG, cmd->sense_buffer + 2);
if (target_get_sess_cmd(&cmd->se_cmd, true) < 0) target_get_sess_cmd(&cmd->se_cmd, true);
return iscsit_add_reject_cmd(cmd,
ISCSI_REASON_WAITING_FOR_LOGOUT, buf);
/* /*
* TASK_REASSIGN for ERL=2 / connection stays inside of * TASK_REASSIGN for ERL=2 / connection stays inside of
...@@ -4149,6 +4145,9 @@ int iscsit_close_connection( ...@@ -4149,6 +4145,9 @@ int iscsit_close_connection(
iscsit_stop_nopin_response_timer(conn); iscsit_stop_nopin_response_timer(conn);
iscsit_stop_nopin_timer(conn); iscsit_stop_nopin_timer(conn);
if (conn->conn_transport->iscsit_wait_conn)
conn->conn_transport->iscsit_wait_conn(conn);
/* /*
* During Connection recovery drop unacknowledged out of order * During Connection recovery drop unacknowledged out of order
* commands for this connection, and prepare the other commands * commands for this connection, and prepare the other commands
...@@ -4231,11 +4230,6 @@ int iscsit_close_connection( ...@@ -4231,11 +4230,6 @@ int iscsit_close_connection(
* must wait until they have completed. * must wait until they have completed.
*/ */
iscsit_check_conn_usage_count(conn); iscsit_check_conn_usage_count(conn);
target_sess_cmd_list_set_waiting(sess->se_sess);
target_wait_for_sess_cmds(sess->se_sess);
if (conn->conn_transport->iscsit_wait_conn)
conn->conn_transport->iscsit_wait_conn(conn);
ahash_request_free(conn->conn_tx_hash); ahash_request_free(conn->conn_tx_hash);
if (conn->conn_rx_hash) { if (conn->conn_rx_hash) {
......
...@@ -666,6 +666,11 @@ static int transport_cmd_check_stop_to_fabric(struct se_cmd *cmd) ...@@ -666,6 +666,11 @@ static int transport_cmd_check_stop_to_fabric(struct se_cmd *cmd)
target_remove_from_state_list(cmd); target_remove_from_state_list(cmd);
/*
* Clear struct se_cmd->se_lun before the handoff to FE.
*/
cmd->se_lun = NULL;
spin_lock_irqsave(&cmd->t_state_lock, flags); spin_lock_irqsave(&cmd->t_state_lock, flags);
/* /*
* Determine if frontend context caller is requesting the stopping of * Determine if frontend context caller is requesting the stopping of
...@@ -693,6 +698,17 @@ static int transport_cmd_check_stop_to_fabric(struct se_cmd *cmd) ...@@ -693,6 +698,17 @@ static int transport_cmd_check_stop_to_fabric(struct se_cmd *cmd)
return cmd->se_tfo->check_stop_free(cmd); return cmd->se_tfo->check_stop_free(cmd);
} }
static void transport_lun_remove_cmd(struct se_cmd *cmd)
{
struct se_lun *lun = cmd->se_lun;
if (!lun)
return;
if (cmpxchg(&cmd->lun_ref_active, true, false))
percpu_ref_put(&lun->lun_ref);
}
static void target_complete_failure_work(struct work_struct *work) static void target_complete_failure_work(struct work_struct *work)
{ {
struct se_cmd *cmd = container_of(work, struct se_cmd, work); struct se_cmd *cmd = container_of(work, struct se_cmd, work);
...@@ -783,6 +799,8 @@ static void target_handle_abort(struct se_cmd *cmd) ...@@ -783,6 +799,8 @@ static void target_handle_abort(struct se_cmd *cmd)
WARN_ON_ONCE(kref_read(&cmd->cmd_kref) == 0); WARN_ON_ONCE(kref_read(&cmd->cmd_kref) == 0);
transport_lun_remove_cmd(cmd);
transport_cmd_check_stop_to_fabric(cmd); transport_cmd_check_stop_to_fabric(cmd);
} }
...@@ -1708,6 +1726,7 @@ static void target_complete_tmr_failure(struct work_struct *work) ...@@ -1708,6 +1726,7 @@ static void target_complete_tmr_failure(struct work_struct *work)
se_cmd->se_tmr_req->response = TMR_LUN_DOES_NOT_EXIST; se_cmd->se_tmr_req->response = TMR_LUN_DOES_NOT_EXIST;
se_cmd->se_tfo->queue_tm_rsp(se_cmd); se_cmd->se_tfo->queue_tm_rsp(se_cmd);
transport_lun_remove_cmd(se_cmd);
transport_cmd_check_stop_to_fabric(se_cmd); transport_cmd_check_stop_to_fabric(se_cmd);
} }
...@@ -1898,6 +1917,7 @@ void transport_generic_request_failure(struct se_cmd *cmd, ...@@ -1898,6 +1917,7 @@ void transport_generic_request_failure(struct se_cmd *cmd,
goto queue_full; goto queue_full;
check_stop: check_stop:
transport_lun_remove_cmd(cmd);
transport_cmd_check_stop_to_fabric(cmd); transport_cmd_check_stop_to_fabric(cmd);
return; return;
...@@ -2195,6 +2215,7 @@ static void transport_complete_qf(struct se_cmd *cmd) ...@@ -2195,6 +2215,7 @@ static void transport_complete_qf(struct se_cmd *cmd)
transport_handle_queue_full(cmd, cmd->se_dev, ret, false); transport_handle_queue_full(cmd, cmd->se_dev, ret, false);
return; return;
} }
transport_lun_remove_cmd(cmd);
transport_cmd_check_stop_to_fabric(cmd); transport_cmd_check_stop_to_fabric(cmd);
} }
...@@ -2289,6 +2310,7 @@ static void target_complete_ok_work(struct work_struct *work) ...@@ -2289,6 +2310,7 @@ static void target_complete_ok_work(struct work_struct *work)
if (ret) if (ret)
goto queue_full; goto queue_full;
transport_lun_remove_cmd(cmd);
transport_cmd_check_stop_to_fabric(cmd); transport_cmd_check_stop_to_fabric(cmd);
return; return;
} }
...@@ -2314,6 +2336,7 @@ static void target_complete_ok_work(struct work_struct *work) ...@@ -2314,6 +2336,7 @@ static void target_complete_ok_work(struct work_struct *work)
if (ret) if (ret)
goto queue_full; goto queue_full;
transport_lun_remove_cmd(cmd);
transport_cmd_check_stop_to_fabric(cmd); transport_cmd_check_stop_to_fabric(cmd);
return; return;
} }
...@@ -2349,6 +2372,7 @@ static void target_complete_ok_work(struct work_struct *work) ...@@ -2349,6 +2372,7 @@ static void target_complete_ok_work(struct work_struct *work)
if (ret) if (ret)
goto queue_full; goto queue_full;
transport_lun_remove_cmd(cmd);
transport_cmd_check_stop_to_fabric(cmd); transport_cmd_check_stop_to_fabric(cmd);
return; return;
} }
...@@ -2384,6 +2408,7 @@ static void target_complete_ok_work(struct work_struct *work) ...@@ -2384,6 +2408,7 @@ static void target_complete_ok_work(struct work_struct *work)
break; break;
} }
transport_lun_remove_cmd(cmd);
transport_cmd_check_stop_to_fabric(cmd); transport_cmd_check_stop_to_fabric(cmd);
return; return;
...@@ -2710,6 +2735,9 @@ int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks) ...@@ -2710,6 +2735,9 @@ int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks)
*/ */
if (cmd->state_active) if (cmd->state_active)
target_remove_from_state_list(cmd); target_remove_from_state_list(cmd);
if (cmd->se_lun)
transport_lun_remove_cmd(cmd);
} }
if (aborted) if (aborted)
cmd->free_compl = &compl; cmd->free_compl = &compl;
...@@ -2781,9 +2809,6 @@ static void target_release_cmd_kref(struct kref *kref) ...@@ -2781,9 +2809,6 @@ static void target_release_cmd_kref(struct kref *kref)
struct completion *abrt_compl = se_cmd->abrt_compl; struct completion *abrt_compl = se_cmd->abrt_compl;
unsigned long flags; unsigned long flags;
if (se_cmd->lun_ref_active)
percpu_ref_put(&se_cmd->se_lun->lun_ref);
if (se_sess) { if (se_sess) {
spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); spin_lock_irqsave(&se_sess->sess_cmd_lock, flags);
list_del_init(&se_cmd->se_cmd_list); list_del_init(&se_cmd->se_cmd_list);
......
...@@ -627,7 +627,6 @@ struct iscsi_reject { ...@@ -627,7 +627,6 @@ struct iscsi_reject {
#define ISCSI_REASON_BOOKMARK_INVALID 9 #define ISCSI_REASON_BOOKMARK_INVALID 9
#define ISCSI_REASON_BOOKMARK_NO_RESOURCES 10 #define ISCSI_REASON_BOOKMARK_NO_RESOURCES 10
#define ISCSI_REASON_NEGOTIATION_RESET 11 #define ISCSI_REASON_NEGOTIATION_RESET 11
#define ISCSI_REASON_WAITING_FOR_LOGOUT 12
/* Max. number of Key=Value pairs in a text message */ /* Max. number of Key=Value pairs in a text message */
#define MAX_KEY_VALUE_PAIRS 8192 #define MAX_KEY_VALUE_PAIRS 8192
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment