branch update for HEAD-2003021201
[reactos.git] / drivers / storage / disk / disk.c
index 682ae7c..2e54035 100644 (file)
@@ -491,6 +491,10 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
   DiskDeviceExtension->TargetId = InquiryData->TargetId;
   DiskDeviceExtension->Lun = InquiryData->Lun;
 
+  /* Initialize the lookaside list for SRBs */
+  ScsiClassInitializeSrbLookasideList(DiskDeviceExtension,
+                                     4);
+
   /* zero-out disk data */
   DiskData = (PDISK_DATA)(DiskDeviceExtension + 1);
   RtlZeroMemory(DiskData,
@@ -503,6 +507,8 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
     {
       DPRINT("Failed to allocate geometry buffer!\n");
 
+      ExDeleteNPagedLookasideList(&DiskDeviceExtension->SrbLookasideListHead);
+
       IoDeleteDevice(DiskDeviceObject);
 
       /* Release (unclaim) the disk */
@@ -552,41 +558,41 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
     }
   else
     {
-  /* Read partition table */
-  Status = IoReadPartitionTable(DiskDeviceObject,
-                               DiskDeviceExtension->DiskGeometry->BytesPerSector,
-                               TRUE,
-                               &PartitionList);
+      /* Read partition table */
+      Status = IoReadPartitionTable(DiskDeviceObject,
+                                   DiskDeviceExtension->DiskGeometry->BytesPerSector,
+                                   TRUE,
+                                   &PartitionList);
 
-  DPRINT("IoReadPartitionTable(): Status: %lx\n", Status);
+      DPRINT("IoReadPartitionTable(): Status: %lx\n", Status);
 
-  if ((!NT_SUCCESS(Status) || PartitionList->PartitionCount == 0) &&
-      DiskDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA)
-    {
-      if (!NT_SUCCESS(Status))
+      if ((!NT_SUCCESS(Status) || PartitionList->PartitionCount == 0) &&
+         DiskDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA)
        {
-         /* Drive is not ready. */
-         DPRINT("Drive not ready\n");
-         DiskData->DriveNotReady = TRUE;
-       }
-      else
-       {
-         ExFreePool(PartitionList);
-       }
+         if (!NT_SUCCESS(Status))
+           {
+             /* Drive is not ready. */
+             DPRINT("Drive not ready\n");
+             DiskData->DriveNotReady = TRUE;
+           }
+         else
+           {
+             ExFreePool(PartitionList);
+           }
 
-      /* Allocate a partition list for a single entry. */
-      PartitionList = ExAllocatePool(NonPagedPool,
-                                    sizeof(DRIVE_LAYOUT_INFORMATION));
-      if (PartitionList != NULL)
-       {
-         RtlZeroMemory(PartitionList,
-                       sizeof(DRIVE_LAYOUT_INFORMATION));
-         PartitionList->PartitionCount = 1;
+         /* Allocate a partition list for a single entry. */
+         PartitionList = ExAllocatePool(NonPagedPool,
+                                        sizeof(DRIVE_LAYOUT_INFORMATION));
+         if (PartitionList != NULL)
+           {
+             RtlZeroMemory(PartitionList,
+                           sizeof(DRIVE_LAYOUT_INFORMATION));
+             PartitionList->PartitionCount = 1;
 
-         Status = STATUS_SUCCESS;
+             Status = STATUS_SUCCESS;
+           }
        }
     }
-  }
 
   if (NT_SUCCESS(Status))
     {
@@ -642,6 +648,10 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
              PartitionDeviceExtension->Lun = InquiryData->Lun;
              PartitionDeviceExtension->SectorShift = DiskDeviceExtension->SectorShift;
 
+             /* Initialize lookaside list for SRBs */
+             ScsiClassInitializeSrbLookasideList(PartitionDeviceExtension,
+                                                 8);
+
              DiskData = (PDISK_DATA)(PartitionDeviceExtension + 1);
              DiskData->PartitionType = PartitionEntry->PartitionType;
              DiskData->PartitionNumber = PartitionNumber + 1;
@@ -969,14 +979,20 @@ DiskClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
   Srb->TargetId = DeviceExtension->TargetId;
   Srb->Lun = DeviceExtension->Lun;
 
-
-  /* FIXME: Flush write cache */
-
+  /* Flush write cache */
+  Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+  Srb->SrbFlags = SRB_FLAGS_NO_DATA_TRANSFER;
+  Srb->CdbLength = 10;
+  Srb->Cdb[0] = SCSIOP_SYNCHRONIZE_CACHE;
+  ScsiClassSendSrbSynchronous(DeviceObject,
+                             Srb,
+                             NULL,
+                             0,
+                             TRUE);
 
   /* Get current stack location */
   IrpStack = IoGetCurrentIrpStackLocation(Irp);
 
-
   /* FIXME: Unlock removable media upon shutdown */