1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

lvmetad: fix format1 updates

fmt1 doesn't have a separate commit function: updates take effect
immediately vg_write is called, so we must update lvmetad at this
point if we're going to go on and ask lvmetad for the VG metadata
again before calling the commit function (though that's probably an
unsupported and pointless thing to do anyway as the client must
already have that data and it cannot have changed because it's locked
and with devs suspended we shouldn't be communicating with lvmetad;
so when that's fixed properly, this fix here can be reverted).

This problem showed up as an internal error when lvremoving an LVM1
snapshot.

> Internal error: LV snap1 (00000000000000000000000000000001) missing from preload metadata

https://bugzilla.redhat.com/891855
This commit is contained in:
Alasdair G Kergon 2013-01-05 03:07:43 +00:00
parent 48e1ae7f6a
commit b617109fff
2 changed files with 12 additions and 4 deletions

1
lib/cache/lvmetad.h vendored
View File

@ -72,6 +72,7 @@ void lvmetad_set_token(const struct dm_config_value *filter);
*/ */
void lvmetad_release_token(void); void lvmetad_release_token(void);
// FIXME What's described here doesn't appear to be implemented yet.
/* /*
* Send a new version of VG metadata to lvmetad. This is normally called after * Send a new version of VG metadata to lvmetad. This is normally called after
* vg_write but before vg_commit. After vg_commit, lvmetad_vg_commit is called * vg_write but before vg_commit. After vg_commit, lvmetad_vg_commit is called

View File

@ -2659,6 +2659,13 @@ int vg_write(struct volume_group *vg)
} }
} }
/*
* If precommit is not supported, changes take effect immediately.
* FIXME Replace with a more-accurate FMT_COMMIT flag.
*/
if (!(vg->fid->fmt->features & FMT_PRECOMMIT) && !lvmetad_vg_update(vg))
return_0;
return 1; return 1;
} }
@ -2707,8 +2714,9 @@ int vg_commit(struct volume_group *vg)
return cache_updated; return cache_updated;
} }
if (!lvmetad_vg_update(vg)) /* Skip if we already did this in vg_write */
return 0; if ((vg->fid->fmt->features & FMT_PRECOMMIT) && !lvmetad_vg_update(vg))
return_0;
cache_updated = _vg_commit_mdas(vg); cache_updated = _vg_commit_mdas(vg);
@ -3511,7 +3519,7 @@ struct logical_volume *lv_from_lvid(struct cmd_context *cmd, const char *lvid_s,
lvid = (const union lvid *) lvid_s; lvid = (const union lvid *) lvid_s;
log_very_verbose("Finding volume group for uuid %s", lvid_s); log_very_verbose("Finding %svolume group for uuid %s", precommitted ? "precommitted " : "", lvid_s);
if (!(vg = _vg_read_by_vgid(cmd, (const char *)lvid->id[0].uuid, precommitted))) { if (!(vg = _vg_read_by_vgid(cmd, (const char *)lvid->id[0].uuid, precommitted))) {
log_error("Volume group for uuid not found: %s", lvid_s); log_error("Volume group for uuid not found: %s", lvid_s);
return NULL; return NULL;
@ -3533,7 +3541,6 @@ out:
return NULL; return NULL;
} }
const char *find_vgname_from_pvid(struct cmd_context *cmd, const char *find_vgname_from_pvid(struct cmd_context *cmd,
const char *pvid) const char *pvid)
{ {