Introduce the parameter to limit scsi timeout count (take 2)
RFC PATCH 2/2 Introduce the parameter to limit scsi timeout count (take 2)
Introduce interfaces, scsi_mod module parameter (initparm) and procfs (scsi/initparm) to define default values, timeout and max_timeout_cnt, for the devices identified by vendor and model.
Default values can be registered through these interfaces with the format of "v:m:t:c[,v:m:t:c]"
(v:vendor, m:model, t=timeout, c=max_timeout_cnt)
Example:
* Load scsi module with default values, scsi timeout(10s) and maximum timeout count (1) for HITACHI/DF600.
# insmod scsi_mod.ko initparm="HITACHI:DF600:10:1"
* Show current default settings
# cat /proc/scsi/initparm
'HITACHI' 'DF600' timeout=10 max_timeout_cnt=1Signed-off-by Takahiro Yasui <[email protected]>
--- drivers/scsi/Makefile | 3 drivers/scsi/scsi.c | 8 - drivers/scsi/scsi_initparm.c | 338 +++++++++++++++++++++++++++++++++++++++++++ drivers/scsi/scsi_priv.h | 5 drivers/scsi/scsi_scan.c | 2 5 files changed, 354 insertions(+), 2 deletions(-)
drivers/scsi/Makefile +2 -1
@@ -150,7 +150,8 @@ obj-$(CONFIG_SCSI_WAIT_SCAN) += scsi_wai scsi_mod-y += scsi.o hosts.o scsi_ioctl.o constants.o \ scsicam.o scsi_error.o scsi_lib.o scsi_mod-$(CONFIG_SCSI_DMA) += scsi_lib_dma.o -scsi_mod-y += scsi_scan.o scsi_sysfs.o scsi_devinfo.o +scsi_mod-y += scsi_scan.o scsi_sysfs.o scsi_devinfo.o \ + scsi_initparm.o scsi_mod-$(CONFIG_SCSI_NETLINK) += scsi_netlink.o scsi_mod-$(CONFIG_SYSCTL) += scsi_sysctl.o scsi_mod-$(CONFIG_SCSI_PROC_FS) += scsi_proc.o
drivers/scsi/scsi.c +7 -1
@@ -1323,9 +1323,12 @@ static int __init init_scsi(void) error =scsi_init_devinfo ();if (error) goto cleanup_procfs; - error =scsi_init_hosts (); + error =scsi_init_initparm ();if (error) goto cleanup_devlist; + error =scsi_init_hosts (); +if (error) + goto cleanup_config; error =scsi_init_sysctl ();if (error) goto cleanup_hosts;
@@ -1342,6 +1345,8 @@ cleanup_sysctl:scsi_exit_sysctl (); cleanup_hosts:scsi_exit_hosts (); +cleanup_config: +scsi_exit_initparm (); cleanup_devlist:scsi_exit_devinfo (); cleanup_procfs:
@@ -1360,6 +1365,7 @@ static void __exit exit_scsi(void)scsi_exit_sysctl ();scsi_exit_hosts ();scsi_exit_devinfo (); +scsi_exit_initparm ();scsi_exit_procfs ();scsi_exit_queue (); }
drivers/scsi/scsi_initparm.c new file +338 -0
338 lines not on this page · raw message
drivers/scsi/scsi_priv.h +5 -0
@@ -45,6 +45,11 @@ extern int scsi_get_device_flags(structextern int __init scsi_init_devinfo (void );extern void scsi_exit_devinfo (void ); +/* scsi_initparm.c */ +extern void scsi_override_parms (struct scsi_device *sdev); +extern int __init scsi_init_initparm (void ); +extern void scsi_exit_initparm (void ); +/* scsi_error.c */ extern enum blk_eh_timer_return scsi_times_out (struct request *req);extern int scsi_error_handler (void *host);
drivers/scsi/scsi_scan.c +2 -0
@@ -926,6 +926,8 @@ static int scsi_add_lun(struct scsi_deviif (*bflags &BLIST_RETRY_HWERROR ) sdev->retry_hwerror =1 ; +scsi_override_parms (sdev); +transport_configure_device (&sdev->sdev_gendev);if (sdev->host->hostt->slave_configure) {