github.com/minio/minio@v0.0.0-20240328213742-3f72439b8a27/internal/disk/directio_unix.go (about) 1 //go:build !windows && !darwin && !openbsd && !plan9 2 // +build !windows,!darwin,!openbsd,!plan9 3 4 // Copyright (c) 2015-2023 MinIO, Inc. 5 // 6 // This file is part of MinIO Object Storage stack 7 // 8 // This program is free software: you can redistribute it and/or modify 9 // it under the terms of the GNU Affero General Public License as published by 10 // the Free Software Foundation, either version 3 of the License, or 11 // (at your option) any later version. 12 // 13 // This program is distributed in the hope that it will be useful 14 // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 // GNU Affero General Public License for more details. 17 // 18 // You should have received a copy of the GNU Affero General Public License 19 // along with this program. If not, see <http://www.gnu.org/licenses/>. 20 21 package disk 22 23 import ( 24 "os" 25 "syscall" 26 27 "github.com/ncw/directio" 28 "golang.org/x/sys/unix" 29 ) 30 31 // ODirectPlatform indicates if the platform supports O_DIRECT 32 const ODirectPlatform = true 33 34 // OpenFileDirectIO - bypass kernel cache. 35 func OpenFileDirectIO(filePath string, flag int, perm os.FileMode) (*os.File, error) { 36 return directio.OpenFile(filePath, flag, perm) 37 } 38 39 // DisableDirectIO - disables directio mode. 40 func DisableDirectIO(f *os.File) error { 41 fd := f.Fd() 42 flag, err := unix.FcntlInt(fd, unix.F_GETFL, 0) 43 if err != nil { 44 return err 45 } 46 flag &= ^(syscall.O_DIRECT) 47 _, err = unix.FcntlInt(fd, unix.F_SETFL, flag) 48 return err 49 } 50 51 // AlignedBlock - pass through to directio implementation. 52 func AlignedBlock(blockSize int) []byte { 53 return directio.AlignedBlock(blockSize) 54 }