]> xenbits.xensource.com Git - pvdrivers/win/xenvbd.git/commitdiff
Add registry overrides for features 8.2.0-rc3
authorOwen Smith <owen.smith@citrix.com>
Fri, 3 Feb 2017 14:03:52 +0000 (14:03 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Fri, 3 Feb 2017 17:29:54 +0000 (17:29 +0000)
Add a REG_DWORD to XenVbd's Parameters key, with names based
on the features, as per xenstore value, and set to 0 to
override use of that feature.

For example,
 "HKLM\System\CCS\Services\XenVbd\Parameters" "feature-barrier" 0
  will prevent the frontend issuing BLKIF_OP_WRITE_BARRIERs
 "HKLM\System\CCS\Services\XenVbd\Parameters" "feature-discard" 0
  will prevent the frontend issuing BLKIF_OP_DISCARDs

Signed-off-by: Owen Smith <owen.smith@citrix.com>
src/xenvbd/driver.c
src/xenvbd/driver.h
src/xenvbd/frontend.c

index 776d5ae8ecc993b43523bd20047d46a0aae1a77a..bb1954fc2a2914f035ea8c7978de850737fce3e1 100644 (file)
@@ -82,6 +82,22 @@ __DriverParseOption(
     RegistryFreeSzValue(Option);
 }
 
+static FORCEINLINE HANDLE
+__DriverGetParametersKey(
+    VOID
+    )
+{
+    return Driver.ParametersKey;
+}
+
+HANDLE
+DriverGetParametersKey(
+    VOID
+    )
+{
+    return __DriverGetParametersKey();
+}
+
 NTSTATUS
 DriverDispatchPnp(
     IN  PDEVICE_OBJECT  DeviceObject,
index cf55330f2db7d5861593c315196a2fd7e3b2df53..e7730a9d85c552f44ab9b96f0d87ca521691f522 100644 (file)
@@ -57,6 +57,11 @@ typedef struct _XENVBD_PARAMETERS {
 
 extern XENVBD_PARAMETERS    DriverParameters;
 
+extern HANDLE
+DriverGetParametersKey(
+    VOID
+    );
+
 extern NTSTATUS
 DriverDispatchPnp(
     IN  PDEVICE_OBJECT  DeviceObject,
index d48b6e6c7f9cca7a8b7c7b1efe4c19c728cccf8b..c2ed0b5e473807710df78f39403d4e498300bf89 100644 (file)
@@ -30,6 +30,7 @@
  */ 
 
 #include "frontend.h"
+#include "registry.h"
 #include "driver.h"
 #include "fdo.h"
 #include "pdoinquiry.h"
@@ -624,6 +625,7 @@ FrontendReadFeature(
 {
     NTSTATUS        status;
     PCHAR           Buffer;
+    ULONG           Override;
     BOOLEAN         Old = *Value;
 
     status = XENBUS_STORE(Read,
@@ -640,6 +642,15 @@ FrontendReadFeature(
                     Frontend->Store,
                     Buffer);
 
+    // check registry for disable-override
+    status = RegistryQueryDwordValue(DriverGetParametersKey(),
+                                    Name,
+                                    &Override);
+    if (NT_SUCCESS(status)) {
+        if (Override == 0)
+            *Value = FALSE;
+    }
+
     return Old != *Value;
 }
 
@@ -647,11 +658,13 @@ static FORCEINLINE BOOLEAN
 FrontendReadValue32(
     IN  PXENVBD_FRONTEND            Frontend,
     IN  PCHAR                       Name,
+    IN  BOOLEAN                     AllowOverride,
     IN  PULONG                      Value
     )
 {
     NTSTATUS        status;
     PCHAR           Buffer;
+    ULONG           Override;
     ULONG           Old = *Value;
 
     status = XENBUS_STORE(Read,
@@ -668,6 +681,16 @@ FrontendReadValue32(
                     Frontend->Store,
                     Buffer);
 
+    // check registry for disable-override
+    if (AllowOverride) {
+        status = RegistryQueryDwordValue(DriverGetParametersKey(),
+                                        Name,
+                                        &Override);
+        if (NT_SUCCESS(status)) {
+            *Value = Override;
+        }
+    }
+
     return Old != *Value;
 }
 
@@ -730,12 +753,15 @@ __ReadDiskInfo(
 
     Changed |= FrontendReadValue32(Frontend,
                                   "info",
+                                  FALSE,
                                   &Frontend->DiskInfo.DiskInfo);
     Changed |= FrontendReadValue32(Frontend,
                                   "sector-size",
+                                  FALSE,
                                   &Frontend->DiskInfo.SectorSize);
     Changed |= FrontendReadValue32(Frontend,
                                   "physical-sector-size",
+                                  FALSE,
                                   &Frontend->DiskInfo.PhysSectorSize);
     Changed |= FrontendReadValue64(Frontend,
                                   "sectors",
@@ -783,6 +809,7 @@ FrontendReadFeatures(
                                    &Frontend->Caps.Removable);
     Changed |= FrontendReadValue32(Frontend,
                                    "feature-max-indirect-segments",
+                                   TRUE,
                                    &Frontend->Features.Indirect);
     Changed |= FrontendReadFeature(Frontend,
                                    "feature-persistent",
@@ -824,9 +851,11 @@ FrontendReadDiskInfo(
                                    &Frontend->DiskInfo.DiscardSecure);
     Changed |= FrontendReadValue32(Frontend,
                                    "discard-alignment",
+                                   TRUE,
                                    &Frontend->DiskInfo.DiscardAlignment);
     Changed |= FrontendReadValue32(Frontend,
                                    "discard-granularity",
+                                   TRUE,
                                    &Frontend->DiskInfo.DiscardGranularity);
 
     if (!Changed)