mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
libxl: change disk to use generic getting list functions
Signed-off-by: Oleksandr Grytsov <oleksandr_grytsov@epam.com> Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
635f46f094
commit
fbbaf2cc98
7 files changed
+34
-82
No files matched your search
+7
-2
@@ -1749,9 +1749,14 @@ int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
|
||||
const libxl_asyncop_how *ao_how)
|
||||
LIBXL_EXTERNAL_CALLERS_ONLY;
|
||||
|
||||
libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num);
|
||||
libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx,
|
||||
uint32_t domid, int *num)
|
||||
LIBXL_EXTERNAL_CALLERS_ONLY;
|
||||
void libxl_device_disk_list_free(libxl_device_disk* list, int num)
|
||||
LIBXL_EXTERNAL_CALLERS_ONLY;
|
||||
int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
|
||||
libxl_device_disk *disk, libxl_diskinfo *diskinfo);
|
||||
libxl_device_disk *disk, libxl_diskinfo *diskinfo)
|
||||
LIBXL_EXTERNAL_CALLERS_ONLY;
|
||||
|
||||
/*
|
||||
* Insert a CD-ROM device. A device corresponding to disk must already
|
||||
|
||||
@@ -66,7 +66,8 @@ void libxl__checkpoint_devices_setup(libxl__egc *egc,
|
||||
cds->nics = libxl_device_nic_list(CTX, cds->domid, &cds->num_nics);
|
||||
|
||||
if (cds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VBD))
|
||||
cds->disks = libxl_device_disk_list(CTX, cds->domid, &cds->num_disks);
|
||||
cds->disks = libxl__device_list(gc, &libxl__disk_devtype, cds->domid,
|
||||
"disk", &cds->num_disks);
|
||||
|
||||
if (cds->num_nics == 0 && cds->num_disks == 0)
|
||||
goto out;
|
||||
@@ -221,9 +222,7 @@ static void devices_teardown_cb(libxl__egc *egc,
|
||||
cds->num_nics = 0;
|
||||
|
||||
/* clean disk */
|
||||
for (i = 0; i < cds->num_disks; i++)
|
||||
libxl_device_disk_dispose(&cds->disks[i]);
|
||||
free(cds->disks);
|
||||
libxl__device_list_free(&libxl__disk_devtype, cds->disks, cds->num_disks);
|
||||
cds->disks = NULL;
|
||||
cds->num_disks = 0;
|
||||
|
||||
|
||||
@@ -938,8 +938,8 @@ static void initiate_domain_create(libxl__egc *egc,
|
||||
store_libxl_entry(gc, domid, &d_config->b_info);
|
||||
|
||||
for (i = 0; i < d_config->num_disks; i++) {
|
||||
ret = libxl__device_disk_setdefault(gc, domid, &d_config->disks[i],
|
||||
false);
|
||||
ret = libxl__disk_devtype.set_default(gc, domid, &d_config->disks[i],
|
||||
false);
|
||||
if (ret) {
|
||||
LOGD(ERROR, domid, "Unable to set disk defaults for disk %d", i);
|
||||
goto error_out;
|
||||
|
||||
+20
-63
@@ -152,8 +152,8 @@ void libxl_evdisable_disk_eject(libxl_ctx *ctx, libxl_evgen_disk_eject *evg) {
|
||||
GC_FREE;
|
||||
}
|
||||
|
||||
int libxl__device_disk_setdefault(libxl__gc *gc, uint32_t domid,
|
||||
libxl_device_disk *disk, bool hotplug)
|
||||
static int libxl__device_disk_setdefault(libxl__gc *gc, uint32_t domid,
|
||||
libxl_device_disk *disk, bool hotplug)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@@ -181,7 +181,7 @@ int libxl__device_disk_setdefault(libxl__gc *gc, uint32_t domid,
|
||||
return rc;
|
||||
}
|
||||
|
||||
int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
|
||||
static int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
|
||||
const libxl_device_disk *disk,
|
||||
libxl__device *device)
|
||||
{
|
||||
@@ -472,17 +472,15 @@ static void libxl__device_disk_add(libxl__egc *egc, uint32_t domid,
|
||||
device_disk_add(egc, domid, disk, aodev, NULL, NULL);
|
||||
}
|
||||
|
||||
static int libxl__device_disk_from_xenstore(libxl__gc *gc,
|
||||
const char *libxl_path,
|
||||
libxl_device_disk *disk)
|
||||
static int libxl__disk_from_xenstore(libxl__gc *gc, const char *libxl_path,
|
||||
libxl_devid devid,
|
||||
libxl_device_disk *disk)
|
||||
{
|
||||
libxl_ctx *ctx = libxl__gc_owner(gc);
|
||||
unsigned int len;
|
||||
char *tmp;
|
||||
int rc;
|
||||
|
||||
libxl_device_disk_init(disk);
|
||||
|
||||
const char *backend_path;
|
||||
rc = libxl__xs_read_checked(gc, XBT_NULL,
|
||||
GCSPRINTF("%s/backend", libxl_path),
|
||||
@@ -617,69 +615,28 @@ int libxl_vdev_to_device_disk(libxl_ctx *ctx, uint32_t domid,
|
||||
}
|
||||
libxl_path = GCSPRINTF("%s/device/vbd/%d", dom_xl_path, devid);
|
||||
|
||||
rc = libxl__device_disk_from_xenstore(gc, libxl_path, disk);
|
||||
rc = libxl__disk_from_xenstore(gc, libxl_path, devid, disk);
|
||||
out:
|
||||
GC_FREE;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int libxl__append_disk_list(libxl__gc *gc,
|
||||
uint32_t domid,
|
||||
libxl_device_disk **disks,
|
||||
int *ndisks)
|
||||
{
|
||||
char *libxl_dir_path = NULL;
|
||||
char **dir = NULL;
|
||||
unsigned int n = 0;
|
||||
libxl_device_disk *pdisk = NULL, *pdisk_end = NULL;
|
||||
int rc=0;
|
||||
int initial_disks = *ndisks;
|
||||
|
||||
libxl_dir_path = GCSPRINTF("%s/device/vbd",
|
||||
libxl__xs_libxl_path(gc, domid));
|
||||
dir = libxl__xs_directory(gc, XBT_NULL, libxl_dir_path, &n);
|
||||
if (dir && n) {
|
||||
libxl_device_disk *tmp;
|
||||
tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
|
||||
if (tmp == NULL)
|
||||
return ERROR_NOMEM;
|
||||
*disks = tmp;
|
||||
pdisk = *disks + initial_disks;
|
||||
pdisk_end = *disks + initial_disks + n;
|
||||
for (; pdisk < pdisk_end; pdisk++, dir++) {
|
||||
const char *p;
|
||||
p = GCSPRINTF("%s/%s", libxl_dir_path, *dir);
|
||||
if ((rc=libxl__device_disk_from_xenstore(gc, p, pdisk)))
|
||||
goto out;
|
||||
*ndisks += 1;
|
||||
}
|
||||
}
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
|
||||
{
|
||||
libxl_device_disk *r;
|
||||
|
||||
GC_INIT(ctx);
|
||||
libxl_device_disk *disks = NULL;
|
||||
int rc;
|
||||
|
||||
*num = 0;
|
||||
|
||||
rc = libxl__append_disk_list(gc, domid, &disks, num);
|
||||
if (rc) goto out_err;
|
||||
r = libxl__device_list(gc, &libxl__disk_devtype, domid, "disk", num);
|
||||
|
||||
GC_FREE;
|
||||
return disks;
|
||||
|
||||
out_err:
|
||||
LOG(ERROR, "Unable to list disks");
|
||||
while (disks && *num) {
|
||||
(*num)--;
|
||||
libxl_device_disk_dispose(&disks[*num]);
|
||||
}
|
||||
free(disks);
|
||||
return NULL;
|
||||
return r;
|
||||
}
|
||||
|
||||
void libxl_device_disk_list_free(libxl_device_disk *list, int num)
|
||||
{
|
||||
libxl__device_list_free(&libxl__disk_devtype, list, num);
|
||||
}
|
||||
|
||||
int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
|
||||
@@ -783,7 +740,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk,
|
||||
goto out;
|
||||
}
|
||||
|
||||
disks = libxl_device_disk_list(ctx, domid, &num);
|
||||
disks = libxl__device_list(gc, &libxl__disk_devtype, domid, "disk", &num);
|
||||
for (i = 0; i < num; i++) {
|
||||
if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev))
|
||||
{
|
||||
@@ -921,9 +878,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk,
|
||||
|
||||
out:
|
||||
libxl__xs_transaction_abort(gc, &t);
|
||||
for (i = 0; i < num; i++)
|
||||
libxl_device_disk_dispose(&disks[i]);
|
||||
free(disks);
|
||||
libxl__device_list_free(&libxl__disk_devtype, disks, num);
|
||||
libxl_device_disk_dispose(&disk_empty);
|
||||
libxl_device_disk_dispose(&disk_saved);
|
||||
libxl_domain_config_dispose(&d_config);
|
||||
@@ -1250,6 +1205,8 @@ static int libxl_device_disk_dm_needed(void *e, unsigned domid)
|
||||
DEFINE_DEVICE_TYPE_STRUCT(disk,
|
||||
.merge = libxl_device_disk_merge,
|
||||
.dm_needed = libxl_device_disk_dm_needed,
|
||||
.from_xenstore = (int (*)(libxl__gc *, const char *, libxl_devid, void *))
|
||||
libxl__disk_from_xenstore,
|
||||
.skip_attach = 1
|
||||
);
|
||||
|
||||
|
||||
@@ -1242,9 +1242,6 @@ _hidden int libxl__domain_create_info_setdefault(libxl__gc *gc,
|
||||
libxl_domain_create_info *c_info);
|
||||
_hidden int libxl__domain_build_info_setdefault(libxl__gc *gc,
|
||||
libxl_domain_build_info *b_info);
|
||||
_hidden int libxl__device_disk_setdefault(libxl__gc *gc, uint32_t domid,
|
||||
libxl_device_disk *disk,
|
||||
bool hotplug);
|
||||
_hidden int libxl__device_nic_setdefault(libxl__gc *gc, uint32_t domid,
|
||||
libxl_device_nic *nic, bool hotplug);
|
||||
_hidden void libxl__rdm_setdefault(libxl__gc *gc,
|
||||
@@ -1754,10 +1751,6 @@ _hidden char *libxl__blktap_devpath(libxl__gc *gc,
|
||||
*/
|
||||
_hidden int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params);
|
||||
|
||||
_hidden int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
|
||||
const libxl_device_disk *disk,
|
||||
libxl__device *device);
|
||||
|
||||
/* Calls poll() again - useful to check whether a signaled condition
|
||||
* is still true. Cannot fail. Returns currently-true revents. */
|
||||
_hidden short libxl__fd_poll_recheck(libxl__egc *egc, int fd, short events);
|
||||
|
||||
@@ -763,9 +763,8 @@ value stub_xl_device_disk_list(value ctx, value domid)
|
||||
Field(list, 1) = temp;
|
||||
temp = list;
|
||||
Store_field(list, 0, Val_device_disk(&c_list[i]));
|
||||
libxl_device_disk_dispose(&c_list[i]);
|
||||
}
|
||||
free(c_list);
|
||||
libxl_device_disk_list_free(c_list, nb);
|
||||
|
||||
CAMLreturn(list);
|
||||
}
|
||||
|
||||
+1
-2
@@ -88,9 +88,8 @@ int main_blocklist(int argc, char **argv)
|
||||
diskinfo.state, diskinfo.evtch, diskinfo.rref, diskinfo.backend);
|
||||
libxl_diskinfo_dispose(&diskinfo);
|
||||
}
|
||||
libxl_device_disk_dispose(&disks[i]);
|
||||
}
|
||||
free(disks);
|
||||
libxl_device_disk_list_free(disks, nb);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||