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_image_close_chain(struct list_head *list) { td_image_t *image, *next; tapdisk_for_each_image_safe(image, next, list) tapdisk_image_close(image); }
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); }
int tapdisk_vbd_add_secondary(td_vbd_t *vbd) { td_image_t *leaf, *second = NULL; const char *path; int type, err; DPRINTF("Adding secondary image: %s\n", vbd->secondary_name); type = tapdisk_disktype_parse_params(vbd->secondary_name, &path); if (type < 0) return type; leaf = tapdisk_vbd_first_image(vbd); if (!leaf) { err = -EINVAL; goto fail; } err = tapdisk_image_open(type, path, leaf->flags, &second); if (err) goto fail; if (second->info.size != leaf->info.size) { EPRINTF("Secondary image size %"PRIu64" != image size %"PRIu64"\n", second->info.size, leaf->info.size); err = -EINVAL; goto fail; } vbd->secondary = second; leaf->flags |= TD_IGNORE_ENOSPC; if (td_flag_test(vbd->flags, TD_OPEN_STANDBY)) { DPRINTF("In standby mode\n"); vbd->secondary_mode = TD_VBD_SECONDARY_STANDBY; } else { DPRINTF("In mirror mode\n"); vbd->secondary_mode = TD_VBD_SECONDARY_MIRROR; /* we actually need this image to also be part of the chain, * since it may already contain data */ list_add(&second->next, &leaf->next); } DPRINTF("Added secondary image\n"); return 0; fail: if (second) tapdisk_image_close(second); return err; }
int tapdisk_image_open(int type, const char *name, int flags, td_image_t **_image) { td_image_t *image; int err; image = tapdisk_image_allocate(name, type, flags); if (!image) { err = -ENOMEM; goto fail; } err = td_load(image); if (!err) goto done; image->driver = tapdisk_driver_allocate(image->type, image->name, image->flags); if (!image->driver) { err = -ENOMEM; goto fail; } err = td_open(image); if (err) goto fail; done: *_image = image; return 0; fail: if (image) tapdisk_image_close(image); return err; }