1 /* $NetBSD: lv_manip.c,v 1.4 2009/12/02 00:58:03 haad Exp $ */
2
3 /*
4 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
5 * Copyright (C) 2004-2007 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 "locking.h"
21 #include "pv_map.h"
22 #include "lvm-string.h"
23 #include "toolcontext.h"
24 #include "lv_alloc.h"
25 #include "pv_alloc.h"
26 #include "display.h"
27 #include "segtype.h"
28 #include "archiver.h"
29 #include "activate.h"
30 #include "str_list.h"
31
32 struct lv_names {
33 const char *old;
34 const char *new;
35 };
36
add_seg_to_segs_using_this_lv(struct logical_volume * lv,struct lv_segment * seg)37 int add_seg_to_segs_using_this_lv(struct logical_volume *lv,
38 struct lv_segment *seg)
39 {
40 struct seg_list *sl;
41
42 dm_list_iterate_items(sl, &lv->segs_using_this_lv) {
43 if (sl->seg == seg) {
44 sl->count++;
45 return 1;
46 }
47 }
48
49 log_very_verbose("Adding %s:%" PRIu32 " as an user of %s",
50 seg->lv->name, seg->le, lv->name);
51
52 if (!(sl = dm_pool_zalloc(lv->vg->cmd->mem, sizeof(*sl)))) {
53 log_error("Failed to allocate segment list");
54 return 0;
55 }
56
57 sl->count = 1;
58 sl->seg = seg;
59 dm_list_add(&lv->segs_using_this_lv, &sl->list);
60
61 return 1;
62 }
63
remove_seg_from_segs_using_this_lv(struct logical_volume * lv,struct lv_segment * seg)64 int remove_seg_from_segs_using_this_lv(struct logical_volume *lv,
65 struct lv_segment *seg)
66 {
67 struct seg_list *sl;
68
69 dm_list_iterate_items(sl, &lv->segs_using_this_lv) {
70 if (sl->seg != seg)
71 continue;
72 if (sl->count > 1)
73 sl->count--;
74 else {
75 log_very_verbose("%s:%" PRIu32 " is no longer a user "
76 "of %s", seg->lv->name, seg->le,
77 lv->name);
78 dm_list_del(&sl->list);
79 }
80 return 1;
81 }
82
83 return 0;
84 }
85
86 /*
87 * This is a function specialized for the common case where there is
88 * only one segment which uses the LV.
89 * e.g. the LV is a layer inserted by insert_layer_for_lv().
90 *
91 * In general, walk through lv->segs_using_this_lv.
92 */
get_only_segment_using_this_lv(struct logical_volume * lv)93 struct lv_segment *get_only_segment_using_this_lv(struct logical_volume *lv)
94 {
95 struct seg_list *sl;
96
97 if (dm_list_size(&lv->segs_using_this_lv) != 1) {
98 log_error("%s is expected to have only one segment using it, "
99 "while it has %d", lv->name,
100 dm_list_size(&lv->segs_using_this_lv));
101 return NULL;
102 }
103
104 sl = dm_list_item(dm_list_first(&lv->segs_using_this_lv), struct seg_list);
105
106 if (sl->count != 1) {
107 log_error("%s is expected to have only one segment using it, "
108 "while %s:%" PRIu32 " uses it %d times",
109 lv->name, sl->seg->lv->name, sl->seg->le, sl->count);
110 return NULL;
111 }
112
113 return sl->seg;
114 }
115
116 /*
117 * PVs used by a segment of an LV
118 */
119 struct seg_pvs {
120 struct dm_list list;
121
122 struct dm_list pvs; /* struct pv_list */
123
124 uint32_t le;
125 uint32_t len;
126 };
127
_find_seg_pvs_by_le(struct dm_list * list,uint32_t le)128 static struct seg_pvs *_find_seg_pvs_by_le(struct dm_list *list, uint32_t le)
129 {
130 struct seg_pvs *spvs;
131
132 dm_list_iterate_items(spvs, list)
133 if (le >= spvs->le && le < spvs->le + spvs->len)
134 return spvs;
135
136 return NULL;
137 }
138
139 /*
140 * Find first unused LV number.
141 */
find_free_lvnum(struct logical_volume * lv)142 uint32_t find_free_lvnum(struct logical_volume *lv)
143 {
144 int lvnum_used[MAX_RESTRICTED_LVS + 1];
145 uint32_t i = 0;
146 struct lv_list *lvl;
147 int lvnum;
148
149 memset(&lvnum_used, 0, sizeof(lvnum_used));
150
151 dm_list_iterate_items(lvl, &lv->vg->lvs) {
152 lvnum = lvnum_from_lvid(&lvl->lv->lvid);
153 if (lvnum <= MAX_RESTRICTED_LVS)
154 lvnum_used[lvnum] = 1;
155 }
156
157 while (lvnum_used[i])
158 i++;
159
160 /* FIXME What if none are free? */
161
162 return i;
163 }
164
165 /*
166 * All lv_segments get created here.
167 */
alloc_lv_segment(struct dm_pool * mem,const struct segment_type * segtype,struct logical_volume * lv,uint32_t le,uint32_t len,uint32_t status,uint32_t stripe_size,struct logical_volume * log_lv,uint32_t area_count,uint32_t area_len,uint32_t chunk_size,uint32_t region_size,uint32_t extents_copied)168 struct lv_segment *alloc_lv_segment(struct dm_pool *mem,
169 const struct segment_type *segtype,
170 struct logical_volume *lv,
171 uint32_t le, uint32_t len,
172 uint32_t status,
173 uint32_t stripe_size,
174 struct logical_volume *log_lv,
175 uint32_t area_count,
176 uint32_t area_len,
177 uint32_t chunk_size,
178 uint32_t region_size,
179 uint32_t extents_copied)
180 {
181 struct lv_segment *seg;
182 uint32_t areas_sz = area_count * sizeof(*seg->areas);
183
184 if (!(seg = dm_pool_zalloc(mem, sizeof(*seg))))
185 return_NULL;
186
187 if (!(seg->areas = dm_pool_zalloc(mem, areas_sz))) {
188 dm_pool_free(mem, seg);
189 return_NULL;
190 }
191
192 if (!segtype) {
193 log_error("alloc_lv_segment: Missing segtype.");
194 return NULL;
195 }
196
197 seg->segtype = segtype;
198 seg->lv = lv;
199 seg->le = le;
200 seg->len = len;
201 seg->status = status;
202 seg->stripe_size = stripe_size;
203 seg->area_count = area_count;
204 seg->area_len = area_len;
205 seg->chunk_size = chunk_size;
206 seg->region_size = region_size;
207 seg->extents_copied = extents_copied;
208 seg->log_lv = log_lv;
209 dm_list_init(&seg->tags);
210
211 if (log_lv && !attach_mirror_log(seg, log_lv))
212 return_NULL;
213
214 return seg;
215 }
216
alloc_snapshot_seg(struct logical_volume * lv,uint32_t status,uint32_t old_le_count)217 struct lv_segment *alloc_snapshot_seg(struct logical_volume *lv,
218 uint32_t status, uint32_t old_le_count)
219 {
220 struct lv_segment *seg;
221 const struct segment_type *segtype;
222
223 segtype = get_segtype_from_string(lv->vg->cmd, "snapshot");
224 if (!segtype) {
225 log_error("Failed to find snapshot segtype");
226 return NULL;
227 }
228
229 if (!(seg = alloc_lv_segment(lv->vg->cmd->mem, segtype, lv, old_le_count,
230 lv->le_count - old_le_count, status, 0,
231 NULL, 0, lv->le_count - old_le_count,
232 0, 0, 0))) {
233 log_error("Couldn't allocate new snapshot segment.");
234 return NULL;
235 }
236
237 dm_list_add(&lv->segments, &seg->list);
238 lv->status |= VIRTUAL;
239
240 return seg;
241 }
242
release_lv_segment_area(struct lv_segment * seg,uint32_t s,uint32_t area_reduction)243 void release_lv_segment_area(struct lv_segment *seg, uint32_t s,
244 uint32_t area_reduction)
245 {
246 if (seg_type(seg, s) == AREA_UNASSIGNED)
247 return;
248
249 if (seg_type(seg, s) == AREA_PV) {
250 if (release_pv_segment(seg_pvseg(seg, s), area_reduction) &&
251 seg->area_len == area_reduction)
252 seg_type(seg, s) = AREA_UNASSIGNED;
253 return;
254 }
255
256 if (seg_lv(seg, s)->status & MIRROR_IMAGE) {
257 lv_reduce(seg_lv(seg, s), area_reduction);
258 return;
259 }
260
261 if (area_reduction == seg->area_len) {
262 log_very_verbose("Remove %s:%" PRIu32 "[%" PRIu32 "] from "
263 "the top of LV %s:%" PRIu32,
264 seg->lv->name, seg->le, s,
265 seg_lv(seg, s)->name, seg_le(seg, s));
266
267 remove_seg_from_segs_using_this_lv(seg_lv(seg, s), seg);
268 seg_lv(seg, s) = NULL;
269 seg_le(seg, s) = 0;
270 seg_type(seg, s) = AREA_UNASSIGNED;
271 }
272 }
273
274 /*
275 * Move a segment area from one segment to another
276 */
move_lv_segment_area(struct lv_segment * seg_to,uint32_t area_to,struct lv_segment * seg_from,uint32_t area_from)277 int move_lv_segment_area(struct lv_segment *seg_to, uint32_t area_to,
278 struct lv_segment *seg_from, uint32_t area_from)
279 {
280 struct physical_volume *pv;
281 struct logical_volume *lv;
282 uint32_t pe, le;
283
284 switch (seg_type(seg_from, area_from)) {
285 case AREA_PV:
286 pv = seg_pv(seg_from, area_from);
287 pe = seg_pe(seg_from, area_from);
288
289 release_lv_segment_area(seg_from, area_from,
290 seg_from->area_len);
291 release_lv_segment_area(seg_to, area_to, seg_to->area_len);
292
293 if (!set_lv_segment_area_pv(seg_to, area_to, pv, pe))
294 return_0;
295
296 break;
297
298 case AREA_LV:
299 lv = seg_lv(seg_from, area_from);
300 le = seg_le(seg_from, area_from);
301
302 release_lv_segment_area(seg_from, area_from,
303 seg_from->area_len);
304 release_lv_segment_area(seg_to, area_to, seg_to->area_len);
305
306 if (!set_lv_segment_area_lv(seg_to, area_to, lv, le, 0))
307 return_0;
308
309 break;
310
311 case AREA_UNASSIGNED:
312 release_lv_segment_area(seg_to, area_to, seg_to->area_len);
313 }
314
315 return 1;
316 }
317
318 /*
319 * Link part of a PV to an LV segment.
320 */
set_lv_segment_area_pv(struct lv_segment * seg,uint32_t area_num,struct physical_volume * pv,uint32_t pe)321 int set_lv_segment_area_pv(struct lv_segment *seg, uint32_t area_num,
322 struct physical_volume *pv, uint32_t pe)
323 {
324 seg->areas[area_num].type = AREA_PV;
325
326 if (!(seg_pvseg(seg, area_num) =
327 assign_peg_to_lvseg(pv, pe, seg->area_len, seg, area_num)))
328 return_0;
329
330 return 1;
331 }
332
333 /*
334 * Link one LV segment to another. Assumes sizes already match.
335 */
set_lv_segment_area_lv(struct lv_segment * seg,uint32_t area_num,struct logical_volume * lv,uint32_t le,uint32_t flags)336 int set_lv_segment_area_lv(struct lv_segment *seg, uint32_t area_num,
337 struct logical_volume *lv, uint32_t le,
338 uint32_t flags)
339 {
340 log_very_verbose("Stack %s:%" PRIu32 "[%" PRIu32 "] on LV %s:%" PRIu32,
341 seg->lv->name, seg->le, area_num, lv->name, le);
342
343 seg->areas[area_num].type = AREA_LV;
344 seg_lv(seg, area_num) = lv;
345 seg_le(seg, area_num) = le;
346 lv->status |= flags;
347
348 if (!add_seg_to_segs_using_this_lv(lv, seg))
349 return_0;
350
351 return 1;
352 }
353
354 /*
355 * Prepare for adding parallel areas to an existing segment.
356 */
_lv_segment_add_areas(struct logical_volume * lv,struct lv_segment * seg,uint32_t new_area_count)357 static int _lv_segment_add_areas(struct logical_volume *lv,
358 struct lv_segment *seg,
359 uint32_t new_area_count)
360 {
361 struct lv_segment_area *newareas;
362 uint32_t areas_sz = new_area_count * sizeof(*newareas);
363
364 if (!(newareas = dm_pool_zalloc(lv->vg->cmd->mem, areas_sz)))
365 return_0;
366
367 memcpy(newareas, seg->areas, seg->area_count * sizeof(*seg->areas));
368
369 seg->areas = newareas;
370 seg->area_count = new_area_count;
371
372 return 1;
373 }
374
375 /*
376 * Reduce the size of an lv_segment. New size can be zero.
377 */
_lv_segment_reduce(struct lv_segment * seg,uint32_t reduction)378 static int _lv_segment_reduce(struct lv_segment *seg, uint32_t reduction)
379 {
380 uint32_t area_reduction, s;
381
382 /* Caller must ensure exact divisibility */
383 if (seg_is_striped(seg)) {
384 if (reduction % seg->area_count) {
385 log_error("Segment extent reduction %" PRIu32
386 "not divisible by #stripes %" PRIu32,
387 reduction, seg->area_count);
388 return 0;
389 }
390 area_reduction = (reduction / seg->area_count);
391 } else
392 area_reduction = reduction;
393
394 for (s = 0; s < seg->area_count; s++)
395 release_lv_segment_area(seg, s, area_reduction);
396
397 seg->len -= reduction;
398 seg->area_len -= area_reduction;
399
400 return 1;
401 }
402
403 /*
404 * Entry point for all LV reductions in size.
405 */
_lv_reduce(struct logical_volume * lv,uint32_t extents,int delete)406 static int _lv_reduce(struct logical_volume *lv, uint32_t extents, int delete)
407 {
408 struct lv_segment *seg;
409 uint32_t count = extents;
410 uint32_t reduction;
411
412 dm_list_iterate_back_items(seg, &lv->segments) {
413 if (!count)
414 break;
415
416 if (seg->len <= count) {
417 /* remove this segment completely */
418 /* FIXME Check this is safe */
419 if (seg->log_lv && !lv_remove(seg->log_lv))
420 return_0;
421 dm_list_del(&seg->list);
422 reduction = seg->len;
423 } else
424 reduction = count;
425
426 if (!_lv_segment_reduce(seg, reduction))
427 return_0;
428 count -= reduction;
429 }
430
431 lv->le_count -= extents;
432 lv->size = (uint64_t) lv->le_count * lv->vg->extent_size;
433
434 if (!delete)
435 return 1;
436
437 /* Remove the LV if it is now empty */
438 if (!lv->le_count && !unlink_lv_from_vg(lv))
439 return_0;
440 else if (lv->vg->fid->fmt->ops->lv_setup &&
441 !lv->vg->fid->fmt->ops->lv_setup(lv->vg->fid, lv))
442 return_0;
443
444 return 1;
445 }
446
447 /*
448 * Empty an LV.
449 */
lv_empty(struct logical_volume * lv)450 int lv_empty(struct logical_volume *lv)
451 {
452 return _lv_reduce(lv, lv->le_count, 0);
453 }
454
455 /*
456 * Empty an LV and add error segment.
457 */
replace_lv_with_error_segment(struct logical_volume * lv)458 int replace_lv_with_error_segment(struct logical_volume *lv)
459 {
460 uint32_t len = lv->le_count;
461
462 if (!lv_empty(lv))
463 return_0;
464
465 if (!lv_add_virtual_segment(lv, 0, len,
466 get_segtype_from_string(lv->vg->cmd,
467 "error")))
468 return_0;
469
470 return 1;
471 }
472
473 /*
474 * Remove given number of extents from LV.
475 */
lv_reduce(struct logical_volume * lv,uint32_t extents)476 int lv_reduce(struct logical_volume *lv, uint32_t extents)
477 {
478 return _lv_reduce(lv, extents, 1);
479 }
480
481 /*
482 * Completely remove an LV.
483 */
lv_remove(struct logical_volume * lv)484 int lv_remove(struct logical_volume *lv)
485 {
486
487 if (!lv_reduce(lv, lv->le_count))
488 return_0;
489
490 return 1;
491 }
492
493 /*
494 * A set of contiguous physical extents allocated
495 */
496 struct alloced_area {
497 struct dm_list list;
498
499 struct physical_volume *pv;
500 uint32_t pe;
501 uint32_t len;
502 };
503
504 /*
505 * Details of an allocation attempt
506 */
507 struct alloc_handle {
508 struct cmd_context *cmd;
509 struct dm_pool *mem;
510
511 alloc_policy_t alloc; /* Overall policy */
512 uint32_t area_count; /* Number of parallel areas */
513 uint32_t area_multiple; /* seg->len = area_len * area_multiple */
514 uint32_t log_count; /* Number of parallel 1-extent logs */
515 uint32_t log_region_size; /* region size for log device */
516 uint32_t total_area_len; /* Total number of parallel extents */
517
518 struct dm_list *parallel_areas; /* PVs to avoid */
519
520 struct alloced_area log_area; /* Extent used for log */
521 struct dm_list alloced_areas[0]; /* Lists of areas in each stripe */
522 };
523
calc_area_multiple(const struct segment_type * segtype,const uint32_t area_count)524 static uint32_t calc_area_multiple(const struct segment_type *segtype,
525 const uint32_t area_count)
526 {
527 if (!segtype_is_striped(segtype) || !area_count)
528 return 1;
529
530 return area_count;
531 }
532
533 /*
534 * Preparation for a specific allocation attempt
535 */
_alloc_init(struct cmd_context * cmd,struct dm_pool * mem,const struct segment_type * segtype,alloc_policy_t alloc,uint32_t mirrors,uint32_t stripes,uint32_t log_count,uint32_t log_region_size,struct dm_list * parallel_areas)536 static struct alloc_handle *_alloc_init(struct cmd_context *cmd,
537 struct dm_pool *mem,
538 const struct segment_type *segtype,
539 alloc_policy_t alloc,
540 uint32_t mirrors,
541 uint32_t stripes,
542 uint32_t log_count,
543 uint32_t log_region_size,
544 struct dm_list *parallel_areas)
545 {
546 struct alloc_handle *ah;
547 uint32_t s, area_count;
548
549 if (stripes > 1 && mirrors > 1) {
550 log_error("Striped mirrors are not supported yet");
551 return NULL;
552 }
553
554 if (log_count && stripes > 1) {
555 log_error("Can't mix striping with a mirror log yet.");
556 return NULL;
557 }
558
559 if (segtype_is_virtual(segtype))
560 area_count = 0;
561 else if (mirrors > 1)
562 area_count = mirrors;
563 else
564 area_count = stripes;
565
566 if (!(ah = dm_pool_zalloc(mem, sizeof(*ah) + sizeof(ah->alloced_areas[0]) * area_count))) {
567 log_error("allocation handle allocation failed");
568 return NULL;
569 }
570
571 if (segtype_is_virtual(segtype))
572 return ah;
573
574 ah->cmd = cmd;
575
576 if (!(ah->mem = dm_pool_create("allocation", 1024))) {
577 log_error("allocation pool creation failed");
578 return NULL;
579 }
580
581 ah->area_count = area_count;
582 ah->log_count = log_count;
583 ah->log_region_size = log_region_size;
584 ah->alloc = alloc;
585 ah->area_multiple = calc_area_multiple(segtype, area_count);
586
587 for (s = 0; s < ah->area_count; s++)
588 dm_list_init(&ah->alloced_areas[s]);
589
590 ah->parallel_areas = parallel_areas;
591
592 return ah;
593 }
594
alloc_destroy(struct alloc_handle * ah)595 void alloc_destroy(struct alloc_handle *ah)
596 {
597 if (ah->mem)
598 dm_pool_destroy(ah->mem);
599 }
600
_log_parallel_areas(struct dm_pool * mem,struct dm_list * parallel_areas)601 static int _log_parallel_areas(struct dm_pool *mem, struct dm_list *parallel_areas)
602 {
603 struct seg_pvs *spvs;
604 struct pv_list *pvl;
605 char *pvnames;
606
607 if (!parallel_areas)
608 return 1;
609
610 dm_list_iterate_items(spvs, parallel_areas) {
611 if (!dm_pool_begin_object(mem, 256)) {
612 log_error("dm_pool_begin_object failed");
613 return 0;
614 }
615
616 dm_list_iterate_items(pvl, &spvs->pvs) {
617 if (!dm_pool_grow_object(mem, pv_dev_name(pvl->pv), strlen(pv_dev_name(pvl->pv)))) {
618 log_error("dm_pool_grow_object failed");
619 dm_pool_abandon_object(mem);
620 return 0;
621 }
622 if (!dm_pool_grow_object(mem, " ", 1)) {
623 log_error("dm_pool_grow_object failed");
624 dm_pool_abandon_object(mem);
625 return 0;
626 }
627 }
628
629 if (!dm_pool_grow_object(mem, "\0", 1)) {
630 log_error("dm_pool_grow_object failed");
631 dm_pool_abandon_object(mem);
632 return 0;
633 }
634
635 pvnames = dm_pool_end_object(mem);
636 log_debug("Parallel PVs at LE %" PRIu32 " length %" PRIu32 ": %s",
637 spvs->le, spvs->len, pvnames);
638 dm_pool_free(mem, pvnames);
639 }
640
641 return 1;
642 }
643
_setup_alloced_segment(struct logical_volume * lv,uint32_t status,uint32_t area_count,uint32_t stripe_size,const struct segment_type * segtype,struct alloced_area * aa,uint32_t region_size,struct logical_volume * log_lv __attribute ((unused)))644 static int _setup_alloced_segment(struct logical_volume *lv, uint32_t status,
645 uint32_t area_count,
646 uint32_t stripe_size,
647 const struct segment_type *segtype,
648 struct alloced_area *aa,
649 uint32_t region_size,
650 struct logical_volume *log_lv __attribute((unused)))
651 {
652 uint32_t s, extents, area_multiple;
653 struct lv_segment *seg;
654
655 area_multiple = calc_area_multiple(segtype, area_count);
656
657 /* log_lv gets set up elsehere */
658 if (!(seg = alloc_lv_segment(lv->vg->cmd->mem, segtype, lv,
659 lv->le_count,
660 aa[0].len * area_multiple,
661 status, stripe_size, NULL,
662 area_count,
663 aa[0].len, 0u, region_size, 0u))) {
664 log_error("Couldn't allocate new LV segment.");
665 return 0;
666 }
667
668 for (s = 0; s < area_count; s++)
669 if (!set_lv_segment_area_pv(seg, s, aa[s].pv, aa[s].pe))
670 return_0;
671
672 dm_list_add(&lv->segments, &seg->list);
673
674 extents = aa[0].len * area_multiple;
675 lv->le_count += extents;
676 lv->size += (uint64_t) extents *lv->vg->extent_size;
677
678 if (segtype_is_mirrored(segtype))
679 lv->status |= MIRRORED;
680
681 return 1;
682 }
683
_setup_alloced_segments(struct logical_volume * lv,struct dm_list * alloced_areas,uint32_t area_count,uint32_t status,uint32_t stripe_size,const struct segment_type * segtype,uint32_t region_size,struct logical_volume * log_lv)684 static int _setup_alloced_segments(struct logical_volume *lv,
685 struct dm_list *alloced_areas,
686 uint32_t area_count,
687 uint32_t status,
688 uint32_t stripe_size,
689 const struct segment_type *segtype,
690 uint32_t region_size,
691 struct logical_volume *log_lv)
692 {
693 struct alloced_area *aa;
694
695 dm_list_iterate_items(aa, &alloced_areas[0]) {
696 if (!_setup_alloced_segment(lv, status, area_count,
697 stripe_size, segtype, aa,
698 region_size, log_lv))
699 return_0;
700 }
701
702 return 1;
703 }
704
705 /*
706 * Returns log device size in extents, algorithm from kernel code
707 */
708 #define BYTE_SHIFT 3
mirror_log_extents(uint32_t region_size,uint32_t pe_size,uint32_t area_len)709 static uint32_t mirror_log_extents(uint32_t region_size, uint32_t pe_size, uint32_t area_len)
710 {
711 size_t area_size, bitset_size, log_size, region_count;
712
713 area_size = area_len * pe_size;
714 region_count = dm_div_up(area_size, region_size);
715
716 /* Work out how many "unsigned long"s we need to hold the bitset. */
717 bitset_size = dm_round_up(region_count, sizeof(uint32_t) << BYTE_SHIFT);
718 bitset_size >>= BYTE_SHIFT;
719
720 /* Log device holds both header and bitset. */
721 log_size = dm_round_up((MIRROR_LOG_OFFSET << SECTOR_SHIFT) + bitset_size, 1 << SECTOR_SHIFT);
722 log_size >>= SECTOR_SHIFT;
723
724 return dm_div_up(log_size, pe_size);
725 }
726
727 /*
728 * This function takes a list of pv_areas and adds them to allocated_areas.
729 * If the complete area is not needed then it gets split.
730 * The part used is removed from the pv_map so it can't be allocated twice.
731 */
_alloc_parallel_area(struct alloc_handle * ah,uint32_t needed,struct pv_area ** areas,uint32_t * ix,struct pv_area * log_area,uint32_t log_len)732 static int _alloc_parallel_area(struct alloc_handle *ah, uint32_t needed,
733 struct pv_area **areas,
734 uint32_t *ix, struct pv_area *log_area,
735 uint32_t log_len)
736 {
737 uint32_t area_len, remaining;
738 uint32_t s;
739 struct alloced_area *aa;
740
741 remaining = needed - *ix;
742 area_len = remaining / ah->area_multiple;
743
744 /* Reduce area_len to the smallest of the areas */
745 for (s = 0; s < ah->area_count; s++)
746 if (area_len > areas[s]->count)
747 area_len = areas[s]->count;
748
749 if (!(aa = dm_pool_alloc(ah->mem, sizeof(*aa) *
750 (ah->area_count + (log_area ? 1 : 0))))) {
751 log_error("alloced_area allocation failed");
752 return 0;
753 }
754
755 for (s = 0; s < ah->area_count; s++) {
756 aa[s].pv = areas[s]->map->pv;
757 aa[s].pe = areas[s]->start;
758 aa[s].len = area_len;
759 dm_list_add(&ah->alloced_areas[s], &aa[s].list);
760 }
761
762 ah->total_area_len += area_len;
763
764 for (s = 0; s < ah->area_count; s++)
765 consume_pv_area(areas[s], area_len);
766
767 if (log_area) {
768 ah->log_area.pv = log_area->map->pv;
769 ah->log_area.pe = log_area->start;
770 ah->log_area.len = log_len;
771 consume_pv_area(log_area, ah->log_area.len);
772 }
773
774 *ix += area_len * ah->area_multiple;
775
776 return 1;
777 }
778
779 /*
780 * Call fn for each AREA_PV used by the LV segment at lv:le of length *max_seg_len.
781 * If any constituent area contains more than one segment, max_seg_len is
782 * reduced to cover only the first.
783 * fn should return 0 on error, 1 to continue scanning or >1 to terminate without error.
784 * In the last case, this function passes on the return code.
785 */
_for_each_pv(struct cmd_context * cmd,struct logical_volume * lv,uint32_t le,uint32_t len,uint32_t * max_seg_len,uint32_t first_area,uint32_t max_areas,int top_level_area_index,int only_single_area_segments,int (* fn)(struct cmd_context * cmd,struct pv_segment * peg,uint32_t s,void * data),void * data)786 static int _for_each_pv(struct cmd_context *cmd, struct logical_volume *lv,
787 uint32_t le, uint32_t len, uint32_t *max_seg_len,
788 uint32_t first_area, uint32_t max_areas,
789 int top_level_area_index,
790 int only_single_area_segments,
791 int (*fn)(struct cmd_context *cmd,
792 struct pv_segment *peg, uint32_t s,
793 void *data),
794 void *data)
795 {
796 struct lv_segment *seg;
797 uint32_t s;
798 uint32_t remaining_seg_len, area_len, area_multiple;
799 int r = 1;
800
801 if (!(seg = find_seg_by_le(lv, le))) {
802 log_error("Failed to find segment for %s extent %" PRIu32,
803 lv->name, le);
804 return 0;
805 }
806
807 /* Remaining logical length of segment */
808 remaining_seg_len = seg->len - (le - seg->le);
809
810 if (remaining_seg_len > len)
811 remaining_seg_len = len;
812
813 if (max_seg_len && *max_seg_len > remaining_seg_len)
814 *max_seg_len = remaining_seg_len;
815
816 area_multiple = calc_area_multiple(seg->segtype, seg->area_count);
817 area_len = remaining_seg_len / area_multiple ? : 1;
818
819 for (s = first_area;
820 s < seg->area_count && (!max_areas || s <= max_areas);
821 s++) {
822 if (seg_type(seg, s) == AREA_LV) {
823 if (!(r = _for_each_pv(cmd, seg_lv(seg, s),
824 seg_le(seg, s) +
825 (le - seg->le) / area_multiple,
826 area_len, max_seg_len,
827 only_single_area_segments ? 0 : 0,
828 only_single_area_segments ? 1U : 0U,
829 top_level_area_index != -1 ? top_level_area_index : (int) s,
830 only_single_area_segments, fn,
831 data)))
832 stack;
833 } else if (seg_type(seg, s) == AREA_PV)
834 if (!(r = fn(cmd, seg_pvseg(seg, s), top_level_area_index != -1 ? (uint32_t) top_level_area_index : s, data)))
835 stack;
836 if (r != 1)
837 return r;
838 }
839
840 /* FIXME only_single_area_segments used as workaround to skip log LV - needs new param? */
841 if (!only_single_area_segments && seg_is_mirrored(seg) && seg->log_lv) {
842 if (!(r = _for_each_pv(cmd, seg->log_lv, 0, seg->log_lv->le_count,
843 NULL, 0, 0, 0, only_single_area_segments,
844 fn, data)))
845 stack;
846 if (r != 1)
847 return r;
848 }
849
850 /* FIXME Add snapshot cow LVs etc. */
851
852 return 1;
853 }
854
_comp_area(const void * l,const void * r)855 static int _comp_area(const void *l, const void *r)
856 {
857 const struct pv_area *lhs = *((const struct pv_area **) l);
858 const struct pv_area *rhs = *((const struct pv_area **) r);
859
860 if (lhs->count < rhs->count)
861 return 1;
862
863 else if (lhs->count > rhs->count)
864 return -1;
865
866 return 0;
867 }
868
869 /*
870 * Search for pvseg that matches condition
871 */
872 struct pv_match {
873 int (*condition)(struct pv_segment *pvseg, struct pv_area *pva);
874
875 struct pv_area **areas;
876 struct pv_area *pva;
877 uint32_t areas_size;
878 int s; /* Area index of match */
879 };
880
881 /*
882 * Is PV area on the same PV?
883 */
_is_same_pv(struct pv_segment * pvseg,struct pv_area * pva)884 static int _is_same_pv(struct pv_segment *pvseg, struct pv_area *pva)
885 {
886 if (pvseg->pv != pva->map->pv)
887 return 0;
888
889 return 1;
890 }
891
892 /*
893 * Is PV area contiguous to PV segment?
894 */
_is_contiguous(struct pv_segment * pvseg,struct pv_area * pva)895 static int _is_contiguous(struct pv_segment *pvseg, struct pv_area *pva)
896 {
897 if (pvseg->pv != pva->map->pv)
898 return 0;
899
900 if (pvseg->pe + pvseg->len != pva->start)
901 return 0;
902
903 return 1;
904 }
905
_is_condition(struct cmd_context * cmd __attribute ((unused)),struct pv_segment * pvseg,uint32_t s,void * data)906 static int _is_condition(struct cmd_context *cmd __attribute((unused)),
907 struct pv_segment *pvseg, uint32_t s,
908 void *data)
909 {
910 struct pv_match *pvmatch = data;
911
912 if (!pvmatch->condition(pvseg, pvmatch->pva))
913 return 1; /* Continue */
914
915 if (s >= pvmatch->areas_size)
916 return 1;
917
918 pvmatch->areas[s] = pvmatch->pva;
919
920 return 2; /* Finished */
921 }
922
923 /*
924 * Is pva on same PV as any existing areas?
925 */
_check_cling(struct cmd_context * cmd,struct lv_segment * prev_lvseg,struct pv_area * pva,struct pv_area ** areas,uint32_t areas_size)926 static int _check_cling(struct cmd_context *cmd,
927 struct lv_segment *prev_lvseg, struct pv_area *pva,
928 struct pv_area **areas, uint32_t areas_size)
929 {
930 struct pv_match pvmatch;
931 int r;
932
933 pvmatch.condition = _is_same_pv;
934 pvmatch.areas = areas;
935 pvmatch.areas_size = areas_size;
936 pvmatch.pva = pva;
937
938 /* FIXME Cope with stacks by flattening */
939 if (!(r = _for_each_pv(cmd, prev_lvseg->lv,
940 prev_lvseg->le + prev_lvseg->len - 1, 1, NULL,
941 0, 0, -1, 1,
942 _is_condition, &pvmatch)))
943 stack;
944
945 if (r != 2)
946 return 0;
947
948 return 1;
949 }
950
951 /*
952 * Is pva contiguous to any existing areas or on the same PV?
953 */
_check_contiguous(struct cmd_context * cmd,struct lv_segment * prev_lvseg,struct pv_area * pva,struct pv_area ** areas,uint32_t areas_size)954 static int _check_contiguous(struct cmd_context *cmd,
955 struct lv_segment *prev_lvseg, struct pv_area *pva,
956 struct pv_area **areas, uint32_t areas_size)
957 {
958 struct pv_match pvmatch;
959 int r;
960
961 pvmatch.condition = _is_contiguous;
962 pvmatch.areas = areas;
963 pvmatch.areas_size = areas_size;
964 pvmatch.pva = pva;
965
966 /* FIXME Cope with stacks by flattening */
967 if (!(r = _for_each_pv(cmd, prev_lvseg->lv,
968 prev_lvseg->le + prev_lvseg->len - 1, 1, NULL,
969 0, 0, -1, 1,
970 _is_condition, &pvmatch)))
971 stack;
972
973 if (r != 2)
974 return 0;
975
976 return 1;
977 }
978
979 /*
980 * Choose sets of parallel areas to use, respecting any constraints.
981 */
_find_parallel_space(struct alloc_handle * ah,alloc_policy_t alloc,struct dm_list * pvms,struct pv_area ** areas,uint32_t areas_size,unsigned can_split,struct lv_segment * prev_lvseg,uint32_t * allocated,uint32_t needed)982 static int _find_parallel_space(struct alloc_handle *ah, alloc_policy_t alloc,
983 struct dm_list *pvms, struct pv_area **areas,
984 uint32_t areas_size, unsigned can_split,
985 struct lv_segment *prev_lvseg,
986 uint32_t *allocated, uint32_t needed)
987 {
988 struct pv_map *pvm;
989 struct pv_area *pva;
990 struct pv_list *pvl;
991 unsigned already_found_one = 0;
992 unsigned contiguous = 0, cling = 0, preferred_count = 0;
993 unsigned ix;
994 unsigned ix_offset = 0; /* Offset for non-preferred allocations */
995 unsigned too_small_for_log_count; /* How many too small for log? */
996 uint32_t max_parallel; /* Maximum extents to allocate */
997 uint32_t next_le;
998 struct seg_pvs *spvs;
999 struct dm_list *parallel_pvs;
1000 uint32_t free_pes;
1001 uint32_t log_len;
1002 struct pv_area *log_area;
1003 unsigned log_needs_allocating;
1004
1005 /* Is there enough total space? */
1006 free_pes = pv_maps_size(pvms);
1007 if (needed - *allocated > free_pes) {
1008 log_error("Insufficient free space: %" PRIu32 " extents needed,"
1009 " but only %" PRIu32 " available",
1010 needed - *allocated, free_pes);
1011 return 0;
1012 }
1013
1014 /* FIXME Select log PV appropriately if there isn't one yet */
1015
1016 /* Are there any preceding segments we must follow on from? */
1017 if (prev_lvseg) {
1018 ix_offset = prev_lvseg->area_count;
1019 if ((alloc == ALLOC_CONTIGUOUS))
1020 contiguous = 1;
1021 else if ((alloc == ALLOC_CLING))
1022 cling = 1;
1023 else
1024 ix_offset = 0;
1025 }
1026
1027 /* FIXME This algorithm needs a lot of cleaning up! */
1028 /* FIXME anywhere doesn't find all space yet */
1029 /* ix_offset holds the number of allocations that must be contiguous */
1030 /* ix holds the number of areas found on other PVs */
1031 do {
1032 ix = 0;
1033 preferred_count = 0;
1034
1035 parallel_pvs = NULL;
1036 max_parallel = needed;
1037
1038 /*
1039 * If there are existing parallel PVs, avoid them and reduce
1040 * the maximum we can allocate in one go accordingly.
1041 */
1042 if (ah->parallel_areas) {
1043 next_le = (prev_lvseg ? prev_lvseg->le + prev_lvseg->len : 0) + *allocated / ah->area_multiple;
1044 dm_list_iterate_items(spvs, ah->parallel_areas) {
1045 if (next_le >= spvs->le + spvs->len)
1046 continue;
1047
1048 if (max_parallel > (spvs->le + spvs->len) * ah->area_multiple)
1049 max_parallel = (spvs->le + spvs->len) * ah->area_multiple;
1050 parallel_pvs = &spvs->pvs;
1051 break;
1052 }
1053 }
1054
1055 /*
1056 * Put the smallest area of each PV that is at least the
1057 * size we need into areas array. If there isn't one
1058 * that fits completely and we're allowed more than one
1059 * LV segment, then take the largest remaining instead.
1060 */
1061 dm_list_iterate_items(pvm, pvms) {
1062 if (dm_list_empty(&pvm->areas))
1063 continue; /* Next PV */
1064
1065 if (alloc != ALLOC_ANYWHERE) {
1066 /* Don't allocate onto the log pv */
1067 if (ah->log_count &&
1068 pvm->pv == ah->log_area.pv)
1069 continue; /* Next PV */
1070
1071 /* Avoid PVs used by existing parallel areas */
1072 if (parallel_pvs)
1073 dm_list_iterate_items(pvl, parallel_pvs)
1074 if (pvm->pv == pvl->pv)
1075 goto next_pv;
1076 }
1077
1078 already_found_one = 0;
1079 /* First area in each list is the largest */
1080 dm_list_iterate_items(pva, &pvm->areas) {
1081 if (contiguous) {
1082 if (prev_lvseg &&
1083 _check_contiguous(ah->cmd,
1084 prev_lvseg,
1085 pva, areas,
1086 areas_size)) {
1087 preferred_count++;
1088 goto next_pv;
1089 }
1090 continue;
1091 }
1092
1093 if (cling) {
1094 if (prev_lvseg &&
1095 _check_cling(ah->cmd,
1096 prev_lvseg,
1097 pva, areas,
1098 areas_size)) {
1099 preferred_count++;
1100 }
1101 goto next_pv;
1102 }
1103
1104 /* Is it big enough on its own? */
1105 if (pva->count * ah->area_multiple <
1106 max_parallel - *allocated &&
1107 ((!can_split && !ah->log_count) ||
1108 (already_found_one &&
1109 !(alloc == ALLOC_ANYWHERE))))
1110 goto next_pv;
1111
1112 if (!already_found_one ||
1113 alloc == ALLOC_ANYWHERE) {
1114 ix++;
1115 already_found_one = 1;
1116 }
1117
1118 areas[ix + ix_offset - 1] = pva;
1119
1120 goto next_pv;
1121 }
1122 next_pv:
1123 if (ix >= areas_size)
1124 break;
1125 }
1126
1127 if ((contiguous || cling) && (preferred_count < ix_offset))
1128 break;
1129
1130 log_needs_allocating = (ah->log_count && !ah->log_area.len) ?
1131 1 : 0;
1132
1133 if (ix + ix_offset < ah->area_count +
1134 (log_needs_allocating ? ah->log_count : 0))
1135 break;
1136
1137 /* sort the areas so we allocate from the biggest */
1138 if (ix > 1)
1139 qsort(areas + ix_offset, ix, sizeof(*areas),
1140 _comp_area);
1141
1142 /*
1143 * First time around, if there's a log, allocate it on the
1144 * smallest device that has space for it.
1145 *
1146 * FIXME decide which PV to use at top of function instead
1147 */
1148
1149 too_small_for_log_count = 0;
1150
1151 if (!log_needs_allocating) {
1152 log_len = 0;
1153 log_area = NULL;
1154 } else {
1155 log_len = mirror_log_extents(ah->log_region_size,
1156 pv_pe_size((*areas)->map->pv),
1157 (max_parallel - *allocated) / ah->area_multiple);
1158
1159 /* How many areas are too small for the log? */
1160 while (too_small_for_log_count < ix_offset + ix &&
1161 (*(areas + ix_offset + ix - 1 -
1162 too_small_for_log_count))->count < log_len)
1163 too_small_for_log_count++;
1164
1165 log_area = *(areas + ix_offset + ix - 1 -
1166 too_small_for_log_count);
1167 }
1168
1169 if (ix + ix_offset < ah->area_count +
1170 (log_needs_allocating ? ah->log_count +
1171 too_small_for_log_count : 0))
1172 /* FIXME With ALLOC_ANYWHERE, need to split areas */
1173 break;
1174
1175 if (!_alloc_parallel_area(ah, max_parallel, areas, allocated,
1176 log_area, log_len))
1177 return_0;
1178
1179 } while (!contiguous && *allocated != needed && can_split);
1180
1181 return 1;
1182 }
1183
1184 /*
1185 * Allocate several segments, each the same size, in parallel.
1186 * If mirrored_pv and mirrored_pe are supplied, it is used as
1187 * the first area, and additional areas are allocated parallel to it.
1188 */
_allocate(struct alloc_handle * ah,struct volume_group * vg,struct logical_volume * lv,uint32_t new_extents,unsigned can_split,struct dm_list * allocatable_pvs)1189 static int _allocate(struct alloc_handle *ah,
1190 struct volume_group *vg,
1191 struct logical_volume *lv,
1192 uint32_t new_extents,
1193 unsigned can_split,
1194 struct dm_list *allocatable_pvs)
1195 {
1196 struct pv_area **areas;
1197 uint32_t allocated = lv ? lv->le_count : 0;
1198 uint32_t old_allocated;
1199 struct lv_segment *prev_lvseg = NULL;
1200 int r = 0;
1201 struct dm_list *pvms;
1202 uint32_t areas_size;
1203 alloc_policy_t alloc;
1204
1205 if (allocated >= new_extents && !ah->log_count) {
1206 log_error("_allocate called with no work to do!");
1207 return 1;
1208 }
1209
1210 if (ah->alloc == ALLOC_CONTIGUOUS)
1211 can_split = 0;
1212
1213 if (lv && !dm_list_empty(&lv->segments))
1214 prev_lvseg = dm_list_item(dm_list_last(&lv->segments),
1215 struct lv_segment);
1216 /*
1217 * Build the sets of available areas on the pv's.
1218 */
1219 if (!(pvms = create_pv_maps(ah->mem, vg, allocatable_pvs)))
1220 return_0;
1221
1222 if (!_log_parallel_areas(ah->mem, ah->parallel_areas))
1223 stack;
1224
1225 areas_size = dm_list_size(pvms);
1226 if (areas_size && areas_size < (ah->area_count + ah->log_count)) {
1227 if (ah->alloc != ALLOC_ANYWHERE) {
1228 log_error("Not enough PVs with free space available "
1229 "for parallel allocation.");
1230 log_error("Consider --alloc anywhere if desperate.");
1231 return 0;
1232 }
1233 areas_size = ah->area_count + ah->log_count;
1234 }
1235
1236 /* Upper bound if none of the PVs in prev_lvseg is in pvms */
1237 /* FIXME Work size out properly */
1238 if (prev_lvseg)
1239 areas_size += prev_lvseg->area_count;
1240
1241 /* Allocate an array of pv_areas to hold the largest space on each PV */
1242 if (!(areas = dm_malloc(sizeof(*areas) * areas_size))) {
1243 log_error("Couldn't allocate areas array.");
1244 return 0;
1245 }
1246
1247 /* Attempt each defined allocation policy in turn */
1248 for (alloc = ALLOC_CONTIGUOUS; alloc < ALLOC_INHERIT; alloc++) {
1249 old_allocated = allocated;
1250 if (!_find_parallel_space(ah, alloc, pvms, areas,
1251 areas_size, can_split,
1252 prev_lvseg, &allocated, new_extents))
1253 goto_out;
1254 if ((allocated == new_extents) || (ah->alloc == alloc) ||
1255 (!can_split && (allocated != old_allocated)))
1256 break;
1257 }
1258
1259 if (allocated != new_extents) {
1260 log_error("Insufficient suitable %sallocatable extents "
1261 "for logical volume %s: %u more required",
1262 can_split ? "" : "contiguous ",
1263 lv ? lv->name : "",
1264 (new_extents - allocated) * ah->area_count
1265 / ah->area_multiple);
1266 goto out;
1267 }
1268
1269 if (ah->log_count && !ah->log_area.len) {
1270 log_error("Insufficient extents for log allocation "
1271 "for logical volume %s.",
1272 lv ? lv->name : "");
1273 goto out;
1274 }
1275
1276 r = 1;
1277
1278 out:
1279 dm_free(areas);
1280 return r;
1281 }
1282
lv_add_virtual_segment(struct logical_volume * lv,uint32_t status,uint32_t extents,const struct segment_type * segtype)1283 int lv_add_virtual_segment(struct logical_volume *lv, uint32_t status,
1284 uint32_t extents, const struct segment_type *segtype)
1285 {
1286 struct lv_segment *seg;
1287
1288 if (!(seg = alloc_lv_segment(lv->vg->cmd->mem, segtype, lv,
1289 lv->le_count, extents, status, 0,
1290 NULL, 0, extents, 0, 0, 0))) {
1291 log_error("Couldn't allocate new zero segment.");
1292 return 0;
1293 }
1294
1295 dm_list_add(&lv->segments, &seg->list);
1296
1297 lv->le_count += extents;
1298 lv->size += (uint64_t) extents *lv->vg->extent_size;
1299
1300 lv->status |= VIRTUAL;
1301
1302 return 1;
1303 }
1304
1305 /*
1306 * Entry point for all extent allocations.
1307 */
allocate_extents(struct volume_group * vg,struct logical_volume * lv,const struct segment_type * segtype,uint32_t stripes,uint32_t mirrors,uint32_t log_count,uint32_t log_region_size,uint32_t extents,struct dm_list * allocatable_pvs,alloc_policy_t alloc,struct dm_list * parallel_areas)1308 struct alloc_handle *allocate_extents(struct volume_group *vg,
1309 struct logical_volume *lv,
1310 const struct segment_type *segtype,
1311 uint32_t stripes,
1312 uint32_t mirrors, uint32_t log_count,
1313 uint32_t log_region_size, uint32_t extents,
1314 struct dm_list *allocatable_pvs,
1315 alloc_policy_t alloc,
1316 struct dm_list *parallel_areas)
1317 {
1318 struct alloc_handle *ah;
1319
1320 if (segtype_is_virtual(segtype)) {
1321 log_error("allocate_extents does not handle virtual segments");
1322 return NULL;
1323 }
1324
1325 if (vg->fid->fmt->ops->segtype_supported &&
1326 !vg->fid->fmt->ops->segtype_supported(vg->fid, segtype)) {
1327 log_error("Metadata format (%s) does not support required "
1328 "LV segment type (%s).", vg->fid->fmt->name,
1329 segtype->name);
1330 log_error("Consider changing the metadata format by running "
1331 "vgconvert.");
1332 return NULL;
1333 }
1334
1335 if (alloc == ALLOC_INHERIT)
1336 alloc = vg->alloc;
1337
1338 if (!(ah = _alloc_init(vg->cmd, vg->cmd->mem, segtype, alloc, mirrors,
1339 stripes, log_count, log_region_size, parallel_areas)))
1340 return_NULL;
1341
1342 if (!segtype_is_virtual(segtype) &&
1343 !_allocate(ah, vg, lv, (lv ? lv->le_count : 0) + extents,
1344 1, allocatable_pvs)) {
1345 alloc_destroy(ah);
1346 return_NULL;
1347 }
1348
1349 return ah;
1350 }
1351
1352 /*
1353 * Add new segments to an LV from supplied list of areas.
1354 */
lv_add_segment(struct alloc_handle * ah,uint32_t first_area,uint32_t num_areas,struct logical_volume * lv,const struct segment_type * segtype,uint32_t stripe_size,uint32_t status,uint32_t region_size,struct logical_volume * log_lv)1355 int lv_add_segment(struct alloc_handle *ah,
1356 uint32_t first_area, uint32_t num_areas,
1357 struct logical_volume *lv,
1358 const struct segment_type *segtype,
1359 uint32_t stripe_size,
1360 uint32_t status,
1361 uint32_t region_size,
1362 struct logical_volume *log_lv)
1363 {
1364 if (!segtype) {
1365 log_error("Missing segtype in lv_add_segment().");
1366 return 0;
1367 }
1368
1369 if (segtype_is_virtual(segtype)) {
1370 log_error("lv_add_segment cannot handle virtual segments");
1371 return 0;
1372 }
1373
1374 if (!_setup_alloced_segments(lv, &ah->alloced_areas[first_area],
1375 num_areas, status,
1376 stripe_size, segtype,
1377 region_size, log_lv))
1378 return_0;
1379
1380 if ((segtype->flags & SEG_CAN_SPLIT) && !lv_merge_segments(lv)) {
1381 log_error("Couldn't merge segments after extending "
1382 "logical volume.");
1383 return 0;
1384 }
1385
1386 if (lv->vg->fid->fmt->ops->lv_setup &&
1387 !lv->vg->fid->fmt->ops->lv_setup(lv->vg->fid, lv))
1388 return_0;
1389
1390 return 1;
1391 }
1392
1393 /*
1394 * "mirror" segment type doesn't support split.
1395 * So, when adding mirrors to linear LV segment, first split it,
1396 * then convert it to "mirror" and add areas.
1397 */
_convert_seg_to_mirror(struct lv_segment * seg,uint32_t region_size,struct logical_volume * log_lv)1398 static struct lv_segment *_convert_seg_to_mirror(struct lv_segment *seg,
1399 uint32_t region_size,
1400 struct logical_volume *log_lv)
1401 {
1402 struct lv_segment *newseg;
1403 uint32_t s;
1404
1405 if (!seg_is_striped(seg)) {
1406 log_error("Can't convert non-striped segment to mirrored.");
1407 return NULL;
1408 }
1409
1410 if (seg->area_count > 1) {
1411 log_error("Can't convert striped segment with multiple areas "
1412 "to mirrored.");
1413 return NULL;
1414 }
1415
1416 if (!(newseg = alloc_lv_segment(seg->lv->vg->cmd->mem,
1417 get_segtype_from_string(seg->lv->vg->cmd, "mirror"),
1418 seg->lv, seg->le, seg->len,
1419 seg->status, seg->stripe_size,
1420 log_lv,
1421 seg->area_count, seg->area_len,
1422 seg->chunk_size, region_size,
1423 seg->extents_copied))) {
1424 log_error("Couldn't allocate converted LV segment");
1425 return NULL;
1426 }
1427
1428 for (s = 0; s < seg->area_count; s++)
1429 if (!move_lv_segment_area(newseg, s, seg, s))
1430 return_NULL;
1431
1432 dm_list_add(&seg->list, &newseg->list);
1433 dm_list_del(&seg->list);
1434
1435 return newseg;
1436 }
1437
1438 /*
1439 * Add new areas to mirrored segments
1440 */
lv_add_mirror_areas(struct alloc_handle * ah,struct logical_volume * lv,uint32_t le,uint32_t region_size)1441 int lv_add_mirror_areas(struct alloc_handle *ah,
1442 struct logical_volume *lv, uint32_t le,
1443 uint32_t region_size)
1444 {
1445 struct alloced_area *aa;
1446 struct lv_segment *seg;
1447 uint32_t current_le = le;
1448 uint32_t s, old_area_count, new_area_count;
1449
1450 dm_list_iterate_items(aa, &ah->alloced_areas[0]) {
1451 if (!(seg = find_seg_by_le(lv, current_le))) {
1452 log_error("Failed to find segment for %s extent %"
1453 PRIu32, lv->name, current_le);
1454 return 0;
1455 }
1456
1457 /* Allocator assures aa[0].len <= seg->area_len */
1458 if (aa[0].len < seg->area_len) {
1459 if (!lv_split_segment(lv, seg->le + aa[0].len)) {
1460 log_error("Failed to split segment at %s "
1461 "extent %" PRIu32, lv->name, le);
1462 return 0;
1463 }
1464 }
1465
1466 if (!seg_is_mirrored(seg) &&
1467 (!(seg = _convert_seg_to_mirror(seg, region_size, NULL))))
1468 return_0;
1469
1470 old_area_count = seg->area_count;
1471 new_area_count = old_area_count + ah->area_count;
1472
1473 if (!_lv_segment_add_areas(lv, seg, new_area_count))
1474 return_0;
1475
1476 for (s = 0; s < ah->area_count; s++) {
1477 if (!set_lv_segment_area_pv(seg, s + old_area_count,
1478 aa[s].pv, aa[s].pe))
1479 return_0;
1480 }
1481
1482 current_le += seg->area_len;
1483 }
1484
1485 lv->status |= MIRRORED;
1486
1487 if (lv->vg->fid->fmt->ops->lv_setup &&
1488 !lv->vg->fid->fmt->ops->lv_setup(lv->vg->fid, lv))
1489 return_0;
1490
1491 return 1;
1492 }
1493
1494 /*
1495 * Add mirror image LVs to mirrored segments
1496 */
lv_add_mirror_lvs(struct logical_volume * lv,struct logical_volume ** sub_lvs,uint32_t num_extra_areas,uint32_t status,uint32_t region_size)1497 int lv_add_mirror_lvs(struct logical_volume *lv,
1498 struct logical_volume **sub_lvs,
1499 uint32_t num_extra_areas,
1500 uint32_t status, uint32_t region_size)
1501 {
1502 struct lv_segment *seg;
1503 uint32_t old_area_count, new_area_count;
1504 uint32_t m;
1505 struct segment_type *mirror_segtype;
1506
1507 seg = first_seg(lv);
1508
1509 if (dm_list_size(&lv->segments) != 1 || seg_type(seg, 0) != AREA_LV) {
1510 log_error("Mirror layer must be inserted before adding mirrors");
1511 return_0;
1512 }
1513
1514 mirror_segtype = get_segtype_from_string(lv->vg->cmd, "mirror");
1515 if (seg->segtype != mirror_segtype)
1516 if (!(seg = _convert_seg_to_mirror(seg, region_size, NULL)))
1517 return_0;
1518
1519 if (region_size && region_size != seg->region_size) {
1520 log_error("Conflicting region_size");
1521 return 0;
1522 }
1523
1524 old_area_count = seg->area_count;
1525 new_area_count = old_area_count + num_extra_areas;
1526
1527 if (!_lv_segment_add_areas(lv, seg, new_area_count)) {
1528 log_error("Failed to allocate widened LV segment for %s.",
1529 lv->name);
1530 return 0;
1531 }
1532
1533 for (m = 0; m < old_area_count; m++)
1534 seg_lv(seg, m)->status |= status;
1535
1536 for (m = old_area_count; m < new_area_count; m++) {
1537 if (!set_lv_segment_area_lv(seg, m, sub_lvs[m - old_area_count],
1538 0, status))
1539 return_0;
1540 lv_set_hidden(sub_lvs[m - old_area_count]);
1541 }
1542
1543 lv->status |= MIRRORED;
1544
1545 return 1;
1546 }
1547
1548 /*
1549 * Turn an empty LV into a mirror log.
1550 */
lv_add_log_segment(struct alloc_handle * ah,struct logical_volume * log_lv)1551 int lv_add_log_segment(struct alloc_handle *ah, struct logical_volume *log_lv)
1552 {
1553 struct lv_segment *seg;
1554
1555 if (dm_list_size(&log_lv->segments)) {
1556 log_error("Log segments can only be added to an empty LV");
1557 return 0;
1558 }
1559
1560 if (!(seg = alloc_lv_segment(log_lv->vg->cmd->mem,
1561 get_segtype_from_string(log_lv->vg->cmd,
1562 "striped"),
1563 log_lv, 0, ah->log_area.len, MIRROR_LOG,
1564 0, NULL, 1, ah->log_area.len, 0, 0, 0))) {
1565 log_error("Couldn't allocate new mirror log segment.");
1566 return 0;
1567 }
1568
1569 if (!set_lv_segment_area_pv(seg, 0, ah->log_area.pv, ah->log_area.pe))
1570 return_0;
1571
1572 dm_list_add(&log_lv->segments, &seg->list);
1573 log_lv->le_count += ah->log_area.len;
1574 log_lv->size += (uint64_t) log_lv->le_count * log_lv->vg->extent_size;
1575
1576 if (log_lv->vg->fid->fmt->ops->lv_setup &&
1577 !log_lv->vg->fid->fmt->ops->lv_setup(log_lv->vg->fid, log_lv))
1578 return_0;
1579
1580 return 1;
1581 }
1582
_lv_extend_mirror(struct alloc_handle * ah,struct logical_volume * lv,uint32_t extents,uint32_t first_area)1583 static int _lv_extend_mirror(struct alloc_handle *ah,
1584 struct logical_volume *lv,
1585 uint32_t extents, uint32_t first_area)
1586 {
1587 struct lv_segment *seg;
1588 uint32_t m, s;
1589
1590 seg = first_seg(lv);
1591 for (m = first_area, s = 0; s < seg->area_count; s++) {
1592 if (is_temporary_mirror_layer(seg_lv(seg, s))) {
1593 if (!_lv_extend_mirror(ah, seg_lv(seg, s), extents, m))
1594 return_0;
1595 m += lv_mirror_count(seg_lv(seg, s));
1596 continue;
1597 }
1598
1599 if (!lv_add_segment(ah, m++, 1, seg_lv(seg, s),
1600 get_segtype_from_string(lv->vg->cmd,
1601 "striped"),
1602 0, 0, 0, NULL)) {
1603 log_error("Aborting. Failed to extend %s.",
1604 seg_lv(seg, s)->name);
1605 return 0;
1606 }
1607 }
1608 seg->area_len += extents;
1609 seg->len += extents;
1610 lv->le_count += extents;
1611 lv->size += (uint64_t) extents *lv->vg->extent_size;
1612
1613 return 1;
1614 }
1615
1616 /*
1617 * Entry point for single-step LV allocation + extension.
1618 */
lv_extend(struct logical_volume * lv,const struct segment_type * segtype,uint32_t stripes,uint32_t stripe_size,uint32_t mirrors,uint32_t extents,struct physical_volume * mirrored_pv __attribute ((unused)),uint32_t mirrored_pe __attribute ((unused)),uint32_t status,struct dm_list * allocatable_pvs,alloc_policy_t alloc)1619 int lv_extend(struct logical_volume *lv,
1620 const struct segment_type *segtype,
1621 uint32_t stripes, uint32_t stripe_size,
1622 uint32_t mirrors, uint32_t extents,
1623 struct physical_volume *mirrored_pv __attribute((unused)),
1624 uint32_t mirrored_pe __attribute((unused)),
1625 uint32_t status, struct dm_list *allocatable_pvs,
1626 alloc_policy_t alloc)
1627 {
1628 int r = 1;
1629 struct alloc_handle *ah;
1630
1631 if (segtype_is_virtual(segtype))
1632 return lv_add_virtual_segment(lv, status, extents, segtype);
1633
1634 if (!(ah = allocate_extents(lv->vg, lv, segtype, stripes, mirrors, 0, 0,
1635 extents, allocatable_pvs, alloc, NULL)))
1636 return_0;
1637
1638 if (mirrors < 2)
1639 r = lv_add_segment(ah, 0, ah->area_count, lv, segtype,
1640 stripe_size, status, 0, NULL);
1641 else
1642 r = _lv_extend_mirror(ah, lv, extents, 0);
1643
1644 alloc_destroy(ah);
1645 return r;
1646 }
1647
1648 /*
1649 * Minimal LV renaming function.
1650 * Metadata transaction should be made by caller.
1651 * Assumes new_name is allocated from cmd->mem pool.
1652 */
_rename_single_lv(struct logical_volume * lv,char * new_name)1653 static int _rename_single_lv(struct logical_volume *lv, char *new_name)
1654 {
1655 struct volume_group *vg = lv->vg;
1656
1657 if (find_lv_in_vg(vg, new_name)) {
1658 log_error("Logical volume \"%s\" already exists in "
1659 "volume group \"%s\"", new_name, vg->name);
1660 return 0;
1661 }
1662
1663 if (lv->status & LOCKED) {
1664 log_error("Cannot rename locked LV %s", lv->name);
1665 return 0;
1666 }
1667
1668 lv->name = new_name;
1669
1670 return 1;
1671 }
1672
1673 /*
1674 * Rename sub LV.
1675 * 'lv_name_old' and 'lv_name_new' are old and new names of the main LV.
1676 */
_rename_sub_lv(struct cmd_context * cmd,struct logical_volume * lv,const char * lv_name_old,const char * lv_name_new)1677 static int _rename_sub_lv(struct cmd_context *cmd,
1678 struct logical_volume *lv,
1679 const char *lv_name_old, const char *lv_name_new)
1680 {
1681 char *suffix, *new_name;
1682 size_t len;
1683
1684 /*
1685 * A sub LV name starts with lv_name_old + '_'.
1686 * The suffix follows lv_name_old and includes '_'.
1687 */
1688 len = strlen(lv_name_old);
1689 if (strncmp(lv->name, lv_name_old, len) || lv->name[len] != '_') {
1690 log_error("Cannot rename \"%s\": name format not recognized "
1691 "for internal LV \"%s\"",
1692 lv_name_old, lv->name);
1693 return 0;
1694 }
1695 suffix = lv->name + len;
1696
1697 /*
1698 * Compose a new name for sub lv:
1699 * e.g. new name is "lvol1_mlog"
1700 * if the sub LV is "lvol0_mlog" and
1701 * a new name for main LV is "lvol1"
1702 */
1703 len = strlen(lv_name_new) + strlen(suffix) + 1;
1704 new_name = dm_pool_alloc(cmd->mem, len);
1705 if (!new_name) {
1706 log_error("Failed to allocate space for new name");
1707 return 0;
1708 }
1709 if (!dm_snprintf(new_name, len, "%s%s", lv_name_new, suffix)) {
1710 log_error("Failed to create new name");
1711 return 0;
1712 }
1713
1714 /* Rename it */
1715 return _rename_single_lv(lv, new_name);
1716 }
1717
1718 /* Callback for _for_each_sub_lv */
_rename_cb(struct cmd_context * cmd,struct logical_volume * lv,void * data)1719 static int _rename_cb(struct cmd_context *cmd, struct logical_volume *lv,
1720 void *data)
1721 {
1722 struct lv_names *lv_names = (struct lv_names *) data;
1723
1724 return _rename_sub_lv(cmd, lv, lv_names->old, lv_names->new);
1725 }
1726
1727 /*
1728 * Loop down sub LVs and call "func" for each.
1729 * "func" is responsible to log necessary information on failure.
1730 */
_for_each_sub_lv(struct cmd_context * cmd,struct logical_volume * lv,int (* func)(struct cmd_context * cmd,struct logical_volume * lv,void * data),void * data)1731 static int _for_each_sub_lv(struct cmd_context *cmd, struct logical_volume *lv,
1732 int (*func)(struct cmd_context *cmd,
1733 struct logical_volume *lv,
1734 void *data),
1735 void *data)
1736 {
1737 struct logical_volume *org;
1738 struct lv_segment *seg;
1739 uint32_t s;
1740
1741 if (lv_is_cow(lv) && lv_is_virtual_origin(org = origin_from_cow(lv)))
1742 if (!func(cmd, org, data))
1743 return_0;
1744
1745 dm_list_iterate_items(seg, &lv->segments) {
1746 if (seg->log_lv && !func(cmd, seg->log_lv, data))
1747 return_0;
1748 for (s = 0; s < seg->area_count; s++) {
1749 if (seg_type(seg, s) != AREA_LV)
1750 continue;
1751 if (!func(cmd, seg_lv(seg, s), data))
1752 return_0;
1753 if (!_for_each_sub_lv(cmd, seg_lv(seg, s), func, data))
1754 return_0;
1755 }
1756 }
1757
1758 return 1;
1759 }
1760
1761
1762 /*
1763 * Core of LV renaming routine.
1764 * VG must be locked by caller.
1765 */
lv_rename(struct cmd_context * cmd,struct logical_volume * lv,const char * new_name)1766 int lv_rename(struct cmd_context *cmd, struct logical_volume *lv,
1767 const char *new_name)
1768 {
1769 struct volume_group *vg = lv->vg;
1770 struct lv_names lv_names;
1771 DM_LIST_INIT(lvs_changed);
1772 struct lv_list lvl, lvl2;
1773 int r = 0;
1774
1775 /* rename is not allowed on sub LVs */
1776 if (!lv_is_visible(lv)) {
1777 log_error("Cannot rename internal LV \"%s\".", lv->name);
1778 return 0;
1779 }
1780
1781 if (find_lv_in_vg(vg, new_name)) {
1782 log_error("Logical volume \"%s\" already exists in "
1783 "volume group \"%s\"", new_name, vg->name);
1784 return 0;
1785 }
1786
1787 if (lv->status & LOCKED) {
1788 log_error("Cannot rename locked LV %s", lv->name);
1789 return 0;
1790 }
1791
1792 if (!archive(vg))
1793 return 0;
1794
1795 /* rename sub LVs */
1796 lv_names.old = lv->name;
1797 lv_names.new = new_name;
1798 if (!_for_each_sub_lv(cmd, lv, _rename_cb, (void *) &lv_names))
1799 return 0;
1800
1801 /* rename main LV */
1802 if (!(lv->name = dm_pool_strdup(cmd->mem, new_name))) {
1803 log_error("Failed to allocate space for new name");
1804 return 0;
1805 }
1806
1807 lvl.lv = lv;
1808 dm_list_add(&lvs_changed, &lvl.list);
1809
1810 /* rename active virtual origin too */
1811 if (lv_is_cow(lv) && lv_is_virtual_origin(lvl2.lv = origin_from_cow(lv)))
1812 dm_list_add_h(&lvs_changed, &lvl2.list);
1813
1814 log_verbose("Writing out updated volume group");
1815 if (!vg_write(vg))
1816 return 0;
1817
1818
1819 if (!suspend_lvs(cmd, &lvs_changed)) {
1820 vg_revert(vg);
1821 goto_out;
1822 }
1823
1824 if (!(r = vg_commit(vg)))
1825 stack;
1826
1827 resume_lvs(cmd, &lvs_changed);
1828 out:
1829 backup(vg);
1830 return r;
1831 }
1832
generate_lv_name(struct volume_group * vg,const char * format,char * buffer,size_t len)1833 char *generate_lv_name(struct volume_group *vg, const char *format,
1834 char *buffer, size_t len)
1835 {
1836 struct lv_list *lvl;
1837 int high = -1, i;
1838
1839 dm_list_iterate_items(lvl, &vg->lvs) {
1840 if (sscanf(lvl->lv->name, format, &i) != 1)
1841 continue;
1842
1843 if (i > high)
1844 high = i;
1845 }
1846
1847 if (dm_snprintf(buffer, len, format, high + 1) < 0)
1848 return NULL;
1849
1850 return buffer;
1851 }
1852
vg_max_lv_reached(struct volume_group * vg)1853 int vg_max_lv_reached(struct volume_group *vg)
1854 {
1855 if (!vg->max_lv)
1856 return 0;
1857
1858 if (vg->max_lv > vg_visible_lvs(vg))
1859 return 0;
1860
1861 log_verbose("Maximum number of logical volumes (%u) reached "
1862 "in volume group %s", vg->max_lv, vg->name);
1863
1864 return 1;
1865 }
1866
alloc_lv(struct dm_pool * mem)1867 struct logical_volume *alloc_lv(struct dm_pool *mem)
1868 {
1869 struct logical_volume *lv;
1870
1871 if (!(lv = dm_pool_zalloc(mem, sizeof(*lv)))) {
1872 log_error("Unable to allocate logical volume structure");
1873 return NULL;
1874 }
1875
1876 lv->snapshot = NULL;
1877 dm_list_init(&lv->snapshot_segs);
1878 dm_list_init(&lv->segments);
1879 dm_list_init(&lv->tags);
1880 dm_list_init(&lv->segs_using_this_lv);
1881
1882 return lv;
1883 }
1884
1885 /*
1886 * Create a new empty LV.
1887 */
lv_create_empty(const char * name,union lvid * lvid,uint32_t status,alloc_policy_t alloc,struct volume_group * vg)1888 struct logical_volume *lv_create_empty(const char *name,
1889 union lvid *lvid,
1890 uint32_t status,
1891 alloc_policy_t alloc,
1892 struct volume_group *vg)
1893 {
1894 struct format_instance *fi = vg->fid;
1895 struct logical_volume *lv;
1896 char dname[NAME_LEN];
1897
1898 if (vg_max_lv_reached(vg))
1899 stack;
1900
1901 if (strstr(name, "%d") &&
1902 !(name = generate_lv_name(vg, name, dname, sizeof(dname)))) {
1903 log_error("Failed to generate unique name for the new "
1904 "logical volume");
1905 return NULL;
1906 } else if (find_lv_in_vg(vg, name)) {
1907 log_error("Unable to create LV %s in Volume Group %s: "
1908 "name already in use.", name, vg->name);
1909 return NULL;
1910 }
1911
1912 log_verbose("Creating logical volume %s", name);
1913
1914 if (!(lv = alloc_lv(vg->vgmem)))
1915 return_NULL;
1916
1917 if (!(lv->name = dm_pool_strdup(vg->vgmem, name)))
1918 goto_bad;
1919
1920 lv->status = status;
1921 lv->alloc = alloc;
1922 lv->read_ahead = vg->cmd->default_settings.read_ahead;
1923 lv->major = -1;
1924 lv->minor = -1;
1925 lv->size = UINT64_C(0);
1926 lv->le_count = 0;
1927
1928 if (lvid)
1929 lv->lvid = *lvid;
1930
1931 if (!link_lv_to_vg(vg, lv))
1932 goto_bad;
1933
1934 if (fi->fmt->ops->lv_setup && !fi->fmt->ops->lv_setup(fi, lv))
1935 goto_bad;
1936
1937 return lv;
1938 bad:
1939 dm_pool_free(vg->vgmem, lv);
1940 return NULL;
1941 }
1942
_add_pvs(struct cmd_context * cmd,struct pv_segment * peg,uint32_t s __attribute ((unused)),void * data)1943 static int _add_pvs(struct cmd_context *cmd, struct pv_segment *peg,
1944 uint32_t s __attribute((unused)), void *data)
1945 {
1946 struct seg_pvs *spvs = (struct seg_pvs *) data;
1947 struct pv_list *pvl;
1948
1949 /* Don't add again if it's already on list. */
1950 if (find_pv_in_pv_list(&spvs->pvs, peg->pv))
1951 return 1;
1952
1953 if (!(pvl = dm_pool_alloc(cmd->mem, sizeof(*pvl)))) {
1954 log_error("pv_list allocation failed");
1955 return 0;
1956 }
1957
1958 pvl->pv = peg->pv;
1959
1960 dm_list_add(&spvs->pvs, &pvl->list);
1961
1962 return 1;
1963 }
1964
1965 /*
1966 * Construct dm_list of segments of LVs showing which PVs they use.
1967 */
build_parallel_areas_from_lv(struct cmd_context * cmd,struct logical_volume * lv)1968 struct dm_list *build_parallel_areas_from_lv(struct cmd_context *cmd,
1969 struct logical_volume *lv)
1970 {
1971 struct dm_list *parallel_areas;
1972 struct seg_pvs *spvs;
1973 uint32_t current_le = 0;
1974
1975 if (!(parallel_areas = dm_pool_alloc(cmd->mem, sizeof(*parallel_areas)))) {
1976 log_error("parallel_areas allocation failed");
1977 return NULL;
1978 }
1979
1980 dm_list_init(parallel_areas);
1981
1982 do {
1983 if (!(spvs = dm_pool_zalloc(cmd->mem, sizeof(*spvs)))) {
1984 log_error("allocation failed");
1985 return NULL;
1986 }
1987
1988 dm_list_init(&spvs->pvs);
1989
1990 spvs->le = current_le;
1991 spvs->len = lv->le_count - current_le;
1992
1993 dm_list_add(parallel_areas, &spvs->list);
1994
1995 /* Find next segment end */
1996 /* FIXME Unnecessary nesting! */
1997 if (!_for_each_pv(cmd, lv, current_le, spvs->len, &spvs->len,
1998 0, 0, -1, 0, _add_pvs, (void *) spvs))
1999 return_NULL;
2000
2001 current_le = spvs->le + spvs->len;
2002 } while (current_le < lv->le_count);
2003
2004 /* FIXME Merge adjacent segments with identical PV lists (avoids need for contiguous allocation attempts between successful allocations) */
2005
2006 return parallel_areas;
2007 }
2008
link_lv_to_vg(struct volume_group * vg,struct logical_volume * lv)2009 int link_lv_to_vg(struct volume_group *vg, struct logical_volume *lv)
2010 {
2011 struct lv_list *lvl;
2012
2013 if (vg_max_lv_reached(vg))
2014 stack;
2015
2016 if (!(lvl = dm_pool_zalloc(vg->vgmem, sizeof(*lvl))))
2017 return_0;
2018
2019 lvl->lv = lv;
2020 lv->vg = vg;
2021 dm_list_add(&vg->lvs, &lvl->list);
2022
2023 return 1;
2024 }
2025
unlink_lv_from_vg(struct logical_volume * lv)2026 int unlink_lv_from_vg(struct logical_volume *lv)
2027 {
2028 struct lv_list *lvl;
2029
2030 if (!(lvl = find_lv_in_vg(lv->vg, lv->name)))
2031 return_0;
2032
2033 dm_list_del(&lvl->list);
2034
2035 return 1;
2036 }
2037
lv_set_visible(struct logical_volume * lv)2038 void lv_set_visible(struct logical_volume *lv)
2039 {
2040 if (lv_is_visible(lv))
2041 return;
2042
2043 lv->status |= VISIBLE_LV;
2044
2045 log_debug("LV %s in VG %s is now visible.", lv->name, lv->vg->name);
2046 }
2047
lv_set_hidden(struct logical_volume * lv)2048 void lv_set_hidden(struct logical_volume *lv)
2049 {
2050 if (!lv_is_visible(lv))
2051 return;
2052
2053 lv->status &= ~VISIBLE_LV;
2054
2055 log_debug("LV %s in VG %s is now hidden.", lv->name, lv->vg->name);
2056 }
2057
lv_remove_single(struct cmd_context * cmd,struct logical_volume * lv,const force_t force)2058 int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
2059 const force_t force)
2060 {
2061 struct volume_group *vg;
2062 struct lvinfo info;
2063 struct logical_volume *origin = NULL;
2064
2065 vg = lv->vg;
2066
2067 if (!vg_check_status(vg, LVM_WRITE))
2068 return 0;
2069
2070 if (lv_is_origin(lv)) {
2071 log_error("Can't remove logical volume \"%s\" under snapshot",
2072 lv->name);
2073 return 0;
2074 }
2075
2076 if (lv->status & MIRROR_IMAGE) {
2077 log_error("Can't remove logical volume %s used by a mirror",
2078 lv->name);
2079 return 0;
2080 }
2081
2082 if (lv->status & MIRROR_LOG) {
2083 log_error("Can't remove logical volume %s used as mirror log",
2084 lv->name);
2085 return 0;
2086 }
2087
2088 if (lv->status & LOCKED) {
2089 log_error("Can't remove locked LV %s", lv->name);
2090 return 0;
2091 }
2092
2093 /* FIXME Ensure not referred to by another existing LVs */
2094
2095 if (lv_info(cmd, lv, &info, 1, 0)) {
2096 if (info.open_count) {
2097 log_error("Can't remove open logical volume \"%s\"",
2098 lv->name);
2099 return 0;
2100 }
2101
2102 if (lv_is_active(lv) && (force == PROMPT) &&
2103 lv_is_visible(lv) &&
2104 yes_no_prompt("Do you really want to remove active "
2105 "%slogical volume %s? [y/n]: ",
2106 vg_is_clustered(vg) ? "clustered " : "",
2107 lv->name) == 'n') {
2108 log_print("Logical volume %s not removed", lv->name);
2109 return 0;
2110 }
2111 }
2112
2113 if (!archive(vg))
2114 return 0;
2115
2116 /* FIXME Snapshot commit out of sequence if it fails after here? */
2117 if (!deactivate_lv(cmd, lv)) {
2118 log_error("Unable to deactivate logical volume \"%s\"",
2119 lv->name);
2120 return 0;
2121 }
2122
2123 if (lv_is_cow(lv)) {
2124 origin = origin_from_cow(lv);
2125 log_verbose("Removing snapshot %s", lv->name);
2126 if (!vg_remove_snapshot(lv))
2127 return_0;
2128 }
2129
2130 log_verbose("Releasing logical volume \"%s\"", lv->name);
2131 if (!lv_remove(lv)) {
2132 log_error("Error releasing logical volume \"%s\"", lv->name);
2133 return 0;
2134 }
2135
2136 /* store it on disks */
2137 if (!vg_write(vg) || !vg_commit(vg))
2138 return_0;
2139
2140 backup(vg);
2141
2142 /* If no snapshots left, reload without -real. */
2143 if (origin && !lv_is_origin(origin)) {
2144 if (!suspend_lv(cmd, origin))
2145 log_error("Failed to refresh %s without snapshot.", origin->name);
2146 else if (!resume_lv(cmd, origin))
2147 log_error("Failed to resume %s.", origin->name);
2148 }
2149
2150 if (lv_is_visible(lv))
2151 log_print("Logical volume \"%s\" successfully removed", lv->name);
2152
2153 return 1;
2154 }
2155
2156 /*
2157 * remove LVs with its dependencies - LV leaf nodes should be removed first
2158 */
lv_remove_with_dependencies(struct cmd_context * cmd,struct logical_volume * lv,const force_t force)2159 int lv_remove_with_dependencies(struct cmd_context *cmd, struct logical_volume *lv,
2160 const force_t force)
2161 {
2162 struct dm_list *snh, *snht;
2163
2164 if (lv_is_origin(lv)) {
2165 /* remove snapshot LVs first */
2166 dm_list_iterate_safe(snh, snht, &lv->snapshot_segs) {
2167 if (!lv_remove_with_dependencies(cmd, dm_list_struct_base(snh, struct lv_segment,
2168 origin_list)->cow,
2169 force))
2170 return 0;
2171 }
2172 }
2173
2174 return lv_remove_single(cmd, lv, force);
2175 }
2176
2177 /*
2178 * insert_layer_for_segments_on_pv() inserts a layer segment for a segment area.
2179 * However, layer modification could split the underlying layer segment.
2180 * This function splits the parent area according to keep the 1:1 relationship
2181 * between the parent area and the underlying layer segment.
2182 * Since the layer LV might have other layers below, build_parallel_areas()
2183 * is used to find the lowest-level segment boundaries.
2184 */
_split_parent_area(struct lv_segment * seg,uint32_t s,struct dm_list * layer_seg_pvs)2185 static int _split_parent_area(struct lv_segment *seg, uint32_t s,
2186 struct dm_list *layer_seg_pvs)
2187 {
2188 uint32_t parent_area_len, parent_le, layer_le;
2189 uint32_t area_multiple;
2190 struct seg_pvs *spvs;
2191
2192 if (seg_is_striped(seg))
2193 area_multiple = seg->area_count;
2194 else
2195 area_multiple = 1;
2196
2197 parent_area_len = seg->area_len;
2198 parent_le = seg->le;
2199 layer_le = seg_le(seg, s);
2200
2201 while (parent_area_len > 0) {
2202 /* Find the layer segment pointed at */
2203 if (!(spvs = _find_seg_pvs_by_le(layer_seg_pvs, layer_le))) {
2204 log_error("layer segment for %s:%" PRIu32 " not found",
2205 seg->lv->name, parent_le);
2206 return 0;
2207 }
2208
2209 if (spvs->le != layer_le) {
2210 log_error("Incompatible layer boundary: "
2211 "%s:%" PRIu32 "[%" PRIu32 "] on %s:%" PRIu32,
2212 seg->lv->name, parent_le, s,
2213 seg_lv(seg, s)->name, layer_le);
2214 return 0;
2215 }
2216
2217 if (spvs->len < parent_area_len) {
2218 parent_le += spvs->len * area_multiple;
2219 if (!lv_split_segment(seg->lv, parent_le))
2220 return_0;
2221 }
2222
2223 parent_area_len -= spvs->len;
2224 layer_le += spvs->len;
2225 }
2226
2227 return 1;
2228 }
2229
2230 /*
2231 * Split the parent LV segments if the layer LV below it is splitted.
2232 */
split_parent_segments_for_layer(struct cmd_context * cmd,struct logical_volume * layer_lv)2233 int split_parent_segments_for_layer(struct cmd_context *cmd,
2234 struct logical_volume *layer_lv)
2235 {
2236 struct lv_list *lvl;
2237 struct logical_volume *parent_lv;
2238 struct lv_segment *seg;
2239 uint32_t s;
2240 struct dm_list *parallel_areas;
2241
2242 if (!(parallel_areas = build_parallel_areas_from_lv(cmd, layer_lv)))
2243 return_0;
2244
2245 /* Loop through all LVs except itself */
2246 dm_list_iterate_items(lvl, &layer_lv->vg->lvs) {
2247 parent_lv = lvl->lv;
2248 if (parent_lv == layer_lv)
2249 continue;
2250
2251 /* Find all segments that point at the layer LV */
2252 dm_list_iterate_items(seg, &parent_lv->segments) {
2253 for (s = 0; s < seg->area_count; s++) {
2254 if (seg_type(seg, s) != AREA_LV ||
2255 seg_lv(seg, s) != layer_lv)
2256 continue;
2257
2258 if (!_split_parent_area(seg, s, parallel_areas))
2259 return_0;
2260 }
2261 }
2262 }
2263
2264 return 1;
2265 }
2266
2267 /* Remove a layer from the LV */
remove_layers_for_segments(struct cmd_context * cmd,struct logical_volume * lv,struct logical_volume * layer_lv,uint32_t status_mask,struct dm_list * lvs_changed)2268 int remove_layers_for_segments(struct cmd_context *cmd,
2269 struct logical_volume *lv,
2270 struct logical_volume *layer_lv,
2271 uint32_t status_mask, struct dm_list *lvs_changed)
2272 {
2273 struct lv_segment *seg, *lseg;
2274 uint32_t s;
2275 int lv_changed = 0;
2276 struct lv_list *lvl;
2277
2278 log_very_verbose("Removing layer %s for segments of %s",
2279 layer_lv->name, lv->name);
2280
2281 /* Find all segments that point at the temporary mirror */
2282 dm_list_iterate_items(seg, &lv->segments) {
2283 for (s = 0; s < seg->area_count; s++) {
2284 if (seg_type(seg, s) != AREA_LV ||
2285 seg_lv(seg, s) != layer_lv)
2286 continue;
2287
2288 /* Find the layer segment pointed at */
2289 if (!(lseg = find_seg_by_le(layer_lv, seg_le(seg, s)))) {
2290 log_error("Layer segment found: %s:%" PRIu32,
2291 layer_lv->name, seg_le(seg, s));
2292 return 0;
2293 }
2294
2295 /* Check the segment params are compatible */
2296 if (!seg_is_striped(lseg) || lseg->area_count != 1) {
2297 log_error("Layer is not linear: %s:%" PRIu32,
2298 layer_lv->name, lseg->le);
2299 return 0;
2300 }
2301 if ((lseg->status & status_mask) != status_mask) {
2302 log_error("Layer status does not match: "
2303 "%s:%" PRIu32 " status: 0x%x/0x%x",
2304 layer_lv->name, lseg->le,
2305 lseg->status, status_mask);
2306 return 0;
2307 }
2308 if (lseg->le != seg_le(seg, s) ||
2309 lseg->area_len != seg->area_len) {
2310 log_error("Layer boundary mismatch: "
2311 "%s:%" PRIu32 "-%" PRIu32 " on "
2312 "%s:%" PRIu32 " / "
2313 "%" PRIu32 "-%" PRIu32 " / ",
2314 lv->name, seg->le, seg->area_len,
2315 layer_lv->name, seg_le(seg, s),
2316 lseg->le, lseg->area_len);
2317 return 0;
2318 }
2319
2320 if (!move_lv_segment_area(seg, s, lseg, 0))
2321 return_0;
2322
2323 /* Replace mirror with error segment */
2324 if (!(lseg->segtype =
2325 get_segtype_from_string(lv->vg->cmd, "error"))) {
2326 log_error("Missing error segtype");
2327 return 0;
2328 }
2329 lseg->area_count = 0;
2330
2331 /* First time, add LV to list of LVs affected */
2332 if (!lv_changed && lvs_changed) {
2333 if (!(lvl = dm_pool_alloc(cmd->mem, sizeof(*lvl)))) {
2334 log_error("lv_list alloc failed");
2335 return 0;
2336 }
2337 lvl->lv = lv;
2338 dm_list_add(lvs_changed, &lvl->list);
2339 lv_changed = 1;
2340 }
2341 }
2342 }
2343 if (lv_changed && !lv_merge_segments(lv))
2344 stack;
2345
2346 return 1;
2347 }
2348
2349 /* Remove a layer */
remove_layers_for_segments_all(struct cmd_context * cmd,struct logical_volume * layer_lv,uint32_t status_mask,struct dm_list * lvs_changed)2350 int remove_layers_for_segments_all(struct cmd_context *cmd,
2351 struct logical_volume *layer_lv,
2352 uint32_t status_mask,
2353 struct dm_list *lvs_changed)
2354 {
2355 struct lv_list *lvl;
2356 struct logical_volume *lv1;
2357
2358 /* Loop through all LVs except the temporary mirror */
2359 dm_list_iterate_items(lvl, &layer_lv->vg->lvs) {
2360 lv1 = lvl->lv;
2361 if (lv1 == layer_lv)
2362 continue;
2363
2364 if (!remove_layers_for_segments(cmd, lv1, layer_lv,
2365 status_mask, lvs_changed))
2366 return_0;
2367 }
2368
2369 if (!lv_empty(layer_lv))
2370 return_0;
2371
2372 return 1;
2373 }
2374
_move_lv_segments(struct logical_volume * lv_to,struct logical_volume * lv_from,uint32_t set_status,uint32_t reset_status)2375 static int _move_lv_segments(struct logical_volume *lv_to,
2376 struct logical_volume *lv_from,
2377 uint32_t set_status, uint32_t reset_status)
2378 {
2379 struct lv_segment *seg;
2380
2381 dm_list_iterate_items(seg, &lv_to->segments) {
2382 if (seg->origin) {
2383 log_error("Can't move snapshot segment");
2384 return 0;
2385 }
2386 }
2387
2388 lv_to->segments = lv_from->segments;
2389 lv_to->segments.n->p = &lv_to->segments;
2390 lv_to->segments.p->n = &lv_to->segments;
2391
2392 dm_list_iterate_items(seg, &lv_to->segments) {
2393 seg->lv = lv_to;
2394 seg->status &= ~reset_status;
2395 seg->status |= set_status;
2396 }
2397
2398 dm_list_init(&lv_from->segments);
2399
2400 lv_to->le_count = lv_from->le_count;
2401 lv_to->size = lv_from->size;
2402
2403 lv_from->le_count = 0;
2404 lv_from->size = 0;
2405
2406 return 1;
2407 }
2408
2409 /* Remove a layer from the LV */
remove_layer_from_lv(struct logical_volume * lv,struct logical_volume * layer_lv)2410 int remove_layer_from_lv(struct logical_volume *lv,
2411 struct logical_volume *layer_lv)
2412 {
2413 struct logical_volume *parent;
2414 struct lv_segment *parent_seg;
2415 struct segment_type *segtype;
2416
2417 log_very_verbose("Removing layer %s for %s", layer_lv->name, lv->name);
2418
2419 if (!(parent_seg = get_only_segment_using_this_lv(layer_lv))) {
2420 log_error("Failed to find layer %s in %s",
2421 layer_lv->name, lv->name);
2422 return 0;
2423 }
2424 parent = parent_seg->lv;
2425
2426 /*
2427 * Before removal, the layer should be cleaned up,
2428 * i.e. additional segments and areas should have been removed.
2429 */
2430 if (dm_list_size(&parent->segments) != 1 ||
2431 parent_seg->area_count != 1 ||
2432 seg_type(parent_seg, 0) != AREA_LV ||
2433 layer_lv != seg_lv(parent_seg, 0) ||
2434 parent->le_count != layer_lv->le_count)
2435 return_0;
2436
2437 if (!lv_empty(parent))
2438 return_0;
2439
2440 if (!_move_lv_segments(parent, layer_lv, 0, 0))
2441 return_0;
2442
2443 /* Replace the empty layer with error segment */
2444 segtype = get_segtype_from_string(lv->vg->cmd, "error");
2445 if (!lv_add_virtual_segment(layer_lv, 0, parent->le_count, segtype))
2446 return_0;
2447
2448 return 1;
2449 }
2450
2451 /*
2452 * Create and insert a linear LV "above" lv_where.
2453 * After the insertion, a new LV named lv_where->name + suffix is created
2454 * and all segments of lv_where is moved to the new LV.
2455 * lv_where will have a single segment which maps linearly to the new LV.
2456 */
insert_layer_for_lv(struct cmd_context * cmd,struct logical_volume * lv_where,uint32_t status,const char * layer_suffix)2457 struct logical_volume *insert_layer_for_lv(struct cmd_context *cmd,
2458 struct logical_volume *lv_where,
2459 uint32_t status,
2460 const char *layer_suffix)
2461 {
2462 struct logical_volume *layer_lv;
2463 char *name;
2464 size_t len;
2465 struct segment_type *segtype;
2466 struct lv_segment *mapseg;
2467
2468 /* create an empty layer LV */
2469 len = strlen(lv_where->name) + 32;
2470 if (!(name = alloca(len))) {
2471 log_error("layer name allocation failed. "
2472 "Remove new LV and retry.");
2473 return NULL;
2474 }
2475
2476 if (dm_snprintf(name, len, "%s%s", lv_where->name, layer_suffix) < 0) {
2477 log_error("layer name allocation failed. "
2478 "Remove new LV and retry.");
2479 return NULL;
2480 }
2481
2482 if (!(layer_lv = lv_create_empty(name, NULL, LVM_READ | LVM_WRITE,
2483 ALLOC_INHERIT, lv_where->vg))) {
2484 log_error("Creation of layer LV failed");
2485 return NULL;
2486 }
2487
2488 if (lv_is_active(lv_where) && strstr(name, "_mimagetmp")) {
2489 log_very_verbose("Creating transient LV %s for mirror conversion in VG %s.", name, lv_where->vg->name);
2490
2491 segtype = get_segtype_from_string(cmd, "error");
2492
2493 if (!lv_add_virtual_segment(layer_lv, 0, lv_where->le_count, segtype)) {
2494 log_error("Creation of transient LV %s for mirror conversion in VG %s failed.", name, lv_where->vg->name);
2495 return NULL;
2496 }
2497
2498 if (!vg_write(lv_where->vg)) {
2499 log_error("Failed to write intermediate VG %s metadata for mirror conversion.", lv_where->vg->name);
2500 return NULL;
2501 }
2502
2503 if (!vg_commit(lv_where->vg)) {
2504 log_error("Failed to commit intermediate VG %s metadata for mirror conversion.", lv_where->vg->name);
2505 vg_revert(lv_where->vg);
2506 return NULL;
2507 }
2508
2509 if (!activate_lv(cmd, layer_lv)) {
2510 log_error("Failed to resume transient error LV %s for mirror conversion in VG %s.", name, lv_where->vg->name);
2511 return NULL;
2512 }
2513 }
2514
2515 log_very_verbose("Inserting layer %s for %s",
2516 layer_lv->name, lv_where->name);
2517
2518 if (!_move_lv_segments(layer_lv, lv_where, 0, 0))
2519 return_NULL;
2520
2521 if (!(segtype = get_segtype_from_string(cmd, "striped")))
2522 return_NULL;
2523
2524 /* allocate a new linear segment */
2525 if (!(mapseg = alloc_lv_segment(cmd->mem, segtype,
2526 lv_where, 0, layer_lv->le_count,
2527 status, 0, NULL, 1, layer_lv->le_count,
2528 0, 0, 0)))
2529 return_NULL;
2530
2531 /* map the new segment to the original underlying are */
2532 if (!set_lv_segment_area_lv(mapseg, 0, layer_lv, 0, 0))
2533 return_NULL;
2534
2535 /* add the new segment to the layer LV */
2536 dm_list_add(&lv_where->segments, &mapseg->list);
2537 lv_where->le_count = layer_lv->le_count;
2538 lv_where->size = lv_where->le_count * lv_where->vg->extent_size;
2539
2540 return layer_lv;
2541 }
2542
2543 /*
2544 * Extend and insert a linear layer LV beneath the source segment area.
2545 */
_extend_layer_lv_for_segment(struct logical_volume * layer_lv,struct lv_segment * seg,uint32_t s,uint32_t status)2546 static int _extend_layer_lv_for_segment(struct logical_volume *layer_lv,
2547 struct lv_segment *seg, uint32_t s,
2548 uint32_t status)
2549 {
2550 struct lv_segment *mapseg;
2551 struct segment_type *segtype;
2552 struct physical_volume *src_pv = seg_pv(seg, s);
2553 uint32_t src_pe = seg_pe(seg, s);
2554
2555 if (seg_type(seg, s) != AREA_PV && seg_type(seg, s) != AREA_LV)
2556 return_0;
2557
2558 if (!(segtype = get_segtype_from_string(layer_lv->vg->cmd, "striped")))
2559 return_0;
2560
2561 /* FIXME Incomplete message? Needs more context */
2562 log_very_verbose("Inserting %s:%" PRIu32 "-%" PRIu32 " of %s/%s",
2563 pv_dev_name(src_pv),
2564 src_pe, src_pe + seg->area_len - 1,
2565 seg->lv->vg->name, seg->lv->name);
2566
2567 /* allocate a new segment */
2568 if (!(mapseg = alloc_lv_segment(layer_lv->vg->cmd->mem, segtype,
2569 layer_lv, layer_lv->le_count,
2570 seg->area_len, status, 0,
2571 NULL, 1, seg->area_len, 0, 0, 0)))
2572 return_0;
2573
2574 /* map the new segment to the original underlying are */
2575 if (!move_lv_segment_area(mapseg, 0, seg, s))
2576 return_0;
2577
2578 /* add the new segment to the layer LV */
2579 dm_list_add(&layer_lv->segments, &mapseg->list);
2580 layer_lv->le_count += seg->area_len;
2581 layer_lv->size += seg->area_len * layer_lv->vg->extent_size;
2582
2583 /* map the original area to the new segment */
2584 if (!set_lv_segment_area_lv(seg, s, layer_lv, mapseg->le, 0))
2585 return_0;
2586
2587 return 1;
2588 }
2589
2590 /*
2591 * Match the segment area to PEs in the pvl
2592 * (the segment area boundary should be aligned to PE ranges by
2593 * _adjust_layer_segments() so that there is no partial overlap.)
2594 */
_match_seg_area_to_pe_range(struct lv_segment * seg,uint32_t s,struct pv_list * pvl)2595 static int _match_seg_area_to_pe_range(struct lv_segment *seg, uint32_t s,
2596 struct pv_list *pvl)
2597 {
2598 struct pe_range *per;
2599 uint32_t pe_start, per_end;
2600
2601 if (!pvl)
2602 return 1;
2603
2604 if (seg_type(seg, s) != AREA_PV || seg_dev(seg, s) != pvl->pv->dev)
2605 return 0;
2606
2607 pe_start = seg_pe(seg, s);
2608
2609 /* Do these PEs match to any of the PEs in pvl? */
2610 dm_list_iterate_items(per, pvl->pe_ranges) {
2611 per_end = per->start + per->count - 1;
2612
2613 if ((pe_start < per->start) || (pe_start > per_end))
2614 continue;
2615
2616 /* FIXME Missing context in this message - add LV/seg details */
2617 log_debug("Matched PE range %s:%" PRIu32 "-%" PRIu32 " against "
2618 "%s %" PRIu32 " len %" PRIu32, dev_name(pvl->pv->dev),
2619 per->start, per_end, dev_name(seg_dev(seg, s)),
2620 seg_pe(seg, s), seg->area_len);
2621
2622 return 1;
2623 }
2624
2625 return 0;
2626 }
2627
2628 /*
2629 * For each segment in lv_where that uses a PV in pvl directly,
2630 * split the segment if it spans more than one underlying PV.
2631 */
_align_segment_boundary_to_pe_range(struct logical_volume * lv_where,struct pv_list * pvl)2632 static int _align_segment_boundary_to_pe_range(struct logical_volume *lv_where,
2633 struct pv_list *pvl)
2634 {
2635 struct lv_segment *seg;
2636 struct pe_range *per;
2637 uint32_t pe_start, pe_end, per_end, stripe_multiplier, s;
2638
2639 if (!pvl)
2640 return 1;
2641
2642 /* Split LV segments to match PE ranges */
2643 dm_list_iterate_items(seg, &lv_where->segments) {
2644 for (s = 0; s < seg->area_count; s++) {
2645 if (seg_type(seg, s) != AREA_PV ||
2646 seg_dev(seg, s) != pvl->pv->dev)
2647 continue;
2648
2649 /* Do these PEs match with the condition? */
2650 dm_list_iterate_items(per, pvl->pe_ranges) {
2651 pe_start = seg_pe(seg, s);
2652 pe_end = pe_start + seg->area_len - 1;
2653 per_end = per->start + per->count - 1;
2654
2655 /* No overlap? */
2656 if ((pe_end < per->start) ||
2657 (pe_start > per_end))
2658 continue;
2659
2660 if (seg_is_striped(seg))
2661 stripe_multiplier = seg->area_count;
2662 else
2663 stripe_multiplier = 1;
2664
2665 if ((per->start != pe_start &&
2666 per->start > pe_start) &&
2667 !lv_split_segment(lv_where, seg->le +
2668 (per->start - pe_start) *
2669 stripe_multiplier))
2670 return_0;
2671
2672 if ((per_end != pe_end &&
2673 per_end < pe_end) &&
2674 !lv_split_segment(lv_where, seg->le +
2675 (per_end - pe_start + 1) *
2676 stripe_multiplier))
2677 return_0;
2678 }
2679 }
2680 }
2681
2682 return 1;
2683 }
2684
2685 /*
2686 * Scan lv_where for segments on a PV in pvl, and for each one found
2687 * append a linear segment to lv_layer and insert it between the two.
2688 *
2689 * If pvl is empty, a layer is placed under the whole of lv_where.
2690 * If the layer is inserted, lv_where is added to lvs_changed.
2691 */
insert_layer_for_segments_on_pv(struct cmd_context * cmd,struct logical_volume * lv_where,struct logical_volume * layer_lv,uint32_t status,struct pv_list * pvl,struct dm_list * lvs_changed)2692 int insert_layer_for_segments_on_pv(struct cmd_context *cmd,
2693 struct logical_volume *lv_where,
2694 struct logical_volume *layer_lv,
2695 uint32_t status,
2696 struct pv_list *pvl,
2697 struct dm_list *lvs_changed)
2698 {
2699 struct lv_segment *seg;
2700 struct lv_list *lvl;
2701 int lv_used = 0;
2702 uint32_t s;
2703
2704 log_very_verbose("Inserting layer %s for segments of %s on %s",
2705 layer_lv->name, lv_where->name,
2706 pvl ? pv_dev_name(pvl->pv) : "any");
2707
2708 if (!_align_segment_boundary_to_pe_range(lv_where, pvl))
2709 return_0;
2710
2711 /* Work through all segments on the supplied PV */
2712 dm_list_iterate_items(seg, &lv_where->segments) {
2713 for (s = 0; s < seg->area_count; s++) {
2714 if (!_match_seg_area_to_pe_range(seg, s, pvl))
2715 continue;
2716
2717 /* First time, add LV to list of LVs affected */
2718 if (!lv_used && lvs_changed) {
2719 if (!(lvl = dm_pool_alloc(cmd->mem, sizeof(*lvl)))) {
2720 log_error("lv_list alloc failed");
2721 return 0;
2722 }
2723 lvl->lv = lv_where;
2724 dm_list_add(lvs_changed, &lvl->list);
2725 lv_used = 1;
2726 }
2727
2728 if (!_extend_layer_lv_for_segment(layer_lv, seg, s,
2729 status)) {
2730 log_error("Failed to insert segment in layer "
2731 "LV %s under %s:%" PRIu32 "-%" PRIu32,
2732 layer_lv->name, lv_where->name,
2733 seg->le, seg->le + seg->len);
2734 return 0;
2735 }
2736 }
2737 }
2738
2739 return 1;
2740 }
2741
2742 /*
2743 * Initialize the LV with 'value'.
2744 */
set_lv(struct cmd_context * cmd,struct logical_volume * lv,uint64_t sectors,int value)2745 int set_lv(struct cmd_context *cmd, struct logical_volume *lv,
2746 uint64_t sectors, int value)
2747 {
2748 struct device *dev;
2749 char *name;
2750
2751 /*
2752 * FIXME:
2753 * <clausen> also, more than 4k
2754 * <clausen> say, reiserfs puts it's superblock 32k in, IIRC
2755 * <ejt_> k, I'll drop a fixme to that effect
2756 * (I know the device is at least 4k, but not 32k)
2757 */
2758 if (!(name = dm_pool_alloc(cmd->mem, PATH_MAX))) {
2759 log_error("Name allocation failed - device not cleared");
2760 return 0;
2761 }
2762 #ifdef __NetBSD__
2763 if (dm_snprintf(name, PATH_MAX, "%s%s/r%s", cmd->dev_dir,
2764 lv->vg->name, lv->name) < 0) {
2765 log_error("Name too long - device not cleared (%s)", lv->name);
2766 return 0;
2767 }
2768 #else
2769 if (dm_snprintf(name, PATH_MAX, "%s%s/%s", cmd->dev_dir,
2770 lv->vg->name, lv->name) < 0) {
2771 log_error("Name too long - device not cleared (%s)", lv->name);
2772 return 0;
2773 }
2774 #endif
2775 log_verbose("Clearing start of logical volume \"%s\"", lv->name);
2776
2777 if (!(dev = dev_cache_get(name, NULL))) {
2778 log_error("%s: not found: device not cleared", name);
2779 return 0;
2780 }
2781
2782 if (!dev_open_quiet(dev))
2783 return_0;
2784
2785 if (!sectors)
2786 sectors = UINT64_C(4096) >> SECTOR_SHIFT;
2787
2788 if (sectors > lv->size)
2789 sectors = lv->size;
2790
2791 dev_set(dev, UINT64_C(0), (size_t) sectors << SECTOR_SHIFT, value);
2792 dev_flush(dev);
2793 dev_close_immediate(dev);
2794
2795 return 1;
2796 }
2797
2798
_create_virtual_origin(struct cmd_context * cmd,struct volume_group * vg,const char * lv_name,uint32_t permission,uint64_t voriginextents)2799 static struct logical_volume *_create_virtual_origin(struct cmd_context *cmd,
2800 struct volume_group *vg,
2801 const char *lv_name,
2802 uint32_t permission,
2803 uint64_t voriginextents)
2804 {
2805 const struct segment_type *segtype;
2806 size_t len;
2807 char *vorigin_name;
2808 struct logical_volume *lv;
2809
2810 if (!(segtype = get_segtype_from_string(cmd, "zero"))) {
2811 log_error("Zero segment type for virtual origin not found");
2812 return NULL;
2813 }
2814
2815 len = strlen(lv_name) + 32;
2816 if (!(vorigin_name = alloca(len)) ||
2817 dm_snprintf(vorigin_name, len, "%s_vorigin", lv_name) < 0) {
2818 log_error("Virtual origin name allocation failed.");
2819 return NULL;
2820 }
2821
2822 if (!(lv = lv_create_empty(vorigin_name, NULL, permission,
2823 ALLOC_INHERIT, vg)))
2824 return_NULL;
2825
2826 if (!lv_extend(lv, segtype, 1, 0, 1, voriginextents, NULL, 0u, 0u,
2827 NULL, ALLOC_INHERIT))
2828 return_NULL;
2829
2830 /* store vg on disk(s) */
2831 if (!vg_write(vg) || !vg_commit(vg))
2832 return_NULL;
2833
2834 backup(vg);
2835
2836 return lv;
2837 }
2838
lv_create_single(struct volume_group * vg,struct lvcreate_params * lp)2839 int lv_create_single(struct volume_group *vg,
2840 struct lvcreate_params *lp)
2841 {
2842 struct cmd_context *cmd = vg->cmd;
2843 uint32_t size_rest;
2844 uint32_t status = 0;
2845 struct logical_volume *lv, *org = NULL;
2846 int origin_active = 0;
2847 char lv_name_buf[128];
2848 const char *lv_name;
2849 struct lvinfo info;
2850
2851 if (lp->lv_name && find_lv_in_vg(vg, lp->lv_name)) {
2852 log_error("Logical volume \"%s\" already exists in "
2853 "volume group \"%s\"", lp->lv_name, lp->vg_name);
2854 return 0;
2855 }
2856
2857 if (vg_max_lv_reached(vg)) {
2858 log_error("Maximum number of logical volumes (%u) reached "
2859 "in volume group %s", vg->max_lv, vg->name);
2860 return 0;
2861 }
2862
2863 if (lp->mirrors > 1 && !(vg->fid->fmt->features & FMT_SEGMENTS)) {
2864 log_error("Metadata does not support mirroring.");
2865 return 0;
2866 }
2867
2868 if (lp->read_ahead != DM_READ_AHEAD_AUTO &&
2869 lp->read_ahead != DM_READ_AHEAD_NONE &&
2870 (vg->fid->fmt->features & FMT_RESTRICTED_READAHEAD) &&
2871 (lp->read_ahead < 2 || lp->read_ahead > 120)) {
2872 log_error("Metadata only supports readahead values between 2 and 120.");
2873 return 0;
2874 }
2875
2876 if (lp->stripe_size > vg->extent_size) {
2877 log_error("Reducing requested stripe size %s to maximum, "
2878 "physical extent size %s",
2879 display_size(cmd, (uint64_t) lp->stripe_size),
2880 display_size(cmd, (uint64_t) vg->extent_size));
2881 lp->stripe_size = vg->extent_size;
2882 }
2883
2884 /* Need to check the vg's format to verify this - the cmd format isn't setup properly yet */
2885 if (lp->stripes > 1 &&
2886 !(vg->fid->fmt->features & FMT_UNLIMITED_STRIPESIZE) &&
2887 (lp->stripe_size > STRIPE_SIZE_MAX)) {
2888 log_error("Stripe size may not exceed %s",
2889 display_size(cmd, (uint64_t) STRIPE_SIZE_MAX));
2890 return 0;
2891 }
2892
2893 if ((size_rest = lp->extents % lp->stripes)) {
2894 log_print("Rounding size (%d extents) up to stripe boundary "
2895 "size (%d extents)", lp->extents,
2896 lp->extents - size_rest + lp->stripes);
2897 lp->extents = lp->extents - size_rest + lp->stripes;
2898 }
2899
2900 if (lp->zero && !activation()) {
2901 log_error("Can't wipe start of new LV without using "
2902 "device-mapper kernel driver");
2903 return 0;
2904 }
2905
2906 status |= lp->permission | VISIBLE_LV;
2907
2908 if (lp->snapshot) {
2909 if (!activation()) {
2910 log_error("Can't create snapshot without using "
2911 "device-mapper kernel driver");
2912 return 0;
2913 }
2914 /* FIXME Allow exclusive activation. */
2915 if (vg_is_clustered(vg)) {
2916 log_error("Clustered snapshots are not yet supported.");
2917 return 0;
2918 }
2919
2920 /* Must zero cow */
2921 status |= LVM_WRITE;
2922
2923 if (lp->voriginsize)
2924 origin_active = 1;
2925 else {
2926
2927 if (!(org = find_lv(vg, lp->origin))) {
2928 log_error("Couldn't find origin volume '%s'.",
2929 lp->origin);
2930 return 0;
2931 }
2932 if (lv_is_virtual_origin(org)) {
2933 log_error("Can't share virtual origins. "
2934 "Use --virtualsize.");
2935 return 0;
2936 }
2937 if (lv_is_cow(org)) {
2938 log_error("Snapshots of snapshots are not "
2939 "supported yet.");
2940 return 0;
2941 }
2942 if (org->status & LOCKED) {
2943 log_error("Snapshots of locked devices are not "
2944 "supported yet");
2945 return 0;
2946 }
2947 if ((org->status & MIRROR_IMAGE) ||
2948 (org->status & MIRROR_LOG)) {
2949 log_error("Snapshots of mirror %ss "
2950 "are not supported",
2951 (org->status & MIRROR_LOG) ?
2952 "log" : "image");
2953 return 0;
2954 }
2955
2956 if (!lv_info(cmd, org, &info, 0, 0)) {
2957 log_error("Check for existence of snapshot "
2958 "origin '%s' failed.", org->name);
2959 return 0;
2960 }
2961 origin_active = info.exists;
2962 }
2963 }
2964
2965 if (!lp->extents) {
2966 log_error("Unable to create new logical volume with no extents");
2967 return 0;
2968 }
2969
2970 if (!seg_is_virtual(lp) &&
2971 vg->free_count < lp->extents) {
2972 log_error("Insufficient free extents (%u) in volume group %s: "
2973 "%u required", vg->free_count, vg->name, lp->extents);
2974 return 0;
2975 }
2976
2977 if (lp->stripes > dm_list_size(lp->pvh) && lp->alloc != ALLOC_ANYWHERE) {
2978 log_error("Number of stripes (%u) must not exceed "
2979 "number of physical volumes (%d)", lp->stripes,
2980 dm_list_size(lp->pvh));
2981 return 0;
2982 }
2983
2984 if (lp->mirrors > 1 && !activation()) {
2985 log_error("Can't create mirror without using "
2986 "device-mapper kernel driver.");
2987 return 0;
2988 }
2989
2990 /* The snapshot segment gets created later */
2991 if (lp->snapshot &&
2992 !(lp->segtype = get_segtype_from_string(cmd, "striped")))
2993 return_0;
2994
2995 if (!archive(vg))
2996 return 0;
2997
2998 if (lp->lv_name)
2999 lv_name = lp->lv_name;
3000 else {
3001 if (!generate_lv_name(vg, "lvol%d", lv_name_buf, sizeof(lv_name_buf))) {
3002 log_error("Failed to generate LV name.");
3003 return 0;
3004 }
3005 lv_name = &lv_name_buf[0];
3006 }
3007
3008 if (lp->tag) {
3009 if (!(vg->fid->fmt->features & FMT_TAGS)) {
3010 log_error("Volume group %s does not support tags",
3011 vg->name);
3012 return 0;
3013 }
3014 }
3015
3016 if (lp->mirrors > 1) {
3017 init_mirror_in_sync(lp->nosync);
3018
3019 if (lp->nosync) {
3020 log_warn("WARNING: New mirror won't be synchronised. "
3021 "Don't read what you didn't write!");
3022 status |= MIRROR_NOTSYNCED;
3023 }
3024 }
3025
3026 if (!(lv = lv_create_empty(lv_name ? lv_name : "lvol%d", NULL,
3027 status, lp->alloc, vg)))
3028 return_0;
3029
3030 if (lp->read_ahead) {
3031 log_verbose("Setting read ahead sectors");
3032 lv->read_ahead = lp->read_ahead;
3033 }
3034
3035 if (lp->minor >= 0) {
3036 lv->major = lp->major;
3037 lv->minor = lp->minor;
3038 lv->status |= FIXED_MINOR;
3039 log_verbose("Setting device number to (%d, %d)", lv->major,
3040 lv->minor);
3041 }
3042
3043 if (lp->tag && !str_list_add(cmd->mem, &lv->tags, lp->tag)) {
3044 log_error("Failed to add tag %s to %s/%s",
3045 lp->tag, lv->vg->name, lv->name);
3046 return 0;
3047 }
3048
3049 if (!lv_extend(lv, lp->segtype, lp->stripes, lp->stripe_size,
3050 1, lp->extents, NULL, 0u, 0u, lp->pvh, lp->alloc))
3051 return_0;
3052
3053 if (lp->mirrors > 1) {
3054 if (!lv_add_mirrors(cmd, lv, lp->mirrors - 1, lp->stripes,
3055 adjusted_mirror_region_size(
3056 vg->extent_size,
3057 lv->le_count,
3058 lp->region_size),
3059 lp->corelog ? 0U : 1U, lp->pvh, lp->alloc,
3060 MIRROR_BY_LV |
3061 (lp->nosync ? MIRROR_SKIP_INIT_SYNC : 0))) {
3062 stack;
3063 goto revert_new_lv;
3064 }
3065 }
3066
3067 /* store vg on disk(s) */
3068 if (!vg_write(vg) || !vg_commit(vg))
3069 return_0;
3070
3071 backup(vg);
3072
3073 if (lp->snapshot) {
3074 if (!activate_lv_excl(cmd, lv)) {
3075 log_error("Aborting. Failed to activate snapshot "
3076 "exception store.");
3077 goto revert_new_lv;
3078 }
3079 } else if (!activate_lv(cmd, lv)) {
3080 if (lp->zero) {
3081 log_error("Aborting. Failed to activate new LV to wipe "
3082 "the start of it.");
3083 goto deactivate_and_revert_new_lv;
3084 }
3085 log_error("Failed to activate new LV.");
3086 return 0;
3087 }
3088
3089 if (!lp->zero && !lp->snapshot)
3090 log_error("WARNING: \"%s\" not zeroed", lv->name);
3091 else if (!set_lv(cmd, lv, UINT64_C(0), 0)) {
3092 log_error("Aborting. Failed to wipe %s.",
3093 lp->snapshot ? "snapshot exception store" :
3094 "start of new LV");
3095 goto deactivate_and_revert_new_lv;
3096 }
3097
3098 if (lp->snapshot) {
3099 /* Reset permission after zeroing */
3100 if (!(lp->permission & LVM_WRITE))
3101 lv->status &= ~LVM_WRITE;
3102
3103 /* COW area must be deactivated if origin is not active */
3104 if (!origin_active && !deactivate_lv(cmd, lv)) {
3105 log_error("Aborting. Couldn't deactivate snapshot "
3106 "COW area. Manual intervention required.");
3107 return 0;
3108 }
3109
3110 /* A virtual origin must be activated explicitly. */
3111 if (lp->voriginsize &&
3112 (!(org = _create_virtual_origin(cmd, vg, lv->name,
3113 lp->permission,
3114 lp->voriginextents)) ||
3115 !activate_lv(cmd, org))) {
3116 log_error("Couldn't create virtual origin for LV %s",
3117 lv->name);
3118 if (org && !lv_remove(org))
3119 stack;
3120 goto deactivate_and_revert_new_lv;
3121 }
3122
3123 /* cow LV remains active and becomes snapshot LV */
3124
3125 if (!vg_add_snapshot(org, lv, NULL,
3126 org->le_count, lp->chunk_size)) {
3127 log_error("Couldn't create snapshot.");
3128 goto deactivate_and_revert_new_lv;
3129 }
3130
3131 /* store vg on disk(s) */
3132 if (!vg_write(vg))
3133 return_0;
3134
3135 if (!suspend_lv(cmd, org)) {
3136 log_error("Failed to suspend origin %s", org->name);
3137 vg_revert(vg);
3138 return 0;
3139 }
3140
3141 if (!vg_commit(vg))
3142 return_0;
3143
3144 if (!resume_lv(cmd, org)) {
3145 log_error("Problem reactivating origin %s", org->name);
3146 return 0;
3147 }
3148 }
3149 /* FIXME out of sequence */
3150 backup(vg);
3151
3152 log_print("Logical volume \"%s\" created", lv->name);
3153
3154 /*
3155 * FIXME: as a sanity check we could try reading the
3156 * last block of the device ?
3157 */
3158
3159 return 1;
3160
3161 deactivate_and_revert_new_lv:
3162 if (!deactivate_lv(cmd, lv)) {
3163 log_error("Unable to deactivate failed new LV. "
3164 "Manual intervention required.");
3165 return 0;
3166 }
3167
3168 revert_new_lv:
3169 /* FIXME Better to revert to backup of metadata? */
3170 if (!lv_remove(lv) || !vg_write(vg) || !vg_commit(vg))
3171 log_error("Manual intervention may be required to remove "
3172 "abandoned LV(s) before retrying.");
3173 else
3174 backup(vg);
3175
3176 return 0;
3177 }
3178
3179