diff options
author | David Teigland <teigland@redhat.com> | 2021-09-28 14:58:03 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2021-09-28 15:17:43 -0500 |
commit | 939b4bc58719605aa7d348d2b4e0fcf41aad0b17 (patch) | |
tree | eacfa44671b0c0b14036f2b2195e9e5cb55dd6a2 /lib/cache | |
parent | e3b4c365a4d9fc3f88dcfaca6dff89b924fc4851 (diff) | |
download | lvm2-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.c | 14 | ||||
-rw-r--r-- | lib/cache/lvmcache.h | 2 |
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); |