# HG changeset patch # User Daniel Stodden # Date 1275947595 25200 # Node ID eb39271223ce6600cb81cf0dab8167a382d1393a # Parent 0156cca51013424068a563705b0d5689292b5c36 blktap2: Remove LVM hacks. These only mattered for XCP's LVHD with blktap1. Signed-off-by: Jake Wires Signed-off-by: Daniel Stodden diff -r 0156cca51013 -r eb39271223ce tools/blktap2/drivers/tapdisk-vbd.c --- a/tools/blktap2/drivers/tapdisk-vbd.c Mon Jun 07 14:53:15 2010 -0700 +++ b/tools/blktap2/drivers/tapdisk-vbd.c Mon Jun 07 14:53:15 2010 -0700 @@ -280,272 +280,6 @@ return err; } -/* - * LVHD hack: have to rescan LVM metadata on pool - * slaves to register lvchanges made on master. FIXME. - */ -static int -tapdisk_vbd_reactivate_volume(const char *name) -{ - int err; - char *cmd; - - DPRINTF("reactivating %s\n", name); - - err = asprintf(&cmd, "lvchange -an %s", name); - if (err == - 1) { - EPRINTF("failed to deactivate %s\n", name); - return -errno; - } - - err = system(cmd); - if (err) { - /* - * Assume that LV deactivation failed because the LV is open, - * in which case the LVM information should be up-to-date and - * we don't need this step anyways (so ignore the error). If - * the failure is due to a non-existent LV, the next command - * (lvchange -ay) will catch it. - * If we want to be more prudent/paranoid, we can instead check - * whether the LV is currently open (a bit more work). - */ - } - - free(cmd); - err = asprintf(&cmd, "lvchange -ay --refresh %s", name); - if (err == - 1) { - EPRINTF("failed to activate %s\n", name); - return -errno; - } - - err = system(cmd); - if (err) - EPRINTF("%s failed: %d\n", cmd, err); - free(cmd); - return err; -} - -static int -tapdisk_vbd_reactivate_volumes(td_vbd_t *vbd, int resume) -{ - int i, cnt, err; - char *name, *new; - vhd_context_t vhd; - vhd_parent_locator_t *loc; - - new = NULL; - name = NULL; - - if (vbd->storage != TAPDISK_STORAGE_TYPE_LVM) - return 0; - - if (!resume && vbd->reactivated) - return 0; - - name = strdup(vbd->name); - if (!name) { - EPRINTF("%s: nomem\n", vbd->name); - return -ENOMEM; - } - - for (cnt = 0; 1; cnt++) { - - /* only need to reactivate child and parent during resume */ - if (resume && cnt == 2) - break; - - err = tapdisk_vbd_reactivate_volume(name); - if (err) - goto fail; - - if (!strstr(name, "VHD")) - break; - - for (i = 0; i < TD_VBD_EIO_RETRIES; i++) { - err = vhd_open(&vhd, name, VHD_OPEN_RDONLY); - if (!err) - break; - - libvhd_set_log_level(1); - sleep(TD_VBD_EIO_SLEEP); - } - libvhd_set_log_level(0); - if (err) - goto fail; - - if (vhd.footer.type != HD_TYPE_DIFF) { - vhd_close(&vhd); - break; - } - - loc = NULL; - for (i = 0; i < 8; i++) - if (vhd.header.loc[i].code == PLAT_CODE_MACX) { - loc = vhd.header.loc + i; - break; - } - - if (!loc) { - vhd_close(&vhd); - err = -EINVAL; - goto fail; - } - - free(name); - err = vhd_parent_locator_read(&vhd, loc, &name); - vhd_close(&vhd); - - if (err) { - name = NULL; - goto fail; - } - - /* - * vhd_parent_locator_read returns path relative to child: - * ./VG_XenStorage---VHD-- - * we have to convert this to absolute path for lvm - */ - err = asprintf(&new, "/dev/mapper/%s", name + 2); - if (err == -1) { - err = -errno; - goto fail; - } - - free(name); - name = new; - } - - err = 0; - vbd->reactivated = 1; - -out: - free(name); - return err; - -fail: - EPRINTF("failed to reactivate %s: %d\n", vbd->name, err); - goto out; -} - -/* - * LVHD hack: - * raw volumes are named /dev/-/LV- - * vhd volumes are named /dev/-/VHD- - * - * a live snapshot of a raw volume will result in the writeable volume's - * name changing from the raw to vhd format, but this change will not be - * reflected by xenstore. hence this mess. - */ -static int -tapdisk_vbd_check_file(td_vbd_t *vbd) -{ - int i, err; - regex_t re; - size_t len, max; - regmatch_t matches[4]; - char *new, *src, *dst, error[256]; - - if (vbd->storage != TAPDISK_STORAGE_TYPE_LVM) - return 0; - - err = tapdisk_vbd_reactivate_volume(vbd->name); - if (!err) - return 0; - else - DPRINTF("reactivating %s failed\n", vbd->name); - -#define HEX "[A-Za-z0-9]" -#define UUID HEX"\\{8\\}-"HEX"\\{4\\}-"HEX"\\{4\\}-"HEX"\\{4\\}-"HEX"\\{12\\}" -#define VG "VG_"HEX"\\+" -#define TYPE "\\(LV\\|VHD\\)" -#define RE "\\(/dev/"VG"-"UUID"/\\)"TYPE"\\(-"UUID"\\)" - - err = regcomp(&re, RE, 0); - if (err) - goto regerr; - -#undef HEX -#undef UUID -#undef VG -#undef TYPE -#undef RE - - err = regexec(&re, vbd->name, 4, matches, 0); - if (err) - goto regerr; - - max = strlen("VHD") + 1; - for (i = 1; i < 4; i++) { - if (matches[i].rm_so == -1 || matches[i].rm_eo == -1) { - EPRINTF("%s: failed to tokenize name\n", vbd->name); - err = -EINVAL; - goto out; - } - - max += matches[i].rm_eo - matches[i].rm_so; - } - - new = malloc(max); - if (!new) { - EPRINTF("%s: failed to allocate new name\n", vbd->name); - err = -ENOMEM; - goto out; - } - - src = new; - for (i = 1; i < 4; i++) { - dst = vbd->name + matches[i].rm_so; - len = matches[i].rm_eo - matches[i].rm_so; - - if (i == 2) { - if (memcmp(dst, "LV", len)) { - EPRINTF("%s: bad name format\n", vbd->name); - free(new); - err = -EINVAL; - goto out; - } - - src += sprintf(src, "VHD"); - continue; - } - - memcpy(src, dst, len + 1); - src += len; - } - - *src = '\0'; - - err = tapdisk_vbd_reactivate_volume(new); - if (err) - DPRINTF("reactivating %s failed\n", new); - - err = access(new, F_OK); - if (err == -1) { - EPRINTF("neither %s nor %s accessible\n", - vbd->name, new); - err = -errno; - free(new); - goto out; - } - - DPRINTF("couldn't find %s, trying %s\n", vbd->name, new); - - err = 0; - free(vbd->name); - vbd->name = new; - vbd->type = DISK_TYPE_VHD; - -out: - regfree(&re); - return err; - -regerr: - regerror(err, &re, error, sizeof(error)); - EPRINTF("%s: regex failed: %s\n", vbd->name, error); - err = -EINVAL; - goto out; -} - /* TODO: ugh, lets not call it parent info... */ static struct list_head * tapdisk_vbd_open_level(td_vbd_t *vbd, char* params, int driver_type, td_disk_info_t *parent_info, td_flag_t flags) @@ -658,10 +392,6 @@ struct list_head *images; td_disk_info_t *parent_info = NULL; - err = tapdisk_vbd_reactivate_volumes(vbd, 0); - if (err) - return err; - flags = (vbd->flags & ~TD_OPEN_SHAREABLE) | extra_flags; /* loop on each user specified driver. @@ -1215,22 +945,10 @@ vbd->type = drivertype; for (i = 0; i < TD_VBD_EIO_RETRIES; i++) { - err = tapdisk_vbd_check_file(vbd); - if (err) - goto sleep; - - err = tapdisk_vbd_reactivate_volumes(vbd, 1); - if (err) { - EPRINTF("failed to reactivate %s: %d\n", - vbd->name, err); - goto sleep; - } - err = __tapdisk_vbd_open_vdi(vbd, TD_OPEN_STRICT); if (!err) break; - sleep: sleep(TD_VBD_EIO_SLEEP); } @@ -1887,12 +1605,6 @@ tapdisk_vbd_start_queue(vbd); - err = tapdisk_vbd_reactivate_volumes(vbd, 1); - if (err) { - EPRINTF("failed to reactivate %s, %d\n", vbd->name, err); - goto out; - } - for (i = 0; i < TD_VBD_EIO_RETRIES; i++) { err = __tapdisk_vbd_open_vdi(vbd, TD_OPEN_STRICT); if (err != -EIO)