|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Fix > 2TB disks
In order to determine the size of a disk, Windows will issue a
SCSIOP_READ_CAPACITY. Disks larger than 2TB will respond with a max LBA
of 0xFFFFFFFF, which causes Windows to issue a SCSIOP_READ_CAPACITY16.
The read capacity 16 is passed with a 12 byte buffer to be filled in
using the READ_CAPACITY_DATA_EX structure, not the 16 or 32byte
(depending on packing) READ_CAPACITY16_DATA buffer.
Also adds Error labels to the failure conditions.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvbd/target.c | 40 +++++++++++++++++++++++++++++++---------
1 file changed, 31 insertions(+), 9 deletions(-)
diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c
index e322949..4919db2 100644
--- a/src/xenvbd/target.c
+++ b/src/xenvbd/target.c
@@ -545,14 +545,14 @@ TargetReadCapacity(
Srb->SrbStatus = SRB_STATUS_ERROR;
if (Data == NULL)
- return;
+ goto fail1;
RtlZeroMemory(Data, Length);
if (Length < sizeof(READ_CAPACITY_DATA))
- return;
+ goto fail2;
if (Cdb_PMI(Srb) == 0 && Cdb_LogicalBlock(Srb) != 0)
- return;
+ goto fail3;
SectorCount = DiskInfo->SectorCount;
SectorSize = DiskInfo->SectorSize;
@@ -567,6 +567,15 @@ TargetReadCapacity(
Srb->DataTransferLength = sizeof(READ_CAPACITY_DATA);
Srb->SrbStatus = SRB_STATUS_SUCCESS;
+
+ return;
+
+fail3:
+ Error("fail3\n");
+fail2:
+ Error("fail2\n");
+fail1:
+ Error("fail1\n");
}
static DECLSPEC_NOINLINE VOID
@@ -587,14 +596,14 @@ TargetReadCapacity16(
Srb->SrbStatus = SRB_STATUS_ERROR;
if (Data == NULL)
- return;
+ goto fail1;
RtlZeroMemory(Data, Length);
- if (Length < sizeof(READ_CAPACITY16_DATA))
- return;
+ if (Length < sizeof(READ_CAPACITY_DATA_EX))
+ goto fail2;
if (Cdb_PMI(Srb) == 0 && Cdb_LogicalBlock(Srb) != 0)
- return;
+ goto fail3;
SectorCount = DiskInfo->SectorCount;
SectorSize = DiskInfo->SectorSize;
@@ -607,10 +616,23 @@ TargetReadCapacity16(
Data->LogicalBlockAddress.QuadPart = _byteswap_uint64(SectorCount - 1);
Data->BytesPerBlock = _byteswap_ulong(SectorSize);
- Data->LogicalPerPhysicalExponent = (UCHAR)LogicalPerPhysicalExponent;
- Srb->DataTransferLength = sizeof(READ_CAPACITY16_DATA);
+ if (Length == sizeof(READ_CAPACITY16_DATA))
+ Data->LogicalPerPhysicalExponent = (UCHAR)LogicalPerPhysicalExponent;
+ else
+ Length = sizeof(READ_CAPACITY_DATA_EX);
+
+ Srb->DataTransferLength = Length;
Srb->SrbStatus = SRB_STATUS_SUCCESS;
+
+ return;
+
+fail3:
+ Error("fail3\n");
+fail2:
+ Error("fail2\n");
+fail1:
+ Error("fail1\n");
}
static FORCEINLINE VOID
--
2.16.2.windows.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |