All of lore.kernel.org
 help / color / mirror / Atom feed
From: malahal@us.ibm.com
To: dm-devel@redhat.com
Subject: [RFC] [PATCH] lvm2: mirroredlog support
Date: Tue, 22 Sep 2009 20:03:31 -0700	[thread overview]
Message-ID: <20090923030331.GA26449@us.ibm.com> (raw)

This patch adds '--mirroredlog' option to LVM commands to create a
mirror with mirrored log device. Rebased to the latest LVM code
(LVM2.2.02.51). Have not done 'lvconvert' related changes yet!
Appreciate any comments.

diff -r c70315774a35 lib/activate/activate.c
--- a/lib/activate/activate.c	Tue Sep 15 12:08:46 2009 -0700
+++ b/lib/activate/activate.c	Tue Sep 22 19:51:15 2009 -0700
@@ -979,6 +979,8 @@
 {
 	struct logical_volume *lv;
 	struct lvinfo info;
+	struct lv_segment *seg, *log_seg;
+	struct segment_type *type = get_segtype_from_string(cmd, "mirror");
 	int r = 0;
 
 	if (!activation())
@@ -1012,6 +1014,20 @@
 	if (!monitor_dev_for_events(cmd, lv, 0))
 		stack;
 
+	if ( !dm_list_empty(&lv->segments) ) {
+		seg = dm_list_item(dm_list_first(&lv->segments), struct lv_segment);
+		if (seg->log_lv) {
+			log_very_verbose("lv %s is mirrored, check it's log %s...", lv->name, seg->log_lv->name);
+			if ( !dm_list_empty(&seg->log_lv->segments) ) {
+				log_seg = dm_list_item(dm_list_first(&seg->log_lv->segments), struct lv_segment);
+				if (log_seg->segtype == type) {
+					log_verbose("log %s is mirrored, unregister for events", log_seg->lv->name);
+					monitor_dev_for_events(cmd, log_seg->lv, 0);
+				}
+			}
+		}
+	}
+
 	memlock_inc();
 	r = _lv_deactivate(lv);
 	memlock_dec();
diff -r c70315774a35 lib/metadata/lv_manip.c
--- a/lib/metadata/lv_manip.c	Tue Sep 15 12:08:46 2009 -0700
+++ b/lib/metadata/lv_manip.c	Tue Sep 22 19:51:15 2009 -0700
@@ -3029,14 +3029,16 @@
 		return_0;
 
 	if (lp->mirrors > 1) {
-		if (!lv_add_mirrors(cmd, lv, lp->mirrors - 1, lp->stripes,
+		if (!lv_add_mirrors(cmd, lv, lp->segtype, lp->mirrors - 1,
+				    lp->stripes, lp->stripe_size,
 				    adjusted_mirror_region_size(
 						vg->extent_size,
 						lv->le_count,
 						lp->region_size),
 				    lp->corelog ? 0U : 1U, lp->pvh, lp->alloc,
 				    MIRROR_BY_LV |
-				    (lp->nosync ? MIRROR_SKIP_INIT_SYNC : 0))) {
+				    (lp->nosync ? MIRROR_SKIP_INIT_SYNC : 0),
+				    lp->mirrored_log)) {
 			stack;
 			goto revert_new_lv;
 		}
diff -r c70315774a35 lib/metadata/metadata-exported.h
--- a/lib/metadata/metadata-exported.h	Tue Sep 15 12:08:46 2009 -0700
+++ b/lib/metadata/metadata-exported.h	Tue Sep 22 19:51:15 2009 -0700
@@ -528,6 +528,7 @@
 	uint32_t region_size; /* mirror */
 
 	uint32_t mirrors; /* mirror */
+	uint32_t mirrored_log; /* mirror */
 
 	const struct segment_type *segtype; /* all */
 
@@ -637,9 +638,11 @@
 */
 struct lv_segment *find_mirror_seg(struct lv_segment *seg);
 int lv_add_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
-		   uint32_t mirrors, uint32_t stripes,
+		   const struct segment_type *segtype,
+		   uint32_t mirrors, uint32_t stripes, uint32_t stripe_size,
 		   uint32_t region_size, uint32_t log_count,
-		   struct dm_list *pvs, alloc_policy_t alloc, uint32_t flags);
+		   struct dm_list *pvs, alloc_policy_t alloc, uint32_t flags,
+		   uint32_t mirrored_log);
 int lv_remove_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
 		      uint32_t mirrors, uint32_t log_count,
 		      struct dm_list *pvs, uint32_t status_mask);
@@ -658,16 +661,21 @@
 int remove_mirror_images(struct logical_volume *lv, uint32_t num_mirrors,
 			 struct dm_list *removable_pvs, unsigned remove_log);
 int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
-		      uint32_t mirrors, uint32_t stripes, uint32_t region_size,
+		      const struct segment_type *segtype,
+		      uint32_t mirrors, uint32_t stripes, uint32_t stripe_size,
+		      uint32_t region_size,
 		      struct dm_list *allocatable_pvs, alloc_policy_t alloc,
-		      uint32_t log_count);
+		      uint32_t log_count, uint32_t mirrored_log);
 struct logical_volume *detach_mirror_log(struct lv_segment *seg);
 int attach_mirror_log(struct lv_segment *seg, struct logical_volume *lv);
 int remove_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
 		      struct dm_list *removable_pvs);
 int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
+		   const struct segment_type *segtype,
 		   uint32_t log_count, uint32_t region_size,
-		   struct dm_list *allocatable_pvs, alloc_policy_t alloc);
+		   struct dm_list *allocatable_pvs, alloc_policy_t alloc,
+		   uint32_t mirrors, uint32_t stripes, uint32_t stripe_size,
+		   uint32_t mirrored_log);
 
 int reconfigure_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors,
 			      struct dm_list *removable_pvs, unsigned remove_log);
diff -r c70315774a35 lib/metadata/mirror.c
--- a/lib/metadata/mirror.c	Tue Sep 15 12:08:46 2009 -0700
+++ b/lib/metadata/mirror.c	Tue Sep 22 19:51:15 2009 -0700
@@ -1248,7 +1248,8 @@
 						 struct alloc_handle *ah,
 						 alloc_policy_t alloc,
 						 const char *lv_name,
-						 const char *suffix)
+						 const char *suffix,
+						 uint32_t mirrored_log)
 {
 	struct logical_volume *log_lv;
 	char *log_name;
@@ -1270,7 +1271,7 @@
 				       alloc, lv->vg)))
 		return_NULL;
 
-	if (!lv_add_log_segment(ah, log_lv))
+	if (!mirrored_log && !lv_add_log_segment(ah, log_lv))
 		return_NULL;
 
 	return log_lv;
@@ -1279,10 +1280,16 @@
 static struct logical_volume *_set_up_mirror_log(struct cmd_context *cmd,
 						 struct alloc_handle *ah,
 						 struct logical_volume *lv,
+						 const struct segment_type *segtype,
 						 uint32_t log_count,
-						 uint32_t region_size __attribute((unused)),
+						 uint32_t region_size,
 						 alloc_policy_t alloc,
-						 int in_sync)
+						 int in_sync,
+						 uint32_t mirrors,
+						 uint32_t stripes,
+						 uint32_t stripe_size,
+						 struct dm_list *allocatable_pvs,
+						 uint32_t mirrored_log)
 {
 	struct logical_volume *log_lv;
 	const char *suffix, *c;
@@ -1324,11 +1331,20 @@
 	}
 
 	if (!(log_lv = _create_mirror_log(lv, ah, alloc,
-					  (const char *) lv_name, suffix))) {
+					  (const char *) lv_name, suffix, mirrored_log))) {
 		log_error("Failed to create mirror log.");
 		return NULL;
 	}
 
+	if (mirrored_log) {
+		if (!lv_extend(log_lv, segtype, stripes, stripe_size,
+				1u, 1u, NULL, 0u, 0u, allocatable_pvs, alloc))
+			return NULL;
+
+		add_mirror_images(cmd, log_lv, segtype, mirrors, stripes, stripe_size,
+				   region_size, allocatable_pvs, alloc, 0, 0);
+	}
+
 	if (!_init_mirror_log(cmd, log_lv, in_sync, &lv->tags, 1)) {
 		log_error("Failed to create mirror log.");
 		return NULL;
@@ -1346,8 +1362,11 @@
 }
 
 int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
+		   const struct segment_type *seg_type,
 		   uint32_t log_count, uint32_t region_size,
-		   struct dm_list *allocatable_pvs, alloc_policy_t alloc)
+		   struct dm_list *allocatable_pvs, alloc_policy_t alloc,
+		   uint32_t mirrors, uint32_t stripes, uint32_t stripe_size,
+		   uint32_t mirrored_log)
 {
 	struct alloc_handle *ah;
 	const struct segment_type *segtype;
@@ -1410,8 +1429,10 @@
 	else
 		in_sync = 0;
 
-	if (!(log_lv = _set_up_mirror_log(cmd, ah, lv, log_count,
-					  region_size, alloc, in_sync)))
+	if (!(log_lv = _set_up_mirror_log(cmd, ah, lv, seg_type, log_count,
+					  region_size, alloc, in_sync,
+					  mirrors, stripes, stripe_size, allocatable_pvs,
+					  mirrored_log)))
 		goto_out;
 
 	if (!attach_mirror_log(first_seg(lv), log_lv))
@@ -1427,9 +1448,10 @@
  * Convert "linear" LV to "mirror".
  */
 int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
-		      uint32_t mirrors, uint32_t stripes, uint32_t region_size,
+		      const struct segment_type *seg_type, uint32_t mirrors,
+		      uint32_t stripes, uint32_t stripe_size, uint32_t region_size,
 		      struct dm_list *allocatable_pvs, alloc_policy_t alloc,
-		      uint32_t log_count)
+		      uint32_t log_count, uint32_t mirrored_log)
 {
 	struct alloc_handle *ah;
 	const struct segment_type *segtype;
@@ -1452,9 +1474,18 @@
 	if (!(segtype = get_segtype_from_string(cmd, "mirror")))
 		return_0;
 
-	ah = allocate_extents(lv->vg, NULL, segtype,
-			      stripes, mirrors, log_count, region_size, lv->le_count,
-			      allocatable_pvs, alloc, parallel_areas);
+	if (mirrored_log)
+		/* Allocate mirror extents for the log */
+		ah = allocate_extents(lv->vg, NULL, segtype,
+				       stripes, mirrors, 0,
+				       region_size, 1,
+				       allocatable_pvs, alloc, parallel_areas);
+	else
+		ah = allocate_extents(lv->vg, NULL, segtype,
+				       stripes, mirrors, log_count,
+				       region_size, lv->le_count,
+				       allocatable_pvs, alloc, parallel_areas);
+
 	if (!ah) {
 		log_error("Unable to allocate extents for mirror(s).");
 		return 0;
@@ -1463,11 +1494,25 @@
 	/*
 	 * create and initialize mirror log
 	 */
-	if (log_count &&
-	    !(log_lv = _set_up_mirror_log(cmd, ah, lv, log_count, region_size,
-					  alloc, mirror_in_sync()))) {
-		stack;
-		goto out_remove_images;
+	if (log_count) {
+		if (!(log_lv = _set_up_mirror_log(cmd, ah, lv, seg_type, log_count, region_size,
+				  alloc, mirror_in_sync(), mirrors, stripes,
+				  stripe_size, allocatable_pvs, mirrored_log))) {
+			stack;
+			goto out_remove_images;
+		}
+		if (mirrored_log) {
+			/* Allocate extents for the mirror legs */
+			alloc_destroy(ah);
+			ah = allocate_extents(lv->vg, NULL, segtype,
+						stripes, mirrors, 0,
+						region_size, lv->le_count,
+						allocatable_pvs, alloc, parallel_areas);
+			if (!ah) {
+				stack;
+				goto out_remove_images;
+			}
+		}
 	}
 
 	/* The log initialization involves vg metadata commit.
@@ -1529,9 +1574,11 @@
  * 'pvs' is either allocatable pvs.
  */
 int lv_add_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
-		   uint32_t mirrors, uint32_t stripes,
+		   const struct segment_type *seg_type, uint32_t mirrors,
+		   uint32_t stripes, uint32_t stripe_size,
 		   uint32_t region_size, uint32_t log_count,
-		   struct dm_list *pvs, alloc_policy_t alloc, uint32_t flags)
+		   struct dm_list *pvs, alloc_policy_t alloc, uint32_t flags,
+		   uint32_t mirrored_log)
 {
 	if (!mirrors && !log_count) {
 		log_error("No conversion is requested");
@@ -1564,11 +1611,13 @@
 					       region_size, pvs, alloc);
 	} else if (flags & MIRROR_BY_LV) {
 		if (!mirrors)
-			return add_mirror_log(cmd, lv, log_count,
-					      region_size, pvs, alloc);
-		return add_mirror_images(cmd, lv, mirrors,
-					 stripes, region_size,
-					 pvs, alloc, log_count);
+			return add_mirror_log(cmd, lv, seg_type, log_count,
+					      region_size, pvs, alloc, mirrors,
+				              stripes, stripe_size, mirrored_log);
+		return add_mirror_images(cmd, lv, seg_type, mirrors,
+					 stripes, stripe_size, region_size,
+					 pvs, alloc, log_count,
+					 mirrored_log);
 	}
 
 	log_error("Unsupported mirror conversion type");
diff -r c70315774a35 tools/args.h
--- a/tools/args.h	Tue Sep 15 12:08:46 2009 -0700
+++ b/tools/args.h	Tue Sep 22 19:51:15 2009 -0700
@@ -45,6 +45,7 @@
 arg(alloc_ARG, '\0', "alloc", alloc_arg, 0)
 arg(separator_ARG, '\0', "separator", string_arg, 0)
 arg(mirrorsonly_ARG, '\0', "mirrorsonly", NULL, 0)
+arg(mirroredlog_ARG, '\0', "mirroredlog", NULL, 0)
 arg(nosync_ARG, '\0', "nosync", NULL, 0)
 arg(resync_ARG, '\0', "resync", NULL, 0)
 arg(corelog_ARG, '\0', "corelog", NULL, 0)
diff -r c70315774a35 tools/commands.h
--- a/tools/commands.h	Tue Sep 15 12:08:46 2009 -0700
+++ b/tools/commands.h	Tue Sep 22 19:51:15 2009 -0700
@@ -95,8 +95,7 @@
    "Change logical volume layout",
    0,
    "lvconvert "
-   "[-m|--mirrors Mirrors [{--mirrorlog {disk|core}|--corelog}]]\n"
-   "\t[--repair [--use-policies]]\n"
+   "[-m|--mirrors Mirrors [{--mirrorlog {disk|core}|--corelog|--mirroredlog}]]\n"
    "\t[-R|--regionsize MirrorLogRegionSize]\n"
    "\t[--alloc AllocationPolicy]\n"
    "\t[-b|--background]\n"
@@ -122,7 +121,7 @@
    "\tOriginalLogicalVolume[Path] SnapshotLogicalVolume[Path]\n",
 
    alloc_ARG, background_ARG, chunksize_ARG, corelog_ARG, interval_ARG,
-   mirrorlog_ARG, mirrors_ARG, noudevsync_ARG, regionsize_ARG, repair_ARG,
+   mirrorlog_ARG, mirrors_ARG, noudevsync_ARG, regionsize_ARG, repair_ARG, mirroredlog_ARG,
    snapshot_ARG, test_ARG, use_policies_ARG, yes_ARG, force_ARG, zero_ARG)
 
 xx(lvcreate,
@@ -139,7 +138,7 @@
    "\t{-l|--extents LogicalExtentsNumber |\n"
    "\t -L|--size LogicalVolumeSize[bBsSkKmMgGtTpPeE]}\n"
    "\t[-M|--persistent {y|n}] [--major major] [--minor minor]\n"
-   "\t[-m|--mirrors Mirrors [--nosync] [{--mirrorlog {disk|core}|--corelog}]]\n"
+   "\t[-m|--mirrors Mirrors [--nosync] [{--mirrorlog {disk|core}|--corelog|--mirroredlog}]]\n"
    "\t[-n|--name LogicalVolumeName]\n"
    "\t[--noudevsync]\n"
    "\t[-p|--permission {r|rw}]\n"
@@ -173,9 +172,9 @@
    "\t[-t|--test]\n"
    "\t[-v|--verbose]\n"
    "\t[--version]\n"
+   "\tOriginalLogicalVolume[Path] [PhysicalVolumePath...]\n\n",
 
-   "\t[PhysicalVolumePath...]\n\n",
-
+   mirroredlog_ARG,
    addtag_ARG, alloc_ARG, autobackup_ARG, chunksize_ARG, contiguous_ARG,
    corelog_ARG, extents_ARG, major_ARG, minor_ARG, mirrorlog_ARG, mirrors_ARG,
    name_ARG, nosync_ARG, noudevsync_ARG, permission_ARG, persistent_ARG,
diff -r c70315774a35 tools/lvconvert.c
--- a/tools/lvconvert.c	Tue Sep 15 12:08:46 2009 -0700
+++ b/tools/lvconvert.c	Tue Sep 22 19:51:15 2009 -0700
@@ -31,6 +31,7 @@
 	uint32_t region_size;
 
 	uint32_t mirrors;
+	uint32_t mirrored_log;
 	sign_t mirrors_sign;
 
 	struct segment_type *segtype;
@@ -507,13 +508,16 @@
 			       int corelog)
 {
 	struct logical_volume *original_lv = _original_lv(lv);
+
 	if (_using_corelog(lv) && !corelog) {
-		if (!add_mirror_log(cmd, original_lv, 1,
+		if (!add_mirror_log(cmd, original_lv, lp->segtype, 1,
 				    adjusted_mirror_region_size(
 					lv->vg->extent_size,
 					lv->le_count,
 					lp->region_size),
-				    lp->pvh, lp->alloc))
+				    lp->pvh, lp->alloc,
+				    lp->mirrors, 0, 0,
+				    lp->mirrored_log))
 			return_0;
 	} else if (!_using_corelog(lv) && corelog) {
 		if (!remove_mirror_log(cmd, original_lv,
@@ -538,6 +542,8 @@
 	int repair = arg_count(cmd, repair_ARG);
 	int replace_log = 1, replace_mirrors = 1;
 
+	lp->mirrored_log = arg_count(cmd, mirroredlog_ARG);
+
 	seg = first_seg(lv);
 	existing_mirrors = lv_mirror_count(lv);
 
@@ -696,13 +702,13 @@
 		 * currently taken by the mirror? Would make more sense from
 		 * user perspective.
 		 */
-		if (!lv_add_mirrors(cmd, lv, lp->mirrors - 1, 1,
+		if (!lv_add_mirrors(cmd, lv, lp->segtype, lp->mirrors - 1, 1, 0,
 				    adjusted_mirror_region_size(
 						lv->vg->extent_size,
 						lv->le_count,
 						lp->region_size),
 				    corelog ? 0U : 1U, lp->pvh, lp->alloc,
-				    MIRROR_BY_LV))
+				    MIRROR_BY_LV, lp->mirrored_log))
 			return_0;
 		if (lp->wait_completion)
 			lp->need_polling = 1;
@@ -726,13 +732,13 @@
 			return 0;
 		}
 		/* FIXME: can't have multiple mlogs. force corelog. */
-		if (!lv_add_mirrors(cmd, lv, lp->mirrors - existing_mirrors, 1,
+		if (!lv_add_mirrors(cmd, lv, lp->segtype, lp->mirrors - existing_mirrors, 1, 0,
 				    adjusted_mirror_region_size(
 						lv->vg->extent_size,
 						lv->le_count,
 						lp->region_size),
 				    0U, lp->pvh, lp->alloc,
-				    MIRROR_BY_LV))
+				    MIRROR_BY_LV, lp->mirrored_log))
 			return_0;
 		lv->status |= CONVERTING;
 		lp->need_polling = 1;
@@ -743,6 +749,7 @@
 			if (!_lv_update_log_type(cmd, lp, lv, corelog))
 				return_0;
 		} else {
+			/*malahal this needs rework...*/
 			log_error("Logical volume %s already has %"
 				  PRIu32 " mirror(s).", lv->name,
 				  lp->mirrors - 1);
diff -r c70315774a35 tools/lvcreate.c
--- a/tools/lvcreate.c	Tue Sep 15 12:08:46 2009 -0700
+++ b/tools/lvcreate.c	Tue Sep 22 19:51:15 2009 -0700
@@ -367,6 +367,9 @@
 		lp->region_size = region_size;
 	}
 
+	if (arg_count(cmd, mirroredlog_ARG))
+		lp->mirrored_log = 1;
+
 	if (!_validate_mirror_params(cmd, lp))
 		return 0;
 
diff -r c70315774a35 tools/pvmove.c
--- a/tools/pvmove.c	Tue Sep 15 12:08:46 2009 -0700
+++ b/tools/pvmove.c	Tue Sep 22 19:51:15 2009 -0700
@@ -244,8 +244,8 @@
 		return NULL;
 	}
 
-	if (!lv_add_mirrors(cmd, lv_mirr, 1, 1, 0, log_count,
-			    allocatable_pvs, alloc, MIRROR_BY_SEG)) {
+	if (!lv_add_mirrors(cmd, lv_mirr, NULL, 1u, 1u, 0u, 0u, log_count,
+			    allocatable_pvs, alloc, MIRROR_BY_SEG, 0)) {
 		log_error("Failed to convert pvmove LV to mirrored");
 		return_NULL;
 	}

             reply	other threads:[~2009-09-23  3:03 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-23  3:03 malahal [this message]
2009-09-23 20:29 ` [RFC] [PATCH] lvm2: mirroredlog support Jonathan Brassow
2009-09-23 20:44   ` malahal
2009-09-24  5:22 ` Takahiro Yasui
2009-09-30 15:50 ` Jonathan Brassow
2009-09-30 16:35   ` Alasdair G Kergon
2009-09-30 19:48     ` Jonathan Brassow
2009-09-30 21:18       ` Alasdair G Kergon
2009-09-30 21:46         ` Alasdair G Kergon
2009-09-30 21:19       ` malahal
2009-10-01  0:13   ` malahal
  -- strict thread matches above, loose matches on Subject: below --
2008-12-30  0:10 malahal
2008-12-30  0:10 ` malahal
2009-01-19 22:56 ` Takahiro Yasui
2009-01-20  1:54   ` malahal
2009-01-20 22:12     ` Takahiro Yasui
2009-01-20 21:29 ` Takahiro Yasui
2009-01-20 22:14   ` malahal
2009-01-23 19:14 ` Jonathan Brassow

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=20090923030331.GA26449@us.ibm.com \
    --to=malahal@us.ibm.com \
    --cc=dm-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.