|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Fixed improper SCSI UNMAP request implementation
From: David Buches <davebuch@xxxxxxxxxx>
The XenDisk disk class filter driver was generating requests
that did not adhere to the t10 SBC-3 SCSI specification for UNMAP
operations. Specifically, the data length and block descriptor data
length fields were not populated properly per the spec.
Although the XenVBD miniport driver handled these malformed
requests correctly, it failed to handle *properly* formed requests,
which would result in unpredictable behavior.
Additionally, the XenDisk filter wasn't properly responding to
StorageDeviceTrimProperty queries per the MSDN spec. Specifically,
the DEVICE_TRIM_DESCRIPTOR::Version structure member needs to be set
to sizeof(DEVICE_TRIM_DESCRIPTOR).
Signed-off-by: David Buches <davebuch@xxxxxxxxxx>
---
src/xendisk/pdo.c | 6 +++---
src/xenvbd/pdo.c | 3 +--
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/src/xendisk/pdo.c b/src/xendisk/pdo.c
index 07f4cfd..eaa3e2d 100644
--- a/src/xendisk/pdo.c
+++ b/src/xendisk/pdo.c
@@ -401,7 +401,7 @@ PdoQueryProperty(
Trim = Irp->AssociatedIrp.SystemBuffer;
- Trim->Version = 0;
+ Trim->Version = sizeof(DEVICE_TRIM_DESCRIPTOR);
Trim->Size = sizeof(DEVICE_TRIM_DESCRIPTOR);
Trim->TrimEnabled = TRUE;
@@ -557,8 +557,8 @@ PdoSendTrimSynchronous(
Cdb->UNMAP.OperationCode = SCSIOP_UNMAP;
*(PUSHORT)Cdb->UNMAP.AllocationLength = _byteswap_ushort((USHORT)Length);
- *(PUSHORT)Unmap->DataLength = _byteswap_ushort((USHORT)Length);
- *(PUSHORT)Unmap->BlockDescrDataLength =
_byteswap_ushort((USHORT)sizeof(UNMAP_BLOCK_DESCRIPTOR));
+ *(PUSHORT)Unmap->DataLength = _byteswap_ushort((USHORT)(Length -
FIELD_OFFSET(UNMAP_LIST_HEADER, BlockDescrDataLength)));
+ *(PUSHORT)Unmap->BlockDescrDataLength =
_byteswap_ushort((USHORT)(Length - FIELD_OFFSET(UNMAP_LIST_HEADER,
Descriptors[0])));
for (Index = 0; Index < Count; ++Index) {
PUNMAP_BLOCK_DESCRIPTOR Block = &Unmap->Descriptors[Index];
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 488a74b..67800e4 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -1264,8 +1264,7 @@ PrepareUnmap(
{
PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
PUNMAP_LIST_HEADER Unmap = Srb->DataBuffer;
- ULONG Count = _byteswap_ushort(*(PUSHORT)Unmap->DataLength) /
-
_byteswap_ushort(*(PUSHORT)Unmap->BlockDescrDataLength);
+ ULONG Count =
_byteswap_ushort(*(PUSHORT)Unmap->BlockDescrDataLength) /
sizeof(UNMAP_BLOCK_DESCRIPTOR);
ULONG Index;
LIST_ENTRY List;
--
2.5.3.windows.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |