[USBSTOR]

- Fix broken IRP error handling and leaking memory

svn path=/branches/usb-bringup-trunk/; revision=55155
This commit is contained in:
Cameron Gutman 2012-01-24 22:28:44 +00:00
parent 75947d6708
commit 2f5db208de
3 changed files with 99 additions and 85 deletions

View file

@ -60,13 +60,13 @@ USBSTOR_ResetPipeWithHandle(
NTSTATUS
USBSTOR_HandleTransferError(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PIRP_CONTEXT Context)
{
NTSTATUS Status;
PIO_STACK_LOCATION Stack;
USBD_PIPE_HANDLE PipeHandle;
PSCSI_REQUEST_BLOCK Request;
PCDB pCDB;
DPRINT1("Entered Handle Transfer Error\n");
//
@ -121,20 +121,41 @@ USBSTOR_HandleTransferError(
}
}
Stack = IoGetCurrentIrpStackLocation(Context->Irp);
Request = (PSCSI_REQUEST_BLOCK)Stack->Parameters.Others.Argument1;
pCDB = (PCDB)Request->Cdb;
if (Status != STATUS_SUCCESS)
{
Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = 0;
/* Complete the master IRP */
Context->Irp->IoStatus.Status = Status;
Context->Irp->IoStatus.Information = 0;
IoCompleteRequest(Context->Irp, IO_NO_INCREMENT);
/* Start the next request */
USBSTOR_QueueTerminateRequest(Context->PDODeviceExtension->LowerDeviceObject, TRUE);
USBSTOR_QueueNextRequest(Context->PDODeviceExtension->LowerDeviceObject);
/* Signal the context event */
if (Context->Event)
KeSetEvent(Context->Event, 0, FALSE);
/* Cleanup the IRP context */
if (pCDB->AsByte[0] == SCSIOP_READ_CAPACITY)
FreeItem(Context->TransferData);
FreeItem(Context->cbw);
FreeItem(Context);
}
else
{
Stack = IoGetCurrentIrpStackLocation(Context->Irp);
//
// Retry the operation
//
Request = (PSCSI_REQUEST_BLOCK)Stack->Parameters.Others.Argument1;
DPRINT1("Retrying\n");
Status = USBSTOR_HandleExecuteSCSI(DeviceObject, Context->Irp);
/* Cleanup the old IRP context */
if (pCDB->AsByte[0] == SCSIOP_READ_CAPACITY)
FreeItem(Context->TransferData);
FreeItem(Context->cbw);
FreeItem(Context);
}
DPRINT1("USBSTOR_HandleTransferError returning with Status %x\n", Status);
@ -149,7 +170,7 @@ ErrorHandlerWorkItemRoutine(
NTSTATUS Status;
PERRORHANDLER_WORKITEM_DATA WorkItemData = (PERRORHANDLER_WORKITEM_DATA)Context;
Status = USBSTOR_HandleTransferError(WorkItemData->DeviceObject, WorkItemData->Irp, WorkItemData->Context);
Status = USBSTOR_HandleTransferError(WorkItemData->DeviceObject, WorkItemData->Context);
//
// Free Work Item Data

View file

@ -181,18 +181,9 @@ USBSTOR_CSWCompletionRoutine(
{
DPRINT1("Attempting Error Recovery\n");
//
// If a Read Capacity Request free TransferBuffer
// free the allocated irp
//
if (pCDB->AsByte[0] == SCSIOP_READ_CAPACITY)
{
FreeItem(Context->TransferData);
}
//
// Clean up the rest
//
FreeItem(Context->cbw);
FreeItem(Context);
IoFreeIrp(Irp);
//
// Allocate Work Item Data
@ -213,7 +204,6 @@ USBSTOR_CSWCompletionRoutine(
ErrorHandlerWorkItemData);
ErrorHandlerWorkItemData->DeviceObject = Context->FDODeviceExtension->FunctionalDeviceObject;
ErrorHandlerWorkItemData->Irp = Irp;
ErrorHandlerWorkItemData->Context = Context;
DPRINT1("Queuing WorkItemROutine\n");
ExQueueWorkItem(&ErrorHandlerWorkItemData->WorkQueueItem, DelayedWorkQueue);
@ -315,6 +305,10 @@ USBSTOR_CSWCompletionRoutine(
KeSetEvent(Context->Event, 0, FALSE);
}
//
// free our allocated irp
//
IoFreeIrp(Irp);
//
// free context

View file

@ -278,7 +278,6 @@ typedef struct
typedef struct _ERRORHANDLER_WORKITEM_DATA
{
PDEVICE_OBJECT DeviceObject;
PIRP Irp;
PIRP_CONTEXT Context;
WORK_QUEUE_ITEM WorkQueueItem;
} ERRORHANDLER_WORKITEM_DATA, *PERRORHANDLER_WORKITEM_DATA;