From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46795) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VC7VA-0003m0-1A for qemu-devel@nongnu.org; Wed, 21 Aug 2013 08:27:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VC7V2-0001nF-LB for qemu-devel@nongnu.org; Wed, 21 Aug 2013 08:27:03 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54093) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VC7V2-0001mz-DE for qemu-devel@nongnu.org; Wed, 21 Aug 2013 08:26:56 -0400 From: Stefan Hajnoczi Date: Wed, 21 Aug 2013 14:26:41 +0200 Message-Id: <1377088001-8783-3-git-send-email-stefanha@redhat.com> In-Reply-To: <1377088001-8783-1-git-send-email-stefanha@redhat.com> References: <1377088001-8783-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PATCH 2/2] osdep: warn if opening a file O_DIRECT on tmpfs fails List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Deepak C Shetty , Stefan Hajnoczi 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 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 Signed-off-by: Stefan Hajnoczi --- 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 #include +#ifdef __linux__ +#include +#include +#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