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

Re: [XENVBD PATCH] Report VPD 0xB1 Block Device Characteristics



+    PXENVBD_DISKINFO                       DiskInfo = FrontendGetDiskInfo(Target->Frontend);
This triggers a warning (and error) in checked builds.
"DiskInfo local variable is initialised but not referenced." 

Removing the line for the DiskInfo variable, and adding a "UNREFERENCE_PARAMETER(Target);" is required to compile checked builds.

Owen

On Fri, Feb 14, 2025 at 9:28 AM Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx> wrote:
Report Medium Rotation Rate to be 1 (i.e. solid state disk) to prevent
Windows from defragmenting virtual disks by default.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
 src/xenvbd/target.c | 37 ++++++++++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c
index c5edaca..0775ede 100644
--- a/src/xenvbd/target.c
+++ b/src/xenvbd/target.c
@@ -691,16 +691,17 @@ TargetInquiry00(
         return;
     RtlZeroMemory(Data, Length);

-    if (Length < 8)
+    if (Length < 9)
         return;

-    Data->PageLength = 4;
+    Data->PageLength = 5;
     Data->SupportedPageList[0] = 0x00;
     Data->SupportedPageList[1] = 0x80;
     Data->SupportedPageList[2] = 0x83;
     Data->SupportedPageList[3] = 0xB0;
+    Data->SupportedPageList[4] = 0xB1;

-    Srb->DataTransferLength = 8;
+    Srb->DataTransferLength = 9;
     Srb->SrbStatus = SRB_STATUS_SUCCESS;
 }

@@ -830,6 +831,35 @@ TargetInquiryB0(
     Srb->SrbStatus = SRB_STATUS_SUCCESS;
 }

+static FORCEINLINE VOID
+TargetInquiryB1(
+    IN  PXENVBD_TARGET      Target,
+    IN  PSCSI_REQUEST_BLOCK Srb
+    )
+{
+    PXENVBD_DISKINFO                       DiskInfo = FrontendGetDiskInfo(Target->Frontend);
+    PVPD_BLOCK_DEVICE_CHARACTERISTICS_PAGE Data = ""> +    ULONG                                  Length = Srb->DataTransferLength;
+
+    Srb->SrbStatus = SRB_STATUS_ERROR;
+
+    if (Data == NULL)
+        return;
+    RtlZeroMemory(Data, Length);
+
+    if (Length < sizeof(VPD_BLOCK_DEVICE_CHARACTERISTICS_PAGE))
+        return;
+
+    Data->PageCode = 0xB1;
+    Data->PageLength = 0x3C; // as per spec
+
+    Data->MediumRotationRateMsb = 0;
+    Data->MediumRotationRateLsb = 1; // SSD
+
+    Srb->DataTransferLength = sizeof(VPD_BLOCK_DEVICE_CHARACTERISTICS_PAGE);
+    Srb->SrbStatus = SRB_STATUS_SUCCESS;
+}
+
 static DECLSPEC_NOINLINE VOID
 TargetInquiry(
     IN  PXENVBD_TARGET      Target,
@@ -842,6 +872,7 @@ TargetInquiry(
         case 0x80:  TargetInquiry80(Target, Srb);       break;
         case 0x83:  TargetInquiry83(Target, Srb);       break;
         case 0xB0:  TargetInquiryB0(Target, Srb);       break;
+        case 0xB1:  TargetInquiryB1(Target, Srb);       break;
         default:    Srb->SrbStatus = SRB_STATUS_ERROR;  break;
         }
     } else {
--
2.47.1.windows.2



Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech


 


Rackspace

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