storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/pkg/disk/stat_bsd.go (about) 1 //go:build darwin || dragonfly 2 // +build darwin dragonfly 3 4 /* 5 * MinIO Cloud Storage, (C) 2015-2021 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.Bsize) * (s.Blocks - reservedBlocks), 37 Free: uint64(s.Bsize) * s.Bavail, 38 Files: s.Files, 39 Ffree: s.Ffree, 40 FSType: getFSType(s.Fstypename[:]), 41 } 42 if info.Free > info.Total { 43 return info, fmt.Errorf("detected free space (%d) > total disk space (%d), fs corruption at (%s). please run 'fsck'", info.Free, info.Total, path) 44 } 45 info.Used = info.Total - info.Free 46 return info, nil 47 }