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:
Kevin Wolf 2013-04-10 11:34:56 +02:00
parent c66a615723
commit 8a79380b8e
1 changed files with 47 additions and 10 deletions

View File

@ -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)