On 03/13/2013 07:11 PM, Phillip Susi wrote:
> If anyone is going to use it then it may be worth the bother.
MIT Kerberos relies on fsync (invalid_fd) returning -1,
so I suppose it's worth the bother.
Here's a proposed patch, to libeatmydata.
I haven't tested it.
=== modified file 'libeatmydata/libeatmydata.c'
--- libeatmydata/libeatmydata.c 2012-09-26 06:57:32 +0000
+++ libeatmydata/libeatmydata.c 2013-03-14 06:32:16 +0000
@@ -79,6 +79,11 @@
#endif
}
+static int validate_fd(int fd)
+{
+ return fcntl(fd, F_GETFD) < 0 ? -1 : 0;
+}
+
static int eatmydata_is_hungry(void)
{
/* Init here, as it is called before any libc functions */
@@ -103,10 +108,8 @@
int LIBEATMYDATA_API fsync(int fd)
{
- if (eatmydata_is_hungry()) {
- errno= 0;
- return 0;
- }
+ if (eatmydata_is_hungry())
+ return validate_fd(fd);
return (*libc_fsync)(fd);
}
@@ -148,10 +151,8 @@
int LIBEATMYDATA_API fdatasync(int fd)
{
- if (eatmydata_is_hungry()) {
- errno= 0;
- return 0;
- }
+ if (eatmydata_is_hungry())
+ return validate_fd(fd);
return (*libc_fdatasync)(fd);
}
@@ -169,10 +170,10 @@
#ifdef HAVE_SYNC_FILE_RANGE
int sync_file_range(int fd, off64_t offset, off64_t nbytes, unsigned int flags)
{
- if (eatmydata_is_hungry()) {
- errno= 0;
- return 0;
- }
+ if (eatmydata_is_hungry())
+ flags &= ~ (SYNC_FILE_RANGE_WAIT_BEFORE
+ | SYNC_FILE_RANGE_WRITE
+ | SYNC_FILE_RANGE_WAIT_AFTER);
return (libc_sync_file_range)(fd, offset, nbytes, flags);
}