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