On 10/16/23 4:24 AM, Hannes Reinecke wrote: > iscsi_eh_target_reset() and iscsi_eh_session_reset() only depend > on the cls_session, so use that as an argument. > > Signed-off-by: Hannes Reinecke <hare@xxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > --- > drivers/scsi/be2iscsi/be_main.c | 10 +++++++++- > drivers/scsi/libiscsi.c | 21 +++++++++------------ > include/scsi/libiscsi.h | 2 +- > 3 files changed, 19 insertions(+), 14 deletions(-) > > diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c > index e48f14ad6dfd..441ad2ebc5d5 100644 > --- a/drivers/scsi/be2iscsi/be_main.c > +++ b/drivers/scsi/be2iscsi/be_main.c > @@ -385,6 +385,14 @@ static int beiscsi_eh_device_reset(struct scsi_cmnd *sc) > return rc; > } > > +static int beiscsi_eh_session_reset(struct scsi_cmnd *sc) > +{ > + struct iscsi_cls_session *cls_session; > + > + cls_session = starget_to_session(scsi_target(sc->device)); > + return iscsi_eh_session_reset(cls_session); > +} > + > /*------------------- PCI Driver operations and data ----------------- */ > static const struct pci_device_id beiscsi_pci_id_table[] = { > { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) }, > @@ -408,7 +416,7 @@ static const struct scsi_host_template beiscsi_sht = { > .eh_timed_out = iscsi_eh_cmd_timed_out, > .eh_abort_handler = beiscsi_eh_abort, > .eh_device_reset_handler = beiscsi_eh_device_reset, > - .eh_target_reset_handler = iscsi_eh_session_reset, > + .eh_target_reset_handler = beiscsi_eh_session_reset, > .shost_groups = beiscsi_groups, > .sg_tablesize = BEISCSI_SGLIST_ELEMENTS, > .can_queue = BE2_IO_DEPTH, > diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c > index 0fda8905eabd..a561eefabb50 100644 > --- a/drivers/scsi/libiscsi.c > +++ b/drivers/scsi/libiscsi.c > @@ -2600,13 +2600,11 @@ EXPORT_SYMBOL_GPL(iscsi_session_recovery_timedout); > * This function will wait for a relogin, session termination from > * userspace, or a recovery/replacement timeout. > */ > -int iscsi_eh_session_reset(struct scsi_cmnd *sc) > +int iscsi_eh_session_reset(struct iscsi_cls_session *cls_session) > { Patch looks ok to me. Reviewed-by: Mike Christie <michael.christie@xxxxxxxxxx> As an alternative to this approach though it might be easier to have this function take a scsi_target. You won't need beiscsi_eh_session_reset and for iscsi_eh_recover_target you can pass the scsi_target to iscsi_eh_recover_target/iscsi_eh_session_reset. Either way is ok to me though since we have to convert from scsi_target to cls_session somewhere. > - struct iscsi_cls_session *cls_session; > struct iscsi_session *session; > struct iscsi_conn *conn; > > - cls_session = starget_to_session(scsi_target(sc->device)); > session = cls_session->dd_data; > > mutex_lock(&session->eh_mutex); > @@ -2653,7 +2651,7 @@ int iscsi_eh_session_reset(struct scsi_cmnd *sc) > } > EXPORT_SYMBOL_GPL(iscsi_eh_session_reset); > > -static void iscsi_prep_tgt_reset_pdu(struct scsi_cmnd *sc, struct iscsi_tm *hdr) > +static void iscsi_prep_tgt_reset_pdu(struct iscsi_tm *hdr) > { > memset(hdr, 0, sizeof(*hdr)); > hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE; > @@ -2668,19 +2666,16 @@ static void iscsi_prep_tgt_reset_pdu(struct scsi_cmnd *sc, struct iscsi_tm *hdr) > * > * This will attempt to send a warm target reset. > */ > -static int iscsi_eh_target_reset(struct scsi_cmnd *sc) > +static int iscsi_eh_target_reset(struct iscsi_cls_session *cls_session) > { > - struct iscsi_cls_session *cls_session; > struct iscsi_session *session; > struct iscsi_conn *conn; > struct iscsi_tm *hdr; > int rc = FAILED; > > - cls_session = starget_to_session(scsi_target(sc->device)); > session = cls_session->dd_data; > > - ISCSI_DBG_EH(session, "tgt Reset [sc %p tgt %s]\n", sc, > - session->targetname); > + ISCSI_DBG_EH(session, "tgt Reset [tgt %s]\n", session->targetname); > > mutex_lock(&session->eh_mutex); > spin_lock_bh(&session->frwd_lock); > @@ -2698,7 +2693,7 @@ static int iscsi_eh_target_reset(struct scsi_cmnd *sc) > session->tmf_state = TMF_QUEUED; > > hdr = &session->tmhdr; > - iscsi_prep_tgt_reset_pdu(sc, hdr); > + iscsi_prep_tgt_reset_pdu(hdr); > > if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age, > session->tgt_reset_timeout)) { > @@ -2750,11 +2745,13 @@ static int iscsi_eh_target_reset(struct scsi_cmnd *sc) > */ > int iscsi_eh_recover_target(struct scsi_cmnd *sc) > { > + struct iscsi_cls_session *cls_session; > int rc; > > - rc = iscsi_eh_target_reset(sc); > + cls_session = starget_to_session(scsi_target(sc->device)); > + rc = iscsi_eh_target_reset(cls_session); > if (rc == FAILED) > - rc = iscsi_eh_session_reset(sc); > + rc = iscsi_eh_session_reset(cls_session); > return rc; > } > EXPORT_SYMBOL_GPL(iscsi_eh_recover_target); > diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h > index 7282555adfd5..7dddf785edd0 100644 > --- a/include/scsi/libiscsi.h > +++ b/include/scsi/libiscsi.h > @@ -390,7 +390,7 @@ struct iscsi_host { > */ > extern int iscsi_eh_abort(struct scsi_cmnd *sc); > extern int iscsi_eh_recover_target(struct scsi_cmnd *sc); > -extern int iscsi_eh_session_reset(struct scsi_cmnd *sc); > +extern int iscsi_eh_session_reset(struct iscsi_cls_session *cls_session); > extern int iscsi_eh_device_reset(struct scsi_cmnd *sc); > extern int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc); > extern enum scsi_timeout_action iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc);