repository: C:/dev/kvm-guest-drivers-windows
branch: master
commit e1d925b37a284c97930ef20b9569edce09215757
Author: Yan Vugenfirer <[email protected]>
Date:   Mon May 17 12:46:17 2010 +0300

    [WIN-GUEST_DRIVERS] Add support for logical block size parameter in Windows 
driver and make the virtio-blk aware of read only disks
    
        Signed-off-by: Vadim Rozenfeld <[email protected]>

diff --git a/viostor/buildOne_bat b/viostor/buildOne_bat
deleted file mode 100644
index 8ecc35d..0000000
--- a/viostor/buildOne_bat
+++ /dev/null
@@ -1,13 +0,0 @@
-...@echo off
-
-if "%DDKVER%"=="" set DDKVER=7600.16385.0
-set BUILDROOT=C:\WINDDK\%DDKVER%
-
-set DDKBUILDENV=
-pushd %BUILDROOT%
-call %BUILDROOT%\bin\setenv.bat %BUILDROOT% %2 fre %1 no_oacr
-popd
-build -cZg
-
-set DDKVER=
-set BUILDROOT=
\ No newline at end of file
diff --git a/viostor/packOne.bat b/viostor/packOne.bat
index 8afd09a..bf66704 100644
--- a/viostor/packOne.bat
+++ b/viostor/packOne.bat
@@ -50,6 +50,34 @@ copy /Y %SYS_PATH_AND_NAME% .\Install\%INST_OS%\%INST_ARC%
 copy /Y %PDB_PATH_AND_NAME% .\Install\%INST_OS%\%INST_ARC%
 copy /Y %INF_PATH_AND_NAME% .\Install\%INST_OS%\%INST_ARC%\%SYS_NAME%.inf
 
+:create_cat
+echo "Setting OS mask for:" %1 %2
+
+if /i "%1"=="wlh" goto create_vista
+if /i "%1"=="win7" goto create_vista
+if /i "%1"=="wnet" goto create_xp
+if /i "%1"=="wxp" goto create_xp
+goto error_cat2inf
+
+:create_xp
+if /i "%2"=="x86" set _OSMASK_=XP_X86,Server2003_X86
+if /i "%2"=="x64" set _OSMASK_=XP_X64,Server2003_X64
+goto run_cat2inf
+
+:create_vista
+if /i "%2"=="x86" set _OSMASK_=Vista_X86,Server2008_X86,7_X86
+if /i "%2"=="x64" set _OSMASK_=Vista_X64,Server2008_X64,7_X64,Server2008R2_X64
+goto run_cat2inf
+
+:error_cat2inf 
+echo "Error setting OS mask for inf2cat"
+goto after_cat2inf
+
+:run_cat2inf
+inf2cat /driver:Install\%INST_OS%\%INST_ARC% /os:%_OSMASK_%
+
+:after_cat2inf
+
 set INST_OS=
 set INST_ARC=
 set SYS_NAME=
diff --git a/viostor/virtio_stor.c b/viostor/virtio_stor.c
index 7f9e9f1..9980a2f 100644
--- a/viostor/virtio_stor.c
+++ b/viostor/virtio_stor.c
@@ -455,8 +455,10 @@ VirtIoHwInitialize(
         VirtIODeviceGet( DeviceExtension, FIELD_OFFSET(blk_config, blk_size),
                       &v, sizeof(v));
         adaptExt->info.blk_size = v;
-        RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("VIRTIO_BLK_F_BLK_SIZE = %d\n", 
adaptExt->info.blk_size));
+    } else {
+        adaptExt->info.blk_size = SECTOR_SIZE;
     }
+    RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("VIRTIO_BLK_F_BLK_SIZE = %d\n", 
adaptExt->info.blk_size));
 
     if (CHECKBIT(adaptExt->features, VIRTIO_BLK_F_GEOMETRY)) {
         VirtIODeviceGet( DeviceExtension, FIELD_OFFSET(blk_config, geometry),
@@ -476,19 +478,19 @@ VirtIoHwInitialize(
     if(CHECKBIT(adaptExt->features, VIRTIO_BLK_F_TOPOLOGY)) {
         VirtIODeviceGet( DeviceExtension, FIELD_OFFSET(blk_config, 
physical_block_exp),
                       &adaptExt->info.physical_block_exp, 
sizeof(adaptExt->info.physical_block_exp));
-        RhelDbgPrint(TRACE_LEVEL_ERROR, ("physical_block_exp = %d\n", 
adaptExt->info.physical_block_exp));
+        RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("physical_block_exp = %d\n", 
adaptExt->info.physical_block_exp));
 
         VirtIODeviceGet( DeviceExtension, FIELD_OFFSET(blk_config, 
alignment_offset),
                       &adaptExt->info.alignment_offset, 
sizeof(adaptExt->info.alignment_offset));
-        RhelDbgPrint(TRACE_LEVEL_ERROR, ("alignment_offset = %d\n", 
adaptExt->info.alignment_offset));
+        RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("alignment_offset = %d\n", 
adaptExt->info.alignment_offset));
 
         VirtIODeviceGet( DeviceExtension, FIELD_OFFSET(blk_config, 
min_io_size),
                       &adaptExt->info.min_io_size, 
sizeof(adaptExt->info.min_io_size));
-        RhelDbgPrint(TRACE_LEVEL_ERROR, ("min_io_size = %d\n", 
adaptExt->info.min_io_size));
+        RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("min_io_size = %d\n", 
adaptExt->info.min_io_size));
 
         VirtIODeviceGet( DeviceExtension, FIELD_OFFSET(blk_config, 
opt_io_size),
                       &adaptExt->info.opt_io_size, 
sizeof(adaptExt->info.opt_io_size));
-        RhelDbgPrint(TRACE_LEVEL_ERROR, ("opt_io_size = %d\n", 
adaptExt->info.opt_io_size));
+        RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("opt_io_size = %d\n", 
adaptExt->info.opt_io_size));
       
     }
 
@@ -591,8 +593,9 @@ VirtIoStartIo(
             readCap = (PREAD_CAPACITY_DATA)Srb->DataBuffer;
             readCapEx = (PREAD_CAPACITY_DATA_EX)Srb->DataBuffer;
 
-            lastLBA = (adaptExt->info.capacity >> 
adaptExt->info.physical_block_exp) - 1;
-            blocksize = adaptExt->info.size_max * (1 << 
adaptExt->info.physical_block_exp);
+            blocksize = adaptExt->info.blk_size;
+            lastLBA = adaptExt->info.capacity / (blocksize / SECTOR_SIZE) - 1;
+
             if (Srb->DataTransferLength == sizeof(READ_CAPACITY_DATA)) {
                 if (lastLBA > 0xFFFFFFFF) {
                     readCap->LogicalBlockAddress = (ULONG)-1;
@@ -1033,6 +1036,10 @@ RhelScsiGetModeSense(
         memset(header, 0, sizeof(MODE_PARAMETER_HEADER));
         header->DeviceSpecificParameter = MODE_DSP_FUA_SUPPORTED;
 
+        if (CHECKBIT(adaptExt->features, VIRTIO_BLK_F_RO)) {
+           header->DeviceSpecificParameter |= MODE_DSP_WRITE_PROTECT;
+        }
+
         ModeSenseDataLen -= sizeof(MODE_PARAMETER_HEADER);
         if (ModeSenseDataLen >= sizeof(MODE_CACHING_PAGE)) {
 
@@ -1065,6 +1072,10 @@ RhelScsiGetModeSense(
         memset(header, 0, sizeof(MODE_PARAMETER_HEADER));
         header->DeviceSpecificParameter = MODE_DSP_FUA_SUPPORTED;
 
+        if (CHECKBIT(adaptExt->features, VIRTIO_BLK_F_RO)) {
+           header->DeviceSpecificParameter |= MODE_DSP_WRITE_PROTECT;
+        }
+
         ModeSenseDataLen -= sizeof(MODE_PARAMETER_HEADER);
         if (ModeSenseDataLen >= sizeof(MODE_PARAMETER_BLOCK)) {
 
diff --git a/viostor/virtio_stor_hw_helper.c b/viostor/virtio_stor_hw_helper.c
index ed2e5d2..8060fa8 100644
--- a/viostor/virtio_stor_hw_helper.c
+++ b/viostor/virtio_stor_hw_helper.c
@@ -269,5 +269,5 @@ RhelGetLba(
         }
     }
 
-    return (lba.AsULongLong << adaptExt->info.physical_block_exp);
+    return (lba.AsULongLong * (adaptExt->info.blk_size / SECTOR_SIZE));
 }
--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to