Do not attempt to fetch volume/drive information for each i/o situation. In our case we do this in all calls `posix.go` this in-turn created a terrible situation for windows. This issue does not affect the i/o path on Unix platforms since statvfs calls are in the range of micro seconds on these platforms. This verification is only needed during startup and we let things fail at a later stage on windows.
70 lines
2.3 KiB
Go
70 lines
2.3 KiB
Go
// +build windows
|
|
|
|
/*
|
|
* Minio Cloud Storage, (C) 2015 Minio, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package disk
|
|
|
|
import (
|
|
"path/filepath"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
// GetVolumeInformation provides windows drive volume information.
|
|
GetVolumeInformation = kernel32.NewProc("GetVolumeInformationW")
|
|
)
|
|
|
|
// getFSType returns the filesystem type of the underlying mounted filesystem
|
|
func getFSType(path string) string {
|
|
var volumeNameSize uint32 = 260
|
|
var nFileSystemNameSize, lpVolumeSerialNumber uint32
|
|
var lpFileSystemFlags, lpMaximumComponentLength uint32
|
|
var lpFileSystemNameBuffer, volumeName [260]byte
|
|
var ps = syscall.StringToUTF16Ptr(filepath.VolumeName(path))
|
|
|
|
// Extract values safely
|
|
// BOOL WINAPI GetVolumeInformation(
|
|
// _In_opt_ LPCTSTR lpRootPathName,
|
|
// _Out_opt_ LPTSTR lpVolumeNameBuffer,
|
|
// _In_ DWORD nVolumeNameSize,
|
|
// _Out_opt_ LPDWORD lpVolumeSerialNumber,
|
|
// _Out_opt_ LPDWORD lpMaximumComponentLength,
|
|
// _Out_opt_ LPDWORD lpFileSystemFlags,
|
|
// _Out_opt_ LPTSTR lpFileSystemNameBuffer,
|
|
// _In_ DWORD nFileSystemNameSize
|
|
// );
|
|
|
|
_, _, _ = GetVolumeInformation.Call(uintptr(unsafe.Pointer(ps)),
|
|
uintptr(unsafe.Pointer(&volumeName)),
|
|
uintptr(volumeNameSize),
|
|
uintptr(unsafe.Pointer(&lpVolumeSerialNumber)),
|
|
uintptr(unsafe.Pointer(&lpMaximumComponentLength)),
|
|
uintptr(unsafe.Pointer(&lpFileSystemFlags)),
|
|
uintptr(unsafe.Pointer(&lpFileSystemNameBuffer)),
|
|
uintptr(unsafe.Pointer(&nFileSystemNameSize)), 0)
|
|
var bytes []byte
|
|
if lpFileSystemNameBuffer[6] == 0 {
|
|
bytes = []byte{lpFileSystemNameBuffer[0], lpFileSystemNameBuffer[2],
|
|
lpFileSystemNameBuffer[4]}
|
|
} else {
|
|
bytes = []byte{lpFileSystemNameBuffer[0], lpFileSystemNameBuffer[2],
|
|
lpFileSystemNameBuffer[4], lpFileSystemNameBuffer[6]}
|
|
}
|
|
|
|
return string(bytes)
|
|
}
|