X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_dev_mgr.c;h=45cb8d146c678056af4d602440657ad9598ecba4;hb=d22c11cec4e8c3390bfe6bf16ed07f5d073f0d4a;hp=2c449bc02bf78448674057fda6c0e1b493c33397;hpb=82071a7f5f0b18fbf1a4adc2a37fed1624572a79;p=palacios.git diff --git a/palacios/src/palacios/vmm_dev_mgr.c b/palacios/src/palacios/vmm_dev_mgr.c index 2c449bc..45cb8d1 100644 --- a/palacios/src/palacios/vmm_dev_mgr.c +++ b/palacios/src/palacios/vmm_dev_mgr.c @@ -119,7 +119,9 @@ int v3_init_dev_mgr(struct v3_vm_info * vm) { 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; } @@ -129,8 +131,10 @@ int v3_free_vm_devices(struct v3_vm_info * vm) { struct vm_device * dev; struct vm_device * tmp; - list_for_each_entry_safe(dev, tmp, &(mgr->dev_list), dev_link) { - v3_remove_device(dev); + if (mgr && mgr->num_devs > 0) { + list_for_each_entry_safe(dev, tmp, &(mgr->dev_list), dev_link) { + v3_remove_device(dev); + } } return 0; @@ -168,6 +172,7 @@ int v3_save_vm_devices(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { 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 { @@ -326,8 +331,17 @@ int v3_load_vm_devices(struct v3_vm_info * vm, struct v3_chkpt * chkpt) { 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); @@ -545,6 +559,7 @@ struct vm_device * v3_add_device(struct v3_vm_info * vm, INIT_LIST_HEAD(&(dev->res_hooks)); strncpy(dev->name, name, 32); + dev->name[31] = 0; dev->ops = ops; dev->private_data = private_data; @@ -864,7 +879,7 @@ static int free_frontends(struct v3_vm_info * vm, struct vmm_dev_mgr * mgr) { 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);