fdatasync: new module
authorEric Blake <eblake@redhat.com>
Fri, 16 Sep 2011 15:59:23 +0000 (09:59 -0600)
committerEric Blake <eblake@redhat.com>
Fri, 16 Sep 2011 17:18:56 +0000 (11:18 -0600)
commit64da7b6c00400c0a5e5b02df98faec97c0954a3c
tree7f5dacf7c2c31dab750f2889ef58ff6f20db2291
parent9a0a67e426f31b06f0e3f202618094f6f582c5db
fdatasync: new module

At least libvirt would like to use the lighter-weight fdatasync
on platforms where it is supported, while still guaranteeing full
sync (via the heavy-weight fsync fallback) on all platforms.

I've got an open question to the Austin Group, since the POSIX 2008
wording is self-contradictory (unlike fsync, fdatasync requires
EBADF on non-writable fds, but still mentions that read() errors
must be propagated).  I can see how fsync() would affect atime after
read() while fdatasync() can skip that, explaining why fdatasync()
might have the EBADF requirement, but on the other hand, that prevents
an implementation (like ours) where fdatasync is a straight alias of
fsync.  At any rate, glibc allows fdatasync on read-only fds.

* modules/fsync (Description): Document difference to fdatasync.
* modules/fdatasync: New module.
* m4/fdatasync.m4 (gl_FUNC_FDATASYNC): New file.
* lib/fdatasync.c (fdatasync): Likewise.
* m4/unistd_h.m4 (gl_UNISTD_H, gl_UNISTD_H_DEFAULTS): Set up
defaults.
* modules/unistd (Makefile.am): Set witnesses.
* lib/unistd.in.h (fdatasync): Declare.
* MODULES.html.sh: Document it.
* doc/posix-functions/fdatasync.texi (fdatasync): Likewise.
* modules/fdatasync-tests: New test.
* tests/test-fdatasync.c: Likewise.

Signed-off-by: Eric Blake <eblake@redhat.com>
12 files changed:
ChangeLog
MODULES.html.sh
doc/posix-functions/fdatasync.texi
lib/fdatasync.c [new file with mode: 0644]
lib/unistd.in.h
m4/fdatasync.m4 [new file with mode: 0644]
m4/unistd_h.m4
modules/fdatasync [new file with mode: 0644]
modules/fdatasync-tests [new file with mode: 0644]
modules/fsync
modules/unistd
tests/test-fdatasync.c [new file with mode: 0644]