summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Rockai <prockai@redhat.com>2013-02-18 19:46:09 +0100
committerPetr Rockai <prockai@redhat.com>2013-06-05 12:37:36 +0200
commitec5f5564de0d0e84c1e2359cad06af2477fa4031 (patch)
treec035342e6a7a45815956424f555f87997d310bca
parent1650e1467ca35e3a4dfece81bcda2e2c23bf046b (diff)
downloadlvm2-ec5f5564de0d0e84c1e2359cad06af2477fa4031.tar.gz
lvmcache: Move device ptr from lvmcache_info into label.
-rw-r--r--lib/cache/lvmcache.c92
-rw-r--r--lib/label/label.c4
-rw-r--r--lib/label/label.h1
3 files changed, 51 insertions, 46 deletions
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index d4e6f0320..1c4da0f88 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -40,7 +40,6 @@ struct lvmcache_info {
struct lvmcache_vginfo *vginfo; /* NULL == unknown */
struct label *label; /* move to PV */
const struct format_type *fmt;
- struct device *dev; /* dup'd from PV */
uint64_t device_size; /* move to label */ /* Bytes */
uint32_t status;
};
@@ -370,7 +369,7 @@ const struct format_type *lvmcache_fmt_from_vgname(struct cmd_context *cmd,
log_error("device_list element allocation failed");
return NULL;
}
- devl->dev = info->dev;
+ devl->dev = info->label->dev;
dm_list_add(&devs, &devl->list);
}
@@ -526,7 +525,7 @@ static void _rescan_entry(struct lvmcache_info *info)
struct label *label;
if (info->status & CACHE_INVALID)
- (void) label_read(info->dev, &label, UINT64_C(0));
+ (void) label_read(info->label->dev, &label, UINT64_C(0));
}
static int _scan_invalid(void)
@@ -786,7 +785,7 @@ struct dm_list *lvmcache_get_pvids(struct cmd_context *cmd, const char *vgname,
dm_list_iterate_items(info, &vginfo->infos) {
if (!str_list_add(cmd->mem, pvids,
- dm_pool_strdup(cmd->mem, info->dev->pvid))) {
+ dm_pool_strdup(cmd->mem, info->label->dev->pvid))) {
log_error("strlist allocation failed");
return NULL;
}
@@ -805,15 +804,15 @@ static struct device *_device_from_pvid(const struct id *pvid,
if (lvmetad_active()) {
if (info->label && label_sector)
*label_sector = info->label->sector;
- return info->dev;
+ return info->label->dev;
}
- if (label_read(info->dev, &label, UINT64_C(0))) {
+ if (label_read(info->label->dev, &label, UINT64_C(0))) {
info = (struct lvmcache_info *) label->info;
- if (id_equal(pvid, (struct id *) &info->dev->pvid)) {
+ if (id_equal(pvid, (struct id *) &info->label->dev->pvid)) {
if (label_sector)
*label_sector = label->sector;
- return info->dev;
+ return info->label->dev;
}
}
}
@@ -952,11 +951,13 @@ static int _lvmcache_update_pvid(struct lvmcache_info *info, const char *pvid)
*/
if (((dm_hash_lookup(_pvid_hash, pvid)) == info) &&
- !strcmp(info->dev->pvid, pvid))
+ !strcmp(info->label->dev->pvid, pvid))
return 1;
- if (*info->dev->pvid)
- dm_hash_remove(_pvid_hash, info->dev->pvid);
- strncpy(info->dev->pvid, pvid, sizeof(info->dev->pvid));
+
+ if (*info->label->dev->pvid)
+ dm_hash_remove(_pvid_hash, info->label->dev->pvid);
+ strncpy(info->label->dev->pvid, pvid, sizeof(info->label->dev->pvid));
+
if (!dm_hash_insert(_pvid_hash, pvid, info)) {
log_error("_lvmcache_update: pvid insertion failed: %s", pvid);
return 0;
@@ -980,7 +981,7 @@ static int _lvmcache_update_vgid(struct lvmcache_info *info,
dm_hash_remove(_vgid_hash, vginfo->vgid);
if (!vgid) {
/* FIXME: unreachable code path */
- log_debug_cache("lvmcache: %s: clearing VGID", info ? dev_name(info->dev) : vginfo->vgname);
+ log_debug_cache("lvmcache: %s: clearing VGID", info ? dev_name(info->label->dev) : vginfo->vgname);
return 1;
}
@@ -994,7 +995,7 @@ static int _lvmcache_update_vgid(struct lvmcache_info *info,
if (!is_orphan_vg(vginfo->vgname))
log_debug_cache("lvmcache: %s: setting %s VGID to %s",
- (info) ? dev_name(info->dev) : "",
+ (info) ? dev_name(info->label->dev) : "",
vginfo->vgname, vginfo->vgid);
return 1;
@@ -1173,7 +1174,7 @@ static int _lvmcache_update_vgname(struct lvmcache_info *info,
else
mdabuf[0] = '\0';
log_debug_cache("lvmcache: %s: now in VG %s%s%s%s%s",
- dev_name(info2->dev),
+ dev_name(info2->label->dev),
vgname, orphan_vginfo->vgid[0] ? " (" : "",
orphan_vginfo->vgid[0] ? orphan_vginfo->vgid : "",
orphan_vginfo->vgid[0] ? ")" : "", mdabuf);
@@ -1215,7 +1216,7 @@ static int _lvmcache_update_vgname(struct lvmcache_info *info,
else
mdabuf[0] = '\0';
log_debug_cache("lvmcache: %s: now in VG %s%s%s%s%s",
- dev_name(info->dev),
+ dev_name(info->label->dev),
vgname, vginfo->vgid[0] ? " (" : "",
vginfo->vgid[0] ? vginfo->vgid : "",
vginfo->vgid[0] ? ")" : "", mdabuf);
@@ -1233,7 +1234,7 @@ static int _lvmcache_update_vgstatus(struct lvmcache_info *info, uint32_t vgstat
if ((info->vginfo->status & EXPORTED_VG) != (vgstatus & EXPORTED_VG))
log_debug_cache("lvmcache: %s: VG %s %s exported",
- dev_name(info->dev), info->vginfo->vgname,
+ dev_name(info->label->dev), info->vginfo->vgname,
vgstatus & EXPORTED_VG ? "now" : "no longer");
info->vginfo->status = vgstatus;
@@ -1255,7 +1256,7 @@ static int _lvmcache_update_vgstatus(struct lvmcache_info *info, uint32_t vgstat
}
log_debug_cache("lvmcache: %s: VG %s: Set creation host to %s.",
- dev_name(info->dev), info->vginfo->vgname, creation_host);
+ dev_name(info->label->dev), info->vginfo->vgname, creation_host);
return 1;
}
@@ -1359,57 +1360,57 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
label->info = info;
info->label = label;
dm_list_init(&info->list);
- info->dev = dev;
+ info->label->dev = dev;
lvmcache_del_mdas(info);
lvmcache_del_das(info);
lvmcache_del_bas(info);
} else {
- if (existing->dev != dev) {
+ if (existing->label->dev != dev) {
/* Is the existing entry a duplicate pvid e.g. md ? */
- if (dev_subsystem_part_major(existing->dev) &&
+ if (dev_subsystem_part_major(existing->label->dev) &&
!dev_subsystem_part_major(dev)) {
log_very_verbose("Ignoring duplicate PV %s on "
"%s - using %s %s",
pvid, dev_name(dev),
- dev_subsystem_name(existing->dev),
- dev_name(existing->dev));
+ dev_subsystem_name(existing->label->dev),
+ dev_name(existing->label->dev));
return NULL;
- } else if (dm_is_dm_major(MAJOR(existing->dev->dev)) &&
+ } else if (dm_is_dm_major(MAJOR(existing->label->dev->dev)) &&
!dm_is_dm_major(MAJOR(dev->dev))) {
log_very_verbose("Ignoring duplicate PV %s on "
"%s - using dm %s",
pvid, dev_name(dev),
- dev_name(existing->dev));
+ dev_name(existing->label->dev));
return NULL;
- } else if (!dev_subsystem_part_major(existing->dev) &&
+ } else if (!dev_subsystem_part_major(existing->label->dev) &&
dev_subsystem_part_major(dev))
log_very_verbose("Duplicate PV %s on %s - "
"using %s %s", pvid,
- dev_name(existing->dev),
- dev_subsystem_name(existing->dev),
+ dev_name(existing->label->dev),
+ dev_subsystem_name(existing->label->dev),
dev_name(dev));
- else if (!dm_is_dm_major(MAJOR(existing->dev->dev)) &&
+ else if (!dm_is_dm_major(MAJOR(existing->label->dev->dev)) &&
dm_is_dm_major(MAJOR(dev->dev)))
log_very_verbose("Duplicate PV %s on %s - "
"using dm %s", pvid,
- dev_name(existing->dev),
+ dev_name(existing->label->dev),
dev_name(dev));
/* FIXME If both dm, check dependencies */
//else if (dm_is_dm_major(MAJOR(existing->dev->dev)) &&
//dm_is_dm_major(MAJOR(dev->dev)))
//
- else if (!strcmp(pvid_s, existing->dev->pvid))
+ else if (!strcmp(pvid_s, existing->label->dev->pvid))
log_error("Found duplicate PV %s: using %s not "
"%s", pvid, dev_name(dev),
- dev_name(existing->dev));
+ dev_name(existing->label->dev));
}
- if (strcmp(pvid_s, existing->dev->pvid))
+ if (existing->label->dev && strcmp(pvid_s, existing->label->dev->pvid))
log_debug_cache("Updating pvid cache to %s (%s) from %s (%s)",
pvid_s, dev_name(dev),
- existing->dev->pvid, dev_name(existing->dev));
+ existing->label->dev->pvid, dev_name(existing->label->dev));
/* Switch over to new preferred device */
- existing->dev = dev;
+ existing->label->dev = dev; /* XXX */
info = existing;
/* Has labeller changed? */
if (info->label->labeller != labeller) {
@@ -1418,6 +1419,7 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
/* FIXME leaves info without label! */
return_NULL;
info->label->info = info;
+ info->label->dev = dev;
lvmcache_del_mdas(info);
lvmcache_del_das(info);
}
@@ -1438,7 +1440,7 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
if (!lvmcache_update_vgname_and_id(info, vgname, vgid, vgstatus, NULL)) {
if (!existing) {
dm_hash_remove(_pvid_hash, pvid_s);
- strcpy(info->dev->pvid, "");
+ strcpy(info->label->dev->pvid, "");
dm_free(info);
label_destroy(label);
}
@@ -1451,7 +1453,7 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
static void _lvmcache_destroy_entry(struct lvmcache_info *info)
{
_vginfo_detach_info(info);
- strcpy(info->dev->pvid, "");
+ strcpy(info->label->dev->pvid, "");
label_destroy(info->label);
dm_free(info);
}
@@ -1518,7 +1520,7 @@ int lvmcache_fid_add_mdas(struct lvmcache_info *info, struct format_instance *fi
int lvmcache_fid_add_mdas_pv(struct lvmcache_info *info, struct format_instance *fid)
{
- return lvmcache_fid_add_mdas(info, fid, info->dev->pvid, ID_LEN);
+ return lvmcache_fid_add_mdas(info, fid, info->label->dev->pvid, ID_LEN);
}
int lvmcache_fid_add_mdas_vg(struct lvmcache_vginfo *vginfo, struct format_instance *fid)
@@ -1548,7 +1550,7 @@ static int _get_pv_if_in_vg(struct lvmcache_info *info,
memcpy(vgid, info->vginfo->vgid, sizeof(vgid));
if (get_pv_from_vg_by_id(info->fmt, vgname, vgid,
- info->dev->pvid, pv))
+ info->label->dev->pvid, pv))
return 1;
}
@@ -1574,23 +1576,23 @@ int lvmcache_populate_pv_fields(struct lvmcache_info *info,
}
/* Orphan */
- pv->dev = info->dev;
+ pv->dev = info->label->dev;
pv->fmt = info->fmt;
pv->size = info->device_size >> SECTOR_SHIFT;
pv->vg_name = FMT_TEXT_ORPHAN_VG_NAME;
- memcpy(&pv->id, &info->dev->pvid, sizeof(pv->id));
+ memcpy(&pv->id, &info->label->dev->pvid, sizeof(pv->id));
/* Currently only support exactly one data area */
if (dm_list_size(&info->label->das) != 1) {
log_error("Must be exactly one data area (found %d) on PV %s",
- dm_list_size(&info->label->das), dev_name(info->dev));
+ dm_list_size(&info->label->das), dev_name(info->label->dev));
return 0;
}
/* Currently only support one embedding area at most */
if (dm_list_size(&info->label->bas) > 1) {
log_error("Must be at most one embedding area (found %d) on PV %s",
- dm_list_size(&info->label->bas), dev_name(info->dev));
+ dm_list_size(&info->label->bas), dev_name(info->label->dev));
return 0;
}
@@ -1609,7 +1611,7 @@ int lvmcache_check_format(struct lvmcache_info *info, const struct format_type *
{
if (info->fmt != fmt) {
log_error("PV %s is a different format (seqno %s)",
- dev_name(info->dev), info->fmt->name);
+ dev_name(info->label->dev), info->fmt->name);
return 0;
}
return 1;
@@ -1773,7 +1775,7 @@ void lvmcache_set_device_size(struct lvmcache_info *info, uint64_t size) {
}
struct device *lvmcache_device(struct lvmcache_info *info) {
- return info->dev;
+ return info->label->dev;
}
int lvmcache_is_orphan(struct lvmcache_info *info) {
diff --git a/lib/label/label.c b/lib/label/label.c
index a38ba6813..9c931f50a 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -282,8 +282,10 @@ int label_read(struct device *dev, struct label **result,
if (!(l = _find_labeller(dev, buf, &sector, scan_sector)))
goto out;
- if ((r = (l->ops->read)(l, dev, buf, result)) && result && *result)
+ if ((r = (l->ops->read)(l, dev, buf, result)) && result && *result) {
+ (*result)->dev = dev;
(*result)->sector = sector;
+ }
out:
if (!dev_close(dev))
diff --git a/lib/label/label.h b/lib/label/label.h
index 60dd17626..9a0e07ea2 100644
--- a/lib/label/label.h
+++ b/lib/label/label.h
@@ -43,6 +43,7 @@ struct label {
uint64_t sector;
struct labeller *labeller;
void *info;
+ struct device *dev;
struct dm_list mdas; /* list head for metadata areas */
struct dm_list das; /* list head for data areas */
struct dm_list bas; /* list head for embedding areas */