From: wysochanski@sourceware.org <wysochanski@sourceware.org>
To: lvm-devel@redhat.com
Subject: LVM2/lib/metadata metadata.c
Date: 28 Jun 2010 20:37:55 -0000 [thread overview]
Message-ID: <20100628203755.18705.qmail@sourceware.org> (raw)
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: wysochanski at sourceware.org 2010-06-28 20:37:54
Modified files:
lib/metadata : metadata.c
Log message:
Implement _vg_adjust_ignored_mdas and call from vg_write() path.
Compare the value of the newly added vg_mda_copies field
(--vgmetadatacopies parameter) with the current count of
in-use mdas and ignoring or unignoring mdas as necessary to
get to the target count. Also, as a safety check before
returning, ensure we have at least one mda enabled.
Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.359&r2=1.360
--- LVM2/lib/metadata/metadata.c 2010/06/28 20:36:56 1.359
+++ LVM2/lib/metadata/metadata.c 2010/06/28 20:37:54 1.360
@@ -58,6 +58,8 @@
static uint32_t _vg_bad_status_bits(const struct volume_group *vg,
uint64_t status);
+static int _vg_adjust_ignored_mdas(struct volume_group *vg);
+
const char _really_init[] =
"Really INITIALIZE physical volume \"%s\" of volume group \"%s\" [y/n]? ";
@@ -989,6 +991,93 @@
return 1;
}
+static int _vg_ignore_mdas(struct volume_group *vg, uint32_t num_to_ignore)
+{
+ struct metadata_area *mda;
+
+ if (!num_to_ignore)
+ return 1;
+ /* FIXME: flip bits on random mdas */
+ dm_list_iterate_items(mda, &vg->fid->metadata_areas_in_use) {
+ if (!mda_is_ignored(mda)) {
+ mda_set_ignored(mda, 1);
+ num_to_ignore--;
+ }
+ if (!num_to_ignore)
+ return 1;
+ }
+ log_error("Unable to find %"PRIu32" metadata areas to ignore "
+ "on volume group %s", num_to_ignore, vg->name);
+ return 0;
+}
+
+static int _vg_unignore_mdas(struct volume_group *vg, uint32_t num_to_unignore)
+{
+ struct metadata_area *mda, *tmda;
+
+ if (!num_to_unignore)
+ return 1;
+ /* FIXME: flip bits on random mdas */
+ dm_list_iterate_items_safe(mda, tmda, &vg->fid->metadata_areas_ignored) {
+ if (mda_is_ignored(mda)) {
+ mda_set_ignored(mda, 0);
+ dm_list_move(&vg->fid->metadata_areas_in_use,
+ &mda->list);
+ num_to_unignore--;
+ }
+ if (!num_to_unignore)
+ return 1;
+ }
+ dm_list_iterate_items(mda, &vg->fid->metadata_areas_in_use) {
+ if (mda_is_ignored(mda)) {
+ mda_set_ignored(mda, 0);
+ num_to_unignore--;
+ }
+ if (!num_to_unignore)
+ return 1;
+ }
+ log_error("Unable to find %"PRIu32" metadata areas to un-ignore "
+ "on volume group %s", num_to_unignore, vg->name);
+ return 0;
+}
+
+static int _vg_adjust_ignored_mdas(struct volume_group *vg)
+{
+ uint32_t mda_copies, count;
+ int ret = 1;
+
+ mda_copies = vg_mda_used_count(vg);
+ if (!vg->mda_copies)
+ goto skip_adjust;
+
+ if (mda_copies > vg->mda_copies) {
+ ret = _vg_ignore_mdas(vg, mda_copies - vg->mda_copies);
+ } else if (mda_copies < vg->mda_copies) {
+ /* not an error to have vg_mda_count larger than total mdas */
+ if (vg->mda_copies >= vg_mda_count(vg))
+ count = vg_mda_count(vg) - vg_mda_used_count(vg);
+ else
+ count = vg->mda_copies - mda_copies;
+ ret = _vg_unignore_mdas(vg, count);
+ }
+ if (!ret)
+ return ret;
+
+skip_adjust:
+ /*
+ * Ensure at least one mda in use.
+ * FIXME: check size of fid->metadata_areas_in_use; reason is because
+ * of how pv_setup works in the case of a pv with 2 mdas, one ignored
+ * and another not ignored; function needs refactoring to simplify the
+ * below check and retain correctness.
+ */
+ if (!dm_list_size(&vg->fid->metadata_areas_in_use) ||
+ !vg_mda_used_count(vg)) {
+ ret = _vg_unignore_mdas(vg, 1);
+ }
+ return ret;
+}
+
uint32_t vg_mda_copies(const struct volume_group *vg)
{
return vg->mda_copies;
@@ -2378,6 +2467,7 @@
return 0;
}
+ _vg_adjust_ignored_mdas(vg);
if (dm_list_empty(&vg->fid->metadata_areas_in_use)) {
log_error("Aborting vg_write: No metadata areas to write to!");
next reply other threads:[~2010-06-28 20:37 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-28 20:37 wysochanski [this message]
-- strict thread matches above, loose matches on Subject: below --
2012-03-12 14:43 LVM2/lib/metadata metadata.c zkabelac
2012-03-01 9:46 zkabelac
2012-02-29 0:19 mornfall
2012-02-29 0:18 mornfall
2012-02-28 11:10 zkabelac
2012-02-27 9:51 zkabelac
2012-02-12 20:19 agk
2012-01-25 8:50 zkabelac
2011-04-01 14:54 prajnoha
2011-03-30 13:35 zkabelac
2011-03-10 22:39 zkabelac
2011-02-21 12:13 prajnoha
2011-02-14 19:27 mornfall
2011-02-15 2:07 ` Alasdair G Kergon
2011-02-15 10:22 ` Milan Broz
2010-12-14 17:07 mornfall
2010-11-30 11:15 mornfall
2010-10-25 13:35 zkabelac
2010-07-30 16:47 wysochanski
2010-07-09 16:57 wysochanski
2010-07-08 17:41 wysochanski
2010-07-06 20:09 agk
2010-07-06 17:29 agk
2010-07-06 17:27 agk
2010-07-06 17:26 agk
2010-06-30 19:55 wysochanski
2010-06-30 14:54 agk
2010-06-30 14:52 agk
2010-06-30 14:48 wysochanski
2010-06-30 14:27 agk
2010-06-28 20:38 wysochanski
2010-06-28 20:38 wysochanski
2010-06-28 20:35 wysochanski
2010-06-28 20:35 wysochanski
2010-04-08 15:18 wysochanski
2010-04-06 14:03 wysochanski
2010-04-01 13:08 agk
2010-04-01 11:45 agk
2010-02-24 18:15 wysochanski
2010-01-21 21:04 wysochanski
2010-01-21 21:04 wysochanski
2010-01-07 14:29 zkabelac
2009-12-16 19:26 mornfall
2009-11-19 13:44 mornfall
2009-10-05 20:02 wysochanski
2009-10-05 20:02 wysochanski
2009-09-02 21:39 wysochanski
2009-08-10 17:15 wysochanski
2009-07-28 20:41 agk
2009-07-26 12:41 wysochanski
2009-07-26 1:53 wysochanski
2009-07-26 1:52 wysochanski
2009-07-24 15:15 wysochanski
2009-07-16 20:18 wysochanski
2009-07-01 17:03 wysochanski
2009-06-10 16:14 wysochanski
2009-05-13 1:48 agk
2009-04-28 17:46 wysochanski
2009-04-10 10:01 mbroz
2009-04-02 15:01 mbroz
2009-02-23 16:53 mbroz
2009-01-26 22:22 agk
2008-08-13 13:42 zkabelac
2008-01-22 16:02 agk
2008-01-16 22:52 agk
2007-10-12 21:08 wysochanski
2007-08-06 21:11 wysochanski
2007-07-12 4:12 wysochanski
2007-06-13 21:14 wysochanski
2007-06-12 21:39 wysochanski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100628203755.18705.qmail@sourceware.org \
--to=wysochanski@sourceware.org \
--cc=lvm-devel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.