zfs/scripts
Brian Behlendorf a584ef2605
Direct IO support
Direct IO via the O_DIRECT flag was originally introduced in XFS by
IRIX for database workloads. Its purpose was to allow the database
to bypass the page and buffer caches to prevent unnecessary IO
operations (e.g.  readahead) while preventing contention for system
memory between the database and kernel caches.

On Illumos, there is a library function called directio(3C) that
allows user space to provide a hint to the file system that Direct IO
is useful, but the file system is free to ignore it. The semantics
are also entirely a file system decision. Those that do not
implement it return ENOTTY.

Since the semantics were never defined in any standard, O_DIRECT is
implemented such that it conforms to the behavior described in the
Linux open(2) man page as follows.

    1.  Minimize cache effects of the I/O.

    By design the ARC is already scan-resistant which helps mitigate
    the need for special O_DIRECT handling.  Data which is only
    accessed once will be the first to be evicted from the cache.
    This behavior is in consistent with Illumos and FreeBSD.

    Future performance work may wish to investigate the benefits of
    immediately evicting data from the cache which has been read or
    written with the O_DIRECT flag.  Functionally this behavior is
    very similar to applying the 'primarycache=metadata' property
    per open file.

    2. O_DIRECT _MAY_ impose restrictions on IO alignment and length.

    No additional alignment or length restrictions are imposed.

    3. O_DIRECT _MAY_ perform unbuffered IO operations directly
       between user memory and block device.

    No unbuffered IO operations are currently supported.  In order
    to support features such as transparent compression, encryption,
    and checksumming a copy must be made to transform the data.

    4. O_DIRECT _MAY_ imply O_DSYNC (XFS).

    O_DIRECT does not imply O_DSYNC for ZFS.  Callers must provide
    O_DSYNC to request synchronous semantics.

    5. O_DIRECT _MAY_ disable file locking that serializes IO
       operations.  Applications should avoid mixing O_DIRECT
       and normal IO or mmap(2) IO to the same file.  This is
       particularly true for overlapping regions.

    All I/O in ZFS is locked for correctness and this locking is not
    disabled by O_DIRECT.  However, concurrently mixing O_DIRECT,
    mmap(2), and normal I/O on the same file is not recommended.

This change is implemented by layering the aops->direct_IO operations
on the existing AIO operations.  Code already existed in ZFS on Linux
for bypassing the page cache when O_DIRECT is specified.

References:
  * http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide/tmp/en-US/html/ch02s09.html
  * https://blogs.oracle.com/roch/entry/zfs_and_directio
  * https://ext4.wiki.kernel.org/index.php/Clarifying_Direct_IO's_Semantics
  * https://illumos.org/man/3c/directio

Reviewed-by: Richard Elling <Richard.Elling@RichardElling.com>
Signed-off-by: Richard Yao <ryao@gentoo.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #224 
Closes #7823
2018-08-27 10:04:21 -07:00
..
zfs-images@3331601f6d Add zimport.sh compatibility test script 2014-02-21 12:10:31 -08:00
.gitignore Remove autotools products 2012-08-27 11:47:44 -07:00
Makefile.am Update build system and packaging 2018-05-29 16:00:33 -07:00
commitcheck.sh Direct IO support 2018-08-27 10:04:21 -07:00
common.sh.in ZTS: Adopt OpenZFS test analysis script 2018-06-20 14:03:13 -07:00
cstyle.pl OpenZFS 8794 - cstyle generates warnings with recent perl 2017-12-19 12:54:08 -08:00
dkms.mkconf Update build system and packaging 2018-05-29 16:00:33 -07:00
dkms.postbuild Retire legacy test infrastructure 2017-08-15 17:26:38 -07:00
enum-extract.pl Fix free memory calculation on v3.14+ 2018-02-23 08:50:06 -08:00
kmodtool Update build system and packaging 2018-05-29 16:00:33 -07:00
paxcheck.sh Enable shellcheck to run for select scripts 2017-03-09 10:20:15 -08:00
zfs-helpers.sh Adopt pyzfs from ClusterHQ 2018-05-01 10:33:35 -07:00
zfs-tests.sh ZTS: Adopt OpenZFS test analysis script 2018-06-20 14:03:13 -07:00
zfs.sh OpenZFS 9330 - stack overflow when creating a deeply nested dataset 2018-07-09 13:02:50 -07:00
zfs2zol-patch.sed Add libtpool (thread pools) 2017-08-09 15:31:08 -07:00
zimport.sh Update build system and packaging 2018-05-29 16:00:33 -07:00
zloop.sh Extend zloop.sh for automated testing 2018-01-25 13:42:34 -08:00
zol2zfs-patch.sed Add a script to change file names when upstreaming to OpenZFS/illumos 2016-09-29 21:01:50 -07:00