mirror_zfs/module/os/linux/zfs
adilger f734301d22
linux: add basic fallocate(mode=0/2) compatibility
Implement semi-compatible functionality for mode=0 (preallocation)
and mode=FALLOC_FL_KEEP_SIZE (preallocation beyond EOF) for ZPL.

Since ZFS does COW and snapshots, preallocating blocks for a file
cannot guarantee that writes to the file will not run out of space.
Even if the first overwrite was guaranteed, it would not handle any
later overwrite of blocks due to COW, so strict compliance is futile.
Instead, make a best-effort check that at least enough free space is
currently available in the pool (with a bit of margin), then create
a sparse file of the requested size and continue on with life.

This does not handle all cases (e.g. several fallocate() calls before
writing into the files when the filesystem is nearly full), which
would require a more complex mechanism to be implemented, probably
based on a modified version of dmu_prealloc(), but is usable as-is.

A new module option zfs_fallocate_reserve_percent is used to control
the reserve margin for any single fallocate call.  By default, this
is 110% of the requested preallocation size, so an additional 10% of
available space is reserved for overhead to allow the application a
good chance of finishing the write when the fallocate() succeeds.
If the heuristics of this basic fallocate implementation are not
desirable, the old non-functional behavior of returning EOPNOTSUPP
for calls can be restored by setting zfs_fallocate_reserve_percent=0.

The parameter of zfs_statvfs() is changed to take an inode instead
of a dentry, since no dentry is available in zfs_fallocate_common().

A few tests from @behlendorf cover basic fallocate functionality.

Reviewed-by: Richard Laager <rlaager@wiktel.com>
Reviewed-by: Arshad Hussain <arshad.super@gmail.com>
Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Co-authored-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Andreas Dilger <adilger@dilger.ca>
Issue #326
Closes #10408
2020-06-18 11:22:11 -07:00
..
abd_os.c Add abd_cache_reap_now for abd_chunk_cache users 2020-06-17 21:44:13 -07:00
arc_os.c Don't ignore zfs_arc_max below allmem/32 2020-04-09 15:39:48 -07:00
Makefile.in Cleanup linux module kbuild files 2020-06-10 09:24:15 -07:00
mmp_os.c Add zfs_file_* interface, remove vnodes 2019-11-21 09:32:57 -08:00
policy.c Add zfs_file_* interface, remove vnodes 2019-11-21 09:32:57 -08:00
qat_compress.c Fix QAT allocation failure return value 2020-01-06 11:17:53 -08:00
qat_crypt.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
qat.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
spa_misc_os.c Make spa_history_zone platform-dependent in kernel 2020-03-02 09:43:30 -08:00
spa_stats.c Trim L2ARC 2020-06-09 10:15:08 -07:00
trace.c Enable use of DTRACE_PROBE* macros in "spl" module 2019-11-01 13:13:43 -07:00
vdev_disk.c Make struct vdev_disk_t be platform private 2020-06-16 11:43:33 -07:00
vdev_file.c Mark Linux fallocate extensions as specific to Linux 2019-11-30 15:40:22 -08:00
zfs_acl.c OpenZFS 6765 - zfs_zaccess_delete() comments do not accurately 2020-04-30 11:24:55 -07:00
zfs_ctldir.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zfs_debug.c Linux 5.6 compat: time_t 2020-02-27 09:31:02 -08:00
zfs_dir.c Add 'zfs wait' command 2020-04-01 10:02:06 -07:00
zfs_file_os.c Re-share zfsdev_getminor and zfs_onexit_fd_hold 2020-02-28 14:50:32 -08:00
zfs_ioctl_os.c Restore support for in-kernel ZFS ioctls 2020-06-08 13:57:22 -07:00
zfs_sysfs.c Persistent L2ARC 2020-04-10 10:33:35 -07:00
zfs_vfsops.c linux: add basic fallocate(mode=0/2) compatibility 2020-06-18 11:22:11 -07:00
zfs_vnops.c OpenZFS 3254 - add support in zfs for aclmode=restricted 2020-04-30 11:23:59 -07:00
zfs_znode.c Make zfs_replay.c work on FreeBSD 2019-12-13 07:54:10 -08:00
zio_crypt.c Linux 4.14, 4.19, 5.0+ compat: SIMD save/restore 2019-10-24 10:17:33 -07:00
zpl_ctldir.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_export.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_file.c linux: add basic fallocate(mode=0/2) compatibility 2020-06-18 11:22:11 -07:00
zpl_inode.c Linux 5.6 compat: timestamp_truncate() 2020-02-07 11:04:32 -08:00
zpl_super.c linux: add basic fallocate(mode=0/2) compatibility 2020-06-18 11:22:11 -07:00
zpl_xattr.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zvol_os.c Connect dataset_kstats for FreeBSD 2020-06-05 17:17:02 -07:00