Lines Matching refs:lv

44  * Returns true if the lv is temporary mirror layer for resync
46 int is_temporary_mirror_layer(const struct logical_volume *lv)
48 if (lv->status & MIRROR_IMAGE
49 && lv->status & MIRRORED
50 && !(lv->status & LOCKED))
60 struct logical_volume *find_temporary_mirror(const struct logical_volume *lv)
64 if (!(lv->status & MIRRORED))
67 seg = first_seg(lv);
80 uint32_t lv_mirror_count(const struct logical_volume *lv)
85 if (!(lv->status & MIRRORED))
88 seg = first_seg(lv);
105 mirror_seg = get_only_segment_using_this_lv(seg->lv);
108 log_error("Failed to find mirror_seg for %s", seg->lv->name);
114 mirror_seg->lv->name, seg->lv->name);
189 * This function writes a new header to the mirror log header to the lv
193 static int _write_log_header(struct cmd_context *cmd, struct logical_volume *lv)
209 lv->name);
214 lv->vg->name, lv->name) < 0) {
215 log_error("Name too long - log header not written (%s)", lv->name);
219 log_verbose("Writing log header to device, %s", lv->name);
353 static int _delete_lv(struct logical_volume *mirror_lv, struct logical_volume *lv)
359 if (!str_list_match_list(&mirror_lv->tags, &lv->tags)) {
361 if (!str_list_add(cmd->mem, &lv->tags, sl->str)) {
373 if (!activate_lv(cmd, lv))
376 if (!deactivate_lv(cmd, lv))
379 if (!lv_remove(lv))
385 static int _merge_mirror_images(struct logical_volume *lv,
400 img_lvs[i++] = lvl->lv;
402 return lv_add_mirror_lvs(lv, img_lvs, addition,
403 MIRROR_IMAGE, first_seg(lv)->region_size);
489 static int _remove_mirror_images(struct logical_volume *lv,
500 struct lv_segment *mirrored_seg = first_seg(lv);
543 if (!(lvl = dm_pool_alloc(lv->vg->cmd->mem, sizeof(*lvl)))) {
547 lvl->lv = seg_lv(mirrored_seg, m);
554 /* As an exceptional case, if the lv is temporary layer,
557 if (new_area_count == 1 && !is_temporary_mirror_layer(lv)) {
562 if (!remove_layer_from_lv(lv, lv1))
564 lv->status &= ~MIRRORED;
565 lv->status &= ~MIRROR_NOTSYNCED;
566 if (collapse && !_merge_mirror_images(lv, &tmp_orphan_lvs)) {
571 log_very_verbose("All mimages of %s are gone", lv->name);
576 lv->status &= ~MIRRORED;
577 lv->status &= ~MIRROR_NOTSYNCED;
578 if (!replace_lv_with_error_segment(lv))
589 if (!vg_write(mirrored_seg->lv->vg)) {
594 if (!suspend_lv(mirrored_seg->lv->vg->cmd, mirrored_seg->lv)) {
595 log_error("Failed to lock %s", mirrored_seg->lv->name);
596 vg_revert(mirrored_seg->lv->vg);
600 if (!vg_commit(mirrored_seg->lv->vg)) {
601 resume_lv(mirrored_seg->lv->vg->cmd, mirrored_seg->lv);
605 log_very_verbose("Updating \"%s\" in kernel", mirrored_seg->lv->name);
610 * As it's now detached from mirrored_seg->lv we must resume it
632 if (!resume_lv(mirrored_seg->lv->vg->cmd, mirrored_seg->lv)) {
633 log_error("Problem reactivating %s", mirrored_seg->lv->name);
640 if (!_delete_lv(lv, lvl->lv))
644 if (lv1 && !_delete_lv(lv, lv1))
647 if (detached_log_lv && !_delete_lv(lv, detached_log_lv))
651 if (new_area_count == 1 && is_temporary_mirror_layer(lv)) {
652 if (first_seg(lv)->log_lv &&
653 !_init_mirror_log(lv->vg->cmd, first_seg(lv)->log_lv,
654 1, &lv->tags, 0)) {
666 old_area_count - num_removed, lv->name);
674 int remove_mirror_images(struct logical_volume *lv, uint32_t num_mirrors,
678 uint32_t existing_mirrors = lv_mirror_count(lv);
679 struct logical_volume *next_lv = lv;
709 existing_mirrors - lv_mirror_count(lv),
718 static int _mirrored_lv_in_sync(struct logical_volume *lv)
723 if (!lv_mirror_percent(lv->vg->cmd, lv, 0, &sync_percent,
726 lv->vg->name, lv->name);
744 int collapse_mirrored_lv(struct logical_volume *lv)
749 while ((tmp_lv = find_temporary_mirror(lv))) {
757 if (!_mirrored_lv_in_sync(mirror_seg->lv)) {
759 mirror_seg->lv->name);
763 if (!_remove_mirror_images(mirror_seg->lv,
829 struct logical_volume *lv = mirrored_seg->lv;
835 mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
839 num_mirrors - 1, lv->vg->name, lv->name);
842 num_mirrors - 1, lv->vg->name, lv->name);
856 lv->vg->name, lv->name);
859 mirrored_seg->area_count - 1 , lv->vg->name, lv->name);
876 in_sync = _mirrored_lv_in_sync(mirrored_seg->lv);
885 r = _remove_mirror_images(mirrored_seg->lv, old_num_mirrors - num_mirrors,
892 mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
894 log_policy = get_mirror_log_fault_policy(mirrored_seg->lv->vg->cmd);
895 dev_policy = get_mirror_device_fault_policy(mirrored_seg->lv->vg->cmd);
905 mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
909 mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
914 mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
917 mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
928 struct logical_volume *lv,
935 len = strlen(lv->name) + 32;
942 if (dm_snprintf(img_name, len, "%s_mimage_%%d", lv->name) < 0) {
951 ALLOC_INHERIT, lv->vg))) {
958 get_segtype_from_string(lv->vg->cmd,
977 int remove_mirrors_from_segments(struct logical_volume *lv,
984 dm_list_iterate_items(seg, &lv->segments) {
987 lv->name, seg->le);
991 " status:0x%x/0x%x", lv->name, seg->le,
998 dm_list_iterate_items(seg, &lv->segments) {
1010 seg->segtype = get_segtype_from_string(lv->vg->cmd,
1032 const char *get_pvmove_pvname_from_lv(struct logical_volume *lv)
1037 dm_list_iterate_items(seg, &lv->segments) {
1053 struct logical_volume *lv;
1058 lv = lvl->lv;
1060 if (!(lv->status & lv_type))
1064 dm_list_iterate_items(seg, &lv->segments) {
1069 return lv;
1091 struct logical_volume *lv)
1108 lv1 = lvl1->lv;
1109 if (lv1 == lv)
1116 seg_lv(seg, s) != lv)
1122 lvl->lv = lv1;
1168 dm_list_iterate_items(seg, &lvl->lv->segments) {
1184 int add_mirrors_to_segments(struct cmd_context *cmd, struct logical_volume *lv,
1194 if (!(parallel_areas = build_parallel_areas_from_lv(cmd, lv)))
1200 adjusted_region_size = adjusted_mirror_region_size(lv->vg->extent_size,
1201 lv->le_count,
1204 if (!(ah = allocate_extents(lv->vg, NULL, segtype, 1, mirrors, 0, 0,
1205 lv->le_count, allocatable_pvs, alloc,
1207 log_error("Unable to allocate mirror extents for %s.", lv->name);
1211 if (!lv_add_mirror_areas(ah, lv, 0, adjusted_region_size)) {
1212 log_error("Failed to add mirror areas to %s", lv->name);
1226 struct logical_volume *lv,
1232 struct volume_group *vg = lv->vg;
1235 if (dm_list_size(&lv->segments) != 1) {
1241 if (lv_info(cmd, lv, &info, 0, 0) && info.exists) {
1242 if (!lv_mirror_percent(cmd, lv, 0, &sync_percent,
1249 "cluster mirror, %s", lv->name);
1262 lv->status &= ~MIRROR_NOTSYNCED;
1266 if (!remove_mirror_images(lv, lv_mirror_count(lv),
1273 static struct logical_volume *_create_mirror_log(struct logical_volume *lv,
1296 alloc, lv->vg)))
1307 struct logical_volume *lv,
1331 * o lv->name, if the log is temporary
1334 seg = first_seg(lv);
1337 lv_name = lv->name;
1339 } else if ((c = strstr(lv->name, MIRROR_SYNC_LAYER))) {
1340 len = c - lv->name + 1;
1342 !dm_snprintf(lv_name, len, "%s", lv->name)) {
1348 lv_name = lv->name;
1352 if (!(log_lv = _create_mirror_log(lv, ah, alloc,
1358 if (!_init_mirror_log(cmd, log_lv, in_sync, &lv->tags, 1)) {
1374 int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
1394 if (dm_list_size(&lv->segments) != 1) {
1404 if (vg_is_clustered(lv->vg) &&
1405 !(lv_info(cmd, lv, &info, 0, 0) && info.exists)) {
1407 "cluster mirror %s", lv->name);
1411 if (!(parallel_areas = build_parallel_areas_from_lv(cmd, lv)))
1425 ah = allocate_extents(lv->vg, NULL, segtype,
1434 if (lv_mirror_percent(cmd, lv, 0, &sync_percent, &percent_range,
1441 if (!(log_lv = _set_up_mirror_log(cmd, ah, lv, log_count,
1445 if (!attach_mirror_log(first_seg(lv), log_lv))
1457 int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
1477 if (!(parallel_areas = build_parallel_areas_from_lv(cmd, lv)))
1483 ah = allocate_extents(lv->vg, NULL, segtype,
1484 stripes, mirrors, log_count, region_size, lv->le_count,
1495 !(log_lv = _set_up_mirror_log(cmd, ah, lv, log_count, region_size,
1508 if (dm_list_size(&lv->segments) != 1 ||
1509 seg_type(first_seg(lv), 0) != AREA_LV)
1510 if (!insert_layer_for_lv(cmd, lv, 0, "_mimage_%d"))
1522 if (!_create_mimage_lvs(ah, mirrors, lv, img_lvs))
1525 if (!lv_add_mirror_lvs(lv, img_lvs, mirrors,
1526 MIRROR_IMAGE | (lv->status & LOCKED),
1533 if (log_count && !attach_mirror_log(first_seg(lv), log_lv))
1559 int lv_add_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
1591 return add_mirrors_to_segments(cmd, lv, mirrors,
1595 return add_mirror_log(cmd, lv, log_count,
1597 return add_mirror_images(cmd, lv, mirrors,
1612 struct logical_volume *lv,
1624 seg = first_seg(lv);
1630 if (lv_mirror_count(lv) <= mirrors) {
1635 new_mirrors = lv_mirror_count(lv) - mirrors - 1;
1640 return remove_mirror_images(lv, new_mirrors + 1,
1649 return remove_mirrors_from_segments(lv, new_mirrors, status_mask);