Message ID | 20090923030331.GA26449@us.ibm.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Jonthan Brassow |
Headers | show |
It would be nice if we didn't have to use '--mirroredlog' (a new option), but instead '--mirrorlog mirrored' (continuing use of the preferred option). I will be continuing to review this. brassow On Sep 22, 2009, at 10:03 PM, malahal@us.ibm.com wrote: > 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; > } > > -- > dm-devel mailing list > dm-devel@redhat.com > https://www.redhat.com/mailman/listinfo/dm-devel -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
Jonathan Brassow [jbrassow@redhat.com] wrote: > It would be nice if we didn't have to use '--mirroredlog' (a new option), > but instead '--mirrorlog mirrored' (continuing use of the preferred > option). We can definitely change that. > I will be continuing to review this. Thank you very much. -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
malahal@us.ibm.com wrote: > 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. Thank you for the update of your mirroredlog patch. I'll also review and test it, and then give some feedback here. Thanks, Taka -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
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; }