Print a warning when opening a file O_DIRECT on tmpfs fails. This saves users a lot of time trying to figure out the EINVAL error.
Daniel P. Berrange <berra...@redhat.com> suggested opening the file without O_DIRECT as a portable way to check whether the file system supports O_DIRECT. That gets messy when flags contains O_CREAT since we'd create a file but return an error - or a race condition if we try to unlink the file. It's simpler to check the file system type. Reported-by: Deepak C Shetty <deepa...@linux.vnet.ibm.com> Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> --- util/osdep.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/util/osdep.c b/util/osdep.c index 685c8ae..446a1dc 100644 --- a/util/osdep.c +++ b/util/osdep.c @@ -30,6 +30,11 @@ #include <unistd.h> #include <fcntl.h> +#ifdef __linux__ +#include <sys/vfs.h> +#include <linux/magic.h> +#endif + /* Needed early for CONFIG_BSD etc. */ #include "config-host.h" @@ -207,6 +212,20 @@ int qemu_open(const char *name, int flags, ...) } #endif +#ifdef __linux__ + /* It is not possible to open files O_DIRECT on tmpfs. Provide a hint that + * this may be the case (of course it could change in future kernel + * versions). + */ + if (ret == -1 && errno == EINVAL && (flags & O_DIRECT)) { + struct statfs st; + if (statfs(name, &st) == 0 && st.f_type == TMPFS_MAGIC) { + error_report("tmpfs file systems may not support O_DIRECT"); + } + errno = EINVAL; /* in case it was clobbered */ + } +#endif /* __linux__ */ + return ret; } -- 1.8.3.1