DPRINTK("EXIT, ret=%d\n", ret);
        return ret;
 }
+EXPORT_SYMBOL(ata_scsi_timed_out);
 
 static void ata_eh_unload(struct ata_port *ap)
 {
 
                return NULL;
 
        i->t.eh_strategy_handler        = ata_scsi_error;
-       i->t.eh_timed_out               = ata_scsi_timed_out;
        i->t.user_scan                  = ata_scsi_user_scan;
 
        i->t.host_attrs.ac.attrs = &i->port_attrs[0];
 
 extern void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd);
 extern void ata_eh_acquire(struct ata_port *ap);
 extern void ata_eh_release(struct ata_port *ap);
-extern enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd);
 extern void ata_scsi_error(struct Scsi_Host *host);
 extern void ata_eh_fastdrain_timerfn(unsigned long arg);
 extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
 
        .change_queue_depth     = scsi_change_queue_depth,
        .sg_tablesize           = ISCSI_ISER_DEF_SG_TABLESIZE,
        .cmd_per_lun            = ISER_DEF_CMD_PER_LUN,
+       .eh_timed_out           = iscsi_eh_cmd_timed_out,
        .eh_abort_handler       = iscsi_eh_abort,
        .eh_device_reset_handler= iscsi_eh_device_reset,
        .eh_target_reset_handler = iscsi_eh_recover_target,
 
        .info                           = srp_target_info,
        .queuecommand                   = srp_queuecommand,
        .change_queue_depth             = srp_change_queue_depth,
+       .eh_timed_out                   = srp_timed_out,
        .eh_abort_handler               = srp_abort,
        .eh_device_reset_handler        = srp_reset_device,
        .eh_host_reset_handler          = srp_reset_host,
 
        .target_destroy                 = mptfc_target_destroy,
        .slave_destroy                  = mptscsih_slave_destroy,
        .change_queue_depth             = mptscsih_change_queue_depth,
+       .eh_timed_out                   = fc_eh_timed_out,
        .eh_abort_handler               = mptfc_abort,
        .eh_device_reset_handler        = mptfc_dev_reset,
        .eh_bus_reset_handler           = mptfc_bus_reset,
 
        .target_destroy                 = mptsas_target_destroy,
        .slave_destroy                  = mptscsih_slave_destroy,
        .change_queue_depth             = mptscsih_change_queue_depth,
+       .eh_timed_out                   = mptsas_eh_timed_out,
        .eh_abort_handler               = mptscsih_abort,
        .eh_device_reset_handler        = mptscsih_dev_reset,
        .eh_host_reset_handler          = mptscsih_host_reset,
            sas_attach_transport(&mptsas_transport_functions);
        if (!mptsas_transport_template)
                return -ENODEV;
-       mptsas_transport_template->eh_timed_out = mptsas_eh_timed_out;
 
        mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER,
            "mptscsih_io_done");
 
        .module                  = THIS_MODULE,
        .name                    = "zfcp",
        .queuecommand            = zfcp_scsi_queuecommand,
+       .eh_timed_out            = fc_eh_timed_out,
        .eh_abort_handler        = zfcp_scsi_eh_abort_handler,
        .eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler,
        .eh_target_reset_handler = zfcp_scsi_eh_target_reset_handler,
 
        .change_queue_depth = scsi_change_queue_depth,
        .slave_configure = beiscsi_slave_configure,
        .target_alloc = iscsi_target_alloc,
+       .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,
 
        .name = BFAD_DRIVER_NAME,
        .info = bfad_im_info,
        .queuecommand = bfad_im_queuecommand,
+       .eh_timed_out = fc_eh_timed_out,
        .eh_abort_handler = bfad_im_abort_handler,
        .eh_device_reset_handler = bfad_im_reset_lun_handler,
        .eh_bus_reset_handler = bfad_im_reset_bus_handler,
        .name = BFAD_DRIVER_NAME,
        .info = bfad_im_info,
        .queuecommand = bfad_im_queuecommand,
+       .eh_timed_out = fc_eh_timed_out,
        .eh_abort_handler = bfad_im_abort_handler,
        .eh_device_reset_handler = bfad_im_reset_lun_handler,
        .eh_bus_reset_handler = bfad_im_reset_bus_handler,
 
        .module                 = THIS_MODULE,
        .name                   = "QLogic Offload FCoE Initiator",
        .queuecommand           = bnx2fc_queuecommand,
+       .eh_timed_out           = fc_eh_timed_out,
        .eh_abort_handler       = bnx2fc_eh_abort,        /* abts */
        .eh_device_reset_handler = bnx2fc_eh_device_reset, /* lun reset */
        .eh_target_reset_handler = bnx2fc_eh_target_reset, /* tgt reset */
 
        .name                   = "QLogic Offload iSCSI Initiator",
        .proc_name              = "bnx2i",
        .queuecommand           = iscsi_queuecommand,
+       .eh_timed_out           = iscsi_eh_cmd_timed_out,
        .eh_abort_handler       = iscsi_eh_abort,
        .eh_device_reset_handler = iscsi_eh_device_reset,
        .eh_target_reset_handler = iscsi_eh_recover_target,
 
        .name                   = CSIO_DRV_DESC,
        .proc_name              = KBUILD_MODNAME,
        .queuecommand           = csio_queuecommand,
+       .eh_timed_out           = fc_eh_timed_out,
        .eh_abort_handler       = csio_eh_abort_handler,
        .eh_device_reset_handler = csio_eh_lun_reset_handler,
        .slave_alloc            = csio_slave_alloc,
        .name                   = CSIO_DRV_DESC,
        .proc_name              = KBUILD_MODNAME,
        .queuecommand           = csio_queuecommand,
+       .eh_timed_out           = fc_eh_timed_out,
        .eh_abort_handler       = csio_eh_abort_handler,
        .eh_device_reset_handler = csio_eh_lun_reset_handler,
        .slave_alloc            = csio_slave_alloc,
 
        .sg_tablesize   = SG_ALL,
        .max_sectors    = 0xFFFF,
        .cmd_per_lun    = ISCSI_DEF_CMD_PER_LUN,
+       .eh_timed_out   = iscsi_eh_cmd_timed_out,
        .eh_abort_handler = iscsi_eh_abort,
        .eh_device_reset_handler = iscsi_eh_device_reset,
        .eh_target_reset_handler = iscsi_eh_recover_target,
 
        .sg_tablesize   = SG_ALL,
        .max_sectors    = 0xFFFF,
        .cmd_per_lun    = ISCSI_DEF_CMD_PER_LUN,
+       .eh_timed_out   = iscsi_eh_cmd_timed_out,
        .eh_abort_handler = iscsi_eh_abort,
        .eh_device_reset_handler = iscsi_eh_device_reset,
        .eh_target_reset_handler = iscsi_eh_recover_target,
 
        .name = "FCoE Driver",
        .proc_name = FCOE_NAME,
        .queuecommand = fc_queuecommand,
+       .eh_timed_out = fc_eh_timed_out,
        .eh_abort_handler = fc_eh_abort,
        .eh_device_reset_handler = fc_eh_device_reset,
        .eh_host_reset_handler = fc_eh_host_reset,
 
        .module = THIS_MODULE,
        .name = DRV_NAME,
        .queuecommand = fnic_queuecommand,
+       .eh_timed_out = fc_eh_timed_out,
        .eh_abort_handler = fnic_abort_cmd,
        .eh_device_reset_handler = fnic_device_reset,
        .eh_host_reset_handler = fnic_host_reset,
 
        .name = "IBM POWER Virtual FC Adapter",
        .proc_name = IBMVFC_NAME,
        .queuecommand = ibmvfc_queuecommand,
+       .eh_timed_out = fc_eh_timed_out,
        .eh_abort_handler = ibmvfc_eh_abort_handler,
        .eh_device_reset_handler = ibmvfc_eh_device_reset_handler,
        .eh_target_reset_handler = ibmvfc_eh_target_reset_handler,
 
        .name = "IBM POWER Virtual SCSI Adapter " IBMVSCSI_VERSION,
        .proc_name = "ibmvscsi",
        .queuecommand = ibmvscsi_queuecommand,
+       .eh_timed_out = srp_timed_out,
        .eh_abort_handler = ibmvscsi_eh_abort_handler,
        .eh_device_reset_handler = ibmvscsi_eh_device_reset_handler,
        .eh_host_reset_handler = ibmvscsi_eh_host_reset_handler,
 
        .sg_tablesize           = 4096,
        .max_sectors            = 0xFFFF,
        .cmd_per_lun            = ISCSI_DEF_CMD_PER_LUN,
+       .eh_timed_out           = iscsi_eh_cmd_timed_out,
        .eh_abort_handler       = iscsi_eh_abort,
        .eh_device_reset_handler= iscsi_eh_device_reset,
        .eh_target_reset_handler = iscsi_eh_recover_target,
 
                return 0;
 }
 
-static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
+enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
 {
        enum blk_eh_timer_return rc = BLK_EH_NOT_HANDLED;
        struct iscsi_task *task = NULL, *running_task;
                     "timer reset" : "nh");
        return rc;
 }
+EXPORT_SYMBOL_GPL(iscsi_eh_cmd_timed_out);
 
 static void iscsi_check_transport_timeouts(unsigned long data)
 {
        if (!shost->cmd_per_lun)
                shost->cmd_per_lun = ISCSI_DEF_CMD_PER_LUN;
 
-       if (!shost->transportt->eh_timed_out)
-               shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out;
        return scsi_add_host(shost, pdev);
 }
 EXPORT_SYMBOL_GPL(iscsi_host_add);
 
        .proc_name              = LPFC_DRIVER_NAME,
        .info                   = lpfc_info,
        .queuecommand           = lpfc_queuecommand,
+       .eh_timed_out           = fc_eh_timed_out,
        .eh_abort_handler       = lpfc_abort_handler,
        .eh_device_reset_handler = lpfc_device_reset_handler,
        .eh_target_reset_handler = lpfc_target_reset_handler,
        .proc_name              = LPFC_DRIVER_NAME,
        .info                   = lpfc_info,
        .queuecommand           = lpfc_queuecommand,
+       .eh_timed_out           = fc_eh_timed_out,
        .eh_abort_handler       = lpfc_abort_handler,
        .eh_device_reset_handler = lpfc_device_reset_handler,
        .eh_target_reset_handler = lpfc_target_reset_handler,
 
        .name = "QLogic QEDI 25/40/100Gb iSCSI Initiator Driver",
        .proc_name = QEDI_MODULE_NAME,
        .queuecommand = iscsi_queuecommand,
+       .eh_timed_out = iscsi_eh_cmd_timed_out,
        .eh_abort_handler = iscsi_eh_abort,
        .eh_device_reset_handler = iscsi_eh_device_reset,
        .eh_target_reset_handler = iscsi_eh_recover_target,
 
        .name                   = QLA2XXX_DRIVER_NAME,
        .queuecommand           = qla2xxx_queuecommand,
 
+       .eh_timed_out           = fc_eh_timed_out,
        .eh_abort_handler       = qla2xxx_eh_abort,
        .eh_device_reset_handler = qla2xxx_eh_device_reset,
        .eh_target_reset_handler = qla2xxx_eh_target_reset,
 
        if (host->eh_deadline != -1 && !host->last_reset)
                host->last_reset = jiffies;
 
-       if (host->transportt->eh_timed_out)
-               rtn = host->transportt->eh_timed_out(scmd);
-       else if (host->hostt->eh_timed_out)
+       if (host->hostt->eh_timed_out)
                rtn = host->hostt->eh_timed_out(scmd);
 
        if (rtn == BLK_EH_NOT_HANDLED) {
 
 
 
 /**
- * fc_timed_out - FC Transport I/O timeout intercept handler
+ * fc_eh_timed_out - FC Transport I/O timeout intercept handler
  * @scmd:      The SCSI command which timed out
  *
  * This routine protects against error handlers getting invoked while a
  * Notes:
  *     This routine assumes no locks are held on entry.
  */
-static enum blk_eh_timer_return
-fc_timed_out(struct scsi_cmnd *scmd)
+enum blk_eh_timer_return
+fc_eh_timed_out(struct scsi_cmnd *scmd)
 {
        struct fc_rport *rport = starget_to_rport(scsi_target(scmd->device));
 
 
        return BLK_EH_NOT_HANDLED;
 }
+EXPORT_SYMBOL(fc_eh_timed_out);
 
 /*
  * Called by fc_user_scan to locate an rport on the shost that
        /* Transport uses the shost workq for scsi scanning */
        i->t.create_work_queue = 1;
 
-       i->t.eh_timed_out = fc_timed_out;
-
        i->t.user_scan = fc_user_scan;
 
        /* target-mode drivers' functions */
 
  * Note: This function is called from soft-IRQ context and with the request
  * queue lock held.
  */
-static enum blk_eh_timer_return srp_timed_out(struct scsi_cmnd *scmd)
+enum blk_eh_timer_return srp_timed_out(struct scsi_cmnd *scmd)
 {
        struct scsi_device *sdev = scmd->device;
        struct Scsi_Host *shost = sdev->host;
                i->f->reset_timer_if_blocked && scsi_device_blocked(sdev) ?
                BLK_EH_RESET_TIMER : BLK_EH_NOT_HANDLED;
 }
+EXPORT_SYMBOL(srp_timed_out);
 
 static void srp_rport_release(struct device *dev)
 {
        if (!i)
                return NULL;
 
-       i->t.eh_timed_out = srp_timed_out;
-
        i->t.tsk_mgmt_response = srp_tsk_mgmt_response;
        i->t.it_nexus_response = srp_it_nexus_response;
 
 
        fc_transport_template = fc_attach_transport(&fc_transport_functions);
        if (!fc_transport_template)
                return -ENODEV;
-
-       /*
-        * Install Hyper-V specific timeout handler.
-        */
-       fc_transport_template->eh_timed_out = storvsc_eh_timed_out;
 #endif
 
        ret = vmbus_driver_register(&storvsc_drv);
 
 extern void ata_sas_port_stop(struct ata_port *ap);
 extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
 extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
+extern enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd);
 extern int sata_scr_valid(struct ata_link *link);
 extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);
 extern int sata_scr_write(struct ata_link *link, int reg, u32 val);
        .proc_name              = drv_name,                     \
        .slave_configure        = ata_scsi_slave_config,        \
        .slave_destroy          = ata_scsi_slave_destroy,       \
+       .eh_timed_out           = ata_scsi_timed_out,           \
        .bios_param             = ata_std_bios_param,           \
        .unlock_native_capacity = ata_scsi_unlock_native_capacity, \
        .sdev_attrs             = ata_common_sdev_attrs
 
 extern int iscsi_eh_session_reset(struct scsi_cmnd *sc);
 extern int iscsi_eh_device_reset(struct scsi_cmnd *sc);
 extern int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc);
+extern enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc);
 
 /*
  * iSCSI host helpers.
 
         */
        void (* eh_strategy_handler)(struct Scsi_Host *);
 
-       /*
-        * This is an optional routine that allows the transport to become
-        * involved when a scsi io timer fires. The return value tells the
-        * timer routine how to finish the io timeout handling:
-        * EH_HANDLED:          I fixed the error, please complete the command
-        * EH_RESET_TIMER:      I need more time, reset the timer and
-        *                      begin counting again
-        * EH_NOT_HANDLED       Begin normal error recovery
-        */
-       enum blk_eh_timer_return (*eh_timed_out)(struct scsi_cmnd *);
-
        /*
         * Used as callback for the completion of i_t_nexus request
         * for target drivers.
 
                struct fc_vport_identifiers *);
 int fc_vport_terminate(struct fc_vport *vport);
 int fc_block_scsi_eh(struct scsi_cmnd *cmnd);
+enum blk_eh_timer_return fc_eh_timed_out(struct scsi_cmnd *scmd);
 
 static inline struct Scsi_Host *fc_bsg_to_shost(struct bsg_job *job)
 {
 
 extern void srp_start_tl_fail_timers(struct srp_rport *rport);
 extern void srp_remove_host(struct Scsi_Host *);
 extern void srp_stop_rport_timers(struct srp_rport *rport);
+enum blk_eh_timer_return srp_timed_out(struct scsi_cmnd *scmd);
 
 /**
  * srp_chkready() - evaluate the transport layer state before I/O