reactos/drivers/storage/class2
diff -u -r1.53 -r1.54
--- class2.c 10 May 2004 18:02:20 -0000 1.53
+++ class2.c 10 Jun 2004 07:56:42 -0000 1.54
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: class2.c,v 1.53 2004/05/10 18:02:20 gvg Exp $
+/* $Id: class2.c,v 1.54 2004/06/10 07:56:42 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@@ -46,6 +46,11 @@
#define INQUIRY_DATA_SIZE 2048
#define START_UNIT_TIMEOUT 30
+/*
+ * FIXME:
+ * Create a macro, which rounds up a size value to the next multiple of two.
+ */
+#define SENSEINFO_ALIGNMENT 32
static NTSTATUS STDCALL
ScsiClassCreateClose(IN PDEVICE_OBJECT DeviceObject,
@@ -205,7 +210,7 @@
Srb->QueueAction = SRB_SIMPLE_TAG_REQUEST;
Srb->QueueSortKey = LogicalBlockAddress;
- Srb->SenseInfoBuffer = DeviceExtension->SenseData;
+ Srb->SenseInfoBuffer = (SENSE_DATA*)ROUND_UP((ULONG_PTR)(Srb + 1), SENSEINFO_ALIGNMENT);
Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE;
Srb->TimeOutValue =
@@ -558,9 +563,9 @@
Irp));
}
- /* Allocate an SRB */
- Srb = ExAllocatePool (NonPagedPool,
- sizeof(SCSI_REQUEST_BLOCK));
+ /* Allocate and initialize an SRB */
+ Srb = ExAllocateFromNPagedLookasideList(&DeviceExtension->SrbLookasideListHead);
+
if (Srb == NULL)
{
Irp->IoStatus.Information = 0;
@@ -588,7 +593,9 @@
DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY SMALL\n");
Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
Irp->IoStatus.Information = 0;
- ExFreePool (Srb);
+ /* Free the SRB */
+ ExFreeToNPagedLookasideList(&DeviceExtension->SrbLookasideListHead,
+ Srb);
IoCompleteRequest (Irp,
IO_NO_INCREMENT);
return STATUS_BUFFER_TOO_SMALL;
@@ -599,10 +606,12 @@
FALSE);
if (SubIrp == NULL)
{
- DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY NotEnuf\n");
+ DPRINT ("ScsiClassDeviceControl: IOCTL_DISK_CHECK_VERIFY NotEnuf\n");
Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
Irp->IoStatus.Information = 0;
- ExFreePool (Srb);
+ /* Free the SRB */
+ ExFreeToNPagedLookasideList(&DeviceExtension->SrbLookasideListHead,
+ Srb);
IoCompleteRequest (Irp,
IO_NO_INCREMENT);
return STATUS_INSUFFICIENT_RESOURCES;
@@ -650,8 +659,9 @@
default:
DPRINT("Unknown device io control code %lx\n",
ModifiedControlCode);
- ExFreePool(Srb);
-
+ /* Free the SRB */
+ ExFreeToNPagedLookasideList(&DeviceExtension->SrbLookasideListHead,
+ Srb);
/* Pass the IOCTL down to the port driver */
NextStack = IoGetNextIrpStackLocation(Irp);
NextStack->Parameters = Stack->Parameters;
@@ -993,7 +1003,7 @@
NULL,
NULL,
NonPagedPool,
- sizeof(SCSI_REQUEST_BLOCK),
+ sizeof(SCSI_REQUEST_BLOCK) + sizeof(SENSE_DATA) + SENSEINFO_ALIGNMENT - 1,
TAG_SRBT,
(USHORT)NumberElements);
}
@@ -1720,7 +1730,7 @@
DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
- CapacityBuffer = ExAllocatePool(NonPagedPool,
+ CapacityBuffer = ExAllocatePool(NonPagedPoolCacheAligned,
sizeof(READ_CAPACITY_DATA));
if (CapacityBuffer == NULL)
{
@@ -1925,7 +1935,7 @@
Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
Srb->Cdb[1] |= DeviceExtension->Lun << 5;
- Srb->SenseInfoBuffer = DeviceExtension->SenseData;
+ Srb->SenseInfoBuffer = (SENSE_DATA*)ROUND_UP((ULONG_PTR)(Srb + 1), SENSEINFO_ALIGNMENT);
Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE;
Srb->DataBuffer = BufferAddress;
@@ -2002,7 +2012,7 @@
ULONG RequestType;
BOOLEAN Retry;
ULONG RetryCount;
- PKEVENT Event;
+ KEVENT Event;
PIRP Irp;
NTSTATUS Status;
LARGE_INTEGER RetryWait;
@@ -2044,13 +2054,11 @@
}
}
- Srb->DataTransferLength = BufferLength;
Srb->DataBuffer = BufferAddress;
- Event = ExAllocatePool(NonPagedPool,
- sizeof(KEVENT));
TryAgain:
- KeInitializeEvent(Event,
+ Srb->DataTransferLength = BufferLength;
+ KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
@@ -2061,13 +2069,14 @@
BufferAddress,
BufferLength,
TRUE,
- Event,
+ &Event,
&IoStatusBlock);
if (Irp == NULL)
{
DPRINT("IoBuildDeviceIoControlRequest() failed\n");
ExFreePool(Srb->SenseInfoBuffer);
- ExFreePool(Event);
+ Srb->SenseInfoBuffer = NULL;
+ Srb->SenseInfoBufferLength = 0;
return(STATUS_INSUFFICIENT_RESOURCES);
}
@@ -2081,7 +2090,7 @@
Irp);
if (Status == STATUS_PENDING)
{
- KeWaitForSingleObject(Event,
+ KeWaitForSingleObject(&Event,
Suspended,
KernelMode,
FALSE,
@@ -2123,7 +2132,6 @@
}
ExFreePool(Srb->SenseInfoBuffer);
- ExFreePool(Event);
DPRINT("ScsiClassSendSrbSynchronous() done\n");