|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 5/5] Report Inquiry 0xB0 BlockLimits
From: Owen Smith <owen.smith@xxxxxxxxxx>
Reports discard-alignment and discard-granularity
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvbd/target.c | 39 ++++++++++++++++++++++++++++++++++++---
1 file changed, 36 insertions(+), 3 deletions(-)
diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c
index 0956662..cb92026 100644
--- a/src/xenvbd/target.c
+++ b/src/xenvbd/target.c
@@ -669,15 +669,16 @@ TargetInquiry00(
return;
RtlZeroMemory(Data, Length);
- if (Length < 7)
+ if (Length < 8)
return;
- Data->PageLength = 3;
+ Data->PageLength = 4;
Data->SupportedPageList[0] = 0x00;
Data->SupportedPageList[1] = 0x80;
Data->SupportedPageList[2] = 0x83;
+ Data->SupportedPageList[3] = 0xB0;
- Srb->DataTransferLength = 7;
+ Srb->DataTransferLength = 8;
Srb->SrbStatus = SRB_STATUS_SUCCESS;
}
@@ -776,6 +777,37 @@ TargetInquiry83(
Srb->SrbStatus = SRB_STATUS_SUCCESS;
}
+static FORCEINLINE VOID
+TargetInquiryB0(
+ IN PXENVBD_TARGET Target,
+ IN PSCSI_REQUEST_BLOCK Srb
+ )
+{
+ PXENVBD_DISKINFO DiskInfo = FrontendGetDiskInfo(Target->Frontend);
+ PVPD_BLOCK_LIMITS_PAGE Data = Srb->DataBuffer;
+ ULONG Length = Srb->DataTransferLength;
+
+ Srb->SrbStatus = SRB_STATUS_ERROR;
+
+ if (Data == NULL)
+ return;
+ RtlZeroMemory(Data, Length);
+
+ if (Length < sizeof(VPD_BLOCK_LIMITS_PAGE))
+ return;
+
+ Data->PageCode = 0xB0;
+ Data->PageLength[1] = 0x3C; // as per spec
+
+ *(PULONG)Data->OptimalUnmapGranularity =
_byteswap_ulong(DiskInfo->DiscardGranularity);
+ *(PULONG)Data->UnmapGranularityAlignment =
_byteswap_ulong(DiskInfo->DiscardAlignment);
+ // alignment is only valid if a granularity has been set
+ Data->UGAValid = (DiskInfo->DiscardGranularity != 0) ? 1 : 0;
+
+ Srb->DataTransferLength = sizeof(VPD_BLOCK_LIMITS_PAGE);
+ Srb->SrbStatus = SRB_STATUS_SUCCESS;
+}
+
static DECLSPEC_NOINLINE VOID
TargetInquiry(
IN PXENVBD_TARGET Target,
@@ -787,6 +819,7 @@ TargetInquiry(
case 0x00: TargetInquiry00(Target, Srb); break;
case 0x80: TargetInquiry80(Target, Srb); break;
case 0x83: TargetInquiry83(Target, Srb); break;
+ case 0xB0: TargetInquiryB0(Target, Srb); break;
default: Srb->SrbStatus = SRB_STATUS_ERROR; break;
}
} else {
--
2.8.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |