Example #1
0
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);
}
Example #2
0
static int
vbd_stats_create(td_vbd_t *vbd) {

    int err;

    ASSERT(vbd);

	err = mkdir("/dev/shm/metrics", S_IRUSR | S_IWUSR);
	if (err && errno != EEXIST)
		goto out;

    /*
     * FIXME we use tap-<tapdisk PID>-<minor number> for now, might want to
     * reconsider
     */
    err = asprintf(&vbd->rrd.path, "/dev/shm/metrics/tap-%d-%d", getpid(),
            vbd->uuid);
    if (err == -1) {
        err = errno;
        vbd->rrd.path = NULL;
        EPRINTF("failed to create metric file: %s\n", strerror(err));
        goto out;
    }
    err = 0;

    vbd->rrd.fd = open(vbd->rrd.path, O_CREAT | O_TRUNC | O_RDWR | O_EXCL,
            S_IRUSR | S_IWUSR);
    if (vbd->rrd.fd == -1) {
        err = errno;
        EPRINTF("failed to open %s: %s\n", vbd->rrd.path, strerror(err));
        goto out;
    }

    err = ftruncate(vbd->rrd.fd, RRD_SHM_SIZE);
    if (err == -1) {
        err = errno;
        EPRINTF("failed to truncate %s: %s\n", vbd->rrd.path, strerror(err));
        goto out;
    }

    vbd->rrd.mem = mmap(NULL, RRD_SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
            vbd->rrd.fd, 0);
    if (vbd->rrd.mem == MAP_FAILED) {
        err = errno;
        EPRINTF("failed to mmap %s: %s\n", vbd->rrd.path, strerror(err));
        goto out;
    }

out:
    if (err) {
        int err2 = vbd_stats_destroy(vbd);
        if (err2)
            EPRINTF("failed to clean up failed RRD shared memory creation: "
                    "%s (error ignored)\n", strerror(-err2));
    }
    return -err;
}
Example #3
0
static int
vbd_stats_create(td_vbd_t *vbd) {

    int err;

    ASSERT(vbd);

    err = mkdir("/dev/shm/metrics", S_IRUSR | S_IWUSR);
    if (likely(err)) {
        err = errno;
        if (unlikely(err != EEXIST))
            goto out;
        else
            err = 0;
    }

    /*
     * FIXME Rename this to something like "vbd3-domid-devid". Consider
     * consolidating this with the io_ring shared memory file. Check if blkback
     * exports the same information in some sysfs file and if so move this to
     * the ring location.
     */
    err = asprintf(&vbd->rrd.shm.path, "/dev/shm/metrics/tap-%d-%d", getpid(),
                   vbd->uuid);
    if (err == -1) {
        err = errno;
        vbd->rrd.shm.path = NULL;
        EPRINTF("failed to create metric file: %s\n", strerror(err));
        goto out;
    }
    err = 0;

    vbd->rrd.shm.size = PAGE_SIZE;
    err = shm_create(&vbd->rrd.shm);
    if (err)
        EPRINTF("failed to create RRD: %s\n", strerror(err));

out:
    if (err) {
        int err2 = vbd_stats_destroy(vbd);
        if (err2)
            EPRINTF("failed to clean up failed RRD shared memory creation: "
                    "%s (error ignored)\n", strerror(-err2));
    }
    return -err;
}