qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH v2 1/3] util: validate whether O_DIRECT is supported after fa


From: Markus Armbruster
Subject: Re: [PATCH v2 1/3] util: validate whether O_DIRECT is supported after failure
Date: Wed, 08 Jul 2020 08:45:46 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux)

Daniel P. Berrangé <berrange@redhat.com> writes:

> Currently we suggest that a filesystem may not support O_DIRECT after
> seeing an EINVAL. Other things can cause EINVAL though, so it is better
> to do an explicit check, and then report a definitive error message.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>  util/osdep.c | 15 +++++++++++----
>  1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/util/osdep.c b/util/osdep.c
> index 4829c07ff6..e2b7507ee2 100644
> --- a/util/osdep.c
> +++ b/util/osdep.c
> @@ -332,9 +332,11 @@ int qemu_open(const char *name, int flags, ...)
>      }
>  
>  #ifdef O_CLOEXEC
> -    ret = open(name, flags | O_CLOEXEC, mode);
> -#else
> +    flags |= O_CLOEXEC;
> +#endif
>      ret = open(name, flags, mode);
> +
> +#ifndef O_CLOEXEC
>      if (ret >= 0) {
>          qemu_set_cloexec(ret);
>      }

I'd prefer something like

   #ifdef O_CLOEXEC
       flags |= O_CLOEXEC;
       ret = open(name, flags, mode);
   #else
       ret = open(name, flags, mode);
       if (ret >= 0) {
           qemu_set_cloexec(ret);
       }
   #endif

Continues to duplicate open(), but spares me the effort to fuse two
#ifdef sections in my head to understand what is being done in each
case.

> @@ -342,8 +344,13 @@ int qemu_open(const char *name, int flags, ...)
>  
>  #ifdef O_DIRECT
>      if (ret == -1 && errno == EINVAL && (flags & O_DIRECT)) {
> -        error_report("file system may not support O_DIRECT");
> -        errno = EINVAL; /* in case it was clobbered */
> +        int newflags = flags & ~O_DIRECT;
> +        ret = open(name, newflags, mode);

I'd prefer the more concise

           ret = open(name, flags & ~O_DIRECT, mode);

> +        if (ret != -1) {
> +            close(ret);
> +            error_report("file system does not support O_DIRECT");
> +            errno = EINVAL;
> +        }
>      }
>  #endif /* O_DIRECT */

The function now reports to stderr in just one of many failure modes.
That's wrong.  Looks like the next patch fixes this defect.  I'd swap
the two.




reply via email to

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