summaryrefslogtreecommitdiff
path: root/lib/cache
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2021-09-28 14:58:03 -0500
committerDavid Teigland <teigland@redhat.com>2021-09-28 15:17:43 -0500
commit939b4bc58719605aa7d348d2b4e0fcf41aad0b17 (patch)
treeeacfa44671b0c0b14036f2b2195e9e5cb55dd6a2 /lib/cache
parente3b4c365a4d9fc3f88dcfaca6dff89b924fc4851 (diff)
downloadlvm2-939b4bc58719605aa7d348d2b4e0fcf41aad0b17.tar.gz
handle bad metadata text in vg_read path
Corrupt metadata text (with good mda header) was being handled in the label_scan phase, but not in the vg_read phase. This was sufficient because metadata areas would always be read and checksummed during label_scan (metadata parsing was skipped previously as an optimization.) This changed with the optimization in commit 61a6f9905e87e650f0bddae83fec6923bb100a57 "metadata: optimize reading metadata copies in scan" Now, some metadata areas will not be read and checksummed at all during the label_scan phase, only during the vg_read phase. This means that bad metadata text may first be detected in the vg_read phase. So, add equivalent bad metadata handling to the vg_read path to match the label_scan path.
Diffstat (limited to 'lib/cache')
-rw-r--r--lib/cache/lvmcache.c14
-rw-r--r--lib/cache/lvmcache.h2
2 files changed, 16 insertions, 0 deletions
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 655f34bd8..7a7634074 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -237,6 +237,20 @@ void lvmcache_save_bad_mda(struct lvmcache_info *info, struct metadata_area *mda
dm_list_add(&info->bad_mdas, &mda->list);
}
+void lvmcache_del_save_bad_mda(struct lvmcache_info *info, int mda_num, int bad_mda_flag)
+{
+ struct metadata_area *mda, *mda_safe;
+
+ dm_list_iterate_items_safe(mda, mda_safe, &info->mdas) {
+ if (mda->mda_num == mda_num) {
+ dm_list_del(&mda->list);
+ mda->bad_fields |= bad_mda_flag;
+ lvmcache_save_bad_mda(info, mda);
+ break;
+ }
+ }
+}
+
void lvmcache_get_bad_mdas(struct cmd_context *cmd,
const char *vgname, const char *vgid,
struct dm_list *bad_mda_list)
diff --git a/lib/cache/lvmcache.h b/lib/cache/lvmcache.h
index d7e10f4f0..9511bb9e9 100644
--- a/lib/cache/lvmcache.h
+++ b/lib/cache/lvmcache.h
@@ -210,6 +210,8 @@ void lvmcache_del_outdated_devs(struct cmd_context *cmd,
void lvmcache_save_bad_mda(struct lvmcache_info *info, struct metadata_area *mda);
+void lvmcache_del_save_bad_mda(struct lvmcache_info *info, int mda_num, int bad_mda_flag);
+
void lvmcache_get_bad_mdas(struct cmd_context *cmd,
const char *vgname, const char *vgid,
struct dm_list *bad_mda_list);