All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takahiro Yasui <tyasui@redhat.com>
To: lvm-devel@redhat.com
Subject: [RFC PATCH 3/7] separate metadata parse and verification
Date: Thu, 02 Apr 2009 13:19:22 -0400	[thread overview]
Message-ID: <49D4F39A.6040302@redhat.com> (raw)
In-Reply-To: <49D3D9F5.902@redhat.com>

This patch separates parse and verification process in _reav_pv function.
Instead of getting device data by accessing and checking devices, the
DEV_NEED_VERIFY flag is set to the device structures so that they will
be verified later.


Signed-off-by: Takahiro Yasui <tyasui@redhat.com>
---
 lib/cache/lvmcache.c          |    5 +++--
 lib/device/dev-cache.c        |   12 ++++++++++++
 lib/device/dev-cache.h        |    1 +
 lib/device/device.h           |    2 ++
 lib/format_text/format-text.c |   37 ++++++++++++++++++++++++++++++++-----
 lib/format_text/format-text.h |    2 ++
 lib/format_text/import_vsn1.c |   40 ++++++++++++++++++++++++++++------------
 lib/label/label.c             |    9 +++++++++
 8 files changed, 89 insertions(+), 19 deletions(-)

Index: LVM2.02.46-cvs-20090324/lib/cache/lvmcache.c
===================================================================
--- LVM2.02.46-cvs-20090324.orig/lib/cache/lvmcache.c
+++ LVM2.02.46-cvs-20090324/lib/cache/lvmcache.c
@@ -525,6 +525,8 @@ struct volume_group *lvmcache_get_vg(con
 		return_NULL;
 	}
 
+	verify_pv_status(fid, vg);
+
 	log_debug("Using cached %smetadata for VG %s.",
 		  vginfo->precommitted ? "pre-committed" : "", vginfo->vgname);
 
@@ -705,7 +707,6 @@ static int _drop_vginfo(struct lvmcache_
 	return 1;
 }
 
-/* Unused
 void lvmcache_del(struct lvmcache_info *info)
 {
 	if (info->dev->pvid[0] && _pvid_hash)
@@ -718,7 +719,7 @@ void lvmcache_del(struct lvmcache_info *
 	dm_free(info);
 
 	return;
-} */
+}
 
 static int _lvmcache_update_pvid(struct lvmcache_info *info, const char *pvid)
 {
Index: LVM2.02.46-cvs-20090324/lib/device/dev-cache.c
===================================================================
--- LVM2.02.46-cvs-20090324.orig/lib/device/dev-cache.c
+++ LVM2.02.46-cvs-20090324/lib/device/dev-cache.c
@@ -779,3 +779,15 @@ const char *dev_name(const struct device
 	return (dev) ? dm_list_item(dev->aliases.n, struct str_list)->str :
 	    "unknown device";
 }
+
+int dev_is_valid(struct device *dev, struct dev_filter *f)
+{
+	if (dev->flags & DEV_NEED_VERIFY) {
+		dev->flags &= ~DEV_NEED_VERIFY;
+
+		if (!f->passes_filter(f, dev))
+			return 0;
+	}
+
+	return 1;
+}
Index: LVM2.02.46-cvs-20090324/lib/device/dev-cache.h
===================================================================
--- LVM2.02.46-cvs-20090324.orig/lib/device/dev-cache.h
+++ LVM2.02.46-cvs-20090324/lib/device/dev-cache.h
@@ -51,5 +51,6 @@ struct dev_iter;
 struct dev_iter *dev_iter_create(struct dev_filter *f, int dev_scan);
 void dev_iter_destroy(struct dev_iter *iter);
 struct device *dev_iter_get(struct dev_iter *iter);
+int dev_is_valid(struct device *dev, struct dev_filter *f);
 
 #endif
Index: LVM2.02.46-cvs-20090324/lib/device/device.h
===================================================================
--- LVM2.02.46-cvs-20090324.orig/lib/device/device.h
+++ LVM2.02.46-cvs-20090324/lib/device/device.h
@@ -28,6 +28,8 @@
 #define DEV_O_DIRECT		0x00000020	/* Use O_DIRECT */
 #define DEV_O_DIRECT_TESTED	0x00000040	/* DEV_O_DIRECT is reliable */
 
+#define DEV_NEED_VERIFY		0x10000000	/* Should be verified */
+
 /*
  * All devices in LVM will be represented by one of these.
  * pointer comparisons are valid.
Index: LVM2.02.46-cvs-20090324/lib/format_text/format-text.c
===================================================================
--- LVM2.02.46-cvs-20090324.orig/lib/format_text/format-text.c
+++ LVM2.02.46-cvs-20090324/lib/format_text/format-text.c
@@ -439,6 +439,27 @@ static int _raw_holds_vgname(struct form
 	return r;
 }
 
+void verify_pv_status(struct format_instance *fid, struct volume_group *vg)
+{
+	struct pv_list *pvl;
+	char buffer[64] __attribute((aligned(8)));
+
+	dm_list_iterate_items(pvl, &vg->pvs) {
+		if (!dev_is_valid(pvl->pv->dev, vg->cmd->filter) ||
+		    !(pvl->pv->dev = device_from_pvid(fid->fmt->cmd,
+						      &pvl->pv->id))) {
+			if (!id_write_format(&pvl->pv->id, buffer,
+					     sizeof(buffer)))
+				log_error("Couldn't find device.");
+			else
+				log_error("Couldn't find device with uuid"
+					  " '%s'.", buffer);
+
+			pvl->pv->status |= MISSING_PV;
+		}
+	}
+}
+
 static struct volume_group *_vg_read_raw_area(struct format_instance *fid,
 					      const char *vgname,
 					      struct device_area *area,
@@ -487,6 +508,8 @@ static struct volume_group *_vg_read_raw
 	if (precommitted)
 		vg->status |= PRECOMMITTED;
 
+	verify_pv_status(fid, vg);
+
       out:
 	if (!dev_close(area->dev))
 		stack;
@@ -783,7 +806,8 @@ static int _vg_remove_raw(struct format_
 
 static struct volume_group *_vg_read_file_name(struct format_instance *fid,
 					       const char *vgname,
-					       const char *read_path)
+					       const char *read_path,
+					       int verify_pv)
 {
 	struct volume_group *vg;
 	time_t when;
@@ -805,6 +829,9 @@ static struct volume_group *_vg_read_fil
 	} else
 		log_debug("Read volume group %s from %s", vg->name, read_path);
 
+	if (verify_pv)
+		verify_pv_status(fid, vg);
+
 	return vg;
 }
 
@@ -814,7 +841,7 @@ static struct volume_group *_vg_read_fil
 {
 	struct text_context *tc = (struct text_context *) mda->metadata_locn;
 
-	return _vg_read_file_name(fid, vgname, tc->path_live);
+	return _vg_read_file_name(fid, vgname, tc->path_live, 1);
 }
 
 static struct volume_group *_vg_read_precommit_file(struct format_instance *fid,
@@ -824,10 +851,10 @@ static struct volume_group *_vg_read_pre
 	struct text_context *tc = (struct text_context *) mda->metadata_locn;
 	struct volume_group *vg;
 
-	if ((vg = _vg_read_file_name(fid, vgname, tc->path_edit)))
+	if ((vg = _vg_read_file_name(fid, vgname, tc->path_edit, 1)))
 		vg->status |= PRECOMMITTED;
 	else
-		vg = _vg_read_file_name(fid, vgname, tc->path_live);
+		vg = _vg_read_file_name(fid, vgname, tc->path_live, 1);
 
 	return vg;
 }
@@ -1023,7 +1050,7 @@ static int _scan_file(const struct forma
 				fid = _text_create_text_instance(fmt, NULL, NULL,
 							    NULL);
 				if ((vg = _vg_read_file_name(fid, vgname,
-							     path)))
+							     path, 1)))
 					/* FIXME Store creation host in vg */
 					lvmcache_update_vg(vg, 0);
 			}
Index: LVM2.02.46-cvs-20090324/lib/format_text/format-text.h
===================================================================
--- LVM2.02.46-cvs-20090324.orig/lib/format_text/format-text.h
+++ LVM2.02.46-cvs-20090324/lib/format_text/format-text.h
@@ -47,6 +47,8 @@ struct format_type *create_text_format(s
 void *create_text_context(struct cmd_context *cmd, const char *path,
 			  const char *desc);
 
+void verify_pv_status(struct format_instance *fid, struct volume_group *vg);
+
 struct labeller *text_labeller_create(const struct format_type *fmt);
 
 int pvhdr_read(struct device *dev, char *buf);
Index: LVM2.02.46-cvs-20090324/lib/format_text/import_vsn1.c
===================================================================
--- LVM2.02.46-cvs-20090324.orig/lib/format_text/import_vsn1.c
+++ LVM2.02.46-cvs-20090324/lib/format_text/import_vsn1.c
@@ -150,6 +150,32 @@ static int _read_flag_config(struct conf
 	return 1;
 }
 
+static int _read_device(struct cmd_context *cmd, struct device **dev,
+			struct config_node *cn,	const char *path)
+{
+	struct config_value *cv;
+
+	if (!(cn = find_config_node(cn, path))) {
+		log_error("Couldn't find device.");
+		return 0;
+	}
+
+	cv = cn->v;
+	if (!cv || cv->type != CFG_STRING || !cv->v.str) {
+		log_error("device must be a string.");
+		return 0;
+	}
+
+	/* dev_cache_get function causes disk access if partition
+	   information is not cached on memory */
+	if (!(*dev = dev_cache_get(cv->v.str, NULL)))
+		return 0;
+
+	(*dev)->flags |= DEV_NEED_VERIFY;
+
+	return 1;
+}
+
 static int _read_pv(struct format_instance *fid, struct dm_pool *mem,
 		    struct volume_group *vg, struct config_node *pvn,
 		    struct config_node *vgn __attribute((unused)),
@@ -183,18 +209,8 @@ static int _read_pv(struct format_instan
 		return 0;
 	}
 
-	/*
-	 * Convert the uuid into a device.
-	 */
-	if (!(pv->dev = device_from_pvid(fid->fmt->cmd, &pv->id))) {
-		char buffer[64] __attribute((aligned(8)));
-
-		if (!id_write_format(&pv->id, buffer, sizeof(buffer)))
-			log_error("Couldn't find device.");
-		else
-			log_error("Couldn't find device with uuid '%s'.",
-				  buffer);
-	}
+	if (!_read_device(fid->fmt->cmd, &pv->dev, pvn, "device"))
+		log_error("Couldn't get device for physical volume.");
 
 	if (!(pv->vg_name = dm_pool_strdup(mem, vg->name)))
 		return_0;
Index: LVM2.02.46-cvs-20090324/lib/label/label.c
===================================================================
--- LVM2.02.46-cvs-20090324.orig/lib/label/label.c
+++ LVM2.02.46-cvs-20090324/lib/label/label.c
@@ -19,6 +19,8 @@
 #include "xlate.h"
 #include "lvmcache.h"
 #include "metadata.h"
+#include "toolcontext.h"
+#include "dev-cache.h"
 
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -283,6 +285,13 @@ int label_read(struct device *dev, struc
 		return r;
 	}
 
+	if ((info = info_from_pvid(dev->pvid, 0))) {
+		if (!dev_is_valid(info->dev, info->fmt->cmd->filter)) {
+			lvmcache_del(info);
+			goto out;
+		}
+	}
+
 	if (!(l = _find_labeller(dev, buf, &sector, scan_sector)))
 		goto out;
 







  parent reply	other threads:[~2009-04-02 17:19 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <49D3D9F5.902@redhat.com>
2009-04-02 17:19 ` [RFC PATCH 1/7] remove device scan from _text_create_text_instance Takahiro Yasui
2009-04-02 17:19 ` [RFC PATCH 2/7] rename _has_scanned to _need_scan Takahiro Yasui
2009-04-02 17:19 ` Takahiro Yasui [this message]
2009-04-02 17:19 ` [RFC PATCH 4/7] support metadata cache feature Takahiro Yasui
2009-04-02 17:19 ` [RFC PATCH 5/7] add metadata cache interface Takahiro Yasui
2009-04-02 17:19 ` [RFC PATCH 6/7] individual lvm command settings Takahiro Yasui
2009-04-02 17:19 ` [RFC PATCH 7/7] introduce metadata cache feature Takahiro Yasui

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=49D4F39A.6040302@redhat.com \
    --to=tyasui@redhat.com \
    --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.