mirror of https://gitee.com/openkylin/linux.git
scsi: iscsi_tcp: Fix shost can_queue initialization
We are setting the shost's can_queue after we add the host which is too late, because the SCSI midlayer will have allocated the tag set based on the can_queue value at that time. This patch has us use the iscsi_host_get_max_scsi_cmds() helper to figure out the number of SCSI cmds. It also fixes up the template can_queue so it reflects the max SCSI cmds we can support like how other drivers work. Link: https://lore.kernel.org/r/20210207044608.27585-7-michael.christie@oracle.com Reviewed-by: Lee Duncan <lduncan@suse.com> Signed-off-by: Mike Christie <michael.christie@oracle.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
b4046922b3
commit
25c400db20
|
@ -847,6 +847,7 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
|
||||||
struct iscsi_session *session;
|
struct iscsi_session *session;
|
||||||
struct iscsi_sw_tcp_host *tcp_sw_host;
|
struct iscsi_sw_tcp_host *tcp_sw_host;
|
||||||
struct Scsi_Host *shost;
|
struct Scsi_Host *shost;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (ep) {
|
if (ep) {
|
||||||
printk(KERN_ERR "iscsi_tcp: invalid ep %p.\n", ep);
|
printk(KERN_ERR "iscsi_tcp: invalid ep %p.\n", ep);
|
||||||
|
@ -864,6 +865,11 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
|
||||||
shost->max_channel = 0;
|
shost->max_channel = 0;
|
||||||
shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
|
shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
|
||||||
|
|
||||||
|
rc = iscsi_host_get_max_scsi_cmds(shost, cmds_max);
|
||||||
|
if (rc < 0)
|
||||||
|
goto free_host;
|
||||||
|
shost->can_queue = rc;
|
||||||
|
|
||||||
if (iscsi_host_add(shost, NULL))
|
if (iscsi_host_add(shost, NULL))
|
||||||
goto free_host;
|
goto free_host;
|
||||||
|
|
||||||
|
@ -878,7 +884,6 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
|
||||||
tcp_sw_host = iscsi_host_priv(shost);
|
tcp_sw_host = iscsi_host_priv(shost);
|
||||||
tcp_sw_host->session = session;
|
tcp_sw_host->session = session;
|
||||||
|
|
||||||
shost->can_queue = session->scsi_cmds_max;
|
|
||||||
if (iscsi_tcp_r2tpool_alloc(session))
|
if (iscsi_tcp_r2tpool_alloc(session))
|
||||||
goto remove_session;
|
goto remove_session;
|
||||||
return cls_session;
|
return cls_session;
|
||||||
|
@ -981,7 +986,7 @@ static struct scsi_host_template iscsi_sw_tcp_sht = {
|
||||||
.name = "iSCSI Initiator over TCP/IP",
|
.name = "iSCSI Initiator over TCP/IP",
|
||||||
.queuecommand = iscsi_queuecommand,
|
.queuecommand = iscsi_queuecommand,
|
||||||
.change_queue_depth = scsi_change_queue_depth,
|
.change_queue_depth = scsi_change_queue_depth,
|
||||||
.can_queue = ISCSI_DEF_XMIT_CMDS_MAX - 1,
|
.can_queue = ISCSI_TOTAL_CMDS_MAX,
|
||||||
.sg_tablesize = 4096,
|
.sg_tablesize = 4096,
|
||||||
.max_sectors = 0xFFFF,
|
.max_sectors = 0xFFFF,
|
||||||
.cmd_per_lun = ISCSI_DEF_CMD_PER_LUN,
|
.cmd_per_lun = ISCSI_DEF_CMD_PER_LUN,
|
||||||
|
|
Loading…
Reference in New Issue