public inbox for lvm2-cvs@sourceware.org
help / color / mirror / Atom feed
* LVM2/lib format_text/text_label.c metadata/met ...
@ 2010-06-30 19:28 agk
0 siblings, 0 replies; 3+ messages in thread
From: agk @ 2010-06-30 19:28 UTC (permalink / raw)
To: lvm-devel, lvm2-cvs
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: agk@sourceware.org 2010-06-30 19:28:35
Modified files:
lib/format_text: text_label.c
lib/metadata : metadata-exported.h metadata.c
Log message:
more mda ignore cleanups
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/text_label.c.diff?cvsroot=lvm2&r1=1.35&r2=1.36
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata-exported.h.diff?cvsroot=lvm2&r1=1.162&r2=1.163
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.375&r2=1.376
--- LVM2/lib/format_text/text_label.c 2010/06/30 13:51:11 1.35
+++ LVM2/lib/format_text/text_label.c 2010/06/30 19:28:35 1.36
@@ -314,8 +314,7 @@
mda_set_ignored(mda, rlocn_is_ignored(mdah->raw_locns));
if (mda_is_ignored(mda)) {
- log_debug("Skipping mda with ignored flag on "
- "device %s at offset %"PRIu64,
+ log_debug("Ignoring mda on device %s at offset %"PRIu64,
dev_name(mdac->area.dev),
mdac->area.start);
if (!dev_close(mdac->area.dev))
--- LVM2/lib/metadata/metadata-exported.h 2010/06/30 18:03:52 1.162
+++ LVM2/lib/metadata/metadata-exported.h 2010/06/30 19:28:35 1.163
@@ -117,6 +117,9 @@
#define FAILED_EXIST 0x00000100U
#define SUCCESS 0x00000000U
+#define VGMETADATACOPIES_ALL UINT32_MAX
+#define VGMETADATACOPIES_UNMANAGED 0
+
/* Ordered list - see lv_manip.c */
typedef enum {
ALLOC_INVALID,
@@ -885,8 +888,6 @@
uint64_t vg_max_lv(const struct volume_group *vg);
uint32_t vg_mda_count(const struct volume_group *vg);
uint32_t vg_mda_used_count(const struct volume_group *vg);
-#define VGMETADATACOPIES_ALL UINT32_MAX
-#define VGMETADATACOPIES_UNMANAGED 0
uint32_t vg_mda_copies(const struct volume_group *vg);
int vg_set_mda_copies(struct volume_group *vg, uint32_t copies);
int vg_check_write_mode(struct volume_group *vg);
--- LVM2/lib/metadata/metadata.c 2010/06/30 18:03:52 1.375
+++ LVM2/lib/metadata/metadata.c 2010/06/30 19:28:35 1.376
@@ -1022,14 +1022,12 @@
return 1;
/* FIXME: flip bits on random mdas */
- dm_list_iterate_items(mda, &vg->fid->metadata_areas_in_use) {
+ 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;
}
- if (!num_to_ignore)
- return 1;
- }
log_error(INTERNAL_ERROR "Unable to find %"PRIu32" metadata areas to ignore "
"on volume group %s", num_to_ignore, vg->name);
@@ -1049,25 +1047,21 @@
vg->name, vg_mda_copies(vg), vg_mda_used_count(vg), num_to_unignore);
/* FIXME: Select mdas to change at random */
- dm_list_iterate_items_safe(mda, tmda, &vg->fid->metadata_areas_ignored) {
+ 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;
}
- if (!num_to_unignore)
- return 1;
- }
- dm_list_iterate_items(mda, &vg->fid->metadata_areas_in_use) {
+ 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;
}
- if (!num_to_unignore)
- return 1;
- }
log_error(INTERNAL_ERROR "Unable to find %"PRIu32" metadata areas to unignore "
"on volume group %s", num_to_unignore, vg->name);
@@ -1077,24 +1071,30 @@
static int _vg_adjust_ignored_mdas(struct volume_group *vg)
{
- uint32_t mda_copies, count;
- int ret = 1;
+ uint32_t mda_copies_used = vg_mda_used_count(vg);
- mda_copies = vg_mda_used_count(vg);
- if (vg->mda_copies == VGMETADATACOPIES_UNMANAGED)
- 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);
+ if (vg->mda_copies == VGMETADATACOPIES_UNMANAGED) {
+ /* Ensure at least one mda is in use. */
+ if (!mda_copies_used && vg_mda_count(vg) && !_vg_unignore_mdas(vg, 1))
+ return_0;
else
- count = vg->mda_copies - mda_copies;
- ret = _vg_unignore_mdas(vg, count);
+ return 1;
}
+
+ /* Not an error to have vg_mda_count larger than total mdas. */
+ if (vg->mda_copies == VGMETADATACOPIES_ALL ||
+ vg->mda_copies >= vg_mda_count(vg)) {
+ /* Use all */
+ if (!_vg_unignore_mdas(vg, vg_mda_count(vg) - mda_copies_used))
+ return_0;
+ } else if (mda_copies_used < vg->mda_copies) {
+ if (!_vg_unignore_mdas(vg, vg->mda_copies - mda_copies_used))
+ return_0;
+ } else if (mda_copies_used > vg->mda_copies)
+ if (!_vg_ignore_mdas(vg, mda_copies_used - vg->mda_copies))
+ return_0;
+
/*
* The VGMETADATACOPIES_ALL value will never be written disk.
* It is a special cmdline value that means 2 things:
@@ -1104,24 +1104,6 @@
if (vg->mda_copies == VGMETADATACOPIES_ALL)
vg->mda_copies = VGMETADATACOPIES_UNMANAGED;
- if (!ret)
- return_0;
-
-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)) && vg_mda_count(vg))
- ret = _vg_unignore_mdas(vg, 1);
-
- if (!ret)
- return_0;
-
return 1;
}
@@ -2546,10 +2528,10 @@
return 0;
}
- if (!_vg_adjust_ignored_mdas(vg))
+ if ((vg->fid->fmt->features & FMT_MDAS) && !_vg_adjust_ignored_mdas(vg))
return_0;
- if (dm_list_empty(&vg->fid->metadata_areas_in_use)) {
+ if (!vg_mda_used_count(vg)) {
log_error("Aborting vg_write: No metadata areas to write to!");
return 0;
}
@@ -4375,10 +4357,6 @@
if (!mda_is_ignored(mda))
used_count++;
- dm_list_iterate_items(mda, &vg->fid->metadata_areas_ignored)
- if (!mda_is_ignored(mda))
- used_count++;
-
return used_count;
}
^ permalink raw reply [flat|nested] 3+ messages in thread
* LVM2/lib format_text/text_label.c metadata/met ...
@ 2010-06-29 22:25 wysochanski
0 siblings, 0 replies; 3+ messages in thread
From: wysochanski @ 2010-06-29 22:25 UTC (permalink / raw)
To: lvm-devel, lvm2-cvs
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: wysochanski@sourceware.org 2010-06-29 22:25:58
Modified files:
lib/format_text: text_label.c
lib/metadata : metadata.c metadata.h
Log message:
Add some log_verbose debug statements related to metadataignore.
Logging isn't ideal, especially for mda_set_ignore. Ideally we'd
like to display the device name and offset in this case but this
requires a bit more work and a per-format 'mda_description' function
pointer definition (we don't have access to mda_context in
metadata.c).
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/text_label.c.diff?cvsroot=lvm2&r1=1.32&r2=1.33
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.364&r2=1.365
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.h.diff?cvsroot=lvm2&r1=1.211&r2=1.212
--- LVM2/lib/format_text/text_label.c 2010/06/28 20:34:24 1.32
+++ LVM2/lib/format_text/text_label.c 2010/06/29 22:25:58 1.33
@@ -312,6 +312,10 @@
mda_set_ignored(mda, rlocn_is_ignored(mdah->raw_locns));
if (mda_is_ignored(mda)) {
+ log_verbose("Skipping mda with ignored flag on "
+ "device %s at offset %"PRIu64,
+ dev_name(mdac->area.dev),
+ mdac->area.start);
if (!dev_close(mdac->area.dev))
stack;
continue;
--- LVM2/lib/metadata/metadata.c 2010/06/29 21:32:44 1.364
+++ LVM2/lib/metadata/metadata.c 2010/06/29 22:25:58 1.365
@@ -4117,12 +4117,17 @@
return (mda->flags & MDA_IGNORED);
}
-void mda_set_ignored(struct metadata_area *mda, int value)
+void mda_set_ignored(struct metadata_area *mda, unsigned ignored)
{
- if (value)
+ if (ignored) {
mda->flags |= MDA_IGNORED;
- else
+ log_verbose("Setting mda ignored flag for metadata_locn %p.",
+ mda->metadata_locn);
+ } else {
mda->flags &= ~MDA_IGNORED;
+ log_verbose("Clearing mda ignored flag for metadata_locn %p.",
+ mda->metadata_locn);
+ }
}
uint32_t pv_mda_count(const struct physical_volume *pv)
--- LVM2/lib/metadata/metadata.h 2010/06/28 20:34:40 1.211
+++ LVM2/lib/metadata/metadata.h 2010/06/29 22:25:58 1.212
@@ -181,7 +181,7 @@
struct metadata_area *mda);
unsigned mda_is_ignored(struct metadata_area *mda);
-void mda_set_ignored(struct metadata_area *mda, int value);
+void mda_set_ignored(struct metadata_area *mda, unsigned ignored);
unsigned mda_locns_match(struct metadata_area *mda1, struct metadata_area *mda2);
void fid_add_mda(struct format_instance *fid, struct metadata_area *mda);
int fid_add_mdas(struct format_instance *fid, struct dm_list *mdas);
^ permalink raw reply [flat|nested] 3+ messages in thread
* LVM2/lib format_text/text_label.c metadata/met ...
@ 2010-06-28 20:30 wysochanski
0 siblings, 0 replies; 3+ messages in thread
From: wysochanski @ 2010-06-28 20:30 UTC (permalink / raw)
To: lvm-devel, lvm2-cvs
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: wysochanski@sourceware.org 2010-06-28 20:30:14
Modified files:
lib/format_text: text_label.c
lib/metadata : metadata.c metadata.h
Log message:
Add location independent flag and functions to ignore mdas.
First we add a 'flags' field to the location independent
metadata_area structure, and a MDA_IGNORE flag. The
mda_is_ignored and mda_set_ignored functions are added to
manage the flag. Adding the flag and functions gives a
library interface to ignore metadata areas independent of
the underlying location (disk, file, etc). The location
specific read/write functions must then handle the specifics
of what this flag means to the location.
Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
Reviewed-by: Alasdair G Kergon <agk@redhat.com>
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/text_label.c.diff?cvsroot=lvm2&r1=1.27&r2=1.28
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.346&r2=1.347
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.h.diff?cvsroot=lvm2&r1=1.205&r2=1.206
--- LVM2/lib/format_text/text_label.c 2009/12/16 19:22:12 1.27
+++ LVM2/lib/format_text/text_label.c 2010/06/28 20:30:14 1.28
@@ -215,6 +215,7 @@
mdal->ops = mda_lists->raw_ops;
mdal->metadata_locn = mdac;
+ mdal->flags = 0;
mdac->area.dev = dev;
mdac->area.start = start;
--- LVM2/lib/metadata/metadata.c 2010/06/22 21:10:53 1.346
+++ LVM2/lib/metadata/metadata.c 2010/06/28 20:30:14 1.347
@@ -3855,6 +3855,19 @@
return pv_field(pv, pe_alloc_count);
}
+unsigned mda_is_ignored(struct metadata_area *mda)
+{
+ return (mda->flags & MDA_IGNORED);
+}
+
+void mda_set_ignored(struct metadata_area *mda, int value)
+{
+ if (value)
+ mda->flags |= MDA_IGNORED;
+ else
+ mda->flags &= ~MDA_IGNORED;
+}
+
uint32_t pv_mda_count(const struct physical_volume *pv)
{
struct lvmcache_info *info;
--- LVM2/lib/metadata/metadata.h 2010/05/24 15:32:20 1.205
+++ LVM2/lib/metadata/metadata.h 2010/06/28 20:30:14 1.206
@@ -158,12 +158,18 @@
};
+#define MDA_IGNORED 0x00000001
+
struct metadata_area {
struct dm_list list;
struct metadata_area_ops *ops;
void *metadata_locn;
+ uint32_t flags;
};
+unsigned mda_is_ignored(struct metadata_area *mda);
+void mda_set_ignored(struct metadata_area *mda, int value);
+
#define seg_pvseg(seg, s) (seg)->areas[(s)].u.pv.pvseg
#define seg_dev(seg, s) (seg)->areas[(s)].u.pv.pvseg->pv->dev
#define seg_pe(seg, s) (seg)->areas[(s)].u.pv.pvseg->pe
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-06-30 19:28 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-06-30 19:28 LVM2/lib format_text/text_label.c metadata/met agk
-- strict thread matches above, loose matches on Subject: below --
2010-06-29 22:25 wysochanski
2010-06-28 20:30 wysochanski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).