SCSI fixes on 20200221
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: James E.J. Bottomley <jejb@linux.ibm.com> -----BEGIN PGP SIGNATURE----- iJwEABMIAEQWIQTnYEDbdso9F2cI+arnQslM7pishQUCXlBhuyYcamFtZXMuYm90 dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbQAKCRDnQslM7pishdMGAQCR8Qi2 m2kPgccUvJwVmnJ+DRJ3MRRX3Kn0IJIDoIc0IgEA6/W33+7xY8qQ0uahOyOT90tz g7Y2I7TxQ+dsL9pqs80= =JIpx -----END PGP SIGNATURE----- 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: James 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()"
This commit is contained in:
commit
b98b809c0a
@ -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)
|
|||||||
|
|
||||||
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 @@ retry_alloc:
|
|||||||
|
|
||||||
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 @@ retry_alloc:
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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(
|
|||||||
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(
|
|||||||
* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
|||||||
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 @@ queue_status:
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@ queue_rsp:
|
|||||||
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 @@ queue_status:
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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 {
|
|||||||
#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
|
||||||
|
Loading…
Reference in New Issue
Block a user