01_scsi_timer_update_aic7xxx.patch aic7xxx used scmd->eh_timeout in its dv routines. This kind of usage requires knowledge of and creates dependency into the SCSI midlayer unnecessarily. This patch makes aic7xxx driver use its own timer instead of scmd->eh_timeout. Suggested by Christoph Hellwig. Signed-off-by: Tejun Heo <htejun@xxxxxxxxx> aic79xx_osm.c | 24 ++++++++++++++++-------- aic7xxx_osm.c | 24 ++++++++++++++++-------- 2 files changed, 32 insertions(+), 16 deletions(-) Index: scsi-reqfn-export/drivers/scsi/aic7xxx/aic79xx_osm.c =================================================================== --- scsi-reqfn-export.orig/drivers/scsi/aic7xxx/aic79xx_osm.c 2005-04-11 03:42:10.000000000 +0900 +++ scsi-reqfn-export/drivers/scsi/aic7xxx/aic79xx_osm.c 2005-04-11 03:42:11.000000000 +0900 @@ -460,7 +460,7 @@ static void ahd_linux_initialize_scsi_bu static void ahd_linux_size_nseg(void); static void ahd_linux_thread_run_complete_queue(struct ahd_softc *ahd); static void ahd_linux_start_dv(struct ahd_softc *ahd); -static void ahd_linux_dv_timeout(struct scsi_cmnd *cmd); +static void ahd_linux_dv_timeout(unsigned long data); static int ahd_linux_dv_thread(void *data); static void ahd_linux_kill_dv_thread(struct ahd_softc *ahd); static void ahd_linux_dv_target(struct ahd_softc *ahd, u_int target); @@ -2628,6 +2628,7 @@ ahd_linux_dv_target(struct ahd_softc *ah struct ahd_devinfo devinfo; struct ahd_linux_target *targ; struct scsi_cmnd *cmd; + struct timer_list timer; struct scsi_device *scsi_dev; struct scsi_sense_data *sense; uint8_t *buffer; @@ -2723,8 +2724,7 @@ ahd_linux_dv_target(struct ahd_softc *ah } /* Queue the command and wait for it to complete */ - /* Abuse eh_timeout in the scsi_cmnd struct for our purposes */ - init_timer(&cmd->eh_timeout); + init_timer(&timer); #ifdef AHD_DEBUG if ((ahd_debug & AHD_SHOW_MESSAGES) != 0) /* @@ -2734,7 +2734,10 @@ ahd_linux_dv_target(struct ahd_softc *ah */ timeout += HZ; #endif - scsi_add_timer(cmd, timeout, ahd_linux_dv_timeout); + timer.expires = jiffies + timeout; + timer.function = ahd_linux_dv_timeout; + timer.data = (unsigned long)cmd; + add_timer(&timer); /* * In 2.5.X, it is assumed that all calls from the * "midlayer" (which we are emulating) will have the @@ -2754,6 +2757,13 @@ ahd_linux_dv_target(struct ahd_softc *ah #endif down_interruptible(&ahd->platform_data->dv_cmd_sem); /* + * Although the timer could have gone off while we're + * on normal completion path before reaching the + * following line, it's safe because we use + * cmd->host_scribble for synchronization. + */ + del_timer(&timer); + /* * Wait for the SIMQ to be released so that DV is the * only reason the queue is frozen. */ @@ -3636,8 +3646,9 @@ ahd_linux_fallback(struct ahd_softc *ahd } static void -ahd_linux_dv_timeout(struct scsi_cmnd *cmd) +ahd_linux_dv_timeout(unsigned long data) { + struct scsi_cmnd *cmd = (void *)data; struct ahd_softc *ahd; struct scb *scb; u_long flags; @@ -3698,9 +3709,6 @@ ahd_linux_dv_complete(struct scsi_cmnd * ahd = *((struct ahd_softc **)cmd->device->host->hostdata); - /* Delete the DV timer before it goes off! */ - scsi_delete_timer(cmd); - #ifdef AHD_DEBUG if (ahd_debug & AHD_SHOW_DV) printf("%s:%c:%d: Command completed, status= 0x%x\n", Index: scsi-reqfn-export/drivers/scsi/aic7xxx/aic7xxx_osm.c =================================================================== --- scsi-reqfn-export.orig/drivers/scsi/aic7xxx/aic7xxx_osm.c 2005-04-11 03:42:10.000000000 +0900 +++ scsi-reqfn-export/drivers/scsi/aic7xxx/aic7xxx_osm.c 2005-04-11 03:42:11.000000000 +0900 @@ -477,7 +477,7 @@ static void ahc_linux_initialize_scsi_bu static void ahc_linux_size_nseg(void); static void ahc_linux_thread_run_complete_queue(struct ahc_softc *ahc); static void ahc_linux_start_dv(struct ahc_softc *ahc); -static void ahc_linux_dv_timeout(struct scsi_cmnd *cmd); +static void ahc_linux_dv_timeout(unsigned long data); static int ahc_linux_dv_thread(void *data); static void ahc_linux_kill_dv_thread(struct ahc_softc *ahc); static void ahc_linux_dv_target(struct ahc_softc *ahc, u_int target); @@ -2310,6 +2310,7 @@ ahc_linux_dv_target(struct ahc_softc *ah struct ahc_devinfo devinfo; struct ahc_linux_target *targ; struct scsi_cmnd *cmd; + struct timer_list timer; struct scsi_device *scsi_dev; struct scsi_sense_data *sense; uint8_t *buffer; @@ -2407,8 +2408,7 @@ ahc_linux_dv_target(struct ahc_softc *ah } /* Queue the command and wait for it to complete */ - /* Abuse eh_timeout in the scsi_cmnd struct for our purposes */ - init_timer(&cmd->eh_timeout); + init_timer(&timer); #ifdef AHC_DEBUG if ((ahc_debug & AHC_SHOW_MESSAGES) != 0) /* @@ -2418,7 +2418,10 @@ ahc_linux_dv_target(struct ahc_softc *ah */ timeout += HZ; #endif - scsi_add_timer(cmd, timeout, ahc_linux_dv_timeout); + timer.expires = jiffies + timeout; + timer.function = ahc_linux_dv_timeout; + timer.data = (unsigned long)cmd; + add_timer(&timer); /* * In 2.5.X, it is assumed that all calls from the * "midlayer" (which we are emulating) will have the @@ -2438,6 +2441,13 @@ ahc_linux_dv_target(struct ahc_softc *ah #endif down_interruptible(&ahc->platform_data->dv_cmd_sem); /* + * Although the timer could have gone off while we're + * on normal completion path before reaching the + * following line, it's safe because we use + * cmd->host_scribble for synchronization. + */ + del_timer(&timer); + /* * Wait for the SIMQ to be released so that DV is the * only reason the queue is frozen. */ @@ -3313,8 +3323,9 @@ ahc_linux_fallback(struct ahc_softc *ahc } static void -ahc_linux_dv_timeout(struct scsi_cmnd *cmd) +ahc_linux_dv_timeout(unsigned long data) { + struct scsi_cmnd *cmd = (void *)data; struct ahc_softc *ahc; struct scb *scb; u_long flags; @@ -3375,9 +3386,6 @@ ahc_linux_dv_complete(struct scsi_cmnd * ahc = *((struct ahc_softc **)cmd->device->host->hostdata); - /* Delete the DV timer before it goes off! */ - scsi_delete_timer(cmd); - #ifdef AHC_DEBUG if (ahc_debug & AHC_SHOW_DV) printf("%s:%d:%d: Command completed, status= 0x%x\n", - : send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html