util: give a specific error message when O_DIRECT doesn't work
A common error scenario is to tell QEMU to use O_DIRECT in combination with a filesystem that doesn't support it. To aid users to diagnosing their mistake we want to provide a clear error message when this happens. Reviewed-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
c490af57cb
commit
661b3e81a3
15
util/osdep.c
15
util/osdep.c
@ -332,11 +332,24 @@ qemu_open_internal(const char *name, int flags, mode_t mode, Error **errp)
|
||||
|
||||
if (ret == -1) {
|
||||
const char *action = flags & O_CREAT ? "create" : "open";
|
||||
#ifdef O_DIRECT
|
||||
/* Give more helpful error message for O_DIRECT */
|
||||
if (errno == EINVAL && (flags & O_DIRECT)) {
|
||||
ret = open(name, flags & ~O_DIRECT, mode);
|
||||
if (ret != -1) {
|
||||
close(ret);
|
||||
error_setg(errp, "Could not %s '%s': "
|
||||
"filesystem does not support O_DIRECT",
|
||||
action, name);
|
||||
errno = EINVAL; /* restore first open()'s errno */
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#endif /* O_DIRECT */
|
||||
error_setg_errno(errp, errno, "Could not %s '%s'",
|
||||
action, name);
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user