lib/file: don't run preallocate concurrently

This seems to cause file systems to get the amount of free space
wrong.
This commit is contained in:
Nick Craig-Wood 2021-02-16 16:36:27 +00:00
parent 40b58d59ad
commit b9bf91c510
2 changed files with 9 additions and 0 deletions

View File

@ -4,6 +4,7 @@ package file
import (
"os"
"sync"
"sync/atomic"
"github.com/rclone/rclone/fs"
@ -16,6 +17,7 @@ var (
unix.FALLOC_FL_KEEP_SIZE | unix.FALLOC_FL_PUNCH_HOLE, // for ZFS #3066
}
fallocFlagsIndex int32
preAllocateMu sync.Mutex
)
// PreallocateImplemented is a constant indicating whether the
@ -27,6 +29,8 @@ func PreAllocate(size int64, out *os.File) error {
if size <= 0 {
return nil
}
preAllocateMu.Lock()
defer preAllocateMu.Unlock()
index := atomic.LoadInt32(&fallocFlagsIndex)
again:
if index >= int32(len(fallocFlags)) {

View File

@ -4,6 +4,7 @@ package file
import (
"os"
"sync"
"syscall"
"unsafe"
@ -15,6 +16,7 @@ var (
ntdll = windows.NewLazySystemDLL("ntdll.dll")
ntQueryVolumeInformationFile = ntdll.NewProc("NtQueryVolumeInformationFile")
ntSetInformationFile = ntdll.NewProc("NtSetInformationFile")
preAllocateMu sync.Mutex
)
type fileAllocationInformation struct {
@ -42,6 +44,9 @@ func PreAllocate(size int64, out *os.File) error {
return nil
}
preAllocateMu.Lock()
defer preAllocateMu.Unlock()
var (
iosb ioStatusBlock
fsSizeInfo fileFsSizeInformation