qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 2/2] osdep: warn if opening a file O_DIRECT o


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v2 2/2] osdep: warn if opening a file O_DIRECT on tmpfs fails
Date: Wed, 21 Aug 2013 16:08:42 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2 (gnu/linux)

Stefan Hajnoczi <address@hidden> 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 <address@hidden> 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 <address@hidden>
> Signed-off-by: Stefan Hajnoczi <address@hidden>
> ---
>  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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]