Stefan Hajnoczi <stefa...@redhat.com> writes: > Print a warning when opening a file O_DIRECT on tmpfs fails. This saves
Only when it fails with EINVAL, actually. Suggest "on tmpfs fails with EINVAL." > 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; > } In theory, the warning could be misleading, because we can get EINVAL for reasons not related to flags & O_DIRECT. In practice, the warning probably does much more good than harm.