diff options
author | John Howard <jhoward@microsoft.com> | 2019-03-07 18:14:43 -0800 |
---|---|---|
committer | John Howard <jhoward@microsoft.com> | 2019-03-07 18:14:43 -0800 |
commit | 618140ad51e44d940c70b52350cc47304e0a9c45 (patch) | |
tree | e07b53354409ce33c52b4a8060e5348745adea19 | |
parent | c99c5643ff7f5c9ae5bdcca9051c529ca719501e (diff) | |
download | docker-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.go | 105 | ||||
-rw-r--r-- | vendor/github.com/Microsoft/go-winio/vhd/zvhd.go | 4 |
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, + ¶meters, + &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 { |