コード例 #1
0
ファイル: tapdisk-vbd.c プロジェクト: BobBall/blktap
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);
}
コード例 #2
0
ファイル: tapdisk-image.c プロジェクト: DarumasLegs/blktap
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);
}
コード例 #3
0
ファイル: tapdisk-vbd.c プロジェクト: Kristoffer/blktap
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);
}
コード例 #4
0
ファイル: tapdisk-vbd.c プロジェクト: dns42/blktap
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;
}
コード例 #5
0
ファイル: tapdisk-image.c プロジェクト: DarumasLegs/blktap
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;
}