From: Matthew Wilcox <[EMAIL PROTECTED]>
Remove uses of the scsi_cmnd ->done method from the fc4 driver. It was
being abused to flag commands that had already been through queuecommand;
use the fcmd->proto value for that instead. The fcmd->done pointer now
becomes irrelevant. Reuse the fcp_scsi_done name for an entirely different
function which provides a handy single place to call ->scsi_done (removing
some broken places that used to leak scsi_cmnds on error by calling ->done).
I had to add an include of <linux/pci.h> to get this to compile on non-sparc,
and pluto_detect_done() was unused, so remove it too.
Signed-off-by: Matthew Wilcox <[EMAIL PROTECTED]>
Signed-off-by: Boaz Harrosh <[EMAIL PROTECTED]>
---
drivers/fc4/fc.c | 64 ++++++++++++++++-------------------------------
drivers/fc4/fcp_impl.h | 1 -
drivers/scsi/pluto.c | 10 +------
3 files changed, 23 insertions(+), 52 deletions(-)
diff --git a/drivers/fc4/fc.c b/drivers/fc4/fc.c
index 82de9e1..48c3b62 100644
--- a/drivers/fc4/fc.c
+++ b/drivers/fc4/fc.c
@@ -33,6 +33,7 @@
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/init.h>
+#include <linux/pci.h>
#include <asm/pgtable.h>
#include <asm/irq.h>
@@ -378,7 +379,12 @@ void fcp_register(fc_channel *fc, u8 type, int unregister)
printk ("FC: %segistering unknown type %02x\n", unregister ?
"Unr" : "R", type);
}
-static void fcp_scsi_done(struct scsi_cmnd *SCpnt);
+static void fcp_scsi_done(struct scsi_cmnd *SCpnt, unsigned int result)
+{
+ SCpnt->result = result;
+ FCD(("Calling scsi_done with %08x\n", SCpnt->result))
+ SCpnt->scsi_done(SCpnt);
+}
static inline void fcp_scsi_receive(fc_channel *fc, int token, int status,
fc_hdr *fch)
{
@@ -394,9 +400,6 @@ static inline void fcp_scsi_receive(fc_channel *fc, int
token, int status, fc_hd
rsp = (fcp_rsp *) (fc->scsi_rsp_pool + fc->rsp_size * token);
SCpnt = SC_FCMND(fcmd);
- if (SCpnt->done != fcp_scsi_done)
- return;
-
rsp_status = rsp->fcp_status;
FCD(("rsp_status %08x status %08x\n", rsp_status, status))
switch (status) {
@@ -442,17 +445,9 @@ static inline void fcp_scsi_receive(fc_channel *fc, int
token, int status, fc_hd
printk ("%s: (%d,%d) Received rsp_status 0x%x\n", fc->name,
SCpnt->device->channel, SCpnt->device->id, rsp_status);
}
- SCpnt->result = (host_status << 16) | (rsp_status & 0xff);
-#ifdef FCDEBUG
- if (host_status || SCpnt->result || rsp_status) printk("FC: host_status
%d, packet status %d\n",
- host_status, SCpnt->result);
-#endif
- SCpnt->done = fcmd->done;
- fcmd->done=NULL;
clear_bit(token, fc->scsi_bitmap);
fc->scsi_free++;
- FCD(("Calling scsi_done with %08x\n", SCpnt->result))
- SCpnt->scsi_done(SCpnt);
+ fcp_scsi_done(SCpnt, (host_status << 16) | (rsp_status & 0xff));
}
void fcp_receive_solicited(fc_channel *fc, int proto, int token, int status,
fc_hdr *fch)
@@ -751,13 +746,6 @@ void fcp_release(fc_channel *fcchain, int count) /* count
must > 0 */
*/
}
-
-static void fcp_scsi_done(struct scsi_cmnd *SCpnt)
-{
- if (FCP_CMND(SCpnt)->done)
- FCP_CMND(SCpnt)->done(SCpnt);
-}
-
static int fcp_scsi_queue_it(fc_channel *fc, struct scsi_cmnd *SCpnt,
fcp_cmnd *fcmd, int prepare)
{
@@ -773,8 +761,7 @@ static int fcp_scsi_queue_it(fc_channel *fc, struct
scsi_cmnd *SCpnt,
if (fc->encode_addr (SCpnt, cmd->fcp_addr, fc, fcmd)) {
/* Invalid channel/id/lun and couldn't map it into
fcp_addr */
clear_bit (i, fc->scsi_bitmap);
- SCpnt->result = (DID_BAD_TARGET << 16);
- SCpnt->scsi_done(SCpnt);
+ fcp_scsi_done(SCpnt, (DID_BAD_TARGET << 16));
return 0;
}
fc->scsi_free--;
@@ -834,21 +821,20 @@ int fcp_scsi_queuecommand(struct scsi_cmnd *SCpnt,
fc_channel *fc = FC_SCMND(SCpnt);
FCD(("Entering SCSI queuecommand %p\n", fcmd))
- if (SCpnt->done != fcp_scsi_done) {
- fcmd->done = SCpnt->done;
- SCpnt->done = fcp_scsi_done;
- SCpnt->scsi_done = done;
- fcmd->proto = TYPE_SCSI_FCP;
- if (!fc->scsi_free) {
- FCD(("FC: !scsi_free, putting cmd on ML queue\n"))
+ SCpnt->scsi_done = done;
+ if (!fc->scsi_free) {
+ FCD(("FC: !scsi_free, putting cmd on ML queue\n"))
#if (FCP_SCSI_USE_NEW_EH_CODE == 0)
- printk("fcp_scsi_queue_command: queue full, losing cmd,
bad\n");
+ printk("fcp_scsi_queue_command: queue full, losing cmd, bad\n");
#endif
- return 1;
- }
+ return 1;
+ }
+ if (fcmd->proto == TYPE_SCSI_FCP) {
+ return fcp_scsi_queue_it(fc, SCpnt, fcmd, 0);
+ } else {
+ fcmd->proto = TYPE_SCSI_FCP;
return fcp_scsi_queue_it(fc, SCpnt, fcmd, 1);
}
- return fcp_scsi_queue_it(fc, SCpnt, fcmd, 0);
}
void fcp_queue_empty(fc_channel *fc)
@@ -867,7 +853,6 @@ void fcp_queue_empty(fc_channel *fc)
int fcp_scsi_abort(struct scsi_cmnd *SCpnt)
{
/* Internal bookkeeping only. Lose 1 cmd_slots slot. */
- fcp_cmnd *fcmd = FCP_CMND(SCpnt);
fc_channel *fc = FC_SCMND(SCpnt);
/*
@@ -890,8 +875,7 @@ int fcp_scsi_abort(struct scsi_cmnd *SCpnt)
*/
if (++fc->abort_count < (fc->can_queue >> 1)) {
- SCpnt->result = DID_ABORT;
- fcmd->done(SCpnt);
+ fcp_scsi_done(SCpnt, DID_ABORT);
printk("FC: soft abort\n");
return SUCCESS;
} else {
@@ -949,8 +933,6 @@ int fcp_scsi_dev_reset(struct scsi_cmnd *SCpnt)
if (fc->rst_pkt->eh_state == SCSI_STATE_QUEUED)
return FAILED; /* or SUCCESS. Only these */
}
- fc->rst_pkt->done = NULL;
-
fc->rst_pkt->eh_state = SCSI_STATE_QUEUED;
init_timer(&fc->rst_pkt->eh_timeout);
@@ -966,7 +948,7 @@ int fcp_scsi_dev_reset(struct scsi_cmnd *SCpnt)
fc->rst_pkt->device->host->eh_action = &sem;
- fc->rst_pkt->done = fcp_scsi_reset_done;
+ fc->rst_pkt->scsi_done = fcp_scsi_reset_done;
spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
fcp_scsi_queue_it(fc, fc->rst_pkt, fcmd, 0);
@@ -993,15 +975,13 @@ int fcp_scsi_dev_reset(struct scsi_cmnd *SCpnt)
static int __fcp_scsi_host_reset(struct scsi_cmnd *SCpnt)
{
fc_channel *fc = FC_SCMND(SCpnt);
- fcp_cmnd *fcmd = FCP_CMND(SCpnt);
int i;
printk ("FC: host reset\n");
for (i=0; i < fc->can_queue; i++) {
if (fc->cmd_slots[i] && SCpnt->result != DID_ABORT) {
- SCpnt->result = DID_RESET;
- fcmd->done(SCpnt);
+ fcp_scsi_done(SCpnt, DID_RESET);
fc->cmd_slots[i] = NULL;
}
}
diff --git a/drivers/fc4/fcp_impl.h b/drivers/fc4/fcp_impl.h
index 1ac6133..41fa149 100644
--- a/drivers/fc4/fcp_impl.h
+++ b/drivers/fc4/fcp_impl.h
@@ -39,7 +39,6 @@ struct _fc_channel;
typedef struct fcp_cmnd {
struct fcp_cmnd *next;
struct fcp_cmnd *prev;
- void (*done)(struct scsi_cmnd *);
unsigned short proto;
unsigned short token;
unsigned int did;
diff --git a/drivers/scsi/pluto.c b/drivers/scsi/pluto.c
index 0363c1c..e598a90 100644
--- a/drivers/scsi/pluto.c
+++ b/drivers/scsi/pluto.c
@@ -55,14 +55,9 @@ static DECLARE_COMPLETION(fc_detect_complete);
static int pluto_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc,
fcp_cmnd *fcmd);
-static void __init pluto_detect_done(Scsi_Cmnd *SCpnt)
-{
- /* Do nothing */
-}
-
static void __init pluto_detect_scsi_done(Scsi_Cmnd *SCpnt)
{
- PLND(("Detect done %08lx\n", (long)SCpnt))
+ PLND(("Detect done %p\n", SCpnt))
if (atomic_dec_and_test (&fcss))
complete(&fc_detect_complete);
}
@@ -193,9 +188,6 @@ int __init pluto_detect(struct scsi_host_template *tpnt)
SCpnt = &(fcs[i].cmd);
- /* Let FC mid-level free allocated resources */
- pluto_detect_scsi_done(SCpnt);
-
if (!SCpnt->result) {
struct pluto_inquiry *inq;
struct pluto *pluto;
--
1.5.3.1
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html