On Fri, Aug 3, 2018 at 10:28 PM Nir Soffer <nirsof@gmail.com> wrote:
This is the third version to support efficient zero for block devices
on older kernels (e.g. RHEL 7.5), and file systems that do not support
yet FALLOC_FS_ZERO_RANGE (e.g. NFS 4.2).

Changes since v2:
- Revert file_can_trim change, since it is too late to change the value
  after negotiation. Changing the capability dinamically may be useful
  internally, but it should be done via other means.
- Do not depend on FALLOC_FL_* when including <linux/fs.h>.
- Add common/includes/isaligned.h for is_aligned helper, implemented
  in a more efficient way with bitwise math.
- If getting sector size fail, fall back to safe guess instead of
  hard failure.
- More efficient alignment check using bitwise math.
- For BLKZEROOUT, treat ENOTTY as EOPNOTSUPP. Theoretically possible
  with a mix of new headers and old or strangely configured kernel.
- Use default multi line comment style.
- Fix few typos in comments and commit message

Issues to explore later:
- Eric suggested to use the new FALLOC_FL_NO_HIDE_STALE. Requires
  benchmarking with a system supporting this flag.
- Eric suggested to use tri-state for can_* flags. I don't see a need at
  this point.
- Eric suggested to add can_zero. I'm not sure about the semantics of
  this, and it has the same issue of can_trim, reporting dynamic value.

v2 was here:

Changes since v1:
- Split to smaller patches
- Skip linux only includes on other systems
- Skip code using BLKZEROOUT if the macro is not defined
- Try BLKZEROOUT only if the offset and count are aligned to device
  sector size.
- initialize h->can_* properly. Before they were uninitialized if
  FALLOC_FL_* macros were not defined.
- Use new h->can_punch_hole in file_can_trim, so now we report the
  actual capability once we detected it.
- Use h->can_punch_hole in file_trim, so we try only once if the
  operation is not supported.

v1 was here:

Nir Soffer (4):
  file: Avoid unsupported fallocate() calls
  file: Support zero without ZERO_RANGE
  common: Add isaligned helper module
  file: Zero for block devices on old kernels

 common/include/isaligned.h |  50 ++++++++++
 plugins/file/Makefile.am   |   3 +-
 plugins/file/file.c        | 182 +++++++++++++++++++++++++++++--------
 3 files changed, 196 insertions(+), 39 deletions(-)
 create mode 100644 common/include/isaligned.h