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); }
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; }
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; }