[lvm-devel] master - mirror: properly reload table for log init

Zdenek Kabelac zkabelac at sourceware.org
Fri Apr 20 11:02:02 UTC 2018


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=1693fef529e7e1536d91956cfc4256c98cae58ab
Commit:        1693fef529e7e1536d91956cfc4256c98cae58ab
Parent:        55d83f9f6ee1892d419bdd9d50c3450ac41f6749
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Thu Mar 29 23:26:22 2018 +0200
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Fri Apr 20 12:15:36 2018 +0200

mirror: properly reload table for log init

Since mirror can be stacked, we need to properly reload whole
table stack, otherwice we may mishandle devices in dm table.
---
 WHATS_NEW             |    2 ++
 lib/metadata/mirror.c |   14 ++++++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/WHATS_NEW b/WHATS_NEW
index 6affa13..434f4a0 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,7 @@
 Version 2.02.178 - 
 =====================================
+  Reload whole device stack when reinitilizing mirror log.
+  Mirrors without monitoring are WARNING and not blocking on error.
   Detect too big region_size with clustered mirrors.
   Fix evaluation of maximal region size for mirror log.
   Enhance mirror log size estimation and use smaller size when possible.
diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c
index 6c8732b..e09103d 100644
--- a/lib/metadata/mirror.c
+++ b/lib/metadata/mirror.c
@@ -315,6 +315,7 @@ static int _write_log_header(struct cmd_context *cmd, struct logical_volume *lv)
  * Initialize mirror log contents
  */
 static int _init_mirror_log(struct cmd_context *cmd,
+			    struct logical_volume *lock_holder,
 			    struct logical_volume *log_lv, int in_sync,
 			    struct dm_list *tagsl, int remove_on_failure)
 {
@@ -346,7 +347,10 @@ static int _init_mirror_log(struct cmd_context *cmd,
 		}
 
 	/* store mirror log on disk(s) */
-	if (!vg_write(log_lv->vg) || !vg_commit(log_lv->vg))
+	if (!lock_holder) {
+		if (!vg_write(log_lv->vg) || !vg_commit(log_lv->vg))
+			return_0;
+	} else if (!lv_update_and_reload((struct logical_volume*) lock_holder))
 		return_0;
 
 	if (!activate_lv_excl_local(cmd, log_lv)) {
@@ -1021,7 +1025,9 @@ static int _remove_mirror_images(struct logical_volume *lv,
 	/* Mirror with only 1 area is 'in sync'. */
 	if (new_area_count == 1 && is_temporary_mirror_layer(lv)) {
 		detached_log_lv = detach_mirror_log(mirrored_seg);
-		if (!_init_mirror_log(lv->vg->cmd, detached_log_lv,
+		if (!_init_mirror_log(lv->vg->cmd,
+				      (struct logical_volume*)lv_lock_holder(mirrored_seg->lv),
+				      detached_log_lv,
 				      1, &lv->tags, 0)) {
 			/* As a result, unnecessary sync may run after
 			 * collapsing. But safe.*/
@@ -1822,7 +1828,7 @@ static struct logical_volume *_set_up_mirror_log(struct cmd_context *cmd,
 		}
 	}
 
-	if (!_init_mirror_log(cmd, log_lv, in_sync, &lv->tags, 1)) {
+	if (!_init_mirror_log(cmd, NULL, log_lv, in_sync, &lv->tags, 1)) {
 		log_error("Failed to initialise mirror log.");
 		return NULL;
 	}
@@ -1870,7 +1876,7 @@ struct logical_volume *prepare_mirror_log(struct logical_volume *lv,
 		goto out;
 	}
 
-	if (!_init_mirror_log(cmd, log_lv, in_sync, &lv->tags, 1)) {
+	if (!_init_mirror_log(cmd, NULL, log_lv, in_sync, &lv->tags, 1)) {
 		log_error("Failed to initialise mirror log.");
 		log_lv = NULL;
 		goto out;




More information about the lvm-devel mailing list