- Enabled the command queueing (in DiskClassCreateDeviceObject).

- Do always reread the partition table in DiskBuildPartitionTable,
  because DiskBuildPartitionTable is only called for removable media's.
- If there is no partition table available, set the disk data entries
  for this volume to the super floppy format (in DiskBuildPartitionTable).

svn path=/trunk/; revision=9807
This commit is contained in:
Hartmut Birr 2004-06-21 21:03:12 +00:00
parent 7d5a8e2e07
commit 7b96a26e57

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: disk.c,v 1.41 2004/05/10 18:02:20 gvg Exp $ /* $Id: disk.c,v 1.42 2004/06/21 21:03:12 hbirr Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -548,6 +548,14 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
DiskDeviceExtension->PathId = InquiryData->PathId; DiskDeviceExtension->PathId = InquiryData->PathId;
DiskDeviceExtension->TargetId = InquiryData->TargetId; DiskDeviceExtension->TargetId = InquiryData->TargetId;
DiskDeviceExtension->Lun = InquiryData->Lun; DiskDeviceExtension->Lun = InquiryData->Lun;
DiskDeviceExtension->SrbFlags = 0;
/* Enable the command queueing, if it possible */
if (Capabilities->TaggedQueuing &&
((PINQUIRYDATA)InquiryData->InquiryData)->CommandQueue)
{
DiskDeviceExtension->SrbFlags |= SRB_FLAGS_QUEUE_ACTION_ENABLE;
}
/* Get timeout value */ /* Get timeout value */
DiskDeviceExtension->TimeOutValue = DiskDeviceExtension->TimeOutValue =
@ -589,7 +597,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
} }
/* Allocate sense data buffer */ /* Allocate sense data buffer */
DiskDeviceExtension->SenseData = ExAllocatePool(NonPagedPool, DiskDeviceExtension->SenseData = ExAllocatePool(NonPagedPoolCacheAligned,
SENSE_BUFFER_SIZE); SENSE_BUFFER_SIZE);
if (DiskDeviceExtension->SenseData == NULL) if (DiskDeviceExtension->SenseData == NULL)
{ {
@ -853,14 +861,17 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject,
DiskDeviceExtension = (PDEVICE_EXTENSION)DiskDeviceObject->DeviceExtension; DiskDeviceExtension = (PDEVICE_EXTENSION)DiskDeviceObject->DeviceExtension;
DiskData = (PDISK_DATA)(DiskDeviceExtension + 1); DiskData = (PDISK_DATA)(DiskDeviceExtension + 1);
if (DiskDeviceExtension->StartingOffset.QuadPart) Status = ScsiClassReadDriveCapacity(DiskDeviceObject);
if (!NT_SUCCESS(Status))
{ {
DPRINT("Partition already installed\n"); /* Drive is not ready. */
return(STATUS_SUCCESS); DPRINT("Drive not ready\n");
DiskData->DriveNotReady = TRUE;
return Status;
} }
/* Read partition table */ /* Read partition table */
Status = IoReadPartitionTable(DiskDeviceObject, Status = IoReadPartitionTable(DiskDeviceExtension->PhysicalDevice,
DiskDeviceExtension->DiskGeometry->BytesPerSector, DiskDeviceExtension->DiskGeometry->BytesPerSector,
TRUE, TRUE,
&PartitionList); &PartitionList);
@ -886,11 +897,14 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject,
/* Set disk signature */ /* Set disk signature */
DiskData->Signature = PartitionList->Signature; DiskData->Signature = PartitionList->Signature;
DiskData->NextPartition = NULL;
if (PartitionList->PartitionCount)
{
for (PartitionNumber = 0; PartitionNumber < PartitionList->PartitionCount; PartitionNumber++) for (PartitionNumber = 0; PartitionNumber < PartitionList->PartitionCount; PartitionNumber++)
{ {
PartitionEntry = &PartitionList->PartitionEntry[PartitionNumber]; PartitionEntry = &PartitionList->PartitionEntry[PartitionNumber];
DiskData->NextPartition = NULL;
DiskData->PartitionType = PartitionEntry->PartitionType; DiskData->PartitionType = PartitionEntry->PartitionType;
DiskData->PartitionNumber = PartitionNumber + 1; DiskData->PartitionNumber = PartitionNumber + 1;
DiskData->PartitionOrdinal = PartitionNumber + 1; DiskData->PartitionOrdinal = PartitionNumber + 1;
@ -900,7 +914,7 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject,
DiskDeviceExtension->StartingOffset = PartitionEntry->StartingOffset; DiskDeviceExtension->StartingOffset = PartitionEntry->StartingOffset;
DiskDeviceExtension->PartitionLength = PartitionEntry->PartitionLength; DiskDeviceExtension->PartitionLength = PartitionEntry->PartitionLength;
DPRINT("Partition %02ld: nr: %d boot: %1x type: %x offset: %I64d size: %I64d\n", DPRINT1("Partition %02ld: nr: %d boot: %1x type: %x offset: %I64d size: %I64d\n",
PartitionNumber, PartitionNumber,
DiskData->PartitionNumber, DiskData->PartitionNumber,
DiskData->BootIndicator, DiskData->BootIndicator,
@ -909,6 +923,18 @@ DiskBuildPartitionTable(IN PDEVICE_OBJECT DiskDeviceObject,
DiskDeviceExtension->PartitionLength.QuadPart / 512 /* DrvParms.BytesPerSector*/); DiskDeviceExtension->PartitionLength.QuadPart / 512 /* DrvParms.BytesPerSector*/);
} }
} }
else
{
DiskData->PartitionType = 0;
DiskData->PartitionNumber = 1;
DiskData->PartitionOrdinal = 0;
DiskData->HiddenSectors = 0;
DiskData->BootIndicator = 0;
DiskData->DriveNotReady = FALSE;
DiskDeviceExtension->PartitionLength.QuadPart += DiskDeviceExtension->StartingOffset.QuadPart;
DiskDeviceExtension->StartingOffset.QuadPart = 0;
}
}
DPRINT("DiskBuildPartitionTable() done\n"); DPRINT("DiskBuildPartitionTable() done\n");
if (PartitionList != NULL) if (PartitionList != NULL)
@ -980,7 +1006,7 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* Drive is not ready */ /* Drive is not ready */
DiskData->DriveNotReady = FALSE; DiskData->DriveNotReady = TRUE;
break; break;
} }