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:
Daniel P. Berrangé 2020-07-21 16:17:35 +01:00
parent c490af57cb
commit 661b3e81a3
1 changed files with 14 additions and 1 deletions

View File

@ -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;
}