block/file: switch to use qemu_open/qemu_create for improved errors
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': 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': filesystem does not support O_DIRECT" } Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
661b3e81a3
commit
b18a24a9f8
@ -630,11 +630,10 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
|
|||||||
raw_parse_flags(bdrv_flags, &s->open_flags, false);
|
raw_parse_flags(bdrv_flags, &s->open_flags, false);
|
||||||
|
|
||||||
s->fd = -1;
|
s->fd = -1;
|
||||||
fd = qemu_open_old(filename, s->open_flags, 0644);
|
fd = qemu_open(filename, s->open_flags, errp);
|
||||||
ret = fd < 0 ? -errno : 0;
|
ret = fd < 0 ? -errno : 0;
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg_file_open(errp, -ret, filename);
|
|
||||||
if (ret == -EROFS) {
|
if (ret == -EROFS) {
|
||||||
ret = -EACCES;
|
ret = -EACCES;
|
||||||
}
|
}
|
||||||
@ -1032,15 +1031,13 @@ static int raw_reconfigure_getfd(BlockDriverState *bs, int flags,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we cannot use fcntl, or fcntl failed, fall back to qemu_open_old() */
|
/* If we cannot use fcntl, or fcntl failed, fall back to qemu_open() */
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
const char *normalized_filename = bs->filename;
|
const char *normalized_filename = bs->filename;
|
||||||
ret = raw_normalize_devicepath(&normalized_filename, errp);
|
ret = raw_normalize_devicepath(&normalized_filename, errp);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
assert(!(*open_flags & O_CREAT));
|
fd = qemu_open(normalized_filename, *open_flags, errp);
|
||||||
fd = qemu_open_old(normalized_filename, *open_flags);
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
error_setg_errno(errp, errno, "Could not reopen file");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2411,10 +2408,9 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Create file */
|
/* Create file */
|
||||||
fd = qemu_open_old(file_opts->filename, O_RDWR | O_CREAT | O_BINARY, 0644);
|
fd = qemu_create(file_opts->filename, O_RDWR | O_BINARY, 0644, errp);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
result = -errno;
|
result = -errno;
|
||||||
error_setg_errno(errp, -result, "Could not create file");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3335,7 +3331,7 @@ static bool setup_cdrom(char *bsd_path, Error **errp)
|
|||||||
for (index = 0; index < num_of_test_partitions; index++) {
|
for (index = 0; index < num_of_test_partitions; index++) {
|
||||||
snprintf(test_partition, sizeof(test_partition), "%ss%d", bsd_path,
|
snprintf(test_partition, sizeof(test_partition), "%ss%d", bsd_path,
|
||||||
index);
|
index);
|
||||||
fd = qemu_open_old(test_partition, O_RDONLY | O_BINARY | O_LARGEFILE);
|
fd = qemu_open(test_partition, O_RDONLY | O_BINARY | O_LARGEFILE, NULL);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
partition_found = true;
|
partition_found = true;
|
||||||
qemu_close(fd);
|
qemu_close(fd);
|
||||||
@ -3653,7 +3649,7 @@ static int cdrom_probe_device(const char *filename)
|
|||||||
int prio = 0;
|
int prio = 0;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
fd = qemu_open_old(filename, O_RDONLY | O_NONBLOCK);
|
fd = qemu_open(filename, O_RDONLY | O_NONBLOCK, NULL);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -3787,7 +3783,7 @@ static int cdrom_reopen(BlockDriverState *bs)
|
|||||||
*/
|
*/
|
||||||
if (s->fd >= 0)
|
if (s->fd >= 0)
|
||||||
qemu_close(s->fd);
|
qemu_close(s->fd);
|
||||||
fd = qemu_open_old(bs->filename, s->open_flags, 0644);
|
fd = qemu_open(bs->filename, s->open_flags, NULL);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
s->fd = -1;
|
s->fd = -1;
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
@ -596,11 +596,9 @@ static int raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = qemu_open_old(file_opts->filename,
|
fd = qemu_create(file_opts->filename, O_WRONLY | O_TRUNC | O_BINARY,
|
||||||
O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
|
0644, errp);
|
||||||
0644);
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
error_setg_errno(errp, errno, "Could not create file");
|
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
set_sparse(fd);
|
set_sparse(fd);
|
||||||
|
Loading…
Reference in New Issue
Block a user