storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/pkg/disk/stat_linux.go (about) 1 //go:build linux && !s390x && !arm && !386 2 // +build linux,!s390x,!arm,!386 3 4 /* 5 * MinIO Cloud Storage, (C) 2015, 2016, 2017 MinIO, Inc. 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 */ 19 20 package disk 21 22 import ( 23 "fmt" 24 "syscall" 25 ) 26 27 // GetInfo returns total and free bytes available in a directory, e.g. `/`. 28 func GetInfo(path string) (info Info, err error) { 29 s := syscall.Statfs_t{} 30 err = syscall.Statfs(path, &s) 31 if err != nil { 32 return Info{}, err 33 } 34 reservedBlocks := s.Bfree - s.Bavail 35 info = Info{ 36 Total: uint64(s.Frsize) * (s.Blocks - reservedBlocks), 37 Free: uint64(s.Frsize) * s.Bavail, 38 Files: s.Files, 39 Ffree: s.Ffree, 40 FSType: getFSType(int64(s.Type)), 41 } 42 // Check for overflows. 43 // https://github.com/minio/minio/issues/8035 44 // XFS can show wrong values at times error out 45 // in such scenarios. 46 if info.Free > info.Total { 47 return info, fmt.Errorf("detected free space (%d) > total disk space (%d), fs corruption at (%s). please run 'fsck'", info.Free, info.Total, path) 48 } 49 info.Used = info.Total - info.Free 50 return info, nil 51 }