raw-win32: Use bdrv_open options instead of filename
Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
c66a615723
commit
8a79380b8e
|
@ -221,21 +221,50 @@ static void raw_parse_flags(int flags, int *access_flags, DWORD *overlapped)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raw_open(BlockDriverState *bs, const char *filename,
|
static QemuOptsList raw_runtime_opts = {
|
||||||
|
.name = "raw",
|
||||||
|
.head = QTAILQ_HEAD_INITIALIZER(raw_runtime_opts.head),
|
||||||
|
.desc = {
|
||||||
|
{
|
||||||
|
.name = "filename",
|
||||||
|
.type = QEMU_OPT_STRING,
|
||||||
|
.help = "File name of the image",
|
||||||
|
},
|
||||||
|
{ /* end of list */ }
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int raw_open(BlockDriverState *bs, const char *unused,
|
||||||
QDict *options, int flags)
|
QDict *options, int flags)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
int access_flags;
|
int access_flags;
|
||||||
DWORD overlapped;
|
DWORD overlapped;
|
||||||
|
QemuOpts *opts;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
const char *filename;
|
||||||
|
int ret;
|
||||||
|
|
||||||
s->type = FTYPE_FILE;
|
s->type = FTYPE_FILE;
|
||||||
|
|
||||||
|
opts = qemu_opts_create_nofail(&raw_runtime_opts);
|
||||||
|
qemu_opts_absorb_qdict(opts, options, &local_err);
|
||||||
|
if (error_is_set(&local_err)) {
|
||||||
|
qerror_report_err(local_err);
|
||||||
|
error_free(local_err);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
filename = qemu_opt_get(opts, "filename");
|
||||||
|
|
||||||
raw_parse_flags(flags, &access_flags, &overlapped);
|
raw_parse_flags(flags, &access_flags, &overlapped);
|
||||||
|
|
||||||
if ((flags & BDRV_O_NATIVE_AIO) && aio == NULL) {
|
if ((flags & BDRV_O_NATIVE_AIO) && aio == NULL) {
|
||||||
aio = win32_aio_init();
|
aio = win32_aio_init();
|
||||||
if (aio == NULL) {
|
if (aio == NULL) {
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,20 +274,27 @@ static int raw_open(BlockDriverState *bs, const char *filename,
|
||||||
if (s->hfile == INVALID_HANDLE_VALUE) {
|
if (s->hfile == INVALID_HANDLE_VALUE) {
|
||||||
int err = GetLastError();
|
int err = GetLastError();
|
||||||
|
|
||||||
if (err == ERROR_ACCESS_DENIED)
|
if (err == ERROR_ACCESS_DENIED) {
|
||||||
return -EACCES;
|
ret = -EACCES;
|
||||||
return -EINVAL;
|
} else {
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & BDRV_O_NATIVE_AIO) {
|
if (flags & BDRV_O_NATIVE_AIO) {
|
||||||
int ret = win32_aio_attach(aio, s->hfile);
|
ret = win32_aio_attach(aio, s->hfile);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
CloseHandle(s->hfile);
|
CloseHandle(s->hfile);
|
||||||
return ret;
|
goto fail;
|
||||||
}
|
}
|
||||||
s->aio = aio;
|
s->aio = aio;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
ret = 0;
|
||||||
|
fail:
|
||||||
|
qemu_opts_del(opts);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BlockDriverAIOCB *raw_aio_readv(BlockDriverState *bs,
|
static BlockDriverAIOCB *raw_aio_readv(BlockDriverState *bs,
|
||||||
|
@ -495,13 +531,14 @@ static int hdev_probe_device(const char *filename)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hdev_open(BlockDriverState *bs, const char *filename,
|
static int hdev_open(BlockDriverState *bs, const char *dummy,
|
||||||
QDict *options, int flags)
|
QDict *options, int flags)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
int access_flags, create_flags;
|
int access_flags, create_flags;
|
||||||
DWORD overlapped;
|
DWORD overlapped;
|
||||||
char device_name[64];
|
char device_name[64];
|
||||||
|
const char *filename = qdict_get_str(options, "filename");
|
||||||
|
|
||||||
if (strstart(filename, "/dev/cdrom", NULL)) {
|
if (strstart(filename, "/dev/cdrom", NULL)) {
|
||||||
if (find_cdrom(device_name, sizeof(device_name)) < 0)
|
if (find_cdrom(device_name, sizeof(device_name)) < 0)
|
||||||
|
|
Loading…
Reference in New Issue