[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH xenvbd] Implement query for StorageAccessAlignmentProperty



XENDISK already issues a SCSIOP_READ_CAPACITY16 down to XENVBD and so it
may as well handle a query for StorageAccessAlignmentProperty.

NOTE: This patch also adds a name decoder for STORAGE_QUERY_TYPE and adds
      some missing entries to the name decoder for STORAGE_PROPERTY_ID.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 src/xendisk/pdo.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 70 insertions(+), 3 deletions(-)

diff --git a/src/xendisk/pdo.c b/src/xendisk/pdo.c
index 0f719d1..dc7fc24 100644
--- a/src/xendisk/pdo.c
+++ b/src/xendisk/pdo.c
@@ -65,6 +65,7 @@ struct _XENDISK_PDO {
 
     BOOLEAN                     InterceptTrim;
     ULONG                       SectorSize;
+    ULONG                       PhysSectorSize;
 };
 
 static FORCEINLINE PVOID
@@ -429,7 +430,8 @@ fail1:
 static NTSTATUS
 PdoSendReadCapacity16Synchronous(
     IN  PXENDISK_PDO            Pdo,
-    OUT PULONG                  SectorSize
+    OUT PULONG                  SectorSize,
+    OUT PULONG                  PhysSectorSize
     )
 {
     SCSI_REQUEST_BLOCK          Srb;
@@ -470,6 +472,7 @@ PdoSendReadCapacity16Synchronous(
         goto fail3;
 
     *SectorSize = _byteswap_ulong(Capacity->BytesPerBlock);
+    *PhysSectorSize = *SectorSize << Capacity->LogicalPerPhysicalExponent;
 
     __PdoFree(Capacity);
 
@@ -587,6 +590,16 @@ PropertyIdName(
     _STORAGE_PROPERTY_NAME(DevicePowerProperty);
     _STORAGE_PROPERTY_NAME(DeviceCopyOffloadProperty);
     _STORAGE_PROPERTY_NAME(DeviceResiliencyProperty);
+    _STORAGE_PROPERTY_NAME(DeviceMediumProductType);
+    _STORAGE_PROPERTY_NAME(AdapterCryptoProperty);
+    _STORAGE_PROPERTY_NAME(DeviceIoCapabilityProperty);
+    _STORAGE_PROPERTY_NAME(AdapterProtocolSpecificProperty);
+    _STORAGE_PROPERTY_NAME(DeviceProtocolSpecificProperty);
+    _STORAGE_PROPERTY_NAME(AdapterTemperatureProperty);
+    _STORAGE_PROPERTY_NAME(DeviceTemperatureProperty);
+    _STORAGE_PROPERTY_NAME(AdapterPhysicalTopologyProperty);
+    _STORAGE_PROPERTY_NAME(DevicePhysicalTopologyProperty);
+    _STORAGE_PROPERTY_NAME(DeviceAttributesProperty);
     default:
         break;
     }
@@ -596,6 +609,28 @@ PropertyIdName(
 #undef _STORAGE_PROPERTY_NAME
 }
 
+static const CHAR *
+QueryTypeName(
+    IN  STORAGE_QUERY_TYPE  Type
+    )
+{
+#define _STORAGE_QUERY_NAME(_Type)   \
+    case Property ## _Type ## Query: \
+        return #_Type;
+
+    switch (Type) {
+    _STORAGE_QUERY_NAME(Standard);
+    _STORAGE_QUERY_NAME(Exists);
+    _STORAGE_QUERY_NAME(Mask);
+    default:
+        break;
+    }
+
+    return "UNKNOWN";
+
+#undef _STORAGE_QUERY_NAME
+}
+
 static DECLSPEC_NOINLINE NTSTATUS
 PdoQueryProperty(
     IN  PXENDISK_PDO        Pdo,
@@ -614,7 +649,7 @@ PdoQueryProperty(
 
     Query = Irp->AssociatedIrp.SystemBuffer;
 
-    Trace("%s\n", PropertyIdName(Query->PropertyId));
+    Trace("%s %s\n", PropertyIdName(Query->PropertyId), 
QueryTypeName(Query->QueryType));
 
     switch (Query->PropertyId) {
     case StorageDeviceTrimProperty:
@@ -646,6 +681,34 @@ PdoQueryProperty(
         status = PdoCompleteIrp(Pdo, Irp, STATUS_SUCCESS);
         break;
 
+    case StorageAccessAlignmentProperty: {
+        if (Query->QueryType == PropertyStandardQuery) {
+            PSTORAGE_ACCESS_ALIGNMENT_DESCRIPTOR AccessAlignment;
+
+            if (StackLocation->Parameters.DeviceIoControl.OutputBufferLength <
+                sizeof (STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR))
+                return PdoCompleteIrp(Pdo, Irp, STATUS_BUFFER_OVERFLOW);
+
+            AccessAlignment = Irp->AssociatedIrp.SystemBuffer;
+
+            RtlZeroMemory(AccessAlignment, 
sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR));
+
+            AccessAlignment->Version = 
sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR);
+            AccessAlignment->Size = 
sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR);
+            AccessAlignment->BytesPerCacheLine = 0;
+            AccessAlignment->BytesOffsetForCacheAlignment = 0;
+            AccessAlignment->BytesPerLogicalSector = Pdo->SectorSize;
+            AccessAlignment->BytesPerPhysicalSector = Pdo->PhysSectorSize;
+            AccessAlignment->BytesOffsetForSectorAlignment = 0;
+
+            Irp->IoStatus.Information = 
sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR);
+        } else {
+            Irp->IoStatus.Information = 0;
+        }
+
+        status = PdoCompleteIrp(Pdo, Irp, STATUS_SUCCESS);
+        break;
+    }
     default:
         status = PdoForwardIrpAndForget(Pdo, Irp);
         break;
@@ -743,6 +806,7 @@ PdoStartDevice(
     )
 {
     ULONG               SectorSize;
+    ULONG               PhysSectorSize;
     POWER_STATE         PowerState;
     NTSTATUS            status;
 
@@ -754,11 +818,14 @@ PdoStartDevice(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    status = PdoSendReadCapacity16Synchronous(Pdo, &SectorSize);
+    status = PdoSendReadCapacity16Synchronous(Pdo, &SectorSize, 
&PhysSectorSize);
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    Trace("SectorSize = %u PhysSectorSize = %u\n", SectorSize, PhysSectorSize);
+
     Pdo->SectorSize = SectorSize;
+    Pdo->PhysSectorSize = PhysSectorSize;
 
     __PdoSetSystemPowerState(Pdo, PowerSystemWorking);
     __PdoSetDevicePowerState(Pdo, PowerDeviceD0);
-- 
2.5.3


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.