diff --git a/WHATS_NEW b/WHATS_NEW index 91e88b4a7..7c03af425 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.03 - =================================== + Capture vgid in more places. Update extent size information in vgchange and vgcreate man pages. Introduce origin_from_cow() and lv_is_visible(). pvremove without -f now fails if there's no PV label. diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c index 4ac298be3..99fa6fa92 100644 --- a/lib/cache/lvmcache.c +++ b/lib/cache/lvmcache.c @@ -356,8 +356,10 @@ static int _lvmcache_update_vgid(struct lvmcache_info *info, const char *vgid) if (info->vginfo && *info->vginfo->vgid) dm_hash_remove(_vgid_hash, info->vginfo->vgid); - if (!vgid) + if (!vgid) { + log_debug("lvmcache: %s: clearing VGID", dev_name(info->dev)); return 1; + } strncpy(info->vginfo->vgid, vgid, sizeof(info->vginfo->vgid)); info->vginfo->vgid[sizeof(info->vginfo->vgid) - 1] = '\0'; @@ -367,6 +369,9 @@ static int _lvmcache_update_vgid(struct lvmcache_info *info, const char *vgid) return 0; } + log_debug("lvmcache: %s: setting VGID to %s", dev_name(info->dev), + info->vginfo->vgid); + return 1; } diff --git a/lib/format1/disk-rep.c b/lib/format1/disk-rep.c index 790456206..af76b8faf 100644 --- a/lib/format1/disk-rep.c +++ b/lib/format1/disk-rep.c @@ -223,11 +223,11 @@ static int _read_lvd(struct device *dev, uint64_t pos, struct lv_disk *disk) return 1; } -static int _read_vgd(struct disk_list *data) +int read_vgd(struct device *dev, struct vg_disk *vgd, struct pv_disk *pvd) { - struct vg_disk *vgd = &data->vgd; - uint64_t pos = data->pvd.vg_on_disk.base; - if (!dev_read(data->dev, pos, sizeof(*vgd), vgd)) + uint64_t pos = pvd->vg_on_disk.base; + + if (!dev_read(dev, pos, sizeof(*vgd), vgd)) fail; _xlate_vgd(vgd); @@ -319,13 +319,29 @@ static int _read_extents(struct disk_list *data) return 1; } +static void __update_lvmcache(const struct format_type *fmt, + struct disk_list *dl, + struct device *dev, const char *vgid) +{ + struct lvmcache_info *info; + + if (!(info = lvmcache_add(fmt->labeller, dl->pvd.pv_uuid, dev, + dl->pvd.vg_name, vgid))) { + stack; + return; + } + + info->device_size = xlate32(dl->pvd.pv_size) << SECTOR_SHIFT; + list_init(&info->mdas); + info->status &= ~CACHE_INVALID; +} + static struct disk_list *__read_disk(const struct format_type *fmt, struct device *dev, struct dm_pool *mem, const char *vg_name) { - struct disk_list *dl = dm_pool_alloc(mem, sizeof(*dl)); + struct disk_list *dl = dm_pool_zalloc(mem, sizeof(*dl)); const char *name = dev_name(dev); - struct lvmcache_info *info; if (!dl) { stack; @@ -342,41 +358,31 @@ static struct disk_list *__read_disk(const struct format_type *fmt, goto bad; } - if (!(info = lvmcache_add(fmt->labeller, dl->pvd.pv_uuid, dev, - dl->pvd.vg_name, NULL))) - stack; - else { - info->device_size = xlate32(dl->pvd.pv_size) << SECTOR_SHIFT; - list_init(&info->mdas); - info->status &= ~CACHE_INVALID; - } - /* * is it an orphan ? */ if (!*dl->pvd.vg_name) { log_very_verbose("%s is not a member of any format1 VG", name); - /* Update VG cache */ - /* vgcache_add(dl->pvd.vg_name, NULL, dev, fmt); */ - + __update_lvmcache(fmt, dl, dev, NULL); return (vg_name) ? NULL : dl; } - if (!_read_vgd(dl)) { + if (!read_vgd(dl->dev, &dl->vgd, &dl->pvd)) { log_error("Failed to read VG data from PV (%s)", name); + __update_lvmcache(fmt, dl, dev, NULL); goto bad; } - /* Update VG cache with what we found */ - /* vgcache_add(dl->pvd.vg_name, dl->vgd.vg_uuid, dev, fmt); */ - if (vg_name && strcmp(vg_name, dl->pvd.vg_name)) { log_very_verbose("%s is not a member of the VG %s", name, vg_name); + __update_lvmcache(fmt, dl, dev, NULL); goto bad; } + __update_lvmcache(fmt, dl, dev, dl->vgd.vg_uuid); + if (!_read_uuids(dl)) { log_error("Failed to read PV uuid list from %s", name); goto bad; diff --git a/lib/format1/disk-rep.h b/lib/format1/disk-rep.h index 3b8cd7faa..13f57bc43 100644 --- a/lib/format1/disk-rep.h +++ b/lib/format1/disk-rep.h @@ -237,6 +237,7 @@ void export_numbers(struct list *pvds, struct volume_group *vg); void export_pv_act(struct list *pvds); int munge_pvd(struct device *dev, struct pv_disk *pvd); +int read_vgd(struct device *dev, struct vg_disk *vgd, struct pv_disk *pvd); /* blech */ int get_free_vg_number(struct format_instance *fid, struct dev_filter *filter, diff --git a/lib/format1/lvm1-label.c b/lib/format1/lvm1-label.c index 3c8b4f3f0..dfd814012 100644 --- a/lib/format1/lvm1-label.c +++ b/lib/format1/lvm1-label.c @@ -58,11 +58,16 @@ static int _read(struct labeller *l, struct device *dev, char *buf, struct label **label) { struct pv_disk *pvd = (struct pv_disk *) buf; + struct vg_disk vgd; struct lvmcache_info *info; + const char *vgid = NULL; munge_pvd(dev, pvd); - if (!(info = lvmcache_add(l, pvd->pv_uuid, dev, pvd->vg_name, NULL))) { + if (*pvd->vg_name && read_vgd(dev, &vgd, pvd)) + vgid = vgd.vg_uuid; + + if (!(info = lvmcache_add(l, pvd->pv_uuid, dev, pvd->vg_name, vgid))) { stack; return 0; } diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c index 65d729dc2..5425eba1c 100644 --- a/lib/format_text/text_label.c +++ b/lib/format_text/text_label.c @@ -235,6 +235,7 @@ static int _read(struct labeller *l, struct device *dev, char *buf, if (vgname_from_mda(info->fmt, &mdac->area, vgnamebuf, sizeof(vgnamebuf))) { lvmcache_update_vgname(info, vgnamebuf); + /* FIXME Also store vgid */ } }