void tapdisk_vbd_close_vdi(td_vbd_t *vbd) { int err; err = vbd_stats_destroy(vbd); if (err) { EPRINTF("failed to destroy RRD stats file: %s (error ignored)\n", strerror(-err)); } tapdisk_image_close_chain(&vbd->images); if (vbd->secondary && vbd->secondary_mode != TD_VBD_SECONDARY_MIRROR) { tapdisk_image_close(vbd->secondary); vbd->secondary = NULL; } if (vbd->retired) { tapdisk_image_close(vbd->retired); vbd->retired = NULL; } td_flag_set(vbd->state, TD_VBD_CLOSED); }
void tapdisk_vbd_close_vdi(td_vbd_t *vbd) { tapdisk_image_close_chain(&vbd->images); if (vbd->secondary && vbd->secondary_mode != TD_VBD_SECONDARY_MIRROR) { tapdisk_image_close(vbd->secondary); vbd->secondary = NULL; } if (vbd->retired) { tapdisk_image_close(vbd->retired); vbd->retired = NULL; } td_flag_set(vbd->state, TD_VBD_CLOSED); }
static int __tapdisk_image_open_chain(int type, const char *name, int flags, struct list_head *_head, int prt_devnum) { struct list_head head = LIST_HEAD_INIT(head); td_image_t *image; int err; err = tapdisk_image_open(type, name, flags, &image); if (err) goto fail; list_add_tail(&image->next, &head); if (unlikely(prt_devnum >= 0)) { char dev[32]; snprintf(dev, sizeof(dev), "%s%d", BLKTAP2_IO_DEVICE, prt_devnum); err = tapdisk_image_open(DISK_TYPE_AIO, dev, flags|TD_OPEN_RDONLY, &image); if (err) goto fail; list_add_tail(&image->next, &head); goto done; } err = tapdisk_image_open_parents(image); if (err) goto fail; done: list_splice(&head, _head); return 0; fail: tapdisk_image_close_chain(&head); return err; }
int tapdisk_vbd_open_vdi(td_vbd_t *vbd, const char *name, td_flag_t flags, int prt_devnum) { char *tmp = vbd->name; int err; if (!list_empty(&vbd->images)) { err = -EBUSY; goto fail; } if (!name && !vbd->name) { err = -EINVAL; goto fail; } if (name) { vbd->name = strdup(name); if (!vbd->name) { err = -errno; goto fail; } } err = tapdisk_image_open_chain(vbd->name, flags, prt_devnum, &vbd->images); if (err) goto fail; td_flag_clear(vbd->state, TD_VBD_CLOSED); vbd->flags = flags; if (td_flag_test(vbd->flags, TD_OPEN_LOG_DIRTY)) { err = tapdisk_vbd_add_dirty_log(vbd); if (err) goto fail; } if (td_flag_test(vbd->flags, TD_OPEN_ADD_CACHE)) { err = tapdisk_vbd_add_block_cache(vbd); if (err) goto fail; } if (td_flag_test(vbd->flags, TD_OPEN_LOCAL_CACHE)) { err = tapdisk_vbd_add_local_cache(vbd); if (err) goto fail; } err = tapdisk_vbd_validate_chain(vbd); if (err) goto fail; if (td_flag_test(vbd->flags, TD_OPEN_SECONDARY)) { err = tapdisk_vbd_add_secondary(vbd); if (err) { if (vbd->nbd_mirror_failed != 1) goto fail; INFO("Ignoring failed NBD secondary attach\n"); err = 0; } } if (tmp != vbd->name) free(tmp); return err; fail: if (vbd->name != tmp) { free(vbd->name); vbd->name = tmp; } if (!list_empty(&vbd->images)) tapdisk_image_close_chain(&vbd->images); vbd->flags = 0; return err; }