From: Zdenek Kabelac <zkabelac@redhat.com>
To: lvm-devel@redhat.com
Subject: [PATCH 3 of 4] LVM: allow disk to mirror log conversion
Date: Tue, 11 Jan 2011 12:03:13 +0100 [thread overview]
Message-ID: <4D2C38F1.3060805@redhat.com> (raw)
In-Reply-To: <201101102056.p0AKum46012036@hydrogen.msp.redhat.com>
Dne 10.1.2011 21:56, Jonathan Brassow napsal(a):
> Patch name: lvm-allow-disk-to-mirror-log-conversion.patch
>
> Add ability to convert disk log to mirrored log
>
> We can convert between any combination of mirror logs except
> disk -> mirrored. This patch fixes that.
> Index: LVM2/lib/metadata/mirror.c
> ===================================================================
> --- LVM2.orig/lib/metadata/mirror.c
> +++ LVM2/lib/metadata/mirror.c
> @@ -1322,7 +1322,9 @@ static int _create_mimage_lvs(struct all
> }
>
> if (log) {
> - if (!lv_add_log_segment(ah, m * stripes + 1, img_lvs[m], 0)) {
> + uint32_t first_area = m * stripes + (log - 1);
Declaration should be at the beginning of the function.
> +
> + if (!lv_add_log_segment(ah, first_area, img_lvs[m], 0)) {
> log_error("Aborting. Failed to add mirror image segment "
> "to %s. Remove new LV and retry.",
> img_lvs[m]->name);
Actually here should be probably log_verbose() - as the log_error() is
already written by lv_add_log_segment() - and return_0;
Though this appears in many many other place, so not sure if it's worth to fix
it...
> @@ -1760,7 +1762,7 @@ static struct logical_volume *_set_up_mi
> }
>
> if ((log_count > 1) &&
> - !_form_mirror(cmd, ah, log_lv, log_count-1, 1, 0, region_size, 1)) {
> + !_form_mirror(cmd, ah, log_lv, log_count-1, 1, 0, region_size, 2)) {
> log_error("Failed to form mirrored log.");
> return NULL;
> }
> @@ -1792,6 +1794,7 @@ int add_mirror_log(struct cmd_context *c
> int in_sync;
> struct logical_volume *log_lv;
> struct lvinfo info;
> + int old_log_count;
> int r = 0;
>
> if (dm_list_size(&lv->segments) != 1) {
> @@ -1811,6 +1814,11 @@ int add_mirror_log(struct cmd_context *c
> return 0;
> }
>
> + log_lv = first_seg(lv)->log_lv;
> + old_log_count = (log_lv) ? lv_mirror_count(log_lv) : 0;
> + if (old_log_count == log_count)
> + return_0;
return_0 -> log_error("what is wrong"); return 0
> +
> if (!(parallel_areas = build_parallel_areas_from_lv(cmd, lv, 0)))
> return_0;
>
> @@ -1826,13 +1834,24 @@ int add_mirror_log(struct cmd_context *c
>
> /* allocate destination extents */
> ah = allocate_extents(lv->vg, NULL, segtype,
> - 0, 0, log_count, region_size, 0,
> + 0, 0, log_count - old_log_count, region_size, 0,
> allocatable_pvs, alloc, parallel_areas);
> if (!ah) {
> log_error("Unable to allocate extents for mirror log.");
> return 0;
> }
>
> + if (old_log_count) {
> + /* Converting from disk to mirrored log */
> + if (!_form_mirror(cmd, ah, log_lv, log_count - 1, 1, 0,
> + region_size, 1)) {
> + log_error("Failed to convert mirror log");
> + return 0;
> + }
> + r = 1;
> + goto out;
> + }
> +
> /* check sync status */
> if (lv_mirror_percent(cmd, lv, 0, &sync_percent, NULL) &&
> (sync_percent == PERCENT_100))
> Index: LVM2/tools/lvconvert.c
> ===================================================================
> --- LVM2.orig/tools/lvconvert.c
> +++ LVM2/tools/lvconvert.c
> @@ -718,6 +718,7 @@ static int _lv_update_mirrored_log(struc
> operable_pvs, 0U);
> }
>
> +static int _reload_lv(struct cmd_context *cmd, struct logical_volume *lv);
> static int _lv_update_log_type(struct cmd_context *cmd,
> struct lvconvert_params *lp,
> struct logical_volume *lv,
> @@ -738,14 +739,6 @@ static int _lv_update_log_type(struct cm
> lv->le_count,
> lp->region_size);
>
> - /* Add a log where there is none */
> - if (!old_log_count) {
> - if (!add_mirror_log(cmd, original_lv, log_count,
> - region_size, operable_pvs, lp->alloc))
> - return_0;
> - return 1;
> - }
> -
> /* Remove an existing log completely */
> if (!log_count) {
> if (!remove_mirror_log(cmd, original_lv, operable_pvs,
> @@ -759,9 +752,17 @@ static int _lv_update_log_type(struct cm
>
> /* Adding redundancy to the log */
> if (old_log_count < log_count) {
> - log_error("Adding log redundancy not supported yet.");
> - log_error("Try converting the log to 'core' first.");
> - return_0;
> + if (!add_mirror_log(cmd, original_lv, log_count,
> + region_size, operable_pvs, lp->alloc))
> + return_0;
> + /*
> + * FIXME: This simple approach won't work in cluster mirrors,
> + * but it doesn't matter because we don't support
> + * mirrored logs in cluster mirrors.
> + */
> + if (old_log_count)
> + return _reload_lv(cmd, log_lv);
> + return 1;
> }
>
> /* Reducing redundancy of the log */
> @@ -1109,7 +1110,8 @@ static int _lvconvert_mirrors_aux(struct
>
> /* FIXME: can't have multiple mlogs. force corelog. */
> if (!lv_add_mirrors(cmd, lv,
> - new_mimage_count - old_mimage_count, lp->stripes, lp->stripe_size,
> + new_mimage_count - old_mimage_count,
> + lp->stripes, lp->stripe_size,
> region_size, 0U, operable_pvs, lp->alloc,
> MIRROR_BY_LV)) {
> layer_lv = seg_lv(first_seg(lv), 0);
>
> --
> lvm-devel mailing list
> lvm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/lvm-devel
>
Zdenek
prev parent reply other threads:[~2011-01-11 11:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-10 20:56 [PATCH 3 of 4] LVM: allow disk to mirror log conversion Jonathan Brassow
2011-01-11 11:03 ` Zdenek Kabelac [this message]
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=4D2C38F1.3060805@redhat.com \
--to=zkabelac@redhat.com \
--cc=lvm-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.