storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/pkg/disk/directio_unix.go (about) 1 //go:build linux || netbsd || freebsd 2 // +build linux netbsd freebsd 3 4 /* 5 * Minio Cloud Storage, (C) 2019-2020 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 "os" 24 "syscall" 25 26 "github.com/ncw/directio" 27 "golang.org/x/sys/unix" 28 ) 29 30 // OpenFileDirectIO - bypass kernel cache. 31 func OpenFileDirectIO(filePath string, flag int, perm os.FileMode) (*os.File, error) { 32 return directio.OpenFile(filePath, flag, perm) 33 } 34 35 // DisableDirectIO - disables directio mode. 36 func DisableDirectIO(f *os.File) error { 37 fd := f.Fd() 38 flag, err := unix.FcntlInt(fd, unix.F_GETFL, 0) 39 if err != nil { 40 return err 41 } 42 flag = flag & ^(syscall.O_DIRECT) 43 _, err = unix.FcntlInt(fd, unix.F_SETFL, flag) 44 return err 45 } 46 47 // AlignedBlock - pass through to directio implementation. 48 func AlignedBlock(BlockSize int) []byte { 49 return directio.AlignedBlock(BlockSize) 50 }