* [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT @ 2020-07-01 16:05 Daniel P. Berrangé 2020-07-01 16:05 ` [PATCH 1/3] util: validate whether O_DIRECT is supported after failure Daniel P. Berrangé ` (3 more replies) 0 siblings, 4 replies; 8+ messages in thread From: Daniel P. Berrangé @ 2020-07-01 16:05 UTC (permalink / raw) To: qemu-devel Cc: Kevin Wolf, P J P, Daniel P. Berrangé, qemu-block, Max Reitz To repeat the commit message from patch 3... Currently at startup if using cache=none on a filesystem lacking O_DIRECT such as tmpfs, at startup QEMU prints qemu-system-x86_64: -drive file=/tmp/foo.img,cache=none: file system may not support O_DIRECT qemu-system-x86_64: -drive file=/tmp/foo.img,cache=none: Could not open '/tmp/foo.img': Invalid argument while at QMP level the hint is missing, so QEMU reports just "error": { "class": "GenericError", "desc": "Could not open '/tmp/foo.img': Invalid argument" } which is close to useless for the end user trying to figure out what they did wrong With this change at startup QEMU prints qemu-system-x86_64: -drive file=/tmp/foo.img,cache=none: Unable to open '/tmp/foo.img' flags 0x4000: filesystem does not support O_DIRECT while at the QMP level QEMU reports a massively more informative "error": { "class": "GenericError", "desc": "Unable to open '/tmp/foo.img' flags 0x4002: filesystem does not support O_DIRECT" } qemu_open is used in many more places besides block layer, but converting those to qemu_open_err is left as an exercise for other maintainers. Daniel P. Berrangé (3): util: validate whether O_DIRECT is supported after failure util: support detailed error reporting for qemu_open block: switch to use qemu_open_err for improved errors block/file-posix.c | 10 +++---- include/qemu/osdep.h | 1 + util/osdep.c | 70 ++++++++++++++++++++++++++++++++++++++------ 3 files changed, 66 insertions(+), 15 deletions(-) -- 2.26.2 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/3] util: validate whether O_DIRECT is supported after failure 2020-07-01 16:05 [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT Daniel P. Berrangé @ 2020-07-01 16:05 ` Daniel P. Berrangé 2020-07-02 10:10 ` Philippe Mathieu-Daudé 2020-07-01 16:05 ` [PATCH 2/3] util: support detailed error reporting for qemu_open Daniel P. Berrangé ` (2 subsequent siblings) 3 siblings, 1 reply; 8+ messages in thread From: Daniel P. Berrangé @ 2020-07-01 16:05 UTC (permalink / raw) To: qemu-devel Cc: Kevin Wolf, P J P, Daniel P. Berrangé, qemu-block, Max Reitz 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 | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/util/osdep.c b/util/osdep.c index 4829c07ff6..4bdbe81cec 100644 --- a/util/osdep.c +++ b/util/osdep.c @@ -342,8 +342,17 @@ 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; +# ifdef O_CLOEXEC + ret = open(name, newflags | O_CLOEXEC, mode); +# else + ret = open(name, newflags, mode); +# endif + if (ret != -1) { + close(ret); + error_report("file system does not support O_DIRECT"); + errno = EINVAL; + } } #endif /* O_DIRECT */ -- 2.26.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] util: validate whether O_DIRECT is supported after failure 2020-07-01 16:05 ` [PATCH 1/3] util: validate whether O_DIRECT is supported after failure Daniel P. Berrangé @ 2020-07-02 10:10 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 8+ messages in thread From: Philippe Mathieu-Daudé @ 2020-07-02 10:10 UTC (permalink / raw) To: Daniel P. Berrangé, qemu-devel Cc: Kevin Wolf, Max Reitz, qemu-block, P J P On 7/1/20 6:05 PM, Daniel P. Berrangé wrote: > 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 | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/util/osdep.c b/util/osdep.c > index 4829c07ff6..4bdbe81cec 100644 > --- a/util/osdep.c > +++ b/util/osdep.c > @@ -342,8 +342,17 @@ 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; > +# ifdef O_CLOEXEC > + ret = open(name, newflags | O_CLOEXEC, mode); > +# else > + ret = open(name, newflags, mode); > +# endif Can we use this simpler form (easier to set a breakpoint)? #ifdef O_CLOEXEC newflags |= O_CLOEXEC; #endif ret = open(name, newflags, mode); Whichever you prefer: Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > + if (ret != -1) { > + close(ret); > + error_report("file system does not support O_DIRECT"); > + errno = EINVAL; > + } > } > #endif /* O_DIRECT */ > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/3] util: support detailed error reporting for qemu_open 2020-07-01 16:05 [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT Daniel P. Berrangé 2020-07-01 16:05 ` [PATCH 1/3] util: validate whether O_DIRECT is supported after failure Daniel P. Berrangé @ 2020-07-01 16:05 ` Daniel P. Berrangé 2020-07-02 5:13 ` Markus Armbruster 2020-07-01 16:05 ` [PATCH 3/3] block: switch to use qemu_open_err for improved errors Daniel P. Berrangé 2020-07-01 16:58 ` [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT no-reply 3 siblings, 1 reply; 8+ messages in thread From: Daniel P. Berrangé @ 2020-07-01 16:05 UTC (permalink / raw) To: qemu-devel Cc: Kevin Wolf, P J P, Daniel P. Berrangé, qemu-block, Max Reitz Create a "qemu_open_err" method which does the same as "qemu_open", but with a "Error **errp" for error reporting. There should be no behavioural difference for existing callers at this stage. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- include/qemu/osdep.h | 1 + util/osdep.c | 71 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index 0d26a1b9bd..e41701a308 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -483,6 +483,7 @@ int qemu_madvise(void *addr, size_t len, int advice); int qemu_mprotect_rwx(void *addr, size_t size); int qemu_mprotect_none(void *addr, size_t size); +int qemu_open_err(const char *name, int flags, Error **errp, ...); int qemu_open(const char *name, int flags, ...); int qemu_close(int fd); int qemu_unlink(const char *name); diff --git a/util/osdep.c b/util/osdep.c index 4bdbe81cec..450b3a5da3 100644 --- a/util/osdep.c +++ b/util/osdep.c @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #include "qemu/osdep.h" +#include "qapi/error.h" /* Needed early for CONFIG_BSD etc. */ @@ -282,7 +283,7 @@ int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive) /* * Opens a file with FD_CLOEXEC set */ -int qemu_open(const char *name, int flags, ...) +static int qemu_openv(const char *name, int flags, Error **errp, va_list ap) { int ret; int mode = 0; @@ -297,24 +298,31 @@ int qemu_open(const char *name, int flags, ...) fdset_id = qemu_parse_fdset(fdset_id_str); if (fdset_id == -1) { + error_setg(errp, "Unable to parse fdset %s", name); errno = EINVAL; return -1; } fd = monitor_fdset_get_fd(fdset_id, flags); if (fd < 0) { + error_setg_errno(errp, -fd, "Unable acquire FD for %s flags %x", + name, flags); errno = -fd; return -1; } dupfd = qemu_dup_flags(fd, flags); if (dupfd == -1) { + error_setg_errno(errp, errno, "Unable dup FD for %s flags %x", + name, flags); return -1; } ret = monitor_fdset_dup_fd_add(fdset_id, dupfd); if (ret == -1) { close(dupfd); + error_setg(errp, "Unable save FD for %s flags %x", + name, flags); errno = EINVAL; return -1; } @@ -324,11 +332,7 @@ int qemu_open(const char *name, int flags, ...) #endif if (flags & O_CREAT) { - va_list ap; - - va_start(ap, flags); mode = va_arg(ap, int); - va_end(ap); } #ifdef O_CLOEXEC @@ -340,25 +344,64 @@ int qemu_open(const char *name, int flags, ...) } #endif + if (ret == -1) { + const char *action = "open"; + if (flags & O_CREAT) { + action = "create"; + } #ifdef O_DIRECT - if (ret == -1 && errno == EINVAL && (flags & O_DIRECT)) { - int newflags = flags & ~O_DIRECT; + if (errno == EINVAL && (flags & O_DIRECT)) { + int newflags = flags & ~O_DIRECT; # ifdef O_CLOEXEC - ret = open(name, newflags | O_CLOEXEC, mode); + ret = open(name, newflags | O_CLOEXEC, mode); # else - ret = open(name, newflags, mode); + ret = open(name, newflags, mode); # endif - if (ret != -1) { - close(ret); - error_report("file system does not support O_DIRECT"); - errno = EINVAL; + if (ret != -1) { + close(ret); + error_setg(errp, "Unable to %s '%s' flags 0x%x: " + "filesystem does not support O_DIRECT", + action, name, flags); + if (!errp) { + error_report("file system does not support O_DIRECT"); + } + errno = EINVAL; + return -1; + } } - } #endif /* O_DIRECT */ + error_setg_errno(errp, errno, "Unable to %s '%s' flags 0x%x", + action, name, flags); + } + return ret; } +int qemu_open_err(const char *name, int flags, Error **errp, ...) +{ + va_list ap; + int rv; + + va_start(ap, errp); + rv = qemu_openv(name, flags, errp, ap); + va_end(ap); + + return rv; +} + +int qemu_open(const char *name, int flags, ...) +{ + va_list ap; + int rv; + + va_start(ap, flags); + rv = qemu_openv(name, flags, NULL, ap); + va_end(ap); + + return rv; +} + int qemu_close(int fd) { int64_t fdset_id; -- 2.26.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] util: support detailed error reporting for qemu_open 2020-07-01 16:05 ` [PATCH 2/3] util: support detailed error reporting for qemu_open Daniel P. Berrangé @ 2020-07-02 5:13 ` Markus Armbruster 2020-07-02 9:30 ` Daniel P. Berrangé 0 siblings, 1 reply; 8+ messages in thread From: Markus Armbruster @ 2020-07-02 5:13 UTC (permalink / raw) To: Daniel P. Berrangé Cc: Kevin Wolf, qemu-block, qemu-devel, Max Reitz, Stefan Hajnoczi, P J P Daniel P. Berrangé <berrange@redhat.com> writes: > Create a "qemu_open_err" method which does the same as "qemu_open", > but with a "Error **errp" for error reporting. There should be no > behavioural difference for existing callers at this stage. > > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> > --- > include/qemu/osdep.h | 1 + > util/osdep.c | 71 +++++++++++++++++++++++++++++++++++--------- > 2 files changed, 58 insertions(+), 14 deletions(-) > > diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h > index 0d26a1b9bd..e41701a308 100644 > --- a/include/qemu/osdep.h > +++ b/include/qemu/osdep.h > @@ -483,6 +483,7 @@ int qemu_madvise(void *addr, size_t len, int advice); > int qemu_mprotect_rwx(void *addr, size_t size); > int qemu_mprotect_none(void *addr, size_t size); > > +int qemu_open_err(const char *name, int flags, Error **errp, ...); > int qemu_open(const char *name, int flags, ...); > int qemu_close(int fd); > int qemu_unlink(const char *name); > diff --git a/util/osdep.c b/util/osdep.c > index 4bdbe81cec..450b3a5da3 100644 > --- a/util/osdep.c > +++ b/util/osdep.c > @@ -22,6 +22,7 @@ > * THE SOFTWARE. > */ > #include "qemu/osdep.h" > +#include "qapi/error.h" > > /* Needed early for CONFIG_BSD etc. */ > > @@ -282,7 +283,7 @@ int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive) > /* > * Opens a file with FD_CLOEXEC set > */ > -int qemu_open(const char *name, int flags, ...) > +static int qemu_openv(const char *name, int flags, Error **errp, va_list ap) > { > int ret; > int mode = 0; > @@ -297,24 +298,31 @@ int qemu_open(const char *name, int flags, ...) > > fdset_id = qemu_parse_fdset(fdset_id_str); > if (fdset_id == -1) { > + error_setg(errp, "Unable to parse fdset %s", name); > errno = EINVAL; > return -1; > } > > fd = monitor_fdset_get_fd(fdset_id, flags); > if (fd < 0) { > + error_setg_errno(errp, -fd, "Unable acquire FD for %s flags %x", > + name, flags); > errno = -fd; > return -1; > } > > dupfd = qemu_dup_flags(fd, flags); > if (dupfd == -1) { > + error_setg_errno(errp, errno, "Unable dup FD for %s flags %x", > + name, flags); > return -1; > } > > ret = monitor_fdset_dup_fd_add(fdset_id, dupfd); > if (ret == -1) { > close(dupfd); > + error_setg(errp, "Unable save FD for %s flags %x", > + name, flags); > errno = EINVAL; > return -1; > } > @@ -324,11 +332,7 @@ int qemu_open(const char *name, int flags, ...) > #endif > > if (flags & O_CREAT) { > - va_list ap; > - > - va_start(ap, flags); > mode = va_arg(ap, int); > - va_end(ap); > } > > #ifdef O_CLOEXEC > @@ -340,25 +344,64 @@ int qemu_open(const char *name, int flags, ...) > } > #endif > > + if (ret == -1) { > + const char *action = "open"; > + if (flags & O_CREAT) { > + action = "create"; > + } > #ifdef O_DIRECT > - if (ret == -1 && errno == EINVAL && (flags & O_DIRECT)) { > - int newflags = flags & ~O_DIRECT; > + if (errno == EINVAL && (flags & O_DIRECT)) { > + int newflags = flags & ~O_DIRECT; > # ifdef O_CLOEXEC > - ret = open(name, newflags | O_CLOEXEC, mode); > + ret = open(name, newflags | O_CLOEXEC, mode); > # else > - ret = open(name, newflags, mode); > + ret = open(name, newflags, mode); > # endif > - if (ret != -1) { > - close(ret); > - error_report("file system does not support O_DIRECT"); > - errno = EINVAL; > + if (ret != -1) { > + close(ret); > + error_setg(errp, "Unable to %s '%s' flags 0x%x: " > + "filesystem does not support O_DIRECT", > + action, name, flags); > + if (!errp) { If the caller ignores errors, ... > + error_report("file system does not support O_DIRECT"); ... we report this error to stderr (but not any of the other ones). This is weird. I figure you do it here to reproduce the weirdness of qemu_open() before the patch. Goes back to commit a5813077aac7865f69b7ee46a594f3705429f7cd Author: Stefan Hajnoczi <stefanha@redhat.com> Date: Thu Aug 22 11:29:03 2013 +0200 osdep: warn if open(O_DIRECT) on fails with EINVAL Print a warning when opening a file O_DIRECT fails with EINVAL. This saves users a lot of time trying to figure out the EINVAL error, which is typical when attempting to open a file O_DIRECT on Linux tmpfs. Reported-by: Deepak C Shetty <deepakcs@linux.vnet.ibm.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> The message isn't phrased as a warning, though. Should it use warn_report()? Stefan? Regardless, since use of error_report() in a function that returns errors through its Error ** parameter is an anti-pattern, this use needs a comment. I'd make it a TODO comment: convert all callers where the warning is wanted to qemu_open_err(), then drop it. > + } > + errno = EINVAL; > + return -1; > + } > } > - } > #endif /* O_DIRECT */ > + error_setg_errno(errp, errno, "Unable to %s '%s' flags 0x%x", > + action, name, flags); > + } > + > > return ret; > } > > +int qemu_open_err(const char *name, int flags, Error **errp, ...) > +{ > + va_list ap; > + int rv; > + > + va_start(ap, errp); > + rv = qemu_openv(name, flags, errp, ap); > + va_end(ap); > + > + return rv; > +} > + > +int qemu_open(const char *name, int flags, ...) > +{ > + va_list ap; > + int rv; > + > + va_start(ap, flags); > + rv = qemu_openv(name, flags, NULL, ap); > + va_end(ap); > + > + return rv; > +} I'd rename this to qemu_open_with_bad_error_messages(). For better ones, callers can use if (qemu_open_err(name, flags, &err) < 0) { error_report_err(err); ... } or, where the error is fatal qemu_open_err(name, flags, &error_fatal); If you prefer not to rename it now, please add a comment why it should not be used in new code, and existing uses should be converted. If you rename, call the new one qemu_open(). > + > int qemu_close(int fd) > { > int64_t fdset_id; ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] util: support detailed error reporting for qemu_open 2020-07-02 5:13 ` Markus Armbruster @ 2020-07-02 9:30 ` Daniel P. Berrangé 0 siblings, 0 replies; 8+ messages in thread From: Daniel P. Berrangé @ 2020-07-02 9:30 UTC (permalink / raw) To: Markus Armbruster Cc: Kevin Wolf, qemu-block, qemu-devel, Max Reitz, Stefan Hajnoczi, P J P On Thu, Jul 02, 2020 at 07:13:08AM +0200, Markus Armbruster wrote: > Daniel P. Berrangé <berrange@redhat.com> writes: > > > Create a "qemu_open_err" method which does the same as "qemu_open", > > but with a "Error **errp" for error reporting. There should be no > > behavioural difference for existing callers at this stage. > > > > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> > > --- > > include/qemu/osdep.h | 1 + > > util/osdep.c | 71 +++++++++++++++++++++++++++++++++++--------- > > 2 files changed, 58 insertions(+), 14 deletions(-) > > > > diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h > > index 0d26a1b9bd..e41701a308 100644 > > --- a/include/qemu/osdep.h > > +++ b/include/qemu/osdep.h > > @@ -483,6 +483,7 @@ int qemu_madvise(void *addr, size_t len, int advice); > > int qemu_mprotect_rwx(void *addr, size_t size); > > int qemu_mprotect_none(void *addr, size_t size); > > > > +int qemu_open_err(const char *name, int flags, Error **errp, ...); > > int qemu_open(const char *name, int flags, ...); > > int qemu_close(int fd); > > int qemu_unlink(const char *name); > > diff --git a/util/osdep.c b/util/osdep.c > > index 4bdbe81cec..450b3a5da3 100644 > > --- a/util/osdep.c > > +++ b/util/osdep.c > > @@ -22,6 +22,7 @@ > > * THE SOFTWARE. > > */ > > #include "qemu/osdep.h" > > +#include "qapi/error.h" > > > > /* Needed early for CONFIG_BSD etc. */ > > > > @@ -282,7 +283,7 @@ int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive) > > /* > > * Opens a file with FD_CLOEXEC set > > */ > > -int qemu_open(const char *name, int flags, ...) > > +static int qemu_openv(const char *name, int flags, Error **errp, va_list ap) > > { > > int ret; > > int mode = 0; > > @@ -297,24 +298,31 @@ int qemu_open(const char *name, int flags, ...) > > > > fdset_id = qemu_parse_fdset(fdset_id_str); > > if (fdset_id == -1) { > > + error_setg(errp, "Unable to parse fdset %s", name); > > errno = EINVAL; > > return -1; > > } > > > > fd = monitor_fdset_get_fd(fdset_id, flags); > > if (fd < 0) { > > + error_setg_errno(errp, -fd, "Unable acquire FD for %s flags %x", > > + name, flags); > > errno = -fd; > > return -1; > > } > > > > dupfd = qemu_dup_flags(fd, flags); > > if (dupfd == -1) { > > + error_setg_errno(errp, errno, "Unable dup FD for %s flags %x", > > + name, flags); > > return -1; > > } > > > > ret = monitor_fdset_dup_fd_add(fdset_id, dupfd); > > if (ret == -1) { > > close(dupfd); > > + error_setg(errp, "Unable save FD for %s flags %x", > > + name, flags); > > errno = EINVAL; > > return -1; > > } > > @@ -324,11 +332,7 @@ int qemu_open(const char *name, int flags, ...) > > #endif > > > > if (flags & O_CREAT) { > > - va_list ap; > > - > > - va_start(ap, flags); > > mode = va_arg(ap, int); > > - va_end(ap); > > } > > > > #ifdef O_CLOEXEC > > @@ -340,25 +344,64 @@ int qemu_open(const char *name, int flags, ...) > > } > > #endif > > > > + if (ret == -1) { > > + const char *action = "open"; > > + if (flags & O_CREAT) { > > + action = "create"; > > + } > > #ifdef O_DIRECT > > - if (ret == -1 && errno == EINVAL && (flags & O_DIRECT)) { > > - int newflags = flags & ~O_DIRECT; > > + if (errno == EINVAL && (flags & O_DIRECT)) { > > + int newflags = flags & ~O_DIRECT; > > # ifdef O_CLOEXEC > > - ret = open(name, newflags | O_CLOEXEC, mode); > > + ret = open(name, newflags | O_CLOEXEC, mode); > > # else > > - ret = open(name, newflags, mode); > > + ret = open(name, newflags, mode); > > # endif > > - if (ret != -1) { > > - close(ret); > > - error_report("file system does not support O_DIRECT"); > > - errno = EINVAL; > > + if (ret != -1) { > > + close(ret); > > + error_setg(errp, "Unable to %s '%s' flags 0x%x: " > > + "filesystem does not support O_DIRECT", > > + action, name, flags); > > + if (!errp) { > > If the caller ignores errors, ... > > > + error_report("file system does not support O_DIRECT"); > > ... we report this error to stderr (but not any of the other ones). > This is weird. I figure you do it here to reproduce the weirdness of > qemu_open() before the patch. Goes back to > > commit a5813077aac7865f69b7ee46a594f3705429f7cd > Author: Stefan Hajnoczi <stefanha@redhat.com> > Date: Thu Aug 22 11:29:03 2013 +0200 > > osdep: warn if open(O_DIRECT) on fails with EINVAL > > Print a warning when opening a file O_DIRECT fails with EINVAL. This > saves users a lot of time trying to figure out the EINVAL error, which > is typical when attempting to open a file O_DIRECT on Linux tmpfs. > > Reported-by: Deepak C Shetty <deepakcs@linux.vnet.ibm.com> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > Reviewed-by: Eric Blake <eblake@redhat.com> > > The message isn't phrased as a warning, though. Should it use > warn_report()? Stefan? I was really in two minds as to whether to keep this error_report or not. It depends depends on whether any other callers of qemu_open still need it. In fact if nothing outside the block layer uses O_DIRECT then I think we can remove the error_report line. > > +int qemu_open_err(const char *name, int flags, Error **errp, ...) > > +{ > > + va_list ap; > > + int rv; > > + > > + va_start(ap, errp); > > + rv = qemu_openv(name, flags, errp, ap); > > + va_end(ap); > > + > > + return rv; > > +} > > + > > +int qemu_open(const char *name, int flags, ...) > > +{ > > + va_list ap; > > + int rv; > > + > > + va_start(ap, flags); > > + rv = qemu_openv(name, flags, NULL, ap); > > + va_end(ap); > > + > > + return rv; > > +} > > I'd rename this to qemu_open_with_bad_error_messages(). My goal was to avoid a big bang conversion of all callers. > > For better ones, callers can use > > if (qemu_open_err(name, flags, &err) < 0) { > error_report_err(err); > ... > } > > or, where the error is fatal > > qemu_open_err(name, flags, &error_fatal); > > If you prefer not to rename it now, please add a comment why it should > not be used in new code, and existing uses should be converted. > > If you rename, call the new one qemu_open(). Maybe it is better to rename upfront though, instead of waiting till everything uses the qemu_open_err and then renaming back to qemu_open. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] block: switch to use qemu_open_err for improved errors 2020-07-01 16:05 [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT Daniel P. Berrangé 2020-07-01 16:05 ` [PATCH 1/3] util: validate whether O_DIRECT is supported after failure Daniel P. Berrangé 2020-07-01 16:05 ` [PATCH 2/3] util: support detailed error reporting for qemu_open Daniel P. Berrangé @ 2020-07-01 16:05 ` Daniel P. Berrangé 2020-07-01 16:58 ` [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT no-reply 3 siblings, 0 replies; 8+ messages in thread From: Daniel P. Berrangé @ 2020-07-01 16:05 UTC (permalink / raw) To: qemu-devel Cc: Kevin Wolf, P J P, Daniel P. Berrangé, qemu-block, Max Reitz Currently at startup if using cache=none on a filesystem lacking O_DIRECT such as tmpfs, at startup QEMU prints qemu-system-x86_64: -drive file=/tmp/foo.img,cache=none: file system may not support O_DIRECT qemu-system-x86_64: -drive file=/tmp/foo.img,cache=none: Could not open '/tmp/foo.img': Invalid argument while at QMP level the hint is missing, so QEMU reports just "error": { "class": "GenericError", "desc": "Could not open '/tmp/foo.img': Invalid argument" } which is close to useless for the end user trying to figure out what they did wrong With this change at startup QEMU prints qemu-system-x86_64: -drive file=/tmp/foo.img,cache=none: Unable to open '/tmp/foo.img' flags 0x4000: filesystem does not support O_DIRECT while at the QMP level QEMU reports a massively more informative "error": { "class": "GenericError", "desc": "Unable to open '/tmp/foo.img' flags 0x4002: filesystem does not support O_DIRECT" } Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- block/file-posix.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c index 3ab8f5a0fa..2865b789fb 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -574,11 +574,10 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, raw_parse_flags(bdrv_flags, &s->open_flags, false); s->fd = -1; - fd = qemu_open(filename, s->open_flags, 0644); + fd = qemu_open_err(filename, s->open_flags, errp, 0644); ret = fd < 0 ? -errno : 0; if (ret < 0) { - error_setg_file_open(errp, -ret, filename); if (ret == -EROFS) { ret = -EACCES; } @@ -970,9 +969,8 @@ static int raw_reconfigure_getfd(BlockDriverState *bs, int flags, ret = raw_normalize_devicepath(&normalized_filename, errp); if (ret >= 0) { assert(!(*open_flags & O_CREAT)); - fd = qemu_open(normalized_filename, *open_flags); + fd = qemu_open_err(normalized_filename, *open_flags, errp); if (fd == -1) { - error_setg_errno(errp, errno, "Could not reopen file"); return -1; } } @@ -2324,10 +2322,10 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp) } /* Create file */ - fd = qemu_open(file_opts->filename, O_RDWR | O_CREAT | O_BINARY, 0644); + fd = qemu_open_err(file_opts->filename, O_RDWR | O_CREAT | O_BINARY, + errp, 0644); if (fd < 0) { result = -errno; - error_setg_errno(errp, -result, "Could not create file"); goto out; } -- 2.26.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT 2020-07-01 16:05 [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT Daniel P. Berrangé ` (2 preceding siblings ...) 2020-07-01 16:05 ` [PATCH 3/3] block: switch to use qemu_open_err for improved errors Daniel P. Berrangé @ 2020-07-01 16:58 ` no-reply 3 siblings, 0 replies; 8+ messages in thread From: no-reply @ 2020-07-01 16:58 UTC (permalink / raw) To: berrange; +Cc: kwolf, berrange, qemu-block, qemu-devel, mreitz, ppandit Patchew URL: https://patchew.org/QEMU/20200701160509.1523847-1-berrange@redhat.com/ Hi, This series failed the docker-quick@centos7 build test. Please find the testing commands and their output below. If you have Docker installed, you can probably reproduce it locally. === TEST SCRIPT BEGIN === #!/bin/bash make docker-image-centos7 V=1 NETWORK=1 time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1 === TEST SCRIPT END === +++ /tmp/qemu-test/build/tests/qemu-iotests/226.out.bad 2020-07-01 16:58:11.321029717 +0000 @@ -6,7 +6,7 @@ qemu-io: can't open: A regular file was expected by the 'file' driver, but something else was given qemu-io: warning: Opening a character device as a file using the 'file' driver is deprecated == Testing RW == -qemu-io: can't open: Could not open 'TEST_DIR/t.IMGFMT': Is a directory +qemu-io: can't open: Unable to open 'TEST_DIR/t.IMGFMT' flags 0x2: Is a directory qemu-io: warning: Opening a character device as a file using the 'file' driver is deprecated === Testing with driver:host_device === @@ -14,13 +14,13 @@ --- Not run: 259 Failures: 061 069 111 226 244 Failed 5 of 119 iotests make: *** [check-tests/check-block.sh] Error 1 Traceback (most recent call last): File "./tests/docker/docker.py", line 669, in <module> sys.exit(main()) --- raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=67228a70e7844d70b07a864fef5c4569', '-u', '1003', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew2/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-y2quzqfb/src/docker-src.2020-07-01-12.41.12.23538:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2. filter=--filter=label=com.qemu.instance.uuid=67228a70e7844d70b07a864fef5c4569 make[1]: *** [docker-run] Error 1 make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-y2quzqfb/src' make: *** [docker-run-test-quick@centos7] Error 2 real 17m41.892s user 0m5.790s The full log is available at http://patchew.org/logs/20200701160509.1523847-1-berrange@redhat.com/testing.docker-quick@centos7/?type=message. --- Email generated automatically by Patchew [https://patchew.org/]. Please send your feedback to patchew-devel@redhat.com ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2020-07-02 10:11 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-07-01 16:05 [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT Daniel P. Berrangé 2020-07-01 16:05 ` [PATCH 1/3] util: validate whether O_DIRECT is supported after failure Daniel P. Berrangé 2020-07-02 10:10 ` Philippe Mathieu-Daudé 2020-07-01 16:05 ` [PATCH 2/3] util: support detailed error reporting for qemu_open Daniel P. Berrangé 2020-07-02 5:13 ` Markus Armbruster 2020-07-02 9:30 ` Daniel P. Berrangé 2020-07-01 16:05 ` [PATCH 3/3] block: switch to use qemu_open_err for improved errors Daniel P. Berrangé 2020-07-01 16:58 ` [PATCH 0/3] block: improve error reporting for unsupported O_DIRECT no-reply
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).