aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2017-01-30 07:18:58 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2017-02-06 19:10:03 -0500
commitb6a05c823fc573a65efc4466f174abf05f922e0f (patch)
tree09ec066afc68cf223577217373614dc48251d649
parent28917d40e63a65c3923d45ed190c748e45b90ac7 (diff)
scsi: remove eh_timed_out methods in the transport template
Instead define the timeout behavior purely based on the host_template eh_timed_out method and wire up the existing transport implementations in the host templates. This also clears up the confusion that the transport template method overrides the host template one, so some drivers have to re-override the transport template one. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.com> Reviewed-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/ata/libata-eh.c1
-rw-r--r--drivers/ata/libata-transport.c1
-rw-r--r--drivers/ata/libata.h1
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.c1
-rw-r--r--drivers/infiniband/ulp/srp/ib_srp.c1
-rw-r--r--drivers/message/fusion/mptfc.c1
-rw-r--r--drivers/message/fusion/mptsas.c2
-rw-r--r--drivers/s390/scsi/zfcp_scsi.c1
-rw-r--r--drivers/scsi/be2iscsi/be_main.c1
-rw-r--r--drivers/scsi/bfa/bfad_im.c2
-rw-r--r--drivers/scsi/bnx2fc/bnx2fc_fcoe.c1
-rw-r--r--drivers/scsi/bnx2i/bnx2i_iscsi.c1
-rw-r--r--drivers/scsi/csiostor/csio_scsi.c2
-rw-r--r--drivers/scsi/cxgbi/cxgb3i/cxgb3i.c1
-rw-r--r--drivers/scsi/cxgbi/cxgb4i/cxgb4i.c1
-rw-r--r--drivers/scsi/fcoe/fcoe.c1
-rw-r--r--drivers/scsi/fnic/fnic_main.c1
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc.c1
-rw-r--r--drivers/scsi/ibmvscsi/ibmvscsi.c1
-rw-r--r--drivers/scsi/iscsi_tcp.c1
-rw-r--r--drivers/scsi/libiscsi.c5
-rw-r--r--drivers/scsi/lpfc/lpfc_scsi.c2
-rw-r--r--drivers/scsi/qedi/qedi_iscsi.c1
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c1
-rw-r--r--drivers/scsi/scsi_error.c4
-rw-r--r--drivers/scsi/scsi_transport_fc.c9
-rw-r--r--drivers/scsi/scsi_transport_srp.c5
-rw-r--r--drivers/scsi/storvsc_drv.c5
-rw-r--r--include/linux/libata.h2
-rw-r--r--include/scsi/libiscsi.h1
-rw-r--r--include/scsi/scsi_transport.h11
-rw-r--r--include/scsi/scsi_transport_fc.h1
-rw-r--r--include/scsi/scsi_transport_srp.h1
33 files changed, 38 insertions, 33 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 0e1ec37070d1..50ee10db160f 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -549,6 +549,7 @@ enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd)
549 DPRINTK("EXIT, ret=%d\n", ret); 549 DPRINTK("EXIT, ret=%d\n", ret);
550 return ret; 550 return ret;
551} 551}
552EXPORT_SYMBOL(ata_scsi_timed_out);
552 553
553static void ata_eh_unload(struct ata_port *ap) 554static void ata_eh_unload(struct ata_port *ap)
554{ 555{
diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c
index 7ef16c085058..46698232e6bf 100644
--- a/drivers/ata/libata-transport.c
+++ b/drivers/ata/libata-transport.c
@@ -716,7 +716,6 @@ struct scsi_transport_template *ata_attach_transport(void)
716 return NULL; 716 return NULL;
717 717
718 i->t.eh_strategy_handler = ata_scsi_error; 718 i->t.eh_strategy_handler = ata_scsi_error;
719 i->t.eh_timed_out = ata_scsi_timed_out;
720 i->t.user_scan = ata_scsi_user_scan; 719 i->t.user_scan = ata_scsi_user_scan;
721 720
722 i->t.host_attrs.ac.attrs = &i->port_attrs[0]; 721 i->t.host_attrs.ac.attrs = &i->port_attrs[0];
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
index 8f3a5596dd67..06d479d1f302 100644
--- a/drivers/ata/libata.h
+++ b/drivers/ata/libata.h
@@ -159,7 +159,6 @@ extern unsigned long ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd);
159extern void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd); 159extern void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd);
160extern void ata_eh_acquire(struct ata_port *ap); 160extern void ata_eh_acquire(struct ata_port *ap);
161extern void ata_eh_release(struct ata_port *ap); 161extern void ata_eh_release(struct ata_port *ap);
162extern enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd);
163extern void ata_scsi_error(struct Scsi_Host *host); 162extern void ata_scsi_error(struct Scsi_Host *host);
164extern void ata_eh_fastdrain_timerfn(unsigned long arg); 163extern void ata_eh_fastdrain_timerfn(unsigned long arg);
165extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc); 164extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index 9104e6b8cac9..86fed1956d7d 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -997,6 +997,7 @@ static struct scsi_host_template iscsi_iser_sht = {
997 .change_queue_depth = scsi_change_queue_depth, 997 .change_queue_depth = scsi_change_queue_depth,
998 .sg_tablesize = ISCSI_ISER_DEF_SG_TABLESIZE, 998 .sg_tablesize = ISCSI_ISER_DEF_SG_TABLESIZE,
999 .cmd_per_lun = ISER_DEF_CMD_PER_LUN, 999 .cmd_per_lun = ISER_DEF_CMD_PER_LUN,
1000 .eh_timed_out = iscsi_eh_cmd_timed_out,
1000 .eh_abort_handler = iscsi_eh_abort, 1001 .eh_abort_handler = iscsi_eh_abort,
1001 .eh_device_reset_handler= iscsi_eh_device_reset, 1002 .eh_device_reset_handler= iscsi_eh_device_reset,
1002 .eh_target_reset_handler = iscsi_eh_recover_target, 1003 .eh_target_reset_handler = iscsi_eh_recover_target,
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 8ddc07123193..7866cb0a8f00 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -2864,6 +2864,7 @@ static struct scsi_host_template srp_template = {
2864 .info = srp_target_info, 2864 .info = srp_target_info,
2865 .queuecommand = srp_queuecommand, 2865 .queuecommand = srp_queuecommand,
2866 .change_queue_depth = srp_change_queue_depth, 2866 .change_queue_depth = srp_change_queue_depth,
2867 .eh_timed_out = srp_timed_out,
2867 .eh_abort_handler = srp_abort, 2868 .eh_abort_handler = srp_abort,
2868 .eh_device_reset_handler = srp_reset_device, 2869 .eh_device_reset_handler = srp_reset_device,
2869 .eh_host_reset_handler = srp_reset_host, 2870 .eh_host_reset_handler = srp_reset_host,
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c
index add6a3a6ef0d..98eafae78576 100644
--- a/drivers/message/fusion/mptfc.c
+++ b/drivers/message/fusion/mptfc.c
@@ -119,6 +119,7 @@ static struct scsi_host_template mptfc_driver_template = {
119 .target_destroy = mptfc_target_destroy, 119 .target_destroy = mptfc_target_destroy,
120 .slave_destroy = mptscsih_slave_destroy, 120 .slave_destroy = mptscsih_slave_destroy,
121 .change_queue_depth = mptscsih_change_queue_depth, 121 .change_queue_depth = mptscsih_change_queue_depth,
122 .eh_timed_out = fc_eh_timed_out,
122 .eh_abort_handler = mptfc_abort, 123 .eh_abort_handler = mptfc_abort,
123 .eh_device_reset_handler = mptfc_dev_reset, 124 .eh_device_reset_handler = mptfc_dev_reset,
124 .eh_bus_reset_handler = mptfc_bus_reset, 125 .eh_bus_reset_handler = mptfc_bus_reset,
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c
index 7ee1667acde4..4ce333643943 100644
--- a/drivers/message/fusion/mptsas.c
+++ b/drivers/message/fusion/mptsas.c
@@ -1983,6 +1983,7 @@ static struct scsi_host_template mptsas_driver_template = {
1983 .target_destroy = mptsas_target_destroy, 1983 .target_destroy = mptsas_target_destroy,
1984 .slave_destroy = mptscsih_slave_destroy, 1984 .slave_destroy = mptscsih_slave_destroy,
1985 .change_queue_depth = mptscsih_change_queue_depth, 1985 .change_queue_depth = mptscsih_change_queue_depth,
1986 .eh_timed_out = mptsas_eh_timed_out,
1986 .eh_abort_handler = mptscsih_abort, 1987 .eh_abort_handler = mptscsih_abort,
1987 .eh_device_reset_handler = mptscsih_dev_reset, 1988 .eh_device_reset_handler = mptscsih_dev_reset,
1988 .eh_host_reset_handler = mptscsih_host_reset, 1989 .eh_host_reset_handler = mptscsih_host_reset,
@@ -5398,7 +5399,6 @@ mptsas_init(void)
5398 sas_attach_transport(&mptsas_transport_functions); 5399 sas_attach_transport(&mptsas_transport_functions);
5399 if (!mptsas_transport_template) 5400 if (!mptsas_transport_template)
5400 return -ENODEV; 5401 return -ENODEV;
5401 mptsas_transport_template->eh_timed_out = mptsas_eh_timed_out;
5402 5402
5403 mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER, 5403 mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER,
5404 "mptscsih_io_done"); 5404 "mptscsih_io_done");
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c
index 07ffdbb5107f..0678cf714c0e 100644
--- a/drivers/s390/scsi/zfcp_scsi.c
+++ b/drivers/s390/scsi/zfcp_scsi.c
@@ -330,6 +330,7 @@ static struct scsi_host_template zfcp_scsi_host_template = {
330 .module = THIS_MODULE, 330 .module = THIS_MODULE,
331 .name = "zfcp", 331 .name = "zfcp",
332 .queuecommand = zfcp_scsi_queuecommand, 332 .queuecommand = zfcp_scsi_queuecommand,
333 .eh_timed_out = fc_eh_timed_out,
333 .eh_abort_handler = zfcp_scsi_eh_abort_handler, 334 .eh_abort_handler = zfcp_scsi_eh_abort_handler,
334 .eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler, 335 .eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler,
335 .eh_target_reset_handler = zfcp_scsi_eh_target_reset_handler, 336 .eh_target_reset_handler = zfcp_scsi_eh_target_reset_handler,
diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
index c9b9daa91091..32b2713cec93 100644
--- a/drivers/scsi/be2iscsi/be_main.c
+++ b/drivers/scsi/be2iscsi/be_main.c
@@ -389,6 +389,7 @@ static struct scsi_host_template beiscsi_sht = {
389 .change_queue_depth = scsi_change_queue_depth, 389 .change_queue_depth = scsi_change_queue_depth,
390 .slave_configure = beiscsi_slave_configure, 390 .slave_configure = beiscsi_slave_configure,
391 .target_alloc = iscsi_target_alloc, 391 .target_alloc = iscsi_target_alloc,
392 .eh_timed_out = iscsi_eh_cmd_timed_out,
392 .eh_abort_handler = beiscsi_eh_abort, 393 .eh_abort_handler = beiscsi_eh_abort,
393 .eh_device_reset_handler = beiscsi_eh_device_reset, 394 .eh_device_reset_handler = beiscsi_eh_device_reset,
394 .eh_target_reset_handler = iscsi_eh_session_reset, 395 .eh_target_reset_handler = iscsi_eh_session_reset,
diff --git a/drivers/scsi/bfa/bfad_im.c b/drivers/scsi/bfa/bfad_im.c
index 02d806012fa1..7eb0eef18fdd 100644
--- a/drivers/scsi/bfa/bfad_im.c
+++ b/drivers/scsi/bfa/bfad_im.c
@@ -813,6 +813,7 @@ struct scsi_host_template bfad_im_scsi_host_template = {
813 .name = BFAD_DRIVER_NAME, 813 .name = BFAD_DRIVER_NAME,
814 .info = bfad_im_info, 814 .info = bfad_im_info,
815 .queuecommand = bfad_im_queuecommand, 815 .queuecommand = bfad_im_queuecommand,
816 .eh_timed_out = fc_eh_timed_out,
816 .eh_abort_handler = bfad_im_abort_handler, 817 .eh_abort_handler = bfad_im_abort_handler,
817 .eh_device_reset_handler = bfad_im_reset_lun_handler, 818 .eh_device_reset_handler = bfad_im_reset_lun_handler,
818 .eh_bus_reset_handler = bfad_im_reset_bus_handler, 819 .eh_bus_reset_handler = bfad_im_reset_bus_handler,
@@ -835,6 +836,7 @@ struct scsi_host_template bfad_im_vport_template = {
835 .name = BFAD_DRIVER_NAME, 836 .name = BFAD_DRIVER_NAME,
836 .info = bfad_im_info, 837 .info = bfad_im_info,
837 .queuecommand = bfad_im_queuecommand, 838 .queuecommand = bfad_im_queuecommand,
839 .eh_timed_out = fc_eh_timed_out,
838 .eh_abort_handler = bfad_im_abort_handler, 840 .eh_abort_handler = bfad_im_abort_handler,
839 .eh_device_reset_handler = bfad_im_reset_lun_handler, 841 .eh_device_reset_handler = bfad_im_reset_lun_handler,
840 .eh_bus_reset_handler = bfad_im_reset_bus_handler, 842 .eh_bus_reset_handler = bfad_im_reset_bus_handler,
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index c639d5a02656..b1e39f985ec9 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -2947,6 +2947,7 @@ static struct scsi_host_template bnx2fc_shost_template = {
2947 .module = THIS_MODULE, 2947 .module = THIS_MODULE,
2948 .name = "QLogic Offload FCoE Initiator", 2948 .name = "QLogic Offload FCoE Initiator",
2949 .queuecommand = bnx2fc_queuecommand, 2949 .queuecommand = bnx2fc_queuecommand,
2950 .eh_timed_out = fc_eh_timed_out,
2950 .eh_abort_handler = bnx2fc_eh_abort, /* abts */ 2951 .eh_abort_handler = bnx2fc_eh_abort, /* abts */
2951 .eh_device_reset_handler = bnx2fc_eh_device_reset, /* lun reset */ 2952 .eh_device_reset_handler = bnx2fc_eh_device_reset, /* lun reset */
2952 .eh_target_reset_handler = bnx2fc_eh_target_reset, /* tgt reset */ 2953 .eh_target_reset_handler = bnx2fc_eh_target_reset, /* tgt reset */
diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c b/drivers/scsi/bnx2i/bnx2i_iscsi.c
index 133901fd3e35..f32a66f89d25 100644
--- a/drivers/scsi/bnx2i/bnx2i_iscsi.c
+++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c
@@ -2259,6 +2259,7 @@ static struct scsi_host_template bnx2i_host_template = {
2259 .name = "QLogic Offload iSCSI Initiator", 2259 .name = "QLogic Offload iSCSI Initiator",
2260 .proc_name = "bnx2i", 2260 .proc_name = "bnx2i",
2261 .queuecommand = iscsi_queuecommand, 2261 .queuecommand = iscsi_queuecommand,
2262 .eh_timed_out = iscsi_eh_cmd_timed_out,
2262 .eh_abort_handler = iscsi_eh_abort, 2263 .eh_abort_handler = iscsi_eh_abort,
2263 .eh_device_reset_handler = iscsi_eh_device_reset, 2264 .eh_device_reset_handler = iscsi_eh_device_reset,
2264 .eh_target_reset_handler = iscsi_eh_recover_target, 2265 .eh_target_reset_handler = iscsi_eh_recover_target,
diff --git a/drivers/scsi/csiostor/csio_scsi.c b/drivers/scsi/csiostor/csio_scsi.c
index 89a52b941ea8..a1ff75f1384f 100644
--- a/drivers/scsi/csiostor/csio_scsi.c
+++ b/drivers/scsi/csiostor/csio_scsi.c
@@ -2270,6 +2270,7 @@ struct scsi_host_template csio_fcoe_shost_template = {
2270 .name = CSIO_DRV_DESC, 2270 .name = CSIO_DRV_DESC,
2271 .proc_name = KBUILD_MODNAME, 2271 .proc_name = KBUILD_MODNAME,
2272 .queuecommand = csio_queuecommand, 2272 .queuecommand = csio_queuecommand,
2273 .eh_timed_out = fc_eh_timed_out,
2273 .eh_abort_handler = csio_eh_abort_handler, 2274 .eh_abort_handler = csio_eh_abort_handler,
2274 .eh_device_reset_handler = csio_eh_lun_reset_handler, 2275 .eh_device_reset_handler = csio_eh_lun_reset_handler,
2275 .slave_alloc = csio_slave_alloc, 2276 .slave_alloc = csio_slave_alloc,
@@ -2289,6 +2290,7 @@ struct scsi_host_template csio_fcoe_shost_vport_template = {
2289 .name = CSIO_DRV_DESC, 2290 .name = CSIO_DRV_DESC,
2290 .proc_name = KBUILD_MODNAME, 2291 .proc_name = KBUILD_MODNAME,
2291 .queuecommand = csio_queuecommand, 2292 .queuecommand = csio_queuecommand,
2293 .eh_timed_out = fc_eh_timed_out,
2292 .eh_abort_handler = csio_eh_abort_handler, 2294 .eh_abort_handler = csio_eh_abort_handler,
2293 .eh_device_reset_handler = csio_eh_lun_reset_handler, 2295 .eh_device_reset_handler = csio_eh_lun_reset_handler,
2294 .slave_alloc = csio_slave_alloc, 2296 .slave_alloc = csio_slave_alloc,
diff --git a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
index 33e83464e091..1880eb6c68f7 100644
--- a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
+++ b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
@@ -90,6 +90,7 @@ static struct scsi_host_template cxgb3i_host_template = {
90 .sg_tablesize = SG_ALL, 90 .sg_tablesize = SG_ALL,
91 .max_sectors = 0xFFFF, 91 .max_sectors = 0xFFFF,
92 .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN, 92 .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN,
93 .eh_timed_out = iscsi_eh_cmd_timed_out,
93 .eh_abort_handler = iscsi_eh_abort, 94 .eh_abort_handler = iscsi_eh_abort,
94 .eh_device_reset_handler = iscsi_eh_device_reset, 95 .eh_device_reset_handler = iscsi_eh_device_reset,
95 .eh_target_reset_handler = iscsi_eh_recover_target, 96 .eh_target_reset_handler = iscsi_eh_recover_target,
diff --git a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
index 9a2fdc305cf2..3fb3f5708ff7 100644
--- a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
+++ b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
@@ -103,6 +103,7 @@ static struct scsi_host_template cxgb4i_host_template = {
103 .sg_tablesize = SG_ALL, 103 .sg_tablesize = SG_ALL,
104 .max_sectors = 0xFFFF, 104 .max_sectors = 0xFFFF,
105 .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN, 105 .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN,
106 .eh_timed_out = iscsi_eh_cmd_timed_out,
106 .eh_abort_handler = iscsi_eh_abort, 107 .eh_abort_handler = iscsi_eh_abort,
107 .eh_device_reset_handler = iscsi_eh_device_reset, 108 .eh_device_reset_handler = iscsi_eh_device_reset,
108 .eh_target_reset_handler = iscsi_eh_recover_target, 109 .eh_target_reset_handler = iscsi_eh_recover_target,
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index 59150cad0353..86af57f7c11a 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -277,6 +277,7 @@ static struct scsi_host_template fcoe_shost_template = {
277 .name = "FCoE Driver", 277 .name = "FCoE Driver",
278 .proc_name = FCOE_NAME, 278 .proc_name = FCOE_NAME,
279 .queuecommand = fc_queuecommand, 279 .queuecommand = fc_queuecommand,
280 .eh_timed_out = fc_eh_timed_out,
280 .eh_abort_handler = fc_eh_abort, 281 .eh_abort_handler = fc_eh_abort,
281 .eh_device_reset_handler = fc_eh_device_reset, 282 .eh_device_reset_handler = fc_eh_device_reset,
282 .eh_host_reset_handler = fc_eh_host_reset, 283 .eh_host_reset_handler = fc_eh_host_reset,
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index 58ce9020d69c..ba58b7953263 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -106,6 +106,7 @@ static struct scsi_host_template fnic_host_template = {
106 .module = THIS_MODULE, 106 .module = THIS_MODULE,
107 .name = DRV_NAME, 107 .name = DRV_NAME,
108 .queuecommand = fnic_queuecommand, 108 .queuecommand = fnic_queuecommand,
109 .eh_timed_out = fc_eh_timed_out,
109 .eh_abort_handler = fnic_abort_cmd, 110 .eh_abort_handler = fnic_abort_cmd,
110 .eh_device_reset_handler = fnic_device_reset, 111 .eh_device_reset_handler = fnic_device_reset,
111 .eh_host_reset_handler = fnic_host_reset, 112 .eh_host_reset_handler = fnic_host_reset,
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 78b72c28a55d..2c92dabb55f6 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -3090,6 +3090,7 @@ static struct scsi_host_template driver_template = {
3090 .name = "IBM POWER Virtual FC Adapter", 3090 .name = "IBM POWER Virtual FC Adapter",
3091 .proc_name = IBMVFC_NAME, 3091 .proc_name = IBMVFC_NAME,
3092 .queuecommand = ibmvfc_queuecommand, 3092 .queuecommand = ibmvfc_queuecommand,
3093 .eh_timed_out = fc_eh_timed_out,
3093 .eh_abort_handler = ibmvfc_eh_abort_handler, 3094 .eh_abort_handler = ibmvfc_eh_abort_handler,
3094 .eh_device_reset_handler = ibmvfc_eh_device_reset_handler, 3095 .eh_device_reset_handler = ibmvfc_eh_device_reset_handler,
3095 .eh_target_reset_handler = ibmvfc_eh_target_reset_handler, 3096 .eh_target_reset_handler = ibmvfc_eh_target_reset_handler,
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
index 50cd01165e35..1deb0a9f14a6 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -2072,6 +2072,7 @@ static struct scsi_host_template driver_template = {
2072 .name = "IBM POWER Virtual SCSI Adapter " IBMVSCSI_VERSION, 2072 .name = "IBM POWER Virtual SCSI Adapter " IBMVSCSI_VERSION,
2073 .proc_name = "ibmvscsi", 2073 .proc_name = "ibmvscsi",
2074 .queuecommand = ibmvscsi_queuecommand, 2074 .queuecommand = ibmvscsi_queuecommand,
2075 .eh_timed_out = srp_timed_out,
2075 .eh_abort_handler = ibmvscsi_eh_abort_handler, 2076 .eh_abort_handler = ibmvscsi_eh_abort_handler,
2076 .eh_device_reset_handler = ibmvscsi_eh_device_reset_handler, 2077 .eh_device_reset_handler = ibmvscsi_eh_device_reset_handler,
2077 .eh_host_reset_handler = ibmvscsi_eh_host_reset_handler, 2078 .eh_host_reset_handler = ibmvscsi_eh_host_reset_handler,
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index ace4f1f41b8e..4228aba1f654 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -967,6 +967,7 @@ static struct scsi_host_template iscsi_sw_tcp_sht = {
967 .sg_tablesize = 4096, 967 .sg_tablesize = 4096,
968 .max_sectors = 0xFFFF, 968 .max_sectors = 0xFFFF,
969 .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN, 969 .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN,
970 .eh_timed_out = iscsi_eh_cmd_timed_out,
970 .eh_abort_handler = iscsi_eh_abort, 971 .eh_abort_handler = iscsi_eh_abort,
971 .eh_device_reset_handler= iscsi_eh_device_reset, 972 .eh_device_reset_handler= iscsi_eh_device_reset,
972 .eh_target_reset_handler = iscsi_eh_recover_target, 973 .eh_target_reset_handler = iscsi_eh_recover_target,
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index f9b6fba689ff..834d1212b6d5 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1930,7 +1930,7 @@ static int iscsi_has_ping_timed_out(struct iscsi_conn *conn)
1930 return 0; 1930 return 0;
1931} 1931}
1932 1932
1933static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc) 1933enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
1934{ 1934{
1935 enum blk_eh_timer_return rc = BLK_EH_NOT_HANDLED; 1935 enum blk_eh_timer_return rc = BLK_EH_NOT_HANDLED;
1936 struct iscsi_task *task = NULL, *running_task; 1936 struct iscsi_task *task = NULL, *running_task;
@@ -2063,6 +2063,7 @@ done:
2063 "timer reset" : "nh"); 2063 "timer reset" : "nh");
2064 return rc; 2064 return rc;
2065} 2065}
2066EXPORT_SYMBOL_GPL(iscsi_eh_cmd_timed_out);
2066 2067
2067static void iscsi_check_transport_timeouts(unsigned long data) 2068static void iscsi_check_transport_timeouts(unsigned long data)
2068{ 2069{
@@ -2585,8 +2586,6 @@ int iscsi_host_add(struct Scsi_Host *shost, struct device *pdev)
2585 if (!shost->cmd_per_lun) 2586 if (!shost->cmd_per_lun)
2586 shost->cmd_per_lun = ISCSI_DEF_CMD_PER_LUN; 2587 shost->cmd_per_lun = ISCSI_DEF_CMD_PER_LUN;
2587 2588
2588 if (!shost->transportt->eh_timed_out)
2589 shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out;
2590 return scsi_add_host(shost, pdev); 2589 return scsi_add_host(shost, pdev);
2591} 2590}
2592EXPORT_SYMBOL_GPL(iscsi_host_add); 2591EXPORT_SYMBOL_GPL(iscsi_host_add);
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index 19d349fc889f..1180a22beb43 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -5929,6 +5929,7 @@ struct scsi_host_template lpfc_template = {
5929 .proc_name = LPFC_DRIVER_NAME, 5929 .proc_name = LPFC_DRIVER_NAME,
5930 .info = lpfc_info, 5930 .info = lpfc_info,
5931 .queuecommand = lpfc_queuecommand, 5931 .queuecommand = lpfc_queuecommand,
5932 .eh_timed_out = fc_eh_timed_out,
5932 .eh_abort_handler = lpfc_abort_handler, 5933 .eh_abort_handler = lpfc_abort_handler,
5933 .eh_device_reset_handler = lpfc_device_reset_handler, 5934 .eh_device_reset_handler = lpfc_device_reset_handler,
5934 .eh_target_reset_handler = lpfc_target_reset_handler, 5935 .eh_target_reset_handler = lpfc_target_reset_handler,
@@ -5955,6 +5956,7 @@ struct scsi_host_template lpfc_vport_template = {
5955 .proc_name = LPFC_DRIVER_NAME, 5956 .proc_name = LPFC_DRIVER_NAME,
5956 .info = lpfc_info, 5957 .info = lpfc_info,
5957 .queuecommand = lpfc_queuecommand, 5958 .queuecommand = lpfc_queuecommand,
5959 .eh_timed_out = fc_eh_timed_out,
5958 .eh_abort_handler = lpfc_abort_handler, 5960 .eh_abort_handler = lpfc_abort_handler,
5959 .eh_device_reset_handler = lpfc_device_reset_handler, 5961 .eh_device_reset_handler = lpfc_device_reset_handler,
5960 .eh_target_reset_handler = lpfc_target_reset_handler, 5962 .eh_target_reset_handler = lpfc_target_reset_handler,
diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
index d6a205433b66..8b25f0a1eb8c 100644
--- a/drivers/scsi/qedi/qedi_iscsi.c
+++ b/drivers/scsi/qedi/qedi_iscsi.c
@@ -48,6 +48,7 @@ struct scsi_host_template qedi_host_template = {
48 .name = "QLogic QEDI 25/40/100Gb iSCSI Initiator Driver", 48 .name = "QLogic QEDI 25/40/100Gb iSCSI Initiator Driver",
49 .proc_name = QEDI_MODULE_NAME, 49 .proc_name = QEDI_MODULE_NAME,
50 .queuecommand = iscsi_queuecommand, 50 .queuecommand = iscsi_queuecommand,
51 .eh_timed_out = iscsi_eh_cmd_timed_out,
51 .eh_abort_handler = iscsi_eh_abort, 52 .eh_abort_handler = iscsi_eh_abort,
52 .eh_device_reset_handler = iscsi_eh_device_reset, 53 .eh_device_reset_handler = iscsi_eh_device_reset,
53 .eh_target_reset_handler = iscsi_eh_recover_target, 54 .eh_target_reset_handler = iscsi_eh_recover_target,
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 8521cfe302e9..c5a9d6c295a0 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -262,6 +262,7 @@ struct scsi_host_template qla2xxx_driver_template = {
262 .name = QLA2XXX_DRIVER_NAME, 262 .name = QLA2XXX_DRIVER_NAME,
263 .queuecommand = qla2xxx_queuecommand, 263 .queuecommand = qla2xxx_queuecommand,
264 264
265 .eh_timed_out = fc_eh_timed_out,
265 .eh_abort_handler = qla2xxx_eh_abort, 266 .eh_abort_handler = qla2xxx_eh_abort,
266 .eh_device_reset_handler = qla2xxx_eh_device_reset, 267 .eh_device_reset_handler = qla2xxx_eh_device_reset,
267 .eh_target_reset_handler = qla2xxx_eh_target_reset, 268 .eh_target_reset_handler = qla2xxx_eh_target_reset,
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 996e134d79fa..9d7bfbb02389 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -279,9 +279,7 @@ enum blk_eh_timer_return scsi_times_out(struct request *req)
279 if (host->eh_deadline != -1 && !host->last_reset) 279 if (host->eh_deadline != -1 && !host->last_reset)
280 host->last_reset = jiffies; 280 host->last_reset = jiffies;
281 281
282 if (host->transportt->eh_timed_out) 282 if (host->hostt->eh_timed_out)
283 rtn = host->transportt->eh_timed_out(scmd);
284 else if (host->hostt->eh_timed_out)
285 rtn = host->hostt->eh_timed_out(scmd); 283 rtn = host->hostt->eh_timed_out(scmd);
286 284
287 if (rtn == BLK_EH_NOT_HANDLED) { 285 if (rtn == BLK_EH_NOT_HANDLED) {
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index 03577bde6ac5..9a6ea6fccb06 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -2055,7 +2055,7 @@ static int fc_vport_match(struct attribute_container *cont,
2055 2055
2056 2056
2057/** 2057/**
2058 * fc_timed_out - FC Transport I/O timeout intercept handler 2058 * fc_eh_timed_out - FC Transport I/O timeout intercept handler
2059 * @scmd: The SCSI command which timed out 2059 * @scmd: The SCSI command which timed out
2060 * 2060 *
2061 * This routine protects against error handlers getting invoked while a 2061 * This routine protects against error handlers getting invoked while a
@@ -2076,8 +2076,8 @@ static int fc_vport_match(struct attribute_container *cont,
2076 * Notes: 2076 * Notes:
2077 * This routine assumes no locks are held on entry. 2077 * This routine assumes no locks are held on entry.
2078 */ 2078 */
2079static enum blk_eh_timer_return 2079enum blk_eh_timer_return
2080fc_timed_out(struct scsi_cmnd *scmd) 2080fc_eh_timed_out(struct scsi_cmnd *scmd)
2081{ 2081{
2082 struct fc_rport *rport = starget_to_rport(scsi_target(scmd->device)); 2082 struct fc_rport *rport = starget_to_rport(scsi_target(scmd->device));
2083 2083
@@ -2086,6 +2086,7 @@ fc_timed_out(struct scsi_cmnd *scmd)
2086 2086
2087 return BLK_EH_NOT_HANDLED; 2087 return BLK_EH_NOT_HANDLED;
2088} 2088}
2089EXPORT_SYMBOL(fc_eh_timed_out);
2089 2090
2090/* 2091/*
2091 * Called by fc_user_scan to locate an rport on the shost that 2092 * Called by fc_user_scan to locate an rport on the shost that
@@ -2211,8 +2212,6 @@ fc_attach_transport(struct fc_function_template *ft)
2211 /* Transport uses the shost workq for scsi scanning */ 2212 /* Transport uses the shost workq for scsi scanning */
2212 i->t.create_work_queue = 1; 2213 i->t.create_work_queue = 1;
2213 2214
2214 i->t.eh_timed_out = fc_timed_out;
2215
2216 i->t.user_scan = fc_user_scan; 2215 i->t.user_scan = fc_user_scan;
2217 2216
2218 /* target-mode drivers' functions */ 2217 /* target-mode drivers' functions */
diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c
index b87a78673f65..75b57a1855b0 100644
--- a/drivers/scsi/scsi_transport_srp.c
+++ b/drivers/scsi/scsi_transport_srp.c
@@ -591,7 +591,7 @@ EXPORT_SYMBOL(srp_reconnect_rport);
591 * Note: This function is called from soft-IRQ context and with the request 591 * Note: This function is called from soft-IRQ context and with the request
592 * queue lock held. 592 * queue lock held.
593 */ 593 */
594static enum blk_eh_timer_return srp_timed_out(struct scsi_cmnd *scmd) 594enum blk_eh_timer_return srp_timed_out(struct scsi_cmnd *scmd)
595{ 595{
596 struct scsi_device *sdev = scmd->device; 596 struct scsi_device *sdev = scmd->device;
597 struct Scsi_Host *shost = sdev->host; 597 struct Scsi_Host *shost = sdev->host;
@@ -603,6 +603,7 @@ static enum blk_eh_timer_return srp_timed_out(struct scsi_cmnd *scmd)
603 i->f->reset_timer_if_blocked && scsi_device_blocked(sdev) ? 603 i->f->reset_timer_if_blocked && scsi_device_blocked(sdev) ?
604 BLK_EH_RESET_TIMER : BLK_EH_NOT_HANDLED; 604 BLK_EH_RESET_TIMER : BLK_EH_NOT_HANDLED;
605} 605}
606EXPORT_SYMBOL(srp_timed_out);
606 607
607static void srp_rport_release(struct device *dev) 608static void srp_rport_release(struct device *dev)
608{ 609{
@@ -820,8 +821,6 @@ srp_attach_transport(struct srp_function_template *ft)
820 if (!i) 821 if (!i)
821 return NULL; 822 return NULL;
822 823
823 i->t.eh_timed_out = srp_timed_out;
824
825 i->t.tsk_mgmt_response = srp_tsk_mgmt_response; 824 i->t.tsk_mgmt_response = srp_tsk_mgmt_response;
826 i->t.it_nexus_response = srp_it_nexus_response; 825 i->t.it_nexus_response = srp_it_nexus_response;
827 826
diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index ceadf6b4ebc1..585e54f6512c 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -1899,11 +1899,6 @@ static int __init storvsc_drv_init(void)
1899 fc_transport_template = fc_attach_transport(&fc_transport_functions); 1899 fc_transport_template = fc_attach_transport(&fc_transport_functions);
1900 if (!fc_transport_template) 1900 if (!fc_transport_template)
1901 return -ENODEV; 1901 return -ENODEV;
1902
1903 /*
1904 * Install Hyper-V specific timeout handler.
1905 */
1906 fc_transport_template->eh_timed_out = storvsc_eh_timed_out;
1907#endif 1902#endif
1908 1903
1909 ret = vmbus_driver_register(&storvsc_drv); 1904 ret = vmbus_driver_register(&storvsc_drv);
diff --git a/include/linux/libata.h b/include/linux/libata.h
index c170be548b7f..46e18c0619c6 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -1130,6 +1130,7 @@ extern int ata_sas_port_start(struct ata_port *ap);
1130extern void ata_sas_port_stop(struct ata_port *ap); 1130extern void ata_sas_port_stop(struct ata_port *ap);
1131extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *); 1131extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
1132extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap); 1132extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
1133extern enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd);
1133extern int sata_scr_valid(struct ata_link *link); 1134extern int sata_scr_valid(struct ata_link *link);
1134extern int sata_scr_read(struct ata_link *link, int reg, u32 *val); 1135extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);
1135extern int sata_scr_write(struct ata_link *link, int reg, u32 val); 1136extern int sata_scr_write(struct ata_link *link, int reg, u32 val);
@@ -1355,6 +1356,7 @@ extern struct device_attribute *ata_common_sdev_attrs[];
1355 .proc_name = drv_name, \ 1356 .proc_name = drv_name, \
1356 .slave_configure = ata_scsi_slave_config, \ 1357 .slave_configure = ata_scsi_slave_config, \
1357 .slave_destroy = ata_scsi_slave_destroy, \ 1358 .slave_destroy = ata_scsi_slave_destroy, \
1359 .eh_timed_out = ata_scsi_timed_out, \
1358 .bios_param = ata_std_bios_param, \ 1360 .bios_param = ata_std_bios_param, \
1359 .unlock_native_capacity = ata_scsi_unlock_native_capacity, \ 1361 .unlock_native_capacity = ata_scsi_unlock_native_capacity, \
1360 .sdev_attrs = ata_common_sdev_attrs 1362 .sdev_attrs = ata_common_sdev_attrs
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
index 4d1c46aac331..b0e275de6dec 100644
--- a/include/scsi/libiscsi.h
+++ b/include/scsi/libiscsi.h
@@ -383,6 +383,7 @@ extern int iscsi_eh_recover_target(struct scsi_cmnd *sc);
383extern int iscsi_eh_session_reset(struct scsi_cmnd *sc); 383extern int iscsi_eh_session_reset(struct scsi_cmnd *sc);
384extern int iscsi_eh_device_reset(struct scsi_cmnd *sc); 384extern int iscsi_eh_device_reset(struct scsi_cmnd *sc);
385extern int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc); 385extern int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc);
386extern enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc);
386 387
387/* 388/*
388 * iSCSI host helpers. 389 * iSCSI host helpers.
diff --git a/include/scsi/scsi_transport.h b/include/scsi/scsi_transport.h
index 81292392adbc..6c3bb9f3dc0f 100644
--- a/include/scsi/scsi_transport.h
+++ b/include/scsi/scsi_transport.h
@@ -58,17 +58,6 @@ struct scsi_transport_template {
58 void (* eh_strategy_handler)(struct Scsi_Host *); 58 void (* eh_strategy_handler)(struct Scsi_Host *);
59 59
60 /* 60 /*
61 * This is an optional routine that allows the transport to become
62 * involved when a scsi io timer fires. The return value tells the
63 * timer routine how to finish the io timeout handling:
64 * EH_HANDLED: I fixed the error, please complete the command
65 * EH_RESET_TIMER: I need more time, reset the timer and
66 * begin counting again
67 * EH_NOT_HANDLED Begin normal error recovery
68 */
69 enum blk_eh_timer_return (*eh_timed_out)(struct scsi_cmnd *);
70
71 /*
72 * Used as callback for the completion of i_t_nexus request 61 * Used as callback for the completion of i_t_nexus request
73 * for target drivers. 62 * for target drivers.
74 */ 63 */
diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h
index 924c8e614b45..b21b8aa58c4d 100644
--- a/include/scsi/scsi_transport_fc.h
+++ b/include/scsi/scsi_transport_fc.h
@@ -808,6 +808,7 @@ struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
808 struct fc_vport_identifiers *); 808 struct fc_vport_identifiers *);
809int fc_vport_terminate(struct fc_vport *vport); 809int fc_vport_terminate(struct fc_vport *vport);
810int fc_block_scsi_eh(struct scsi_cmnd *cmnd); 810int fc_block_scsi_eh(struct scsi_cmnd *cmnd);
811enum blk_eh_timer_return fc_eh_timed_out(struct scsi_cmnd *scmd);
811 812
812static inline struct Scsi_Host *fc_bsg_to_shost(struct bsg_job *job) 813static inline struct Scsi_Host *fc_bsg_to_shost(struct bsg_job *job)
813{ 814{
diff --git a/include/scsi/scsi_transport_srp.h b/include/scsi/scsi_transport_srp.h
index d40d3ef25707..20d96797edc5 100644
--- a/include/scsi/scsi_transport_srp.h
+++ b/include/scsi/scsi_transport_srp.h
@@ -124,6 +124,7 @@ extern int srp_reconnect_rport(struct srp_rport *rport);
124extern void srp_start_tl_fail_timers(struct srp_rport *rport); 124extern void srp_start_tl_fail_timers(struct srp_rport *rport);
125extern void srp_remove_host(struct Scsi_Host *); 125extern void srp_remove_host(struct Scsi_Host *);
126extern void srp_stop_rport_timers(struct srp_rport *rport); 126extern void srp_stop_rport_timers(struct srp_rport *rport);
127enum blk_eh_timer_return srp_timed_out(struct scsi_cmnd *scmd);
127 128
128/** 129/**
129 * srp_chkready() - evaluate the transport layer state before I/O 130 * srp_chkready() - evaluate the transport layer state before I/O