[lvm-devel] dev-dct-process-part3 - toollib: Avoid a spurious orphan unlock.

Petr Rockai mornfall at fedoraproject.org
Tue Aug 20 23:26:50 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=940aeee4e7e86f4f389dd20cdd82826c7eeb470c
Commit:        940aeee4e7e86f4f389dd20cdd82826c7eeb470c
Parent:        2963000d1026f4374489a08c9f74b19fd9994f3e
Author:        Petr Rockai <prockai at redhat.com>
AuthorDate:    Wed Aug 21 01:23:39 2013 +0200
Committer:     Petr Rockai <prockai at redhat.com>
CommitterDate: Wed Aug 21 01:23:39 2013 +0200

toollib: Avoid a spurious orphan unlock.

---
 tools/toollib.c |   36 ++++++++++++++++++++++--------------
 1 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/tools/toollib.c b/tools/toollib.c
index 95606e4..0af018a 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -1302,15 +1302,18 @@ static struct vg_list *find_vgl(struct dm_list *vgl_list, const char *vg_name)
 	return NULL;
 }
 
-static void release_vgl(struct cmd_context *cmd, struct vg_list *vgl)
+static int release_vgl(struct cmd_context *cmd, struct vg_list *vgl)
 {
 	if (!vgl->vg)
-		return;
+		return 0;
+
+	int r = 0;
 
 	if (is_orphan_vg(vgl->vg->name)) {
 		log_debug("release_vgl orphan %s", vgl->vg->name);
 		dev_close_vg(vgl->vg->name);
 		release_vg(vgl->vg);
+		r = 1;
 	} else if (vg_read_error(vgl->vg)) {
 		log_debug("release_vgl error %s", vgl->vg->name);
 		dev_close_vg(vgl->vg->name);
@@ -1323,14 +1326,24 @@ static void release_vgl(struct cmd_context *cmd, struct vg_list *vgl)
 	}
 
 	vgl->vg = NULL;
+	return r;
 }
 
-static void release_vg_list(struct cmd_context *cmd, struct dm_list *vgl_list)
+/*
+* Special treatment is needed for unlocking orphan vgs. There are three orphan
+* vgs, and all three share one orphan clvm lock. We return 1 if the orphan VG
+* was in the list to be released.
+*/
+static int release_vg_list(struct cmd_context *cmd, struct dm_list *vgl_list)
 {
 	struct vg_list *vgl;
 
+	int r = 0;
+
 	dm_list_iterate_items(vgl, vgl_list)
-		release_vgl(cmd, vgl);
+		r += release_vgl(cmd, vgl);
+
+	return r;
 }
 
 static int read_vg_name_list(struct cmd_context *cmd, uint32_t flags,
@@ -2009,6 +2022,7 @@ int process_each_pv(struct cmd_context *cmd,
 	int include_other_devs = 0;
 	int ret_max = ECMD_PROCESSED;
 	int ret;
+	int unlock_orphans = 0;
 
 	/*
 	 * arg_tags, arg_pvnames are names specified in argv.
@@ -2104,7 +2118,8 @@ int process_each_pv(struct cmd_context *cmd,
 		if (ret > ret_max)
 			ret_max = ret;
 
-		release_vg_list(cmd, &all_vgs);
+		if (release_vg_list(cmd, &all_vgs))
+			unlock_orphans = 1;
 
 	} else if (flags & ENABLE_ALL_VGNAMES) {
 		/*
@@ -2134,15 +2149,8 @@ process:
 			ret_max = ret;
 	}
 out:
-	if (!vg)
-		release_vg_list(cmd, &use_vgs);
-
-	/*
-	 * This is needed because release_vg_list does not do any unlocks
-	 * for orphan vgs.  There are three orphan vgs, and all three share
-	 * this one orphan clvm lock.
-	 */
-	unlock_vg(cmd, VG_ORPHANS);
+	if (!vg && release_vg_list(cmd, &use_vgs) || unlock_orphans)
+		unlock_vg(cmd, VG_ORPHANS);
 
 	return ret_max;
 }




More information about the lvm-devel mailing list