Re: [PATCH scsi-misc-2.6 01/07] scsi: make aic7xxx use its own timer instead of scmd->eh_timeout

From: Tejun Heo
Date: Sun Apr 10 2005 - 13:51:28 EST


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",

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/