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@xxxxxxxxxx> > --- > 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@xxxxxxxx>