This is an implementation of Dan and Eric's idea for probing a failed O_DIRECT
open(2) call to see if the file system does not support O_DIRECT.
I wanted to see what the implementation looks like but I don't like it:
1. We still need to guess if O_DIRECT is supported in the O_CREAT EINVAL case
because we can't probe if O_CREAT | O_DIRECT | O_EXCL returned EINVAL.
2. There is a race condition between open(O_CREAT | O_EXCL | O_DIRECT) and
opening again without O_CREAT. If the file is deleted we'll get ENOENT
which would have been impossible before.
3. It's way complicated.
Issue #1 gives me an idea: why play games when we can simply warn the user?
if (ret == -1 && errno == EINVAL && (flags & O_DIRECT)) {
error_report("file system may not support O_DIRECT");
errno = EINVAL; /* in case it was clobbered */
}
I think this simple, portable approach beats statfs tmpfs and open probing.
Will send a patch for that and plan to merge it.
Stefan Hajnoczi (2):
libcacard: link against qemu-error.o for error_report()
osdep: warn if opening a file O_DIRECT on tmpfs fails
libcacard/Makefile | 3 ++-
util/osdep.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 57 insertions(+), 8 deletions(-)
--
1.8.3.1