From e7b64a44527135e830ecebf84adb3692dd6ceb03 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Wed, 29 Mar 2006 14:45:18 -0700 Subject: [PATCH] --- yaml --- r: 25819 b: refs/heads/master c: d637c4543fdc86cbef5805c679d24bb665172a7d h: refs/heads/master i: 25817: 4274938a6e58b09e10511ebbc350ecaa19309974 25815: ba300760bf645ea6f62b390d36da888ef433a04b v: v3 --- [refs] | 2 +- trunk/drivers/scsi/sym53c8xx_2/sym_glue.c | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index fb98ed76b997..6246b661b5e6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 80286d478c2b0e07959e79cf34591a4061ff1797 +refs/heads/master: d637c4543fdc86cbef5805c679d24bb665172a7d diff --git a/trunk/drivers/scsi/sym53c8xx_2/sym_glue.c b/trunk/drivers/scsi/sym53c8xx_2/sym_glue.c index 2c4e5f1e7a94..9c83b4d39a26 100644 --- a/trunk/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/trunk/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -140,11 +140,11 @@ static struct scsi_transport_template *sym2_transport_template = NULL; * Driver private area in the SCSI command structure. */ struct sym_ucmd { /* Override the SCSI pointer structure */ - struct completion done; - void (*old_done)(struct scsi_cmnd *); - dma_addr_t data_mapping; - int to_do; - u_char data_mapped; /* corresponds to data_mapping above */ + dma_addr_t data_mapping; + unsigned char data_mapped; + unsigned char to_do; /* For error handling */ + void (*old_done)(struct scsi_cmnd *); /* For error handling */ + struct completion *eh_done; /* For error handling */ }; #define SYM_UCMD_PTR(cmd) ((struct sym_ucmd *)(&(cmd)->SCp)) @@ -713,7 +713,7 @@ static void sym_eh_done(struct scsi_cmnd *cmd) cmd->scsi_done = ucmd->old_done; if (ucmd->to_do == SYM_EH_DO_WAIT) - complete(&ucmd->done); + complete(ucmd->eh_done); } /* @@ -728,6 +728,7 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) SYM_QUEHEAD *qp; int to_do = SYM_EH_DO_IGNORE; int sts = -1; + struct completion eh_done; dev_warn(&cmd->device->sdev_gendev, "%s operation started.\n", opname); @@ -742,8 +743,10 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) } if (to_do == SYM_EH_DO_WAIT) { - init_completion(&ucmd->done); + init_completion(&eh_done); ucmd->old_done = cmd->scsi_done; + ucmd->eh_done = &eh_done; + wmb(); cmd->scsi_done = sym_eh_done; } @@ -779,8 +782,9 @@ static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) spin_unlock_irq(host->host_lock); if (to_do == SYM_EH_DO_WAIT) { - if (!wait_for_completion_timeout(&ucmd->done, 5*HZ)) { + if (!wait_for_completion_timeout(&eh_done, 5*HZ)) { ucmd->to_do = SYM_EH_DO_IGNORE; + wmb(); sts = -2; } }