[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2 of 2] blktap3/vhd: Assorted improvements
This patch introduces a few extra checks in the code path that tells whether a particular Virtual Disk Image driver is available. Signed-off-by: Thanos Makatos <thanos.makatos@xxxxxxxxxx> diff --git a/tools/blktap3/drivers/tapdisk-control.c b/tools/blktap3/drivers/tapdisk-control.c --- a/tools/blktap3/drivers/tapdisk-control.c +++ b/tools/blktap3/drivers/tapdisk-control.c @@ -586,7 +586,7 @@ tapdisk_control_open_image( tapdisk_message_t *request, tapdisk_message_t * const response) { int err; - td_vbd_t *vbd; + td_vbd_t *vbd = NULL; td_flag_t flags; td_disk_info_t info; int prt_path_len; @@ -663,7 +663,9 @@ out: response->u.image.sector_size = info.sector_size; response->u.image.info = info.info; response->type = TAPDISK_MESSAGE_OPEN_RSP; - } + } else + if (vbd) + tapdisk_server_remove_vbd(vbd); return err; diff --git a/tools/blktap3/drivers/tapdisk-disktype.c b/tools/blktap3/drivers/tapdisk-disktype.c --- a/tools/blktap3/drivers/tapdisk-disktype.c +++ b/tools/blktap3/drivers/tapdisk-disktype.c @@ -148,7 +148,7 @@ const disk_info_t *tapdisk_disk_types[] extern struct tap_disk tapdisk_aio; /* - * TODO Why commented out? + * XXX Commented out in blktap2.5. */ #if 0 extern struct tap_disk tapdisk_sync; @@ -160,7 +160,7 @@ extern struct tap_disk tapdisk_vhd; extern struct tap_disk tapdisk_ram; /* - * TODO Why commented out? + * XXX Commented out in blktap2.5. */ #if 0 extern struct tap_disk tapdisk_qcow; @@ -169,39 +169,74 @@ extern struct tap_disk tapdisk_qcow; extern struct tap_disk tapdisk_vhd_index; /* - * TODO Why commented out? + * XXX Commented out in blktap2.5. */ #if 0 extern struct tap_disk tapdisk_log; #endif -const struct tap_disk *tapdisk_disk_drivers[] = { - [DISK_TYPE_AIO] = &tapdisk_aio, +const struct tap_disk * +tapdisk_disk_driver_get(const enum disk_type dt) +{ + static const struct tap_disk *tapdisk_disk_drivers[] = { + [DISK_TYPE_AIO] = &tapdisk_aio, -/* - * TODO Why commented out? - */ + /* + * XXX Commented out in blktap2.5. + */ #if 0 - [DISK_TYPE_SYNC] = &tapdisk_sync, - [DISK_TYPE_VMDK] = &tapdisk_vmdk, - [DISK_TYPE_VHDSYNC] = &tapdisk_vhdsync_disk + [DISK_TYPE_SYNC] = &tapdisk_sync, + [DISK_TYPE_VMDK] = &tapdisk_vmdk, + [DISK_TYPE_VHDSYNC] = &tapdisk_vhdsync_disk +#endif + [DISK_TYPE_VHD] = &tapdisk_vhd, + + /* + * TODO Commeneted out to simplify the upstreaming process. + */ +#if 0 + [DISK_TYPE_RAM] = &tapdisk_ram, #endif -/* - * TODO Why commented out? - */ + /* + * XXX Commented out in blktap2.5. + */ #if 0 - [DISK_TYPE_QCOW] = &tapdisk_qcow, + [DISK_TYPE_QCOW] = &tapdisk_qcow, #endif -/* - * TODO Why commented out? - */ + /* + * TODO Commeneted out to simplify the upstreaming process. + */ #if 0 - [DISK_TYPE_LOG] = &tapdisk_log, + [DISK_TYPE_BLOCK_CACHE] = &tapdisk_block_cache, + [DISK_TYPE_VINDEX] = &tapdisk_vhd_index, #endif - 0, -}; + + /* + * XXX Commented out in blktap2.5. + */ +#if 0 + [DISK_TYPE_LOG] = &tapdisk_log, +#endif + + /* + * TODO Commeneted out to simplify the upstreaming process. + */ +#if 0 + [DISK_TYPE_LCACHE] = &tapdisk_lcache, + [DISK_TYPE_LLPCACHE] = &tapdisk_llpcache, + [DISK_TYPE_LLECACHE] = &tapdisk_llecache, + [DISK_TYPE_VALVE] = &tapdisk_valve, + [DISK_TYPE_NBD] = &tapdisk_nbd, +#endif + }; + + if (dt < 0 || dt > ARRAY_SIZE(tapdisk_disk_drivers)) + return NULL; + else + return tapdisk_disk_drivers[dt]; +} int tapdisk_disktype_find(const char *name) @@ -217,7 +252,7 @@ tapdisk_disktype_find(const char *name) if (strcmp(name, info->name)) continue; - if (!tapdisk_disk_drivers[i]) + if (!tapdisk_disk_driver_get(i)) return -ENOSYS; return i; diff --git a/tools/blktap3/drivers/tapdisk-disktype.h b/tools/blktap3/drivers/tapdisk-disktype.h --- a/tools/blktap3/drivers/tapdisk-disktype.h +++ b/tools/blktap3/drivers/tapdisk-disktype.h @@ -29,32 +29,34 @@ #ifndef __DISKTYPES_H__ #define __DISKTYPES_H__ -#define DISK_TYPE_AIO 0 -#define DISK_TYPE_SYNC 1 -#define DISK_TYPE_VMDK 2 -#define DISK_TYPE_VHDSYNC 3 -#define DISK_TYPE_VHD 4 -#define DISK_TYPE_RAM 5 -#define DISK_TYPE_QCOW 6 -#define DISK_TYPE_BLOCK_CACHE 7 -#define DISK_TYPE_VINDEX 8 -#define DISK_TYPE_LOG 9 -#define DISK_TYPE_REMUS 10 -#define DISK_TYPE_LCACHE 11 -#define DISK_TYPE_LLECACHE 12 -#define DISK_TYPE_LLPCACHE 13 -#define DISK_TYPE_VALVE 14 +enum disk_type { + DISK_TYPE_AIO, + DISK_TYPE_SYNC, + DISK_TYPE_VMDK, + DISK_TYPE_VHDSYNC, + DISK_TYPE_VHD, + DISK_TYPE_RAM, + DISK_TYPE_QCOW, + DISK_TYPE_BLOCK_CACHE, + DISK_TYPE_VINDEX, + DISK_TYPE_LOG, + DISK_TYPE_REMUS, + DISK_TYPE_LCACHE, + DISK_TYPE_LLECACHE, + DISK_TYPE_LLPCACHE, + DISK_TYPE_VALVE}; #define DISK_TYPE_NAME_MAX 32 typedef struct disk_info { const char *name; /* driver name, e.g. 'aio' */ char *desc; /* e.g. "raw image" */ - unsigned int flags; + unsigned int flags; } disk_info_t; extern const disk_info_t *tapdisk_disk_types[]; -extern const struct tap_disk *tapdisk_disk_drivers[]; +const struct tap_disk * +tapdisk_disk_driver_get(const enum disk_type dt); /* one single controller for all instances of disk type */ #define DISK_TYPE_SINGLE_CONTROLLER (1<<0) diff --git a/tools/blktap3/drivers/tapdisk-driver.c b/tools/blktap3/drivers/tapdisk-driver.c --- a/tools/blktap3/drivers/tapdisk-driver.c +++ b/tools/blktap3/drivers/tapdisk-driver.c @@ -73,7 +73,7 @@ tapdisk_driver_allocate(int type, const td_driver_t *driver; const struct tap_disk *ops; - ops = tapdisk_disk_drivers[type]; + ops = tapdisk_disk_driver_get(type); if (!ops) return NULL; diff --git a/tools/blktap3/drivers/tapdisk-interface.c b/tools/blktap3/drivers/tapdisk-interface.c --- a/tools/blktap3/drivers/tapdisk-interface.c +++ b/tools/blktap3/drivers/tapdisk-interface.c @@ -67,6 +67,8 @@ int int err; td_driver_t *driver; + assert(image); + driver = image->driver; if (!driver) { driver = tapdisk_driver_allocate(image->type, @@ -80,6 +82,8 @@ int } if (!td_flag_test(driver->state, TD_DRIVER_OPEN)) { + assert(driver->ops); + assert(driver->ops->td_open); err = driver->ops->td_open(driver, image->name, image->flags); if (err) { if (!image->driver) diff --git a/tools/blktap3/drivers/tapdisk-server.c b/tools/blktap3/drivers/tapdisk-server.c --- a/tools/blktap3/drivers/tapdisk-server.c +++ b/tools/blktap3/drivers/tapdisk-server.c @@ -90,8 +90,11 @@ tapdisk_server_get_vbd(const char *param assert(params); tapdisk_server_for_each_vbd(vbd, tmp) - if (!strcmp(vbd->name, params)) - return vbd; + if (vbd->name) { + /* TODO VBDs without name? Should this be treated as a bug? */ + if (!strcmp(vbd->name, params)) + return vbd; + } return NULL; } diff --git a/tools/blktap3/tapback/backend.c b/tools/blktap3/tapback/backend.c --- a/tools/blktap3/tapback/backend.c +++ b/tools/blktap3/tapback/backend.c @@ -205,6 +205,9 @@ tapback_backend_create_device(const domi if (err) { WARN("failed to open %s on tapdisk pid=%d: %s\n", device->params, device->tap.pid, strerror(-err)); + /* TODO The error handler assumes that there a device has been + * opened, so tapdisk will complain that there is no such image. + */ goto out; } DBG("opened %s on tapdisk pid=%d\n", device->params, device->tap.pid); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |