megaraid bad queuecommand return
Subsystems (2)
PATCH 1/1 megaraid bad queuecommand return
Hi,
In case of scb allocation failure, mega_build_cmd() can return NULL scb but set busy, which causes a non-zero return from ->queuecommand() while the scsi command has been completed. Flagging error and calling done should be enough for appropriate retries.
===== drivers/scsi/megaraid.c 1.73 vs edited =====
drivers/scsi/megaraid.c +0 -20
@@ -634,11 +634,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_ }if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; }
@@ -677,11 +673,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_/* Allocate a SCB and initialize passthru */ if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; } pthru = scb->pthru;
@@ -723,11 +715,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_/* Allocate a SCB and initialize mailbox */ if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; } mbox = (mbox_t *)scb->raw_mbox;
@@ -867,11 +855,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_/* Allocate a SCB and initialize mailbox */ if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; }
@@ -899,11 +883,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_else {/* Allocate a SCB and initialize passthru */ if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; }
Signature · 1 line
Jens Axboe
Quoted 6 lines · Jens Axboe
Hi,
In case of scb allocation failure,
mega_build_cmd()can return NULL scb but set busy, which causes a non-zero return from ->queuecommand() while the scsi command has been completed. Flagging error and calling done should be enough for appropriate retries.
Of course the other way around for this particular patch - just return busy and let the mid layer handle it, but make sure not to call done() first.
Quoted 74 lines
Signed-off-by Jens Axboe <[email protected]>=====
drivers/scsi/megaraid.c1.73 vs edited =====drivers/scsi/megaraid.c +0
-20@@ -634,11 +634,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_ }if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; }@@ -677,11 +673,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_/* Allocate a SCB and initialize passthru */ if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; } pthru = scb->pthru;@@ -723,11 +715,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_/* Allocate a SCB and initialize mailbox */ if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; } mbox = (mbox_t *)scb->raw_mbox;@@ -867,11 +855,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_/* Allocate a SCB and initialize mailbox */ if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; }@@ -899,11 +883,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_else {/* Allocate a SCB and initialize passthru */ if (!(scb =mega_allocate_scb (adapter, cmd))) { - - cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); *busy =1 ; -return NULL ; }Signature · 7 lines
-- Jens Axboe - 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
Signature · 1 line
Jens Axboe