Home | History | Annotate | Line # | Download | only in metadata
      1      1.1  haad /*	$NetBSD: mirror.c,v 1.1.1.3 2009/12/02 00:26:41 haad Exp $	*/
      2      1.1  haad 
      3      1.1  haad /*
      4      1.1  haad  * Copyright (C) 2003-2004 Sistina Software, Inc. All rights reserved.
      5      1.1  haad  * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
      6      1.1  haad  *
      7      1.1  haad  * This file is part of LVM2.
      8      1.1  haad  *
      9      1.1  haad  * This copyrighted material is made available to anyone wishing to use,
     10      1.1  haad  * modify, copy, or redistribute it subject to the terms and conditions
     11      1.1  haad  * of the GNU Lesser General Public License v.2.1.
     12      1.1  haad  *
     13      1.1  haad  * You should have received a copy of the GNU Lesser General Public License
     14      1.1  haad  * along with this program; if not, write to the Free Software Foundation,
     15      1.1  haad  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     16      1.1  haad  */
     17      1.1  haad 
     18      1.1  haad #include "lib.h"
     19      1.1  haad #include "metadata.h"
     20      1.1  haad #include "toolcontext.h"
     21      1.1  haad #include "segtype.h"
     22      1.1  haad #include "display.h"
     23      1.1  haad #include "archiver.h"
     24      1.1  haad #include "activate.h"
     25      1.1  haad #include "lv_alloc.h"
     26      1.1  haad #include "lvm-string.h"
     27      1.1  haad #include "str_list.h"
     28      1.1  haad #include "locking.h"	/* FIXME Should not be used in this file */
     29  1.1.1.3  haad #include "memlock.h"
     30      1.1  haad 
     31      1.1  haad #include "defaults.h" /* FIXME: should this be defaults.h? */
     32      1.1  haad 
     33      1.1  haad /* These are necessary for _write_log_header() */
     34      1.1  haad #include "xlate.h"
     35      1.1  haad #define MIRROR_MAGIC 0x4D695272
     36      1.1  haad #define MIRROR_DISK_VERSION 2
     37      1.1  haad 
     38      1.1  haad /* These are the flags that represent the mirror failure restoration policies */
     39      1.1  haad #define MIRROR_REMOVE		 0
     40      1.1  haad #define MIRROR_ALLOCATE		 1
     41      1.1  haad #define MIRROR_ALLOCATE_ANYWHERE 2
     42      1.1  haad 
     43      1.1  haad /*
     44      1.1  haad  * Returns true if the lv is temporary mirror layer for resync
     45      1.1  haad  */
     46      1.1  haad int is_temporary_mirror_layer(const struct logical_volume *lv)
     47      1.1  haad {
     48      1.1  haad 	if (lv->status & MIRROR_IMAGE
     49      1.1  haad 	    && lv->status & MIRRORED
     50      1.1  haad 	    && !(lv->status & LOCKED))
     51      1.1  haad 		return 1;
     52      1.1  haad 
     53      1.1  haad 	return 0;
     54      1.1  haad }
     55      1.1  haad 
     56      1.1  haad /*
     57      1.1  haad  * Return a temporary LV for resyncing added mirror image.
     58      1.1  haad  * Add other mirror legs to lvs list.
     59      1.1  haad  */
     60      1.1  haad struct logical_volume *find_temporary_mirror(const struct logical_volume *lv)
     61      1.1  haad {
     62      1.1  haad 	struct lv_segment *seg;
     63      1.1  haad 
     64      1.1  haad 	if (!(lv->status & MIRRORED))
     65      1.1  haad 		return NULL;
     66      1.1  haad 
     67      1.1  haad 	seg = first_seg(lv);
     68      1.1  haad 
     69      1.1  haad 	/* Temporary mirror is always area_num == 0 */
     70      1.1  haad 	if (seg_type(seg, 0) == AREA_LV &&
     71      1.1  haad 	    is_temporary_mirror_layer(seg_lv(seg, 0)))
     72      1.1  haad 		return seg_lv(seg, 0);
     73      1.1  haad 
     74      1.1  haad 	return NULL;
     75      1.1  haad }
     76      1.1  haad 
     77      1.1  haad /*
     78      1.1  haad  * Returns the number of mirrors of the LV
     79      1.1  haad  */
     80      1.1  haad uint32_t lv_mirror_count(const struct logical_volume *lv)
     81      1.1  haad {
     82      1.1  haad 	struct lv_segment *seg;
     83      1.1  haad 	uint32_t s, mirrors;
     84      1.1  haad 
     85      1.1  haad 	if (!(lv->status & MIRRORED))
     86      1.1  haad 		return 1;
     87      1.1  haad 
     88      1.1  haad 	seg = first_seg(lv);
     89      1.1  haad 	mirrors = seg->area_count;
     90      1.1  haad 
     91      1.1  haad 	for (s = 0; s < seg->area_count; s++) {
     92      1.1  haad 		if (seg_type(seg, s) != AREA_LV)
     93      1.1  haad 			continue;
     94      1.1  haad 		if (is_temporary_mirror_layer(seg_lv(seg, s)))
     95      1.1  haad 			mirrors += lv_mirror_count(seg_lv(seg, s)) - 1;
     96      1.1  haad 	}
     97      1.1  haad 
     98      1.1  haad 	return mirrors;
     99      1.1  haad }
    100      1.1  haad 
    101      1.1  haad struct lv_segment *find_mirror_seg(struct lv_segment *seg)
    102      1.1  haad {
    103      1.1  haad 	struct lv_segment *mirror_seg;
    104      1.1  haad 
    105      1.1  haad 	mirror_seg = get_only_segment_using_this_lv(seg->lv);
    106      1.1  haad 
    107      1.1  haad 	if (!mirror_seg) {
    108      1.1  haad 		log_error("Failed to find mirror_seg for %s", seg->lv->name);
    109      1.1  haad 		return NULL;
    110      1.1  haad 	}
    111      1.1  haad 
    112      1.1  haad 	if (!seg_is_mirrored(mirror_seg)) {
    113      1.1  haad 		log_error("%s on %s is not a mirror segments",
    114      1.1  haad 			  mirror_seg->lv->name, seg->lv->name);
    115      1.1  haad 		return NULL;
    116      1.1  haad 	}
    117      1.1  haad 
    118      1.1  haad 	return mirror_seg;
    119      1.1  haad }
    120      1.1  haad 
    121      1.1  haad /*
    122      1.1  haad  * Reduce the region size if necessary to ensure
    123      1.1  haad  * the volume size is a multiple of the region size.
    124      1.1  haad  */
    125      1.1  haad uint32_t adjusted_mirror_region_size(uint32_t extent_size, uint32_t extents,
    126      1.1  haad 				     uint32_t region_size)
    127      1.1  haad {
    128      1.1  haad 	uint64_t region_max;
    129      1.1  haad 
    130      1.1  haad 	region_max = (1 << (ffs((int)extents) - 1)) * (uint64_t) extent_size;
    131      1.1  haad 
    132      1.1  haad 	if (region_max < UINT32_MAX && region_size > region_max) {
    133      1.1  haad 		region_size = (uint32_t) region_max;
    134      1.1  haad 		log_print("Using reduced mirror region size of %" PRIu32
    135      1.1  haad 			  " sectors", region_size);
    136      1.1  haad 	}
    137      1.1  haad 
    138      1.1  haad 	return region_size;
    139      1.1  haad }
    140      1.1  haad 
    141      1.1  haad /*
    142      1.1  haad  * shift_mirror_images
    143      1.1  haad  * @mirrored_seg
    144      1.1  haad  * @mimage:  The position (index) of the image to move to the end
    145      1.1  haad  *
    146      1.1  haad  * When dealing with removal of legs, we often move a 'removable leg'
    147      1.1  haad  * to the back of the 'areas' array.  It is critically important not
    148      1.1  haad  * to simply swap it for the last area in the array.  This would have
    149      1.1  haad  * the affect of reordering the remaining legs - altering position of
    150      1.1  haad  * the primary.  So, we must shuffle all of the areas in the array
    151      1.1  haad  * to maintain their relative position before moving the 'removable
    152      1.1  haad  * leg' to the end.
    153      1.1  haad  *
    154      1.1  haad  * Short illustration of the problem:
    155      1.1  haad  *   - Mirror consists of legs A, B, C and we want to remove A
    156      1.1  haad  *   - We swap A and C and then remove A, leaving C, B
    157      1.1  haad  * This scenario is problematic in failure cases where A dies, because
    158      1.1  haad  * B becomes the primary.  If the above happens, we effectively throw
    159      1.1  haad  * away any changes made between the time of failure and the time of
    160      1.1  haad  * restructuring the mirror.
    161      1.1  haad  *
    162      1.1  haad  * So, any time we want to move areas to the end to be removed, use
    163      1.1  haad  * this function.
    164      1.1  haad  */
    165      1.1  haad int shift_mirror_images(struct lv_segment *mirrored_seg, unsigned mimage)
    166      1.1  haad {
    167      1.1  haad 	int i;
    168      1.1  haad 	struct lv_segment_area area;
    169      1.1  haad 
    170      1.1  haad 	if (mimage >= mirrored_seg->area_count) {
    171      1.1  haad 		log_error("Invalid index (%u) of mirror image supplied "
    172      1.1  haad 			  "to shift_mirror_images()", mimage);
    173      1.1  haad 		return 0;
    174      1.1  haad 	}
    175      1.1  haad 
    176      1.1  haad 	area = mirrored_seg->areas[mimage];
    177      1.1  haad 
    178      1.1  haad 	/* Shift remaining images down to fill the hole */
    179      1.1  haad 	for (i = mimage + 1; i < mirrored_seg->area_count; i++)
    180      1.1  haad 		mirrored_seg->areas[i-1] = mirrored_seg->areas[i];
    181      1.1  haad 
    182      1.1  haad 	/* Place this one at the end */
    183      1.1  haad 	mirrored_seg->areas[i-1] = area;
    184      1.1  haad 
    185      1.1  haad 	return 1;
    186      1.1  haad }
    187      1.1  haad 
    188      1.1  haad /*
    189      1.1  haad  * This function writes a new header to the mirror log header to the lv
    190      1.1  haad  *
    191      1.1  haad  * Returns: 1 on success, 0 on failure
    192      1.1  haad  */
    193      1.1  haad static int _write_log_header(struct cmd_context *cmd, struct logical_volume *lv)
    194      1.1  haad {
    195      1.1  haad 	struct device *dev;
    196      1.1  haad 	char *name;
    197      1.1  haad 	struct { /* The mirror log header */
    198      1.1  haad 		uint32_t magic;
    199      1.1  haad 		uint32_t version;
    200      1.1  haad 		uint64_t nr_regions;
    201      1.1  haad 	} log_header;
    202      1.1  haad 
    203      1.1  haad 	log_header.magic = xlate32(MIRROR_MAGIC);
    204      1.1  haad 	log_header.version = xlate32(MIRROR_DISK_VERSION);
    205      1.1  haad 	log_header.nr_regions = xlate64((uint64_t)-1);
    206      1.1  haad 
    207      1.1  haad 	if (!(name = dm_pool_alloc(cmd->mem, PATH_MAX))) {
    208      1.1  haad 		log_error("Name allocation failed - log header not written (%s)",
    209      1.1  haad 			lv->name);
    210      1.1  haad 		return 0;
    211      1.1  haad 	}
    212      1.1  haad 
    213      1.1  haad 	if (dm_snprintf(name, PATH_MAX, "%s%s/%s", cmd->dev_dir,
    214      1.1  haad 			 lv->vg->name, lv->name) < 0) {
    215      1.1  haad 		log_error("Name too long - log header not written (%s)", lv->name);
    216      1.1  haad 		return 0;
    217      1.1  haad 	}
    218      1.1  haad 
    219      1.1  haad 	log_verbose("Writing log header to device, %s", lv->name);
    220      1.1  haad 
    221      1.1  haad 	if (!(dev = dev_cache_get(name, NULL))) {
    222      1.1  haad 		log_error("%s: not found: log header not written", name);
    223      1.1  haad 		return 0;
    224      1.1  haad 	}
    225      1.1  haad 
    226      1.1  haad 	if (!dev_open_quiet(dev))
    227      1.1  haad 		return 0;
    228      1.1  haad 
    229      1.1  haad 	if (!dev_write(dev, UINT64_C(0), sizeof(log_header), &log_header)) {
    230      1.1  haad 		log_error("Failed to write log header to %s", name);
    231      1.1  haad 		dev_close_immediate(dev);
    232      1.1  haad 		return 0;
    233      1.1  haad 	}
    234      1.1  haad 
    235      1.1  haad 	dev_close_immediate(dev);
    236      1.1  haad 
    237      1.1  haad 	return 1;
    238      1.1  haad }
    239      1.1  haad 
    240      1.1  haad /*
    241      1.1  haad  * Initialize mirror log contents
    242      1.1  haad  */
    243      1.1  haad static int _init_mirror_log(struct cmd_context *cmd,
    244      1.1  haad 			    struct logical_volume *log_lv, int in_sync,
    245      1.1  haad 			    struct dm_list *tags, int remove_on_failure)
    246      1.1  haad {
    247      1.1  haad 	struct str_list *sl;
    248      1.1  haad 	struct lvinfo info;
    249      1.1  haad 	uint32_t orig_status = log_lv->status;
    250      1.1  haad 	int was_active = 0;
    251      1.1  haad 
    252      1.1  haad 	if (!activation() && in_sync) {
    253      1.1  haad 		log_error("Aborting. Unable to create in-sync mirror log "
    254      1.1  haad 			  "while activation is disabled.");
    255      1.1  haad 		return 0;
    256      1.1  haad 	}
    257      1.1  haad 
    258      1.1  haad 	/* If the LV is active, deactivate it first. */
    259      1.1  haad 	if (lv_info(cmd, log_lv, &info, 0, 0) && info.exists) {
    260      1.1  haad 		if (!deactivate_lv(cmd, log_lv))
    261      1.1  haad 			return_0;
    262      1.1  haad 		was_active = 1;
    263      1.1  haad 	}
    264      1.1  haad 
    265      1.1  haad 	/* Temporary make it visible for set_lv() */
    266  1.1.1.3  haad 	lv_set_visible(log_lv);
    267      1.1  haad 
    268      1.1  haad 	/* Temporary tag mirror log for activation */
    269      1.1  haad 	dm_list_iterate_items(sl, tags)
    270      1.1  haad 		if (!str_list_add(cmd->mem, &log_lv->tags, sl->str)) {
    271      1.1  haad 			log_error("Aborting. Unable to tag mirror log.");
    272      1.1  haad 			goto activate_lv;
    273      1.1  haad 		}
    274      1.1  haad 
    275      1.1  haad 	/* store mirror log on disk(s) */
    276  1.1.1.3  haad 	if (!vg_write(log_lv->vg) || !vg_commit(log_lv->vg))
    277      1.1  haad 		goto activate_lv;
    278      1.1  haad 
    279      1.1  haad 	backup(log_lv->vg);
    280      1.1  haad 
    281      1.1  haad 	if (!activate_lv(cmd, log_lv)) {
    282      1.1  haad 		log_error("Aborting. Failed to activate mirror log.");
    283      1.1  haad 		goto revert_new_lv;
    284      1.1  haad 	}
    285      1.1  haad 
    286      1.1  haad 	/* Remove the temporary tags */
    287      1.1  haad 	dm_list_iterate_items(sl, tags)
    288      1.1  haad 		if (!str_list_del(&log_lv->tags, sl->str))
    289      1.1  haad 			log_error("Failed to remove tag %s from mirror log.",
    290      1.1  haad 				  sl->str);
    291      1.1  haad 
    292      1.1  haad 	if (activation() && !set_lv(cmd, log_lv, log_lv->size,
    293      1.1  haad 				    in_sync ? -1 : 0)) {
    294      1.1  haad 		log_error("Aborting. Failed to wipe mirror log.");
    295      1.1  haad 		goto deactivate_and_revert_new_lv;
    296      1.1  haad 	}
    297      1.1  haad 
    298      1.1  haad 	if (activation() && !_write_log_header(cmd, log_lv)) {
    299      1.1  haad 		log_error("Aborting. Failed to write mirror log header.");
    300      1.1  haad 		goto deactivate_and_revert_new_lv;
    301      1.1  haad 	}
    302      1.1  haad 
    303      1.1  haad 	if (!deactivate_lv(cmd, log_lv)) {
    304      1.1  haad 		log_error("Aborting. Failed to deactivate mirror log. "
    305      1.1  haad 			  "Manual intervention required.");
    306      1.1  haad 		return 0;
    307      1.1  haad 	}
    308      1.1  haad 
    309  1.1.1.3  haad 	lv_set_hidden(log_lv);
    310      1.1  haad 
    311      1.1  haad 	if (was_active && !activate_lv(cmd, log_lv))
    312      1.1  haad 		return_0;
    313      1.1  haad 
    314      1.1  haad 	return 1;
    315      1.1  haad 
    316      1.1  haad deactivate_and_revert_new_lv:
    317      1.1  haad 	if (!deactivate_lv(cmd, log_lv)) {
    318      1.1  haad 		log_error("Unable to deactivate mirror log LV. "
    319      1.1  haad 			  "Manual intervention required.");
    320      1.1  haad 		return 0;
    321      1.1  haad 	}
    322      1.1  haad 
    323      1.1  haad revert_new_lv:
    324      1.1  haad 	log_lv->status = orig_status;
    325      1.1  haad 
    326      1.1  haad 	dm_list_iterate_items(sl, tags)
    327      1.1  haad 		if (!str_list_del(&log_lv->tags, sl->str))
    328      1.1  haad 			log_error("Failed to remove tag %s from mirror log.",
    329      1.1  haad 				  sl->str);
    330      1.1  haad 
    331      1.1  haad 	if (remove_on_failure && !lv_remove(log_lv)) {
    332      1.1  haad 		log_error("Manual intervention may be required to remove "
    333      1.1  haad 			  "abandoned log LV before retrying.");
    334      1.1  haad 		return 0;
    335      1.1  haad 	}
    336      1.1  haad 
    337  1.1.1.3  haad 	if (!vg_write(log_lv->vg) || !vg_commit(log_lv->vg))
    338      1.1  haad 		log_error("Manual intervention may be required to "
    339      1.1  haad 			  "remove/restore abandoned log LV before retrying.");
    340  1.1.1.3  haad 	else
    341  1.1.1.3  haad 		backup(log_lv->vg);
    342  1.1.1.3  haad 
    343      1.1  haad activate_lv:
    344      1.1  haad 	if (was_active && !remove_on_failure && !activate_lv(cmd, log_lv))
    345      1.1  haad 		return_0;
    346      1.1  haad 
    347      1.1  haad 	return 0;
    348      1.1  haad }
    349      1.1  haad 
    350      1.1  haad /*
    351      1.1  haad  * Delete independent/orphan LV, it must acquire lock.
    352      1.1  haad  */
    353      1.1  haad static int _delete_lv(struct logical_volume *mirror_lv, struct logical_volume *lv)
    354      1.1  haad {
    355      1.1  haad 	struct cmd_context *cmd = mirror_lv->vg->cmd;
    356      1.1  haad 	struct str_list *sl;
    357      1.1  haad 
    358      1.1  haad 	/* Inherit tags - maybe needed for activation */
    359      1.1  haad 	if (!str_list_match_list(&mirror_lv->tags, &lv->tags)) {
    360      1.1  haad 		dm_list_iterate_items(sl, &mirror_lv->tags)
    361      1.1  haad 			if (!str_list_add(cmd->mem, &lv->tags, sl->str)) {
    362      1.1  haad 				log_error("Aborting. Unable to tag.");
    363      1.1  haad 				return 0;
    364      1.1  haad 			}
    365      1.1  haad 
    366      1.1  haad 		if (!vg_write(mirror_lv->vg) ||
    367      1.1  haad 		    !vg_commit(mirror_lv->vg)) {
    368      1.1  haad 			log_error("Intermediate VG commit for orphan volume failed.");
    369      1.1  haad 			return 0;
    370      1.1  haad 		}
    371      1.1  haad 	}
    372      1.1  haad 
    373      1.1  haad 	if (!activate_lv(cmd, lv))
    374      1.1  haad 		return_0;
    375      1.1  haad 
    376      1.1  haad 	if (!deactivate_lv(cmd, lv))
    377      1.1  haad 		return_0;
    378      1.1  haad 
    379      1.1  haad 	if (!lv_remove(lv))
    380      1.1  haad 		return_0;
    381      1.1  haad 
    382      1.1  haad 	return 1;
    383      1.1  haad }
    384      1.1  haad 
    385      1.1  haad static int _merge_mirror_images(struct logical_volume *lv,
    386      1.1  haad 				const struct dm_list *mimages)
    387      1.1  haad {
    388      1.1  haad 	uint32_t addition = dm_list_size(mimages);
    389      1.1  haad 	struct logical_volume **img_lvs;
    390      1.1  haad 	struct lv_list *lvl;
    391      1.1  haad 	int i = 0;
    392      1.1  haad 
    393      1.1  haad 	if (!addition)
    394      1.1  haad 		return 1;
    395      1.1  haad 
    396      1.1  haad 	if (!(img_lvs = alloca(sizeof(*img_lvs) * addition)))
    397      1.1  haad 		return_0;
    398      1.1  haad 
    399      1.1  haad 	dm_list_iterate_items(lvl, mimages)
    400      1.1  haad 		img_lvs[i++] = lvl->lv;
    401      1.1  haad 
    402      1.1  haad 	return lv_add_mirror_lvs(lv, img_lvs, addition,
    403      1.1  haad 				 MIRROR_IMAGE, first_seg(lv)->region_size);
    404      1.1  haad }
    405      1.1  haad 
    406      1.1  haad /* Unlink the relationship between the segment and its log_lv */
    407      1.1  haad struct logical_volume *detach_mirror_log(struct lv_segment *mirrored_seg)
    408      1.1  haad {
    409      1.1  haad 	struct logical_volume *log_lv;
    410      1.1  haad 
    411      1.1  haad 	if (!mirrored_seg->log_lv)
    412      1.1  haad 		return NULL;
    413      1.1  haad 
    414      1.1  haad 	log_lv = mirrored_seg->log_lv;
    415      1.1  haad 	mirrored_seg->log_lv = NULL;
    416  1.1.1.3  haad 	lv_set_visible(log_lv);
    417      1.1  haad 	log_lv->status &= ~MIRROR_LOG;
    418      1.1  haad 	remove_seg_from_segs_using_this_lv(log_lv, mirrored_seg);
    419      1.1  haad 
    420      1.1  haad 	return log_lv;
    421      1.1  haad }
    422      1.1  haad 
    423      1.1  haad /* Check if mirror image LV is removable with regard to given removable_pvs */
    424      1.1  haad static int _is_mirror_image_removable(struct logical_volume *mimage_lv,
    425      1.1  haad 				      struct dm_list *removable_pvs)
    426      1.1  haad {
    427      1.1  haad 	struct physical_volume *pv;
    428      1.1  haad 	struct lv_segment *seg;
    429      1.1  haad 	int pv_found;
    430      1.1  haad 	struct pv_list *pvl;
    431      1.1  haad 	uint32_t s;
    432      1.1  haad 
    433      1.1  haad 	dm_list_iterate_items(seg, &mimage_lv->segments) {
    434      1.1  haad 		for (s = 0; s < seg->area_count; s++) {
    435      1.1  haad 			if (seg_type(seg, s) != AREA_PV) {
    436      1.1  haad 				/* FIXME Recurse for AREA_LV? */
    437      1.1  haad 				/* Structure of seg_lv is unknown.
    438      1.1  haad 				 * Not removing this LV for safety. */
    439      1.1  haad 				return 0;
    440      1.1  haad 			}
    441      1.1  haad 
    442      1.1  haad 			pv = seg_pv(seg, s);
    443      1.1  haad 
    444      1.1  haad 			pv_found = 0;
    445      1.1  haad 			dm_list_iterate_items(pvl, removable_pvs) {
    446  1.1.1.3  haad 				if (id_equal(&pv->id, &pvl->pv->id)) {
    447  1.1.1.3  haad 					pv_found = 1;
    448  1.1.1.3  haad 					break;
    449  1.1.1.3  haad 				}
    450  1.1.1.3  haad 				if (pvl->pv->dev && pv->dev &&
    451  1.1.1.3  haad 				    pv->dev->dev == pvl->pv->dev->dev) {
    452      1.1  haad 					pv_found = 1;
    453      1.1  haad 					break;
    454      1.1  haad 				}
    455      1.1  haad 			}
    456      1.1  haad 			if (!pv_found)
    457      1.1  haad 				return 0;
    458      1.1  haad 		}
    459      1.1  haad 	}
    460      1.1  haad 
    461      1.1  haad 	return 1;
    462      1.1  haad }
    463      1.1  haad 
    464      1.1  haad /*
    465      1.1  haad  * Remove num_removed images from mirrored_seg
    466      1.1  haad  *
    467      1.1  haad  * Arguments:
    468      1.1  haad  *   num_removed:   the requested (maximum) number of mirrors to be removed
    469      1.1  haad  *   removable_pvs: if not NULL, only mirrors using PVs in this list
    470      1.1  haad  *                  will be removed
    471      1.1  haad  *   remove_log:    if non-zero, log_lv will be removed
    472      1.1  haad  *                  (even if it's 0, log_lv will be removed if there is no
    473      1.1  haad  *                   mirror remaining after the removal)
    474      1.1  haad  *   collapse:      if non-zero, instead of removing, remove the temporary
    475      1.1  haad  *                  mirror layer and merge mirrors to the original LV.
    476      1.1  haad  *                  removable_pvs should be NULL and num_removed should be
    477      1.1  haad  *                  seg->area_count - 1.
    478      1.1  haad  *   removed:       if non NULL, the number of removed mirror images is set
    479      1.1  haad  *                  as a result
    480      1.1  haad  *
    481      1.1  haad  * If collapse is non-zero, <removed> is guaranteed to be equal to num_removed.
    482      1.1  haad  *
    483      1.1  haad  * Return values:
    484      1.1  haad  *   Failure (0) means something unexpected has happend and
    485      1.1  haad  *   the caller should abort.
    486      1.1  haad  *   Even if no mirror was removed (e.g. no LV matches to 'removable_pvs'),
    487      1.1  haad  *   returns success (1).
    488      1.1  haad  */
    489      1.1  haad static int _remove_mirror_images(struct logical_volume *lv,
    490      1.1  haad 				 uint32_t num_removed,
    491      1.1  haad 				 struct dm_list *removable_pvs,
    492      1.1  haad 				 unsigned remove_log, unsigned collapse,
    493      1.1  haad 				 uint32_t *removed)
    494      1.1  haad {
    495      1.1  haad 	uint32_t m;
    496      1.1  haad 	uint32_t s;
    497      1.1  haad 	struct logical_volume *sub_lv;
    498      1.1  haad 	struct logical_volume *detached_log_lv = NULL;
    499      1.1  haad 	struct logical_volume *lv1 = NULL;
    500      1.1  haad 	struct lv_segment *mirrored_seg = first_seg(lv);
    501      1.1  haad 	uint32_t old_area_count = mirrored_seg->area_count;
    502      1.1  haad 	uint32_t new_area_count = mirrored_seg->area_count;
    503      1.1  haad 	struct lv_list *lvl;
    504      1.1  haad 	struct dm_list tmp_orphan_lvs;
    505      1.1  haad 
    506      1.1  haad 	if (removed)
    507      1.1  haad 		*removed = 0;
    508      1.1  haad 
    509      1.1  haad 	log_very_verbose("Reducing mirror set from %" PRIu32 " to %"
    510      1.1  haad 			 PRIu32 " image(s)%s.",
    511      1.1  haad 			 old_area_count, old_area_count - num_removed,
    512      1.1  haad 			 remove_log ? " and no log volume" : "");
    513      1.1  haad 
    514      1.1  haad 	if (collapse &&
    515      1.1  haad 	    (removable_pvs || (old_area_count - num_removed != 1))) {
    516      1.1  haad 		log_error("Incompatible parameters to _remove_mirror_images");
    517      1.1  haad 		return 0;
    518      1.1  haad 	}
    519      1.1  haad 
    520      1.1  haad 	/* Move removable_pvs to end of array */
    521      1.1  haad 	if (removable_pvs) {
    522      1.1  haad 		for (s = 0; s < mirrored_seg->area_count &&
    523      1.1  haad 			    old_area_count - new_area_count < num_removed; s++) {
    524      1.1  haad 			sub_lv = seg_lv(mirrored_seg, s);
    525      1.1  haad 
    526      1.1  haad 			if (!is_temporary_mirror_layer(sub_lv) &&
    527      1.1  haad 			    _is_mirror_image_removable(sub_lv, removable_pvs)) {
    528      1.1  haad 				if (!shift_mirror_images(mirrored_seg, s))
    529      1.1  haad 					return_0;
    530      1.1  haad 				new_area_count--;
    531      1.1  haad 			}
    532      1.1  haad 		}
    533      1.1  haad 		if (num_removed && old_area_count == new_area_count)
    534      1.1  haad 			return 1;
    535      1.1  haad 	} else
    536      1.1  haad 		new_area_count = old_area_count - num_removed;
    537      1.1  haad 
    538      1.1  haad 	/* Remove mimage LVs from the segment */
    539      1.1  haad 	dm_list_init(&tmp_orphan_lvs);
    540      1.1  haad 	for (m = new_area_count; m < mirrored_seg->area_count; m++) {
    541      1.1  haad 		seg_lv(mirrored_seg, m)->status &= ~MIRROR_IMAGE;
    542  1.1.1.3  haad 		lv_set_visible(seg_lv(mirrored_seg, m));
    543      1.1  haad 		if (!(lvl = dm_pool_alloc(lv->vg->cmd->mem, sizeof(*lvl)))) {
    544      1.1  haad 			log_error("lv_list alloc failed");
    545      1.1  haad 			return 0;
    546      1.1  haad 		}
    547      1.1  haad 		lvl->lv = seg_lv(mirrored_seg, m);
    548      1.1  haad 		dm_list_add(&tmp_orphan_lvs, &lvl->list);
    549      1.1  haad 		release_lv_segment_area(mirrored_seg, m, mirrored_seg->area_len);
    550      1.1  haad 	}
    551      1.1  haad 	mirrored_seg->area_count = new_area_count;
    552      1.1  haad 
    553      1.1  haad 	/* If no more mirrors, remove mirror layer */
    554      1.1  haad 	/* As an exceptional case, if the lv is temporary layer,
    555      1.1  haad 	 * leave the LV as mirrored and let the lvconvert completion
    556      1.1  haad 	 * to remove the layer. */
    557      1.1  haad 	if (new_area_count == 1 && !is_temporary_mirror_layer(lv)) {
    558      1.1  haad 		lv1 = seg_lv(mirrored_seg, 0);
    559      1.1  haad 		lv1->status &= ~MIRROR_IMAGE;
    560  1.1.1.3  haad 		lv_set_visible(lv1);
    561      1.1  haad 		detached_log_lv = detach_mirror_log(mirrored_seg);
    562      1.1  haad 		if (!remove_layer_from_lv(lv, lv1))
    563      1.1  haad 			return_0;
    564      1.1  haad 		lv->status &= ~MIRRORED;
    565      1.1  haad 		lv->status &= ~MIRROR_NOTSYNCED;
    566      1.1  haad 		if (collapse && !_merge_mirror_images(lv, &tmp_orphan_lvs)) {
    567      1.1  haad 			log_error("Failed to add mirror images");
    568      1.1  haad 			return 0;
    569      1.1  haad 		}
    570      1.1  haad 	} else if (new_area_count == 0) {
    571      1.1  haad 		log_very_verbose("All mimages of %s are gone", lv->name);
    572      1.1  haad 
    573      1.1  haad 		/* All mirror images are gone.
    574      1.1  haad 		 * It can happen for vgreduce --removemissing. */
    575      1.1  haad 		detached_log_lv = detach_mirror_log(mirrored_seg);
    576      1.1  haad 		lv->status &= ~MIRRORED;
    577      1.1  haad 		lv->status &= ~MIRROR_NOTSYNCED;
    578      1.1  haad 		if (!replace_lv_with_error_segment(lv))
    579      1.1  haad 			return_0;
    580      1.1  haad 	} else if (remove_log)
    581      1.1  haad 		detached_log_lv = detach_mirror_log(mirrored_seg);
    582      1.1  haad 
    583      1.1  haad 	/*
    584      1.1  haad 	 * To successfully remove these unwanted LVs we need to
    585      1.1  haad 	 * remove the LVs from the mirror set, commit that metadata
    586      1.1  haad 	 * then deactivate and remove them fully.
    587      1.1  haad 	 */
    588      1.1  haad 
    589      1.1  haad 	if (!vg_write(mirrored_seg->lv->vg)) {
    590      1.1  haad 		log_error("intermediate VG write failed.");
    591      1.1  haad 		return 0;
    592      1.1  haad 	}
    593      1.1  haad 
    594      1.1  haad 	if (!suspend_lv(mirrored_seg->lv->vg->cmd, mirrored_seg->lv)) {
    595      1.1  haad 		log_error("Failed to lock %s", mirrored_seg->lv->name);
    596      1.1  haad 		vg_revert(mirrored_seg->lv->vg);
    597      1.1  haad 		return 0;
    598      1.1  haad 	}
    599      1.1  haad 
    600      1.1  haad 	if (!vg_commit(mirrored_seg->lv->vg)) {
    601      1.1  haad 		resume_lv(mirrored_seg->lv->vg->cmd, mirrored_seg->lv);
    602      1.1  haad 		return 0;
    603      1.1  haad 	}
    604      1.1  haad 
    605      1.1  haad 	log_very_verbose("Updating \"%s\" in kernel", mirrored_seg->lv->name);
    606      1.1  haad 
    607      1.1  haad 	/*
    608      1.1  haad 	 * Avoid having same mirror target loaded twice simultaneously by first
    609      1.1  haad 	 * resuming the removed LV which now contains an error segment.
    610      1.1  haad 	 * As it's now detached from mirrored_seg->lv we must resume it
    611      1.1  haad 	 * explicitly.
    612      1.1  haad 	 */
    613  1.1.1.3  haad 	if (lv1) {
    614  1.1.1.3  haad 		if (!resume_lv(lv1->vg->cmd, lv1)) {
    615  1.1.1.3  haad 			log_error("Problem resuming temporary LV, %s", lv1->name);
    616  1.1.1.3  haad 			return 0;
    617  1.1.1.3  haad 		}
    618  1.1.1.3  haad 
    619  1.1.1.3  haad 		/*
    620  1.1.1.3  haad 		 * The code above calls a suspend_lv once, however we now need
    621  1.1.1.3  haad 		 * to resume 2 LVs, due to image removal: the mirror image
    622  1.1.1.3  haad 		 * itself here, and now the remaining mirror LV. Since
    623  1.1.1.3  haad 		 * suspend_lv/resume_lv call memlock_inc/memlock_dec and these
    624  1.1.1.3  haad 		 * need to be balanced, we need to call an extra memlock_inc()
    625  1.1.1.3  haad 		 * here to balance for the this extra resume -- the following
    626  1.1.1.3  haad 		 * one could otherwise either deadlock due to suspended
    627  1.1.1.3  haad 		 * devices, or alternatively drop memlock_count below 0.
    628  1.1.1.3  haad 		 */
    629  1.1.1.3  haad 		memlock_inc();
    630      1.1  haad 	}
    631      1.1  haad 
    632      1.1  haad 	if (!resume_lv(mirrored_seg->lv->vg->cmd, mirrored_seg->lv)) {
    633      1.1  haad 		log_error("Problem reactivating %s", mirrored_seg->lv->name);
    634      1.1  haad 		return 0;
    635      1.1  haad 	}
    636      1.1  haad 
    637      1.1  haad 	/* Save or delete the 'orphan' LVs */
    638      1.1  haad 	if (!collapse) {
    639      1.1  haad 		dm_list_iterate_items(lvl, &tmp_orphan_lvs)
    640      1.1  haad 			if (!_delete_lv(lv, lvl->lv))
    641      1.1  haad 				return_0;
    642      1.1  haad 	}
    643      1.1  haad 
    644      1.1  haad 	if (lv1 && !_delete_lv(lv, lv1))
    645      1.1  haad 		return_0;
    646      1.1  haad 
    647      1.1  haad 	if (detached_log_lv && !_delete_lv(lv, detached_log_lv))
    648      1.1  haad 		return_0;
    649      1.1  haad 
    650      1.1  haad 	/* Mirror with only 1 area is 'in sync'. */
    651      1.1  haad 	if (new_area_count == 1 && is_temporary_mirror_layer(lv)) {
    652      1.1  haad 		if (first_seg(lv)->log_lv &&
    653      1.1  haad 		    !_init_mirror_log(lv->vg->cmd, first_seg(lv)->log_lv,
    654      1.1  haad 				      1, &lv->tags, 0)) {
    655      1.1  haad 			/* As a result, unnecessary sync may run after
    656      1.1  haad 			 * collapsing. But safe.*/
    657      1.1  haad 			log_error("Failed to initialize log device");
    658      1.1  haad 			return_0;
    659      1.1  haad 		}
    660      1.1  haad 	}
    661      1.1  haad 
    662      1.1  haad 	if (removed)
    663      1.1  haad 		*removed = old_area_count - new_area_count;
    664      1.1  haad 
    665      1.1  haad 	log_very_verbose("%" PRIu32 " image(s) removed from %s",
    666      1.1  haad 			 old_area_count - num_removed, lv->name);
    667      1.1  haad 
    668      1.1  haad 	return 1;
    669      1.1  haad }
    670      1.1  haad 
    671      1.1  haad /*
    672      1.1  haad  * Remove the number of mirror images from the LV
    673      1.1  haad  */
    674      1.1  haad int remove_mirror_images(struct logical_volume *lv, uint32_t num_mirrors,
    675      1.1  haad 			 struct dm_list *removable_pvs, unsigned remove_log)
    676      1.1  haad {
    677      1.1  haad 	uint32_t num_removed, removed_once, r;
    678      1.1  haad 	uint32_t existing_mirrors = lv_mirror_count(lv);
    679      1.1  haad 	struct logical_volume *next_lv = lv;
    680      1.1  haad 
    681      1.1  haad 	num_removed = existing_mirrors - num_mirrors;
    682      1.1  haad 
    683      1.1  haad 	/* num_removed can be 0 if the function is called just to remove log */
    684      1.1  haad 	do {
    685      1.1  haad 		if (num_removed < first_seg(next_lv)->area_count)
    686      1.1  haad 			removed_once = num_removed;
    687      1.1  haad 		else
    688      1.1  haad 			removed_once = first_seg(next_lv)->area_count - 1;
    689      1.1  haad 
    690      1.1  haad 		if (!_remove_mirror_images(next_lv, removed_once,
    691      1.1  haad 					   removable_pvs, remove_log, 0, &r))
    692      1.1  haad 			return_0;
    693      1.1  haad 
    694      1.1  haad 		if (r < removed_once) {
    695      1.1  haad 			/* Some mirrors are removed from the temporary mirror,
    696      1.1  haad 			 * but the temporary layer still exists.
    697      1.1  haad 			 * Down the stack and retry for remainder. */
    698      1.1  haad 			next_lv = find_temporary_mirror(next_lv);
    699      1.1  haad 		}
    700      1.1  haad 
    701      1.1  haad 		num_removed -= r;
    702      1.1  haad 	} while (next_lv && num_removed);
    703      1.1  haad 
    704      1.1  haad 	if (num_removed) {
    705      1.1  haad 		if (num_removed == existing_mirrors - num_mirrors)
    706      1.1  haad 			log_error("No mirror images found using specified PVs.");
    707      1.1  haad 		else {
    708      1.1  haad 			log_error("%u images are removed out of requested %u.",
    709      1.1  haad 				  existing_mirrors - lv_mirror_count(lv),
    710      1.1  haad 				  existing_mirrors - num_mirrors);
    711      1.1  haad 		}
    712      1.1  haad 		return 0;
    713      1.1  haad 	}
    714      1.1  haad 
    715      1.1  haad 	return 1;
    716      1.1  haad }
    717      1.1  haad 
    718      1.1  haad static int _mirrored_lv_in_sync(struct logical_volume *lv)
    719      1.1  haad {
    720      1.1  haad 	float sync_percent;
    721  1.1.1.3  haad 	percent_range_t percent_range;
    722      1.1  haad 
    723  1.1.1.3  haad 	if (!lv_mirror_percent(lv->vg->cmd, lv, 0, &sync_percent,
    724  1.1.1.3  haad 			       &percent_range, NULL)) {
    725      1.1  haad 		log_error("Unable to determine mirror sync status of %s/%s.",
    726      1.1  haad 			  lv->vg->name, lv->name);
    727      1.1  haad 		return 0;
    728      1.1  haad 	}
    729      1.1  haad 
    730  1.1.1.3  haad 	return (percent_range == PERCENT_100) ? 1 : 0;
    731      1.1  haad }
    732      1.1  haad 
    733      1.1  haad /*
    734      1.1  haad  * Collapsing temporary mirror layers.
    735      1.1  haad  *
    736      1.1  haad  * When mirrors are added to already-mirrored LV, a temporary mirror layer
    737      1.1  haad  * is inserted at the top of the stack to reduce resync work.
    738      1.1  haad  * The function will remove the intermediate layer and collapse the stack
    739      1.1  haad  * as far as mirrors are in-sync.
    740      1.1  haad  *
    741      1.1  haad  * The function is destructive: to remove intermediate mirror layers,
    742      1.1  haad  * VG metadata commits and suspend/resume are necessary.
    743      1.1  haad  */
    744      1.1  haad int collapse_mirrored_lv(struct logical_volume *lv)
    745      1.1  haad {
    746      1.1  haad 	struct logical_volume *tmp_lv;
    747      1.1  haad 	struct lv_segment *mirror_seg;
    748      1.1  haad 
    749      1.1  haad 	while ((tmp_lv = find_temporary_mirror(lv))) {
    750      1.1  haad 		mirror_seg = find_mirror_seg(first_seg(tmp_lv));
    751      1.1  haad 		if (!mirror_seg) {
    752      1.1  haad 			log_error("Failed to find mirrored LV for %s",
    753      1.1  haad 				  tmp_lv->name);
    754      1.1  haad 			return 0;
    755      1.1  haad 		}
    756      1.1  haad 
    757      1.1  haad 		if (!_mirrored_lv_in_sync(mirror_seg->lv)) {
    758      1.1  haad 			log_verbose("Not collapsing %s: out-of-sync",
    759      1.1  haad 				    mirror_seg->lv->name);
    760      1.1  haad 			return 1;
    761      1.1  haad 		}
    762      1.1  haad 
    763      1.1  haad 		if (!_remove_mirror_images(mirror_seg->lv,
    764      1.1  haad 					   mirror_seg->area_count - 1,
    765      1.1  haad 					   NULL, 1, 1, NULL)) {
    766      1.1  haad 			log_error("Failed to release mirror images");
    767      1.1  haad 			return 0;
    768      1.1  haad 		}
    769      1.1  haad 	}
    770      1.1  haad 
    771      1.1  haad 	return 1;
    772      1.1  haad }
    773      1.1  haad 
    774      1.1  haad static int get_mirror_fault_policy(struct cmd_context *cmd __attribute((unused)),
    775      1.1  haad 				   int log_policy)
    776      1.1  haad {
    777      1.1  haad 	const char *policy;
    778      1.1  haad 
    779      1.1  haad 	if (log_policy)
    780      1.1  haad 		policy = find_config_str(NULL, "activation/mirror_log_fault_policy",
    781      1.1  haad 					 DEFAULT_MIRROR_LOG_FAULT_POLICY);
    782      1.1  haad 	else
    783      1.1  haad 		policy = find_config_str(NULL, "activation/mirror_device_fault_policy",
    784      1.1  haad 					 DEFAULT_MIRROR_DEV_FAULT_POLICY);
    785      1.1  haad 
    786      1.1  haad 	if (!strcmp(policy, "remove"))
    787      1.1  haad 		return MIRROR_REMOVE;
    788      1.1  haad 	else if (!strcmp(policy, "allocate"))
    789      1.1  haad 		return MIRROR_ALLOCATE;
    790      1.1  haad 	else if (!strcmp(policy, "allocate_anywhere"))
    791      1.1  haad 		return MIRROR_ALLOCATE_ANYWHERE;
    792      1.1  haad 
    793      1.1  haad 	if (log_policy)
    794      1.1  haad 		log_error("Bad activation/mirror_log_fault_policy");
    795      1.1  haad 	else
    796      1.1  haad 		log_error("Bad activation/mirror_device_fault_policy");
    797      1.1  haad 
    798      1.1  haad 	return MIRROR_REMOVE;
    799      1.1  haad }
    800      1.1  haad 
    801      1.1  haad static int get_mirror_log_fault_policy(struct cmd_context *cmd)
    802      1.1  haad {
    803      1.1  haad 	return get_mirror_fault_policy(cmd, 1);
    804      1.1  haad }
    805      1.1  haad 
    806      1.1  haad static int get_mirror_device_fault_policy(struct cmd_context *cmd)
    807      1.1  haad {
    808      1.1  haad 	return get_mirror_fault_policy(cmd, 0);
    809      1.1  haad }
    810      1.1  haad 
    811      1.1  haad /*
    812      1.1  haad  * replace_mirror_images
    813      1.1  haad  * @mirrored_seg: segment (which may be linear now) to restore
    814      1.1  haad  * @num_mirrors: number of copies we should end up with
    815      1.1  haad  * @replace_log: replace log if not present
    816      1.1  haad  * @in_sync: was the original mirror in-sync?
    817      1.1  haad  *
    818      1.1  haad  * in_sync will be set to 0 if new mirror devices are being added
    819      1.1  haad  * In other words, it is only useful if the log (and only the log)
    820      1.1  haad  * is being restored.
    821      1.1  haad  *
    822      1.1  haad  * Returns: 0 on failure, 1 on reconfig, -1 if no reconfig done
    823      1.1  haad  */
    824      1.1  haad static int replace_mirror_images(struct lv_segment *mirrored_seg,
    825      1.1  haad 				 uint32_t num_mirrors,
    826      1.1  haad 				 int log_policy, int in_sync)
    827      1.1  haad {
    828      1.1  haad 	int r = -1;
    829      1.1  haad 	struct logical_volume *lv = mirrored_seg->lv;
    830      1.1  haad 
    831      1.1  haad 	/* FIXME: Use lvconvert rather than duplicating its code */
    832      1.1  haad 
    833      1.1  haad 	if (mirrored_seg->area_count < num_mirrors) {
    834      1.1  haad 		log_error("WARNING: Failed to replace mirror device in %s/%s",
    835      1.1  haad 			  mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
    836      1.1  haad 
    837      1.1  haad 		if ((mirrored_seg->area_count > 1) && !mirrored_seg->log_lv)
    838      1.1  haad 			log_error("WARNING: Use 'lvconvert -m %d %s/%s --corelog' to replace failed devices",
    839      1.1  haad 				  num_mirrors - 1, lv->vg->name, lv->name);
    840      1.1  haad 		else
    841      1.1  haad 			log_error("WARNING: Use 'lvconvert -m %d %s/%s' to replace failed devices",
    842      1.1  haad 				  num_mirrors - 1, lv->vg->name, lv->name);
    843      1.1  haad 		r = 0;
    844      1.1  haad 
    845      1.1  haad 		/* REMEMBER/FIXME: set in_sync to 0 if a new mirror device was added */
    846      1.1  haad 		in_sync = 0;
    847      1.1  haad 	}
    848      1.1  haad 
    849      1.1  haad 	/*
    850      1.1  haad 	 * FIXME: right now, we ignore the allocation policy specified to
    851      1.1  haad 	 * allocate the new log.
    852      1.1  haad 	 */
    853      1.1  haad 	if ((mirrored_seg->area_count > 1) && !mirrored_seg->log_lv &&
    854      1.1  haad 	    (log_policy != MIRROR_REMOVE)) {
    855      1.1  haad 		log_error("WARNING: Failed to replace mirror log device in %s/%s",
    856      1.1  haad 			  lv->vg->name, lv->name);
    857      1.1  haad 
    858      1.1  haad 		log_error("WARNING: Use 'lvconvert -m %d %s/%s' to replace failed devices",
    859      1.1  haad 			  mirrored_seg->area_count - 1 , lv->vg->name, lv->name);
    860      1.1  haad 		r = 0;
    861      1.1  haad 	}
    862      1.1  haad 
    863      1.1  haad 	return r;
    864      1.1  haad }
    865      1.1  haad 
    866      1.1  haad int reconfigure_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors,
    867      1.1  haad 			      struct dm_list *removable_pvs, unsigned remove_log)
    868      1.1  haad {
    869      1.1  haad 	int r;
    870      1.1  haad 	int in_sync;
    871      1.1  haad 	int log_policy, dev_policy;
    872      1.1  haad 	uint32_t old_num_mirrors = mirrored_seg->area_count;
    873      1.1  haad 	int had_log = (mirrored_seg->log_lv) ? 1 : 0;
    874      1.1  haad 
    875      1.1  haad 	/* was the mirror in-sync before problems? */
    876      1.1  haad 	in_sync = _mirrored_lv_in_sync(mirrored_seg->lv);
    877      1.1  haad 
    878      1.1  haad 	/*
    879      1.1  haad 	 * While we are only removing devices, we can have sync set.
    880      1.1  haad 	 * Setting this is only useful if we are moving to core log
    881      1.1  haad 	 * otherwise the disk log will contain the sync information
    882      1.1  haad 	 */
    883      1.1  haad 	init_mirror_in_sync(in_sync);
    884      1.1  haad 
    885      1.1  haad 	r = _remove_mirror_images(mirrored_seg->lv, old_num_mirrors - num_mirrors,
    886      1.1  haad 				  removable_pvs, remove_log, 0, NULL);
    887      1.1  haad 	if (!r)
    888      1.1  haad 		/* Unable to remove bad devices */
    889      1.1  haad 		return 0;
    890      1.1  haad 
    891      1.1  haad 	log_warn("WARNING: Bad device removed from mirror volume, %s/%s",
    892      1.1  haad 		  mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
    893      1.1  haad 
    894      1.1  haad 	log_policy = get_mirror_log_fault_policy(mirrored_seg->lv->vg->cmd);
    895      1.1  haad 	dev_policy = get_mirror_device_fault_policy(mirrored_seg->lv->vg->cmd);
    896      1.1  haad 
    897      1.1  haad 	r = replace_mirror_images(mirrored_seg,
    898      1.1  haad 				  (dev_policy != MIRROR_REMOVE) ?
    899      1.1  haad 				  old_num_mirrors : num_mirrors,
    900      1.1  haad 				  log_policy, in_sync);
    901      1.1  haad 
    902      1.1  haad 	if (!r)
    903      1.1  haad 		/* Failed to replace device(s) */
    904      1.1  haad 		log_error("WARNING: Unable to find substitute device for mirror volume, %s/%s",
    905      1.1  haad 			  mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
    906      1.1  haad 	else if (r > 0)
    907      1.1  haad 		/* Success in replacing device(s) */
    908      1.1  haad 		log_warn("WARNING: Mirror volume, %s/%s restored - substitute for failed device found.",
    909      1.1  haad 			  mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
    910      1.1  haad 	else
    911      1.1  haad 		/* Bad device removed, but not replaced because of policy */
    912      1.1  haad 		if (mirrored_seg->area_count == 1) {
    913      1.1  haad 			log_warn("WARNING: Mirror volume, %s/%s converted to linear due to device failure.",
    914      1.1  haad 				  mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
    915      1.1  haad 		} else if (had_log && !mirrored_seg->log_lv) {
    916      1.1  haad 			log_warn("WARNING: Mirror volume, %s/%s disk log removed due to device failure.",
    917      1.1  haad 				  mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
    918      1.1  haad 		}
    919      1.1  haad 	/*
    920      1.1  haad 	 * If we made it here, we at least removed the bad device.
    921      1.1  haad 	 * Consider this success.
    922      1.1  haad 	 */
    923      1.1  haad 	return 1;
    924      1.1  haad }
    925      1.1  haad 
    926      1.1  haad static int _create_mimage_lvs(struct alloc_handle *ah,
    927      1.1  haad 			      uint32_t num_mirrors,
    928      1.1  haad 			      struct logical_volume *lv,
    929      1.1  haad 			      struct logical_volume **img_lvs)
    930      1.1  haad {
    931      1.1  haad 	uint32_t m;
    932      1.1  haad 	char *img_name;
    933      1.1  haad 	size_t len;
    934      1.1  haad 
    935      1.1  haad 	len = strlen(lv->name) + 32;
    936      1.1  haad 	if (!(img_name = alloca(len))) {
    937      1.1  haad 		log_error("img_name allocation failed. "
    938      1.1  haad 			  "Remove new LV and retry.");
    939      1.1  haad 		return 0;
    940      1.1  haad 	}
    941      1.1  haad 
    942      1.1  haad 	if (dm_snprintf(img_name, len, "%s_mimage_%%d", lv->name) < 0) {
    943      1.1  haad 		log_error("img_name allocation failed. "
    944      1.1  haad 			  "Remove new LV and retry.");
    945      1.1  haad 		return 0;
    946      1.1  haad 	}
    947      1.1  haad 
    948      1.1  haad 	for (m = 0; m < num_mirrors; m++) {
    949      1.1  haad 		if (!(img_lvs[m] = lv_create_empty(img_name,
    950      1.1  haad 					     NULL, LVM_READ | LVM_WRITE,
    951  1.1.1.3  haad 					     ALLOC_INHERIT, lv->vg))) {
    952      1.1  haad 			log_error("Aborting. Failed to create mirror image LV. "
    953      1.1  haad 				  "Remove new LV and retry.");
    954      1.1  haad 			return 0;
    955      1.1  haad 		}
    956      1.1  haad 
    957      1.1  haad 		if (!lv_add_segment(ah, m, 1, img_lvs[m],
    958      1.1  haad 				    get_segtype_from_string(lv->vg->cmd,
    959      1.1  haad 							    "striped"),
    960      1.1  haad 				    0, 0, 0, NULL)) {
    961      1.1  haad 			log_error("Aborting. Failed to add mirror image segment "
    962      1.1  haad 				  "to %s. Remove new LV and retry.",
    963      1.1  haad 				  img_lvs[m]->name);
    964      1.1  haad 			return 0;
    965      1.1  haad 		}
    966      1.1  haad 	}
    967      1.1  haad 
    968      1.1  haad 	return 1;
    969      1.1  haad }
    970      1.1  haad 
    971      1.1  haad /*
    972      1.1  haad  * Remove mirrors from each segment.
    973      1.1  haad  * 'new_mirrors' is the number of mirrors after the removal. '0' for linear.
    974      1.1  haad  * If 'status_mask' is non-zero, the removal happens only when all segments
    975      1.1  haad  * has the status bits on.
    976      1.1  haad  */
    977      1.1  haad int remove_mirrors_from_segments(struct logical_volume *lv,
    978      1.1  haad 				 uint32_t new_mirrors, uint32_t status_mask)
    979      1.1  haad {
    980      1.1  haad 	struct lv_segment *seg;
    981      1.1  haad 	uint32_t s;
    982      1.1  haad 
    983      1.1  haad 	/* Check the segment params are compatible */
    984      1.1  haad 	dm_list_iterate_items(seg, &lv->segments) {
    985      1.1  haad 		if (!seg_is_mirrored(seg)) {
    986      1.1  haad 			log_error("Segment is not mirrored: %s:%" PRIu32,
    987      1.1  haad 				  lv->name, seg->le);
    988      1.1  haad 			return 0;
    989      1.1  haad 		} if ((seg->status & status_mask) != status_mask) {
    990      1.1  haad 			log_error("Segment status does not match: %s:%" PRIu32
    991      1.1  haad 				  " status:0x%x/0x%x", lv->name, seg->le,
    992      1.1  haad 				  seg->status, status_mask);
    993      1.1  haad 			return 0;
    994      1.1  haad 		}
    995      1.1  haad 	}
    996      1.1  haad 
    997      1.1  haad 	/* Convert the segments */
    998      1.1  haad 	dm_list_iterate_items(seg, &lv->segments) {
    999      1.1  haad 		if (!new_mirrors && seg->extents_copied == seg->area_len) {
   1000      1.1  haad 			if (!move_lv_segment_area(seg, 0, seg, 1))
   1001      1.1  haad 				return_0;
   1002      1.1  haad 		}
   1003      1.1  haad 
   1004      1.1  haad 		for (s = new_mirrors + 1; s < seg->area_count; s++)
   1005      1.1  haad 			release_lv_segment_area(seg, s, seg->area_len);
   1006      1.1  haad 
   1007      1.1  haad 		seg->area_count = new_mirrors + 1;
   1008      1.1  haad 
   1009      1.1  haad 		if (!new_mirrors)
   1010      1.1  haad 			seg->segtype = get_segtype_from_string(lv->vg->cmd,
   1011      1.1  haad 							       "striped");
   1012      1.1  haad 	}
   1013      1.1  haad 
   1014      1.1  haad 	return 1;
   1015      1.1  haad }
   1016      1.1  haad 
   1017      1.1  haad const char *get_pvmove_pvname_from_lv_mirr(struct logical_volume *lv_mirr)
   1018      1.1  haad {
   1019      1.1  haad 	struct lv_segment *seg;
   1020      1.1  haad 
   1021      1.1  haad 	dm_list_iterate_items(seg, &lv_mirr->segments) {
   1022      1.1  haad 		if (!seg_is_mirrored(seg))
   1023      1.1  haad 			continue;
   1024      1.1  haad 		if (seg_type(seg, 0) != AREA_PV)
   1025      1.1  haad 			continue;
   1026      1.1  haad 		return dev_name(seg_dev(seg, 0));
   1027      1.1  haad 	}
   1028      1.1  haad 
   1029      1.1  haad 	return NULL;
   1030      1.1  haad }
   1031      1.1  haad 
   1032      1.1  haad const char *get_pvmove_pvname_from_lv(struct logical_volume *lv)
   1033      1.1  haad {
   1034      1.1  haad 	struct lv_segment *seg;
   1035      1.1  haad 	uint32_t s;
   1036      1.1  haad 
   1037      1.1  haad 	dm_list_iterate_items(seg, &lv->segments) {
   1038      1.1  haad 		for (s = 0; s < seg->area_count; s++) {
   1039      1.1  haad 			if (seg_type(seg, s) != AREA_LV)
   1040      1.1  haad 				continue;
   1041      1.1  haad 			return get_pvmove_pvname_from_lv_mirr(seg_lv(seg, s));
   1042      1.1  haad 		}
   1043      1.1  haad 	}
   1044      1.1  haad 
   1045      1.1  haad 	return NULL;
   1046      1.1  haad }
   1047      1.1  haad 
   1048      1.1  haad struct logical_volume *find_pvmove_lv(struct volume_group *vg,
   1049      1.1  haad 				      struct device *dev,
   1050      1.1  haad 				      uint32_t lv_type)
   1051      1.1  haad {
   1052      1.1  haad 	struct lv_list *lvl;
   1053      1.1  haad 	struct logical_volume *lv;
   1054      1.1  haad 	struct lv_segment *seg;
   1055      1.1  haad 
   1056      1.1  haad 	/* Loop through all LVs */
   1057      1.1  haad 	dm_list_iterate_items(lvl, &vg->lvs) {
   1058      1.1  haad 		lv = lvl->lv;
   1059      1.1  haad 
   1060      1.1  haad 		if (!(lv->status & lv_type))
   1061      1.1  haad 			continue;
   1062      1.1  haad 
   1063      1.1  haad 		/* Check segment origins point to pvname */
   1064      1.1  haad 		dm_list_iterate_items(seg, &lv->segments) {
   1065      1.1  haad 			if (seg_type(seg, 0) != AREA_PV)
   1066      1.1  haad 				continue;
   1067      1.1  haad 			if (seg_dev(seg, 0) != dev)
   1068      1.1  haad 				continue;
   1069      1.1  haad 			return lv;
   1070      1.1  haad 		}
   1071      1.1  haad 	}
   1072      1.1  haad 
   1073      1.1  haad 	return NULL;
   1074      1.1  haad }
   1075      1.1  haad 
   1076      1.1  haad struct logical_volume *find_pvmove_lv_from_pvname(struct cmd_context *cmd,
   1077  1.1.1.3  haad 						  struct volume_group *vg,
   1078  1.1.1.3  haad 						  const char *name,
   1079  1.1.1.3  haad 						  const char *uuid __attribute((unused)),
   1080  1.1.1.3  haad 						  uint32_t lv_type)
   1081      1.1  haad {
   1082      1.1  haad 	struct physical_volume *pv;
   1083      1.1  haad 
   1084      1.1  haad 	if (!(pv = find_pv_by_name(cmd, name)))
   1085      1.1  haad 		return_NULL;
   1086      1.1  haad 
   1087      1.1  haad 	return find_pvmove_lv(vg, pv->dev, lv_type);
   1088      1.1  haad }
   1089      1.1  haad 
   1090      1.1  haad struct dm_list *lvs_using_lv(struct cmd_context *cmd, struct volume_group *vg,
   1091      1.1  haad 			  struct logical_volume *lv)
   1092      1.1  haad {
   1093      1.1  haad 	struct dm_list *lvs;
   1094      1.1  haad 	struct logical_volume *lv1;
   1095      1.1  haad 	struct lv_list *lvl, *lvl1;
   1096      1.1  haad 	struct lv_segment *seg;
   1097      1.1  haad 	uint32_t s;
   1098      1.1  haad 
   1099      1.1  haad 	if (!(lvs = dm_pool_alloc(cmd->mem, sizeof(*lvs)))) {
   1100      1.1  haad 		log_error("lvs list alloc failed");
   1101      1.1  haad 		return NULL;
   1102      1.1  haad 	}
   1103      1.1  haad 
   1104      1.1  haad 	dm_list_init(lvs);
   1105      1.1  haad 
   1106      1.1  haad 	/* Loop through all LVs except the one supplied */
   1107      1.1  haad 	dm_list_iterate_items(lvl1, &vg->lvs) {
   1108      1.1  haad 		lv1 = lvl1->lv;
   1109      1.1  haad 		if (lv1 == lv)
   1110      1.1  haad 			continue;
   1111      1.1  haad 
   1112      1.1  haad 		/* Find whether any segment points at the supplied LV */
   1113      1.1  haad 		dm_list_iterate_items(seg, &lv1->segments) {
   1114      1.1  haad 			for (s = 0; s < seg->area_count; s++) {
   1115      1.1  haad 				if (seg_type(seg, s) != AREA_LV ||
   1116      1.1  haad 				    seg_lv(seg, s) != lv)
   1117      1.1  haad 					continue;
   1118      1.1  haad 				if (!(lvl = dm_pool_alloc(cmd->mem, sizeof(*lvl)))) {
   1119      1.1  haad 					log_error("lv_list alloc failed");
   1120      1.1  haad 					return NULL;
   1121      1.1  haad 				}
   1122      1.1  haad 				lvl->lv = lv1;
   1123      1.1  haad 				dm_list_add(lvs, &lvl->list);
   1124      1.1  haad 				goto next_lv;
   1125      1.1  haad 			}
   1126      1.1  haad 		}
   1127      1.1  haad 	      next_lv:
   1128      1.1  haad 		;
   1129      1.1  haad 	}
   1130      1.1  haad 
   1131      1.1  haad 	return lvs;
   1132      1.1  haad }
   1133      1.1  haad 
   1134  1.1.1.3  haad float copy_percent(struct logical_volume *lv_mirr,
   1135  1.1.1.3  haad 		   percent_range_t *percent_range)
   1136      1.1  haad {
   1137      1.1  haad 	uint32_t numerator = 0u, denominator = 0u;
   1138      1.1  haad 	struct lv_segment *seg;
   1139      1.1  haad 
   1140      1.1  haad 	dm_list_iterate_items(seg, &lv_mirr->segments) {
   1141      1.1  haad 		denominator += seg->area_len;
   1142      1.1  haad 
   1143      1.1  haad 		if (seg_is_mirrored(seg) && seg->area_count > 1)
   1144      1.1  haad 			numerator += seg->extents_copied;
   1145      1.1  haad 		else
   1146      1.1  haad 			numerator += seg->area_len;
   1147      1.1  haad 	}
   1148      1.1  haad 
   1149  1.1.1.3  haad 	if (!denominator || (numerator == denominator))
   1150  1.1.1.3  haad 		*percent_range = PERCENT_100;
   1151  1.1.1.3  haad 	else if (numerator == 0)
   1152  1.1.1.3  haad 		*percent_range = PERCENT_0;
   1153  1.1.1.3  haad 	else
   1154  1.1.1.3  haad 		*percent_range = PERCENT_0_TO_100;
   1155  1.1.1.3  haad 
   1156      1.1  haad 	return denominator ? (float) numerator *100 / denominator : 100.0;
   1157      1.1  haad }
   1158      1.1  haad 
   1159      1.1  haad /*
   1160      1.1  haad  * Fixup mirror pointers after single-pass segment import
   1161      1.1  haad  */
   1162      1.1  haad int fixup_imported_mirrors(struct volume_group *vg)
   1163      1.1  haad {
   1164      1.1  haad 	struct lv_list *lvl;
   1165      1.1  haad 	struct lv_segment *seg;
   1166      1.1  haad 
   1167      1.1  haad 	dm_list_iterate_items(lvl, &vg->lvs) {
   1168      1.1  haad 		dm_list_iterate_items(seg, &lvl->lv->segments) {
   1169      1.1  haad 			if (seg->segtype !=
   1170      1.1  haad 			    get_segtype_from_string(vg->cmd, "mirror"))
   1171      1.1  haad 				continue;
   1172      1.1  haad 
   1173      1.1  haad 			if (seg->log_lv && !add_seg_to_segs_using_this_lv(seg->log_lv, seg))
   1174      1.1  haad 				return_0;
   1175      1.1  haad 		}
   1176      1.1  haad 	}
   1177      1.1  haad 
   1178      1.1  haad 	return 1;
   1179      1.1  haad }
   1180      1.1  haad 
   1181      1.1  haad /*
   1182      1.1  haad  * Add mirrors to "linear" or "mirror" segments
   1183      1.1  haad  */
   1184      1.1  haad int add_mirrors_to_segments(struct cmd_context *cmd, struct logical_volume *lv,
   1185      1.1  haad 			    uint32_t mirrors, uint32_t region_size,
   1186      1.1  haad 			    struct dm_list *allocatable_pvs, alloc_policy_t alloc)
   1187      1.1  haad {
   1188      1.1  haad 	struct alloc_handle *ah;
   1189      1.1  haad 	const struct segment_type *segtype;
   1190      1.1  haad 	struct dm_list *parallel_areas;
   1191      1.1  haad 	uint32_t adjusted_region_size;
   1192  1.1.1.3  haad 	int r = 1;
   1193      1.1  haad 
   1194      1.1  haad 	if (!(parallel_areas = build_parallel_areas_from_lv(cmd, lv)))
   1195      1.1  haad 		return_0;
   1196      1.1  haad 
   1197      1.1  haad 	if (!(segtype = get_segtype_from_string(cmd, "mirror")))
   1198      1.1  haad 		return_0;
   1199      1.1  haad 
   1200      1.1  haad 	adjusted_region_size = adjusted_mirror_region_size(lv->vg->extent_size,
   1201      1.1  haad 							   lv->le_count,
   1202      1.1  haad 							   region_size);
   1203      1.1  haad 
   1204  1.1.1.2  haad 	if (!(ah = allocate_extents(lv->vg, NULL, segtype, 1, mirrors, 0, 0,
   1205      1.1  haad 				    lv->le_count, allocatable_pvs, alloc,
   1206      1.1  haad 				    parallel_areas))) {
   1207      1.1  haad 		log_error("Unable to allocate mirror extents for %s.", lv->name);
   1208      1.1  haad 		return 0;
   1209      1.1  haad 	}
   1210      1.1  haad 
   1211      1.1  haad 	if (!lv_add_mirror_areas(ah, lv, 0, adjusted_region_size)) {
   1212      1.1  haad 		log_error("Failed to add mirror areas to %s", lv->name);
   1213  1.1.1.3  haad 		r = 0;
   1214      1.1  haad 	}
   1215      1.1  haad 
   1216  1.1.1.3  haad 	alloc_destroy(ah);
   1217  1.1.1.3  haad 	return r;
   1218      1.1  haad }
   1219      1.1  haad 
   1220      1.1  haad /*
   1221      1.1  haad  * Convert mirror log
   1222      1.1  haad  *
   1223      1.1  haad  * FIXME: Can't handle segment-by-segment mirror (like pvmove)
   1224      1.1  haad  */
   1225      1.1  haad int remove_mirror_log(struct cmd_context *cmd,
   1226      1.1  haad 		      struct logical_volume *lv,
   1227      1.1  haad 		      struct dm_list *removable_pvs)
   1228      1.1  haad {
   1229      1.1  haad 	float sync_percent;
   1230  1.1.1.3  haad 	percent_range_t percent_range = PERCENT_0;
   1231      1.1  haad 	struct lvinfo info;
   1232      1.1  haad 	struct volume_group *vg = lv->vg;
   1233      1.1  haad 
   1234      1.1  haad 	/* Unimplemented features */
   1235      1.1  haad 	if (dm_list_size(&lv->segments) != 1) {
   1236      1.1  haad 		log_error("Multiple-segment mirror is not supported");
   1237      1.1  haad 		return 0;
   1238      1.1  haad 	}
   1239      1.1  haad 
   1240      1.1  haad 	/* Had disk log, switch to core. */
   1241      1.1  haad 	if (lv_info(cmd, lv, &info, 0, 0) && info.exists) {
   1242  1.1.1.3  haad 		if (!lv_mirror_percent(cmd, lv, 0, &sync_percent,
   1243  1.1.1.3  haad 				       &percent_range, NULL)) {
   1244      1.1  haad 			log_error("Unable to determine mirror sync status.");
   1245      1.1  haad 			return 0;
   1246      1.1  haad 		}
   1247      1.1  haad 	} else if (vg_is_clustered(vg)) {
   1248  1.1.1.3  haad 		log_error("Unable to convert the log of an inactive "
   1249  1.1.1.3  haad 			  "cluster mirror, %s", lv->name);
   1250      1.1  haad 		return 0;
   1251      1.1  haad 	} else if (yes_no_prompt("Full resync required to convert "
   1252      1.1  haad 				 "inactive mirror %s to core log. "
   1253  1.1.1.3  haad 				 "Proceed? [y/n]: ") == 'y')
   1254      1.1  haad 		sync_percent = 0;
   1255      1.1  haad 	else
   1256      1.1  haad 		return 0;
   1257      1.1  haad 
   1258  1.1.1.3  haad 	if (percent_range == PERCENT_100)
   1259      1.1  haad 		init_mirror_in_sync(1);
   1260      1.1  haad 	else {
   1261      1.1  haad 		/* A full resync will take place */
   1262      1.1  haad 		lv->status &= ~MIRROR_NOTSYNCED;
   1263      1.1  haad 		init_mirror_in_sync(0);
   1264      1.1  haad 	}
   1265      1.1  haad 
   1266      1.1  haad 	if (!remove_mirror_images(lv, lv_mirror_count(lv),
   1267      1.1  haad 				  removable_pvs, 1U))
   1268      1.1  haad 		return_0;
   1269      1.1  haad 
   1270      1.1  haad 	return 1;
   1271      1.1  haad }
   1272      1.1  haad 
   1273      1.1  haad static struct logical_volume *_create_mirror_log(struct logical_volume *lv,
   1274      1.1  haad 						 struct alloc_handle *ah,
   1275      1.1  haad 						 alloc_policy_t alloc,
   1276      1.1  haad 						 const char *lv_name,
   1277      1.1  haad 						 const char *suffix)
   1278      1.1  haad {
   1279      1.1  haad 	struct logical_volume *log_lv;
   1280      1.1  haad 	char *log_name;
   1281      1.1  haad 	size_t len;
   1282      1.1  haad 
   1283      1.1  haad 	len = strlen(lv_name) + 32;
   1284      1.1  haad 	if (!(log_name = alloca(len))) {
   1285      1.1  haad 		log_error("log_name allocation failed.");
   1286      1.1  haad 		return NULL;
   1287      1.1  haad 	}
   1288      1.1  haad 
   1289      1.1  haad 	if (dm_snprintf(log_name, len, "%s%s", lv_name, suffix) < 0) {
   1290      1.1  haad 		log_error("log_name allocation failed.");
   1291      1.1  haad 		return NULL;
   1292      1.1  haad 	}
   1293      1.1  haad 
   1294      1.1  haad 	if (!(log_lv = lv_create_empty(log_name, NULL,
   1295      1.1  haad 				       VISIBLE_LV | LVM_READ | LVM_WRITE,
   1296  1.1.1.3  haad 				       alloc, lv->vg)))
   1297      1.1  haad 		return_NULL;
   1298      1.1  haad 
   1299      1.1  haad 	if (!lv_add_log_segment(ah, log_lv))
   1300      1.1  haad 		return_NULL;
   1301      1.1  haad 
   1302      1.1  haad 	return log_lv;
   1303      1.1  haad }
   1304      1.1  haad 
   1305      1.1  haad static struct logical_volume *_set_up_mirror_log(struct cmd_context *cmd,
   1306      1.1  haad 						 struct alloc_handle *ah,
   1307      1.1  haad 						 struct logical_volume *lv,
   1308      1.1  haad 						 uint32_t log_count,
   1309      1.1  haad 						 uint32_t region_size __attribute((unused)),
   1310      1.1  haad 						 alloc_policy_t alloc,
   1311      1.1  haad 						 int in_sync)
   1312      1.1  haad {
   1313      1.1  haad 	struct logical_volume *log_lv;
   1314      1.1  haad 	const char *suffix, *c;
   1315      1.1  haad 	char *lv_name;
   1316      1.1  haad 	size_t len;
   1317      1.1  haad 	struct lv_segment *seg;
   1318      1.1  haad 
   1319      1.1  haad 	init_mirror_in_sync(in_sync);
   1320      1.1  haad 
   1321      1.1  haad 	if (log_count != 1) {
   1322      1.1  haad 		log_error("log_count != 1 is not supported.");
   1323      1.1  haad 		return NULL;
   1324      1.1  haad 	}
   1325      1.1  haad 
   1326      1.1  haad 	/* Mirror log name is lv_name + suffix, determined as the following:
   1327      1.1  haad 	 *   1. suffix is:
   1328      1.1  haad 	 *        o "_mlog" for the original mirror LV.
   1329      1.1  haad 	 *        o "_mlogtmp_%d" for temporary mirror LV,
   1330      1.1  haad 	 *   2. lv_name is:
   1331      1.1  haad 	 *        o lv->name, if the log is temporary
   1332      1.1  haad 	 *        o otherwise, the top-level LV name
   1333      1.1  haad 	 */
   1334      1.1  haad 	seg = first_seg(lv);
   1335      1.1  haad 	if (seg_type(seg, 0) == AREA_LV &&
   1336      1.1  haad 	    strstr(seg_lv(seg, 0)->name, MIRROR_SYNC_LAYER)) {
   1337      1.1  haad 		lv_name = lv->name;
   1338      1.1  haad 		suffix = "_mlogtmp_%d";
   1339      1.1  haad 	} else if ((c = strstr(lv->name, MIRROR_SYNC_LAYER))) {
   1340      1.1  haad 		len = c - lv->name + 1;
   1341      1.1  haad 		if (!(lv_name = alloca(len)) ||
   1342      1.1  haad 		    !dm_snprintf(lv_name, len, "%s", lv->name)) {
   1343      1.1  haad 			log_error("mirror log name allocation failed");
   1344      1.1  haad 			return 0;
   1345      1.1  haad 		}
   1346      1.1  haad 		suffix = "_mlog";
   1347      1.1  haad 	} else {
   1348      1.1  haad 		lv_name = lv->name;
   1349      1.1  haad 		suffix = "_mlog";
   1350      1.1  haad 	}
   1351      1.1  haad 
   1352      1.1  haad 	if (!(log_lv = _create_mirror_log(lv, ah, alloc,
   1353      1.1  haad 					  (const char *) lv_name, suffix))) {
   1354      1.1  haad 		log_error("Failed to create mirror log.");
   1355      1.1  haad 		return NULL;
   1356      1.1  haad 	}
   1357      1.1  haad 
   1358      1.1  haad 	if (!_init_mirror_log(cmd, log_lv, in_sync, &lv->tags, 1)) {
   1359      1.1  haad 		log_error("Failed to create mirror log.");
   1360      1.1  haad 		return NULL;
   1361      1.1  haad 	}
   1362      1.1  haad 
   1363      1.1  haad 	return log_lv;
   1364      1.1  haad }
   1365      1.1  haad 
   1366      1.1  haad int attach_mirror_log(struct lv_segment *seg, struct logical_volume *log_lv)
   1367      1.1  haad {
   1368      1.1  haad 	seg->log_lv = log_lv;
   1369      1.1  haad 	log_lv->status |= MIRROR_LOG;
   1370  1.1.1.3  haad 	lv_set_hidden(log_lv);
   1371      1.1  haad 	return add_seg_to_segs_using_this_lv(log_lv, seg);
   1372      1.1  haad }
   1373      1.1  haad 
   1374      1.1  haad int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
   1375      1.1  haad 		   uint32_t log_count, uint32_t region_size,
   1376      1.1  haad 		   struct dm_list *allocatable_pvs, alloc_policy_t alloc)
   1377      1.1  haad {
   1378      1.1  haad 	struct alloc_handle *ah;
   1379      1.1  haad 	const struct segment_type *segtype;
   1380      1.1  haad 	struct dm_list *parallel_areas;
   1381      1.1  haad 	float sync_percent;
   1382  1.1.1.3  haad 	percent_range_t percent_range;
   1383      1.1  haad 	int in_sync;
   1384      1.1  haad 	struct logical_volume *log_lv;
   1385      1.1  haad 	struct lvinfo info;
   1386  1.1.1.3  haad 	int r = 0;
   1387      1.1  haad 
   1388      1.1  haad 	/* Unimplemented features */
   1389      1.1  haad 	if (log_count > 1) {
   1390      1.1  haad 		log_error("log_count > 1 is not supported");
   1391      1.1  haad 		return 0;
   1392      1.1  haad 	}
   1393      1.1  haad 
   1394      1.1  haad 	if (dm_list_size(&lv->segments) != 1) {
   1395      1.1  haad 		log_error("Multiple-segment mirror is not supported");
   1396      1.1  haad 		return 0;
   1397      1.1  haad 	}
   1398      1.1  haad 
   1399      1.1  haad 	/*
   1400      1.1  haad 	 * We are unable to convert the log of inactive cluster mirrors
   1401      1.1  haad 	 * due to the inability to detect whether the mirror is active
   1402      1.1  haad 	 * on remote nodes (even though it is inactive on this node)
   1403      1.1  haad 	 */
   1404      1.1  haad 	if (vg_is_clustered(lv->vg) &&
   1405      1.1  haad 	    !(lv_info(cmd, lv, &info, 0, 0) && info.exists)) {
   1406      1.1  haad 		log_error("Unable to convert the log of inactive "
   1407      1.1  haad 			  "cluster mirror %s", lv->name);
   1408      1.1  haad 		return 0;
   1409      1.1  haad 	}
   1410      1.1  haad 
   1411      1.1  haad 	if (!(parallel_areas = build_parallel_areas_from_lv(cmd, lv)))
   1412      1.1  haad 		return_0;
   1413      1.1  haad 
   1414      1.1  haad 	if (!(segtype = get_segtype_from_string(cmd, "mirror")))
   1415      1.1  haad 		return_0;
   1416      1.1  haad 
   1417      1.1  haad 	if (activation() && segtype->ops->target_present &&
   1418  1.1.1.3  haad 	    !segtype->ops->target_present(cmd, NULL, NULL)) {
   1419      1.1  haad 		log_error("%s: Required device-mapper target(s) not "
   1420      1.1  haad 			  "detected in your kernel", segtype->name);
   1421      1.1  haad 		return 0;
   1422      1.1  haad 	}
   1423      1.1  haad 
   1424      1.1  haad 	/* allocate destination extents */
   1425      1.1  haad 	ah = allocate_extents(lv->vg, NULL, segtype,
   1426  1.1.1.2  haad 			      0, 0, log_count, region_size, 0,
   1427      1.1  haad 			      allocatable_pvs, alloc, parallel_areas);
   1428      1.1  haad 	if (!ah) {
   1429      1.1  haad 		log_error("Unable to allocate extents for mirror log.");
   1430      1.1  haad 		return 0;
   1431      1.1  haad 	}
   1432      1.1  haad 
   1433      1.1  haad 	/* check sync status */
   1434  1.1.1.3  haad 	if (lv_mirror_percent(cmd, lv, 0, &sync_percent, &percent_range,
   1435  1.1.1.3  haad 			      NULL) &&
   1436  1.1.1.3  haad 	    (percent_range == PERCENT_100))
   1437      1.1  haad 		in_sync = 1;
   1438      1.1  haad 	else
   1439      1.1  haad 		in_sync = 0;
   1440      1.1  haad 
   1441      1.1  haad 	if (!(log_lv = _set_up_mirror_log(cmd, ah, lv, log_count,
   1442      1.1  haad 					  region_size, alloc, in_sync)))
   1443  1.1.1.3  haad 		goto_out;
   1444      1.1  haad 
   1445      1.1  haad 	if (!attach_mirror_log(first_seg(lv), log_lv))
   1446  1.1.1.3  haad 		goto_out;
   1447      1.1  haad 
   1448  1.1.1.3  haad 	r = 1;
   1449  1.1.1.3  haad out:
   1450      1.1  haad 	alloc_destroy(ah);
   1451  1.1.1.3  haad 	return r;
   1452      1.1  haad }
   1453      1.1  haad 
   1454      1.1  haad /*
   1455      1.1  haad  * Convert "linear" LV to "mirror".
   1456      1.1  haad  */
   1457      1.1  haad int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
   1458      1.1  haad 		      uint32_t mirrors, uint32_t stripes, uint32_t region_size,
   1459      1.1  haad 		      struct dm_list *allocatable_pvs, alloc_policy_t alloc,
   1460      1.1  haad 		      uint32_t log_count)
   1461      1.1  haad {
   1462      1.1  haad 	struct alloc_handle *ah;
   1463      1.1  haad 	const struct segment_type *segtype;
   1464      1.1  haad 	struct dm_list *parallel_areas;
   1465      1.1  haad 	struct logical_volume **img_lvs;
   1466      1.1  haad 	struct logical_volume *log_lv = NULL;
   1467      1.1  haad 
   1468      1.1  haad 	if (stripes > 1) {
   1469      1.1  haad 		log_error("stripes > 1 is not supported");
   1470      1.1  haad 		return 0;
   1471      1.1  haad 	}
   1472      1.1  haad 
   1473      1.1  haad 	/*
   1474      1.1  haad 	 * allocate destination extents
   1475      1.1  haad 	 */
   1476      1.1  haad 
   1477      1.1  haad 	if (!(parallel_areas = build_parallel_areas_from_lv(cmd, lv)))
   1478      1.1  haad 		return_0;
   1479      1.1  haad 
   1480      1.1  haad 	if (!(segtype = get_segtype_from_string(cmd, "mirror")))
   1481      1.1  haad 		return_0;
   1482      1.1  haad 
   1483      1.1  haad 	ah = allocate_extents(lv->vg, NULL, segtype,
   1484  1.1.1.2  haad 			      stripes, mirrors, log_count, region_size, lv->le_count,
   1485      1.1  haad 			      allocatable_pvs, alloc, parallel_areas);
   1486      1.1  haad 	if (!ah) {
   1487      1.1  haad 		log_error("Unable to allocate extents for mirror(s).");
   1488      1.1  haad 		return 0;
   1489      1.1  haad 	}
   1490      1.1  haad 
   1491      1.1  haad 	/*
   1492      1.1  haad 	 * create and initialize mirror log
   1493      1.1  haad 	 */
   1494      1.1  haad 	if (log_count &&
   1495      1.1  haad 	    !(log_lv = _set_up_mirror_log(cmd, ah, lv, log_count, region_size,
   1496  1.1.1.3  haad 					  alloc, mirror_in_sync()))) {
   1497  1.1.1.3  haad 		stack;
   1498  1.1.1.3  haad 		goto out_remove_images;
   1499  1.1.1.3  haad 	}
   1500      1.1  haad 
   1501      1.1  haad 	/* The log initialization involves vg metadata commit.
   1502      1.1  haad 	   So from here on, if failure occurs, the log must be explicitly
   1503      1.1  haad 	   removed and the updated vg metadata should be committed. */
   1504      1.1  haad 
   1505      1.1  haad 	/*
   1506      1.1  haad 	 * insert a mirror layer
   1507      1.1  haad 	 */
   1508      1.1  haad 	if (dm_list_size(&lv->segments) != 1 ||
   1509      1.1  haad 	    seg_type(first_seg(lv), 0) != AREA_LV)
   1510      1.1  haad 		if (!insert_layer_for_lv(cmd, lv, 0, "_mimage_%d"))
   1511      1.1  haad 			goto out_remove_log;
   1512      1.1  haad 
   1513      1.1  haad 	/*
   1514      1.1  haad 	 * create mirror image LVs
   1515      1.1  haad 	 */
   1516      1.1  haad 	if (!(img_lvs = alloca(sizeof(*img_lvs) * mirrors))) {
   1517      1.1  haad 		log_error("img_lvs allocation failed. "
   1518      1.1  haad 			  "Remove new LV and retry.");
   1519      1.1  haad 		goto out_remove_log;
   1520      1.1  haad 	}
   1521      1.1  haad 
   1522      1.1  haad 	if (!_create_mimage_lvs(ah, mirrors, lv, img_lvs))
   1523      1.1  haad 		goto out_remove_log;
   1524      1.1  haad 
   1525      1.1  haad 	if (!lv_add_mirror_lvs(lv, img_lvs, mirrors,
   1526      1.1  haad 			       MIRROR_IMAGE | (lv->status & LOCKED),
   1527      1.1  haad 			       region_size)) {
   1528      1.1  haad 		log_error("Aborting. Failed to add mirror segment. "
   1529      1.1  haad 			  "Remove new LV and retry.");
   1530  1.1.1.3  haad 		goto out_remove_images;
   1531      1.1  haad 	}
   1532      1.1  haad 
   1533      1.1  haad 	if (log_count && !attach_mirror_log(first_seg(lv), log_lv))
   1534      1.1  haad 		stack;
   1535      1.1  haad 
   1536      1.1  haad 	alloc_destroy(ah);
   1537      1.1  haad 	return 1;
   1538      1.1  haad 
   1539      1.1  haad   out_remove_log:
   1540  1.1.1.3  haad 	if (log_lv) {
   1541  1.1.1.3  haad 		if (!lv_remove(log_lv) ||
   1542  1.1.1.3  haad 		    !vg_write(log_lv->vg) ||
   1543  1.1.1.3  haad 		    !vg_commit(log_lv->vg))
   1544  1.1.1.3  haad 			log_error("Manual intervention may be required to remove "
   1545  1.1.1.3  haad 				  "abandoned log LV before retrying.");
   1546  1.1.1.3  haad 		else
   1547  1.1.1.3  haad 			backup(log_lv->vg);
   1548  1.1.1.3  haad 	}
   1549  1.1.1.3  haad   out_remove_images:
   1550  1.1.1.3  haad 	alloc_destroy(ah);
   1551      1.1  haad 	return 0;
   1552      1.1  haad }
   1553      1.1  haad 
   1554      1.1  haad /*
   1555      1.1  haad  * Generic interface for adding mirror and/or mirror log.
   1556      1.1  haad  * 'mirror' is the number of mirrors to be added.
   1557      1.1  haad  * 'pvs' is either allocatable pvs.
   1558      1.1  haad  */
   1559      1.1  haad int lv_add_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
   1560      1.1  haad 		   uint32_t mirrors, uint32_t stripes,
   1561      1.1  haad 		   uint32_t region_size, uint32_t log_count,
   1562      1.1  haad 		   struct dm_list *pvs, alloc_policy_t alloc, uint32_t flags)
   1563      1.1  haad {
   1564      1.1  haad 	if (!mirrors && !log_count) {
   1565      1.1  haad 		log_error("No conversion is requested");
   1566      1.1  haad 		return 0;
   1567      1.1  haad 	}
   1568      1.1  haad 
   1569      1.1  haad 	/* For corelog mirror, activation code depends on
   1570      1.1  haad 	 * the global mirror_in_sync status. As we are adding
   1571      1.1  haad 	 * a new mirror, it should be set as 'out-of-sync'
   1572      1.1  haad 	 * so that the sync starts. */
   1573      1.1  haad 	/* However, MIRROR_SKIP_INIT_SYNC even overrides it. */
   1574      1.1  haad 	if (flags & MIRROR_SKIP_INIT_SYNC)
   1575      1.1  haad 		init_mirror_in_sync(1);
   1576      1.1  haad 	else if (!log_count)
   1577      1.1  haad 		init_mirror_in_sync(0);
   1578      1.1  haad 
   1579      1.1  haad 	if (flags & MIRROR_BY_SEG) {
   1580      1.1  haad 		if (log_count) {
   1581      1.1  haad 			log_error("Persistent log is not supported on "
   1582      1.1  haad 				  "segment-by-segment mirroring");
   1583      1.1  haad 			return 0;
   1584      1.1  haad 		}
   1585      1.1  haad 		if (stripes > 1) {
   1586      1.1  haad 			log_error("Striped-mirroring is not supported on "
   1587      1.1  haad 				  "segment-by-segment mirroring");
   1588      1.1  haad 			return 0;
   1589      1.1  haad 		}
   1590      1.1  haad 
   1591      1.1  haad 		return add_mirrors_to_segments(cmd, lv, mirrors,
   1592      1.1  haad 					       region_size, pvs, alloc);
   1593      1.1  haad 	} else if (flags & MIRROR_BY_LV) {
   1594      1.1  haad 		if (!mirrors)
   1595      1.1  haad 			return add_mirror_log(cmd, lv, log_count,
   1596      1.1  haad 					      region_size, pvs, alloc);
   1597      1.1  haad 		return add_mirror_images(cmd, lv, mirrors,
   1598      1.1  haad 					 stripes, region_size,
   1599      1.1  haad 					 pvs, alloc, log_count);
   1600      1.1  haad 	}
   1601      1.1  haad 
   1602      1.1  haad 	log_error("Unsupported mirror conversion type");
   1603      1.1  haad 	return 0;
   1604      1.1  haad }
   1605      1.1  haad 
   1606      1.1  haad /*
   1607      1.1  haad  * Generic interface for removing mirror and/or mirror log.
   1608      1.1  haad  * 'mirror' is the number of mirrors to be removed.
   1609      1.1  haad  * 'pvs' is removable pvs.
   1610      1.1  haad  */
   1611      1.1  haad int lv_remove_mirrors(struct cmd_context *cmd __attribute((unused)),
   1612      1.1  haad 		      struct logical_volume *lv,
   1613      1.1  haad 		      uint32_t mirrors, uint32_t log_count, struct dm_list *pvs,
   1614      1.1  haad 		      uint32_t status_mask)
   1615      1.1  haad {
   1616      1.1  haad 	uint32_t new_mirrors;
   1617      1.1  haad 	struct lv_segment *seg;
   1618      1.1  haad 
   1619      1.1  haad 	if (!mirrors && !log_count) {
   1620      1.1  haad 		log_error("No conversion is requested");
   1621      1.1  haad 		return 0;
   1622      1.1  haad 	}
   1623      1.1  haad 
   1624      1.1  haad 	seg = first_seg(lv);
   1625      1.1  haad 	if (!seg_is_mirrored(seg)) {
   1626      1.1  haad 		log_error("Not a mirror segment");
   1627      1.1  haad 		return 0;
   1628      1.1  haad 	}
   1629      1.1  haad 
   1630      1.1  haad 	if (lv_mirror_count(lv) <= mirrors) {
   1631      1.1  haad 		log_error("Removing more than existing: %d <= %d",
   1632      1.1  haad 			  seg->area_count, mirrors);
   1633      1.1  haad 		return 0;
   1634      1.1  haad 	}
   1635      1.1  haad 	new_mirrors = lv_mirror_count(lv) - mirrors - 1;
   1636      1.1  haad 
   1637      1.1  haad 	/* MIRROR_BY_LV */
   1638      1.1  haad 	if (seg_type(seg, 0) == AREA_LV &&
   1639      1.1  haad 	    seg_lv(seg, 0)->status & MIRROR_IMAGE)
   1640      1.1  haad 		return remove_mirror_images(lv, new_mirrors + 1,
   1641      1.1  haad 					    pvs, log_count ? 1U : 0);
   1642      1.1  haad 
   1643      1.1  haad 	/* MIRROR_BY_SEG */
   1644      1.1  haad 	if (log_count) {
   1645      1.1  haad 		log_error("Persistent log is not supported on "
   1646      1.1  haad 			  "segment-by-segment mirroring");
   1647      1.1  haad 		return 0;
   1648      1.1  haad 	}
   1649      1.1  haad 	return remove_mirrors_from_segments(lv, new_mirrors, status_mask);
   1650      1.1  haad }
   1651      1.1  haad 
   1652