[lvm-devel] LVM2 ./WHATS_NEW tools/pvdisplay.c tools/pvres ...

agk at sourceware.org agk at sourceware.org
Wed Nov 14 18:41:06 UTC 2007


CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	agk at sourceware.org	2007-11-14 18:41:05

Modified files:
	.              : WHATS_NEW 
	tools          : pvdisplay.c pvresize.c reporter.c toollib.c 
	                 toollib.h vgreduce.c 

Log message:
	Avoid nested vg_reads when processing PVs in VGs and fix associated locking.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.734&r2=1.735
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/pvdisplay.c.diff?cvsroot=lvm2&r1=1.41&r2=1.42
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/pvresize.c.diff?cvsroot=lvm2&r1=1.16&r2=1.17
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/reporter.c.diff?cvsroot=lvm2&r1=1.28&r2=1.29
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/toollib.c.diff?cvsroot=lvm2&r1=1.114&r2=1.115
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/toollib.h.diff?cvsroot=lvm2&r1=1.51&r2=1.52
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/vgreduce.c.diff?cvsroot=lvm2&r1=1.69&r2=1.70

--- LVM2/WHATS_NEW	2007/11/14 00:08:24	1.734
+++ LVM2/WHATS_NEW	2007/11/14 18:41:05	1.735
@@ -1,5 +1,6 @@
 Version 2.02.29 -
 ==================================
+  Avoid nested vg_reads when processing PVs in VGs and fix associated locking.
   Accept sizes with --readahead argument.
   Store size arguments as sectors internally.
   Attempt to remove incomplete LVs with lvcreate zeroing/activation problems.
--- LVM2/tools/pvdisplay.c	2007/11/02 20:40:05	1.41
+++ LVM2/tools/pvdisplay.c	2007/11/14 18:41:05	1.42
@@ -16,7 +16,7 @@
 #include "tools.h"
 
 static int _pvdisplay_single(struct cmd_context *cmd,
-			     struct volume_group *vg __attribute((unused)),
+			     struct volume_group *vg,
 			     struct physical_volume *pv, void *handle)
 {
 	struct pv_list *pvl;
@@ -27,27 +27,27 @@
 	const char *pv_name = pv_dev_name(pv);
 	const char *vg_name = NULL;
 
-	 if (!is_orphan(pv)) {
+	 if (!is_orphan(pv) && !vg) {
 		vg_name = pv_vg_name(pv);
-	         if (!lock_vol(cmd, vg_name, LCK_VG_READ)) {
-	                 log_error("Can't lock %s: skipping", vg_name);
-	                 return ECMD_FAILED;
-	         }
-
-	         if (!(vg = vg_read(cmd, vg_name, (char *)&pv->vgid, &consistent))) {
-	                 log_error("Can't read %s: skipping", vg_name);
-	                 goto out;
-	         }
-
-		 if (!vg_check_status(vg, CLUSTERED)) {
-	                 ret = ECMD_FAILED;
-	                 goto out;
-	         }
+         	if (!lock_vol(cmd, vg_name, LCK_VG_READ)) {
+                 	log_error("Can't lock %s: skipping", vg_name);
+                 	return ECMD_FAILED;
+         	}
+
+         	if (!(vg = vg_read(cmd, vg_name, (char *)&pv->vgid, &consistent))) {
+                 	log_error("Can't read %s: skipping", vg_name);
+                 	goto out;
+         	}
+
+		if (!vg_check_status(vg, CLUSTERED)) {
+			ret = ECMD_FAILED;
+			goto out;
+		}
 
-		 /*
-		  * Replace possibly incomplete PV structure with new one
-		  * allocated in vg_read() path.
-		  */
+	 	/*
+		 * Replace possibly incomplete PV structure with new one
+		 * allocated in vg_read() path.
+		 */
 		 if (!(pvl = find_pv_in_vg(vg, pv_name))) {
 			 log_error("Unable to find \"%s\" in volume group \"%s\"",
 				   pv_name, vg->name);
@@ -119,5 +119,6 @@
 		return EINVALID_CMD_LINE;
 	}
 
-	return process_each_pv(cmd, argc, argv, NULL, NULL, _pvdisplay_single);
+	return process_each_pv(cmd, argc, argv, NULL, LCK_VG_READ, NULL,
+			       _pvdisplay_single);
 }
--- LVM2/tools/pvresize.c	2007/11/14 00:08:25	1.16
+++ LVM2/tools/pvresize.c	2007/11/14 18:41:05	1.17
@@ -61,7 +61,8 @@
 	params.done = 0;
 	params.total = 0;
 
-	ret = process_each_pv(cmd, argc, argv, NULL, &params, _pvresize_single);
+	ret = process_each_pv(cmd, argc, argv, NULL, LCK_VG_WRITE, &params,
+			      _pvresize_single);
 
 	log_print("%d physical volume(s) resized / %d physical volume(s) "
 		  "not resized", params.done, params.total - params.done);
--- LVM2/tools/reporter.c	2007/11/02 20:40:05	1.28
+++ LVM2/tools/reporter.c	2007/11/14 18:41:05	1.29
@@ -54,33 +54,15 @@
 	return ECMD_PROCESSED;
 }
 
-static int _pvsegs_sub_single(struct cmd_context *cmd, struct volume_group *vg,
+static int _pvsegs_sub_single(struct cmd_context *cmd __attribute((unused)),
+			      struct volume_group *vg,
 			      struct pv_segment *pvseg, void *handle)
 {
-	int consistent = 0;
-	struct physical_volume *pv = pvseg->pv;
 	int ret = ECMD_PROCESSED;
 
-	if (!lock_vol(cmd, pv_vg_name(pv), LCK_VG_READ)) {
-		log_error("Can't lock %s: skipping", pv_vg_name(pv));
-		return ECMD_FAILED;
-	}
-
-	if (!(vg = vg_read(cmd, pv_vg_name(pv), NULL, &consistent))) {
-		log_error("Can't read %s: skipping", pv_vg_name(pv));
-		goto out;
-	}
-
-	if (!vg_check_status(vg, CLUSTERED)) {
+	if (!report_object(handle, vg, NULL, pvseg->pv, NULL, pvseg))
 		ret = ECMD_FAILED;
-		goto out;
-	}
 
-	if (!report_object(handle, vg, NULL, pv, NULL, pvseg))
-		ret = ECMD_FAILED;
-
-out:
-	unlock_vg(cmd, pv_vg_name(pv));
 	return ret;
 }
 
@@ -108,7 +90,7 @@
 	int ret = ECMD_PROCESSED;
 	const char *vg_name = NULL;
 
-	if (!is_orphan(pv)) {
+	if (!is_orphan(pv) && !vg) {
 		vg_name = pv_vg_name(pv);
 
 		if (!lock_vol(cmd, vg_name, LCK_VG_READ)) {
@@ -334,7 +316,7 @@
 		break;
 	case PVS:
 		if (args_are_pvs)
-			r = process_each_pv(cmd, argc, argv, NULL,
+			r = process_each_pv(cmd, argc, argv, NULL, LCK_VG_READ,
 					    report_handle, &_pvs_single);
 		else
 			r = process_each_vg(cmd, argc, argv, LCK_VG_READ, 0,
@@ -346,7 +328,7 @@
 		break;
 	case PVSEGS:
 		if (args_are_pvs)
-			r = process_each_pv(cmd, argc, argv, NULL,
+			r = process_each_pv(cmd, argc, argv, NULL, LCK_VG_READ,
 					    report_handle, &_pvsegs_single);
 		else
 			r = process_each_vg(cmd, argc, argv, LCK_VG_READ, 0,
--- LVM2/tools/toollib.c	2007/11/12 21:50:21	1.114
+++ LVM2/tools/toollib.c	2007/11/14 18:41:05	1.115
@@ -424,8 +424,28 @@
 						      void *handle))
 {
 	struct pv_segment *pvseg;
+	const char *vg_name = NULL;
 	int ret_max = 0;
 	int ret;
+	int consistent = 0;
+
+	if (!vg) {
+		vg_name = pv_vg_name(pv);
+		if (!lock_vol(cmd, vg_name, LCK_VG_READ)) {
+			log_error("Can't lock %s: skipping", vg_name);
+			return ECMD_FAILED;
+		}
+
+		if (!(vg = vg_read(cmd, vg_name, NULL, &consistent))) {
+			log_error("Can't read %s: skipping", vg_name);
+			goto out;
+		}
+
+		if (!vg_check_status(vg, CLUSTERED)) {
+			ret = ECMD_FAILED;
+			goto out;
+		}
+	}
 
 	list_iterate_items(pvseg, &pv->segments) {
 		ret = process_single(cmd, vg, pvseg, handle);
@@ -435,6 +455,10 @@
 			return ret_max;
 	}
 
+out:
+	if (vg_name)
+		unlock_vg(cmd, vg_name);
+
 	return ret_max;
 }
 
@@ -665,7 +689,7 @@
 }
 
 int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
-		    struct volume_group *vg, void *handle,
+		    struct volume_group *vg, uint32_t lock_type, void *handle,
 		    int (*process_single) (struct cmd_context * cmd,
 					   struct volume_group * vg,
 					   struct physical_volume * pv,
@@ -735,20 +759,32 @@
 		if (!list_empty(&tags) && (vgnames = get_vgs(cmd, 0)) &&
 		    !list_empty(vgnames)) {
 			list_iterate_items(sll, vgnames) {
+				if (!lock_vol(cmd, sll->str, lock_type)) {
+					log_error("Can't lock %s: skipping", sll->str);
+					continue;
+				}
 				if (!(vg = vg_read(cmd, sll->str, NULL, &consistent))) {
 					log_error("Volume group \"%s\" not found", sll->str);
+					unlock_vg(cmd, sll->str);
 					ret_max = ECMD_FAILED;
 					continue;
 				}
-				if (!consistent)
+				if (!consistent) {
+					unlock_vg(cmd, sll->str);
 					continue;
+				}
 
-				if (!vg_check_status(vg, CLUSTERED))
+				if (!vg_check_status(vg, CLUSTERED)) {
+					unlock_vg(cmd, sll->str);
 					continue;
+				}
 
 				ret = process_each_pv_in_vg(cmd, vg, &tags,
 							    handle,
 							    process_single);
+
+				unlock_vg(cmd, sll->str);
+
 				if (ret > ret_max)
 					ret_max = ret;
 				if (sigint_caught())
--- LVM2/tools/toollib.h	2007/11/02 20:40:05	1.51
+++ LVM2/tools/toollib.h	2007/11/14 18:41:05	1.52
@@ -34,7 +34,7 @@
 					   int consistent, void *handle));
 
 int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
-		    struct volume_group *vg, void *handle,
+		    struct volume_group *vg, uint32_t lock_type, void *handle,
 		    int (*process_single) (struct cmd_context * cmd,
 					   struct volume_group * vg,
 					   struct physical_volume * pv,
--- LVM2/tools/vgreduce.c	2007/11/12 20:51:54	1.69
+++ LVM2/tools/vgreduce.c	2007/11/14 18:41:05	1.70
@@ -539,7 +539,7 @@
 
 		/* FIXME: Pass private struct through to all these functions */
 		/* and update in batch here? */
-		ret = process_each_pv(cmd, argc, argv, vg, NULL,
+		ret = process_each_pv(cmd, argc, argv, vg, LCK_VG_WRITE, NULL,
 				      _vgreduce_single);
 
 	}




More information about the lvm-devel mailing list