From 62bcc84f6fc437e310599d4e5b4692f45bab0d4a Mon Sep 17 00:00:00 2001 From: Claudio Maradonna Date: Tue, 5 Jul 2022 18:29:14 +0200 Subject: [PATCH] vfs: add --vfs-disk-space-total-size option to manually set the total disk space Now you can specify --vfs-disk-space-total-size to set the total disk space (default to -1) fixes #3270 --- vfs/help.go | 7 +++ vfs/vfs.go | 6 +++ vfs/vfscommon/options.go | 96 ++++++++++++++++++++-------------------- vfs/vfsflags/vfsflags.go | 1 + 4 files changed, 63 insertions(+), 47 deletions(-) diff --git a/vfs/help.go b/vfs/help.go index 01382cf5a..3bb809ca8 100644 --- a/vfs/help.go +++ b/vfs/help.go @@ -307,6 +307,13 @@ If the flag is not provided on the command line, then its default value depends on the operating system where rclone runs: "true" on Windows and macOS, "false" otherwise. If the flag is provided without a value, then it is "true". +### VFS Disk Options + +This flag allows you to manually set the statistics about the filing system. +It can be useful when those statistics cannot be read correctly automatically. + + --vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1) + ### Alternate report of used bytes Some backends, most notably S3, do not report the amount of bytes used. diff --git a/vfs/vfs.go b/vfs/vfs.go index 304e23756..b6dc141b3 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -604,6 +604,7 @@ func (vfs *VFS) Statfs() (total, used, free int64) { return } } + if u := vfs.usage; u != nil { if u.Total != nil { total = *u.Total @@ -615,6 +616,11 @@ func (vfs *VFS) Statfs() (total, used, free int64) { used = *u.Used } } + + if int64(vfs.Opt.DiskSpaceTotalSize) >= 0 { + total = int64(vfs.Opt.DiskSpaceTotalSize) + } + total, used, free = fillInMissingSizes(total, used, free, unknownFreeBytes) return } diff --git a/vfs/vfscommon/options.go b/vfs/vfscommon/options.go index 5c1ae7900..c3631859a 100644 --- a/vfs/vfscommon/options.go +++ b/vfs/vfscommon/options.go @@ -10,57 +10,59 @@ import ( // Options is options for creating the vfs type Options struct { - NoSeek bool // don't allow seeking if set - NoChecksum bool // don't check checksums if set - ReadOnly bool // if set VFS is read only - NoModTime bool // don't read mod times for files - DirCacheTime time.Duration // how long to consider directory listing cache valid - PollInterval time.Duration - Umask int - UID uint32 - GID uint32 - DirPerms os.FileMode - FilePerms os.FileMode - ChunkSize fs.SizeSuffix // if > 0 read files in chunks - ChunkSizeLimit fs.SizeSuffix // if > ChunkSize double the chunk size after each chunk until reached - CacheMode CacheMode - CacheMaxAge time.Duration - CacheMaxSize fs.SizeSuffix - CachePollInterval time.Duration - CaseInsensitive bool - WriteWait time.Duration // time to wait for in-sequence write - ReadWait time.Duration // time to wait for in-sequence read - WriteBack time.Duration // time to wait before writing back dirty files - ReadAhead fs.SizeSuffix // bytes to read ahead in cache mode "full" - UsedIsSize bool // if true, use the `rclone size` algorithm for Used size - FastFingerprint bool // if set use fast fingerprints + NoSeek bool // don't allow seeking if set + NoChecksum bool // don't check checksums if set + ReadOnly bool // if set VFS is read only + NoModTime bool // don't read mod times for files + DirCacheTime time.Duration // how long to consider directory listing cache valid + PollInterval time.Duration + Umask int + UID uint32 + GID uint32 + DirPerms os.FileMode + FilePerms os.FileMode + ChunkSize fs.SizeSuffix // if > 0 read files in chunks + ChunkSizeLimit fs.SizeSuffix // if > ChunkSize double the chunk size after each chunk until reached + CacheMode CacheMode + CacheMaxAge time.Duration + CacheMaxSize fs.SizeSuffix + CachePollInterval time.Duration + CaseInsensitive bool + WriteWait time.Duration // time to wait for in-sequence write + ReadWait time.Duration // time to wait for in-sequence read + WriteBack time.Duration // time to wait before writing back dirty files + ReadAhead fs.SizeSuffix // bytes to read ahead in cache mode "full" + UsedIsSize bool // if true, use the `rclone size` algorithm for Used size + FastFingerprint bool // if set use fast fingerprints + DiskSpaceTotalSize fs.SizeSuffix } // DefaultOpt is the default values uses for Opt var DefaultOpt = Options{ - NoModTime: false, - NoChecksum: false, - NoSeek: false, - DirCacheTime: 5 * 60 * time.Second, - PollInterval: time.Minute, - ReadOnly: false, - Umask: 0, - UID: ^uint32(0), // these values instruct WinFSP-FUSE to use the current user - GID: ^uint32(0), // overridden for non windows in mount_unix.go - DirPerms: os.FileMode(0777), - FilePerms: os.FileMode(0666), - CacheMode: CacheModeOff, - CacheMaxAge: 3600 * time.Second, - CachePollInterval: 60 * time.Second, - ChunkSize: 128 * fs.Mebi, - ChunkSizeLimit: -1, - CacheMaxSize: -1, - CaseInsensitive: runtime.GOOS == "windows" || runtime.GOOS == "darwin", // default to true on Windows and Mac, false otherwise - WriteWait: 1000 * time.Millisecond, - ReadWait: 20 * time.Millisecond, - WriteBack: 5 * time.Second, - ReadAhead: 0 * fs.Mebi, - UsedIsSize: false, + NoModTime: false, + NoChecksum: false, + NoSeek: false, + DirCacheTime: 5 * 60 * time.Second, + PollInterval: time.Minute, + ReadOnly: false, + Umask: 0, + UID: ^uint32(0), // these values instruct WinFSP-FUSE to use the current user + GID: ^uint32(0), // overridden for non windows in mount_unix.go + DirPerms: os.FileMode(0777), + FilePerms: os.FileMode(0666), + CacheMode: CacheModeOff, + CacheMaxAge: 3600 * time.Second, + CachePollInterval: 60 * time.Second, + ChunkSize: 128 * fs.Mebi, + ChunkSizeLimit: -1, + CacheMaxSize: -1, + CaseInsensitive: runtime.GOOS == "windows" || runtime.GOOS == "darwin", // default to true on Windows and Mac, false otherwise + WriteWait: 1000 * time.Millisecond, + ReadWait: 20 * time.Millisecond, + WriteBack: 5 * time.Second, + ReadAhead: 0 * fs.Mebi, + UsedIsSize: false, + DiskSpaceTotalSize: -1, } // Init the options, making sure everything is withing range diff --git a/vfs/vfsflags/vfsflags.go b/vfs/vfsflags/vfsflags.go index 69efab86c..ccdcb17db 100644 --- a/vfs/vfsflags/vfsflags.go +++ b/vfs/vfsflags/vfsflags.go @@ -39,5 +39,6 @@ func AddFlags(flagSet *pflag.FlagSet) { flags.FVarP(flagSet, &Opt.ReadAhead, "vfs-read-ahead", "", "Extra read ahead over --buffer-size when using cache-mode full") flags.BoolVarP(flagSet, &Opt.UsedIsSize, "vfs-used-is-size", "", Opt.UsedIsSize, "Use the `rclone size` algorithm for Used size") flags.BoolVarP(flagSet, &Opt.FastFingerprint, "vfs-fast-fingerprint", "", Opt.FastFingerprint, "Use fast (less accurate) fingerprints for change detection") + flags.FVarP(flagSet, &Opt.DiskSpaceTotalSize, "vfs-disk-space-total-size", "", "Specify the total space of disk") platformFlags(flagSet) }