summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Howard <jhoward@microsoft.com>2019-03-07 18:14:43 -0800
committerJohn Howard <jhoward@microsoft.com>2019-03-07 18:14:43 -0800
commit618140ad51e44d940c70b52350cc47304e0a9c45 (patch)
treee07b53354409ce33c52b4a8060e5348745adea19
parentc99c5643ff7f5c9ae5bdcca9051c529ca719501e (diff)
downloaddocker-618140ad51e44d940c70b52350cc47304e0a9c45.tar.gz
Hack for go-winio vhd flushing vendorme
Signed-off-by: John Howard <jhoward@microsoft.com>
-rw-r--r--vendor/github.com/Microsoft/go-winio/vhd/vhd.go105
-rw-r--r--vendor/github.com/Microsoft/go-winio/vhd/zvhd.go4
2 files changed, 102 insertions, 7 deletions
diff --git a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go b/vendor/github.com/Microsoft/go-winio/vhd/vhd.go
index 8fa90e917c..b9f93ce168 100644
--- a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go
+++ b/vendor/github.com/Microsoft/go-winio/vhd/vhd.go
@@ -2,12 +2,15 @@
package vhd
-import "syscall"
+import (
+ "syscall"
+ "unsafe"
+)
//go:generate go run mksyscall_windows.go -output zvhd.go vhd.go
//sys createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.CreateVirtualDisk
-//sys openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *uintptr, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.OpenVirtualDisk
+//sys openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.OpenVirtualDisk
//sys detachVirtualDisk(handle syscall.Handle, flags uint32, providerSpecificFlags uint32) (err error) [failretval != 0] = VirtDisk.DetachVirtualDisk
type virtualStorageType struct {
@@ -31,7 +34,24 @@ const createVirtualDiskFlagFullPhysicalAllocation uint32 = 1
const createVirtualDiskFlagPreventWritesToSourceDisk uint32 = 2
const createVirtualDiskFlagDoNotCopyMetadataFromParent uint32 = 4
-type version2 struct {
+const openVirtualDiskFlagNONE uint32 = 0
+const openVirtualDiskFlagNOPARENTS uint32 = 0x1
+const openVirtualDiskFlagBLANKFILE uint32 = 0x2
+const openVirtualDiskFlagBOOTDRIVE uint32 = 0x4
+const openVirtualDiskFlagCACHEDIO uint32 = 0x8
+const openVirtualDiskFlagCUSTOMDIFFCHAIN uint32 = 0x10
+const openVirtualDiskFlagPARENTCACHEDIO uint32 = 0x20
+const openVirtualDiskFlagVHDSETFILEONLY uint32 = 0x40
+const openVirtualDiskFlagIGNORERELATIVEPARENTLOCATOR uint32 = 0x80
+const openVirtualDiskFlagNOWRITEHARDENING uint32 = 0x100
+
+const vhdWriteCacheModeCacheMetadata uint16 = 0
+const vhdWriteCacheModeWriteInternalMetadata uint16 = 1
+const vhdWriteCacheModeWriteMetadata uint16 = 2
+const vhdWriteCacheModeCommitAll uint16 = 3
+const vhdWriteCacheModeDisableFlushing uint16 = 4
+
+type createVersion2 struct {
UniqueID [16]byte // GUID
MaximumSize uint64
BlockSizeInBytes uint32
@@ -46,7 +66,23 @@ type version2 struct {
type createVirtualDiskParameters struct {
Version uint32 // Must always be set to 2
- Version2 version2
+ Version2 createVersion2
+}
+
+type openVersion2 struct {
+ GetInfoOnly bool
+ ReadOnly bool
+ ResiliencyGUID [16]byte // GUID
+}
+
+type openVirtualDiskParameters struct {
+ Version uint32 // Must always be set to 2
+ Version2 openVersion2
+}
+
+type storageSetSurfaceCachePolicyRequest struct {
+ RequestLevel uint32
+ CacheMode uint16
}
// CreateVhdx will create a simple vhdx file at the given path using default values.
@@ -55,7 +91,7 @@ func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error {
parameters := createVirtualDiskParameters{
Version: 2,
- Version2: version2{
+ Version2: createVersion2{
MaximumSize: uint64(maxSizeInGb) * 1024 * 1024 * 1024,
BlockSizeInBytes: blockSizeInMb * 1024 * 1024,
},
@@ -106,3 +142,62 @@ func DetachVhd(path string) error {
}
return nil
}
+
+// VhdWriteCacheModeDisableFlushing sets a VHDs surface cache policy to disable flushing.
+// It returns a handle which should be kept open during (for example) container start,
+// and restored using VhdWriteCacheModeCacheMetadata.
+func VhdWriteCacheModeDisableFlushing(path string) (syscall.Handle, error) {
+ handle, err := openVhd(path)
+ if err != nil {
+ return 0, err
+ }
+ if err := ioctlStorageSetSurfaceCachePolicy(handle, vhdWriteCacheModeDisableFlushing); err != nil {
+ syscall.CloseHandle(handle)
+ return 0, err
+ }
+ return handle, nil
+}
+
+// VhdWriteCacheModeCacheMetadata sets a VHDs surface cache policy to cache metadata
+func VhdWriteCacheModeCacheMetadata(handle syscall.Handle) error {
+ return ioctlStorageSetSurfaceCachePolicy(handle, vhdWriteCacheModeDisableFlushing)
+}
+
+// openVhd is a wrapper for getting a handle to a VHD.
+func openVhd(path string) (syscall.Handle, error) {
+ var (
+ defaultType virtualStorageType
+ handle syscall.Handle
+ )
+ parameters := openVirtualDiskParameters{Version: 2}
+
+ if err := openVirtualDisk(
+ &defaultType,
+ path,
+ virtualDiskAccessNONE,
+ openVirtualDiskFlagCACHEDIO|openVirtualDiskFlagIGNORERELATIVEPARENTLOCATOR,
+ &parameters,
+ &handle); err != nil {
+ return 0, err
+ }
+
+ return handle, nil
+}
+
+func ioctlStorageSetSurfaceCachePolicy(handle syscall.Handle, cacheMode uint16) error {
+ request := storageSetSurfaceCachePolicyRequest{
+ RequestLevel: 1,
+ CacheMode: cacheMode,
+ }
+ const storageSetSurfaceCachePolicy uint32 = 0x2d1a10
+ var bytesReturned uint32
+ return syscall.DeviceIoControl(
+ handle,
+ storageSetSurfaceCachePolicy,
+ (*byte)(unsafe.Pointer(&request)),
+ uint32(unsafe.Sizeof(request)),
+ nil,
+ 0,
+ &bytesReturned,
+ nil)
+}
diff --git a/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go b/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go
index 73f52596ed..00599ea497 100644
--- a/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go
+++ b/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go
@@ -65,7 +65,7 @@ func _createVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, vi
return
}
-func openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *uintptr, handle *syscall.Handle) (err error) {
+func openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) {
var _p0 *uint16
_p0, err = syscall.UTF16PtrFromString(path)
if err != nil {
@@ -74,7 +74,7 @@ func openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtua
return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, flags, parameters, handle)
}
-func _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, flags uint32, parameters *uintptr, handle *syscall.Handle) (err error) {
+func _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) {
r1, _, e1 := syscall.Syscall6(procOpenVirtualDisk.Addr(), 6, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(flags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle)))
if r1 != 0 {
if e1 != 0 {