mgr->net_table = v3_create_htable(0, dev_hash_fn, dev_eq_fn);
mgr->char_table = v3_create_htable(0, dev_hash_fn, dev_eq_fn);
mgr->cons_table = v3_create_htable(0, dev_hash_fn, dev_eq_fn);
-
+
+ mgr->inited = 1;
+
return 0;
}
struct vm_device * dev;
struct vm_device * tmp;
- if (mgr) {
+ if (mgr && mgr->num_devs > 0) {
list_for_each_entry_safe(dev, tmp, &(mgr->dev_list), dev_link) {
v3_remove_device(dev);
}
list_for_each_entry(dev, &(mgr->dev_list), dev_link) {
if (dev->ops->save) {
strncpy(name_table + tbl_offset, dev->name, V3_MAX_DEVICE_NAME);
+ *(name_table + tbl_offset + V3_MAX_DEVICE_NAME - 1) = 0;
tbl_offset += V3_MAX_DEVICE_NAME;
num_saved_devs++;
} else {
static int free_frontends(struct v3_vm_info * vm, struct vmm_dev_mgr * mgr);
int v3_deinit_dev_mgr(struct v3_vm_info * vm) {
- struct vmm_dev_mgr * mgr = &(vm->dev_mgr);
-
+ struct vmm_dev_mgr * mgr=0;
+
+ if (vm) {
+ mgr = &(vm->dev_mgr);
+ if (!mgr->inited) {
+ return 0;
+ }
+ } else {
+ return 0;
+ }
+
// clear frontend lists
free_frontends(vm, mgr);
INIT_LIST_HEAD(&(dev->res_hooks));
strncpy(dev->name, name, 32);
+ dev->name[31] = 0;
dev->ops = ops;
dev->private_data = private_data;
struct blk_frontend * tmp_blk = NULL;
-
+
list_for_each_entry_safe(chr, tmp_chr, &(mgr->char_list), char_node) {
list_del(&(chr->char_node));
V3_Free(chr);