@@ -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,
@@ -2595,18 +2595,16 @@ EXPORT_SYMBOL_GPL(iscsi_session_recovery_timedout);
/**
* iscsi_eh_session_reset - drop session and attempt relogin
- * @sc: scsi command
+ * @cls_session: class session to reset
*
* 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)
{
- 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;
@@ -2664,23 +2662,20 @@ static void iscsi_prep_tgt_reset_pdu(struct scsi_cmnd *sc, struct iscsi_tm *hdr)
/**
* iscsi_eh_target_reset - reset target
- * @sc: scsi command
+ * @cls_session: class session to reset
*
* 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);
@@ -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);