[01/40] scsi: iscsi: fix shost->max_id use

Message ID 20210403232333.212927-2-michael.christie@oracle.com
State Superseded
Headers show
Series
  • iscsi lock and refcount fix ups
Related show

Commit Message

Mike Christie April 3, 2021, 11:22 p.m.
The iscsi offload drivers are setting the shost->max_id to the max number
of sessions they support. The problem is that max_id is not the max number
of targets but the highest identifier the targets can have. To use it to
limit the number of targets we need to set it to max sessions - 1, or we
can end up with a session we might not have preallocated resources for.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
---
 drivers/scsi/be2iscsi/be_main.c  | 4 ++--
 drivers/scsi/bnx2i/bnx2i_iscsi.c | 2 +-
 drivers/scsi/cxgbi/libcxgbi.c    | 4 ++--
 drivers/scsi/qedi/qedi_main.c    | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

Comments

Lee Duncan April 5, 2021, 4 p.m. | #1
On 4/3/21 4:22 PM, Mike Christie wrote:
> The iscsi offload drivers are setting the shost->max_id to the max number

> of sessions they support. The problem is that max_id is not the max number

> of targets but the highest identifier the targets can have. To use it to

> limit the number of targets we need to set it to max sessions - 1, or we

> can end up with a session we might not have preallocated resources for.

> 

> Signed-off-by: Mike Christie <michael.christie@oracle.com>

> ---

>  drivers/scsi/be2iscsi/be_main.c  | 4 ++--

>  drivers/scsi/bnx2i/bnx2i_iscsi.c | 2 +-

>  drivers/scsi/cxgbi/libcxgbi.c    | 4 ++--

>  drivers/scsi/qedi/qedi_main.c    | 2 +-

>  4 files changed, 6 insertions(+), 6 deletions(-)

> 

> diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c

> index 90fcddb76f46..56bd4441a789 100644

> --- a/drivers/scsi/be2iscsi/be_main.c

> +++ b/drivers/scsi/be2iscsi/be_main.c

> @@ -416,7 +416,7 @@ static struct beiscsi_hba *beiscsi_hba_alloc(struct pci_dev *pcidev)

>  			"beiscsi_hba_alloc - iscsi_host_alloc failed\n");

>  		return NULL;

>  	}

> -	shost->max_id = BE2_MAX_SESSIONS;

> +	shost->max_id = BE2_MAX_SESSIONS - 1;

>  	shost->max_channel = 0;

>  	shost->max_cmd_len = BEISCSI_MAX_CMD_LEN;

>  	shost->max_lun = BEISCSI_NUM_MAX_LUN;

> @@ -5318,7 +5318,7 @@ static int beiscsi_enable_port(struct beiscsi_hba *phba)

>  	/* Re-enable UER. If different TPE occurs then it is recoverable. */

>  	beiscsi_set_uer_feature(phba);

>  

> -	phba->shost->max_id = phba->params.cxns_per_ctrl;

> +	phba->shost->max_id = phba->params.cxns_per_ctrl - 1;

>  	phba->shost->can_queue = phba->params.ios_per_ctrl;

>  	ret = beiscsi_init_port(phba);

>  	if (ret < 0) {

> diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c b/drivers/scsi/bnx2i/bnx2i_iscsi.c

> index 1e6d8f62ea3c..37f5b719050e 100644

> --- a/drivers/scsi/bnx2i/bnx2i_iscsi.c

> +++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c

> @@ -791,7 +791,7 @@ struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic)

>  		return NULL;

>  	shost->dma_boundary = cnic->pcidev->dma_mask;

>  	shost->transportt = bnx2i_scsi_xport_template;

> -	shost->max_id = ISCSI_MAX_CONNS_PER_HBA;

> +	shost->max_id = ISCSI_MAX_CONNS_PER_HBA - 1;

>  	shost->max_channel = 0;

>  	shost->max_lun = 512;

>  	shost->max_cmd_len = 16;

> diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c

> index f078b3c4e083..ecb134b4699f 100644

> --- a/drivers/scsi/cxgbi/libcxgbi.c

> +++ b/drivers/scsi/cxgbi/libcxgbi.c

> @@ -337,7 +337,7 @@ void cxgbi_hbas_remove(struct cxgbi_device *cdev)

>  EXPORT_SYMBOL_GPL(cxgbi_hbas_remove);

>  

>  int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,

> -		unsigned int max_id, struct scsi_host_template *sht,

> +		unsigned int max_conns, struct scsi_host_template *sht,

>  		struct scsi_transport_template *stt)

>  {

>  	struct cxgbi_hba *chba;

> @@ -357,7 +357,7 @@ int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,

>  

>  		shost->transportt = stt;

>  		shost->max_lun = max_lun;

> -		shost->max_id = max_id;

> +		shost->max_id = max_conns - 1;

>  		shost->max_channel = 0;

>  		shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;

>  

> diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c

> index 47ad64b06623..0aa0061dad40 100644

> --- a/drivers/scsi/qedi/qedi_main.c

> +++ b/drivers/scsi/qedi/qedi_main.c

> @@ -642,7 +642,7 @@ static struct qedi_ctx *qedi_host_alloc(struct pci_dev *pdev)

>  		goto exit_setup_shost;

>  	}

>  

> -	shost->max_id = QEDI_MAX_ISCSI_CONNS_PER_HBA;

> +	shost->max_id = QEDI_MAX_ISCSI_CONNS_PER_HBA - 1;

>  	shost->max_channel = 0;

>  	shost->max_lun = ~0;

>  	shost->max_cmd_len = 16;

> 


Reviewed-by: Lee Duncan <lduncan@suse.com>

Patch

diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
index 90fcddb76f46..56bd4441a789 100644
--- a/drivers/scsi/be2iscsi/be_main.c
+++ b/drivers/scsi/be2iscsi/be_main.c
@@ -416,7 +416,7 @@  static struct beiscsi_hba *beiscsi_hba_alloc(struct pci_dev *pcidev)
 			"beiscsi_hba_alloc - iscsi_host_alloc failed\n");
 		return NULL;
 	}
-	shost->max_id = BE2_MAX_SESSIONS;
+	shost->max_id = BE2_MAX_SESSIONS - 1;
 	shost->max_channel = 0;
 	shost->max_cmd_len = BEISCSI_MAX_CMD_LEN;
 	shost->max_lun = BEISCSI_NUM_MAX_LUN;
@@ -5318,7 +5318,7 @@  static int beiscsi_enable_port(struct beiscsi_hba *phba)
 	/* Re-enable UER. If different TPE occurs then it is recoverable. */
 	beiscsi_set_uer_feature(phba);
 
-	phba->shost->max_id = phba->params.cxns_per_ctrl;
+	phba->shost->max_id = phba->params.cxns_per_ctrl - 1;
 	phba->shost->can_queue = phba->params.ios_per_ctrl;
 	ret = beiscsi_init_port(phba);
 	if (ret < 0) {
diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c b/drivers/scsi/bnx2i/bnx2i_iscsi.c
index 1e6d8f62ea3c..37f5b719050e 100644
--- a/drivers/scsi/bnx2i/bnx2i_iscsi.c
+++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c
@@ -791,7 +791,7 @@  struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic)
 		return NULL;
 	shost->dma_boundary = cnic->pcidev->dma_mask;
 	shost->transportt = bnx2i_scsi_xport_template;
-	shost->max_id = ISCSI_MAX_CONNS_PER_HBA;
+	shost->max_id = ISCSI_MAX_CONNS_PER_HBA - 1;
 	shost->max_channel = 0;
 	shost->max_lun = 512;
 	shost->max_cmd_len = 16;
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
index f078b3c4e083..ecb134b4699f 100644
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -337,7 +337,7 @@  void cxgbi_hbas_remove(struct cxgbi_device *cdev)
 EXPORT_SYMBOL_GPL(cxgbi_hbas_remove);
 
 int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,
-		unsigned int max_id, struct scsi_host_template *sht,
+		unsigned int max_conns, struct scsi_host_template *sht,
 		struct scsi_transport_template *stt)
 {
 	struct cxgbi_hba *chba;
@@ -357,7 +357,7 @@  int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,
 
 		shost->transportt = stt;
 		shost->max_lun = max_lun;
-		shost->max_id = max_id;
+		shost->max_id = max_conns - 1;
 		shost->max_channel = 0;
 		shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
 
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 47ad64b06623..0aa0061dad40 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -642,7 +642,7 @@  static struct qedi_ctx *qedi_host_alloc(struct pci_dev *pdev)
 		goto exit_setup_shost;
 	}
 
-	shost->max_id = QEDI_MAX_ISCSI_CONNS_PER_HBA;
+	shost->max_id = QEDI_MAX_ISCSI_CONNS_PER_HBA - 1;
 	shost->max_channel = 0;
 	shost->max_lun = ~0;
 	shost->max_cmd_len = 16;