public inbox for lvm2-cvs@sourceware.org
help / color / mirror / Atom feed
* 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-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-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-29 22:25 LVM2/lib format_text/text_label.c metadata/met wysochanski
  -- strict thread matches above, loose matches on Subject: below --
2010-06-30 19:28 agk
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).