[lvm-devel] master - vgck: fix updatemetadata writing different descriptions
David Teigland
teigland at sourceware.org
Fri Oct 11 18:00:34 UTC 2019
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d6ffc990523468e46ae03a462ef1ec73067f9934
Commit: d6ffc990523468e46ae03a462ef1ec73067f9934
Parent: fe16d296b058333fddd5102afbebf95a18f85468
Author: David Teigland <teigland at redhat.com>
AuthorDate: Tue Oct 8 14:36:55 2019 -0500
Committer: David Teigland <teigland at redhat.com>
CommitterDate: Fri Oct 11 12:57:32 2019 -0500
vgck: fix updatemetadata writing different descriptions
vgck --updatemetadata would write the same correct
metadata to good mdas, and then to bad mdas, but the
sequence of vg_write/vg_commit calls betwen good and
bad mdas could cause a different description field to
be generated for good/bad mdas. (The description field
describing the command was recently included in the
ondisk copy of the metadata text.)
---
lib/format_text/format-text.c | 29 ++++++++++++++++++++++++++++-
lib/format_text/format-text.h | 3 +++
tools/vgck.c | 15 +++++++++++++++
3 files changed, 46 insertions(+), 1 deletions(-)
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index be4730b..6ec47bf 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -41,8 +41,35 @@ struct text_fid_context {
char *write_buf; /* buffer containing metadata text to write to disk */
uint32_t write_buf_size; /* mem size of write_buf, increases in 64K multiples */
uint32_t new_metadata_size; /* size of text metadata in buf */
+ unsigned preserve:1;
};
+void preserve_text_fidtc(struct volume_group *vg)
+{
+ struct format_instance *fid = vg->fid;
+ struct text_fid_context *fidtc = (struct text_fid_context *)fid->private;
+
+ if (fidtc)
+ fidtc->preserve = 1;
+}
+
+void free_text_fidtc(struct volume_group *vg)
+{
+ struct format_instance *fid = vg->fid;
+ struct text_fid_context *fidtc = (struct text_fid_context *)fid->private;
+
+ if (!fidtc)
+ return;
+
+ fidtc->preserve = 0;
+
+ if (fidtc->write_buf)
+ free(fidtc->write_buf);
+ fidtc->write_buf = NULL;
+ fidtc->write_buf_size = 0;
+ fidtc->new_metadata_size = 0;
+}
+
int rlocn_is_ignored(const struct raw_locn *rlocn)
{
return (rlocn->flags & RAW_LOCN_IGNORED ? 1 : 0);
@@ -1183,7 +1210,7 @@ static int _vg_commit_raw_rlocn(struct format_instance *fid,
r = 1;
out:
- if (!precommit) {
+ if (!precommit && !fidtc->preserve) {
free(fidtc->write_buf);
fidtc->write_buf = NULL;
fidtc->write_buf_size = 0;
diff --git a/lib/format_text/format-text.h b/lib/format_text/format-text.h
index 2345d52..552bfb7 100644
--- a/lib/format_text/format-text.h
+++ b/lib/format_text/format-text.h
@@ -80,4 +80,7 @@ struct data_area_list {
int text_wipe_outdated_pv_mda(struct cmd_context *cmd, struct device *dev,
struct metadata_area *mda);
+void preserve_text_fidtc(struct volume_group *vg);
+void free_text_fidtc(struct volume_group *vg);
+
#endif
diff --git a/tools/vgck.c b/tools/vgck.c
index 46ad594..4e797e7 100644
--- a/tools/vgck.c
+++ b/tools/vgck.c
@@ -14,6 +14,7 @@
*/
#include "tools.h"
+#include "lib/format_text/format-text.h"
/*
* TODO: we cannot yet repair corruption in label_header, pv_header/locations,
@@ -39,6 +40,14 @@ static int _update_metadata_single(struct cmd_context *cmd __attribute__((unused
return 0;
}
+ /*
+ * Prevent vg_commit from freeing the metadata
+ * buffer that vg_write wrote to disk so that
+ * vg_write_commit_bad_mdas() can use the same
+ * metadata buffer to write to the bad mdas.
+ */
+ preserve_text_fidtc(vg);
+
if (!vg_commit(vg)) {
log_error("Failed to commit VG.");
return 0;
@@ -53,6 +62,12 @@ static int _update_metadata_single(struct cmd_context *cmd __attribute__((unused
*/
vg_write_commit_bad_mdas(cmd, vg);
+ /*
+ * Now free the metadata buffer that was
+ * preserved above.
+ */
+ free_text_fidtc(vg);
+
return 1;
}
More information about the lvm-devel
mailing list