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  }