diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2017-02-23 14:43:44 +0100 |
---|---|---|
committer | Heinz Mauelshagen <heinzm@redhat.com> | 2017-02-23 14:43:44 +0100 |
commit | d98932039f81e83b3690506a1d92cabd90610f92 (patch) | |
tree | c7bc22168bd93a2994d8178fd7ac17575c0fdafd | |
parent | efecf4a1d265e212c91141477860e46d0adeffa3 (diff) | |
download | lvm2-dev-lvmguy-add-more-raid-features.tar.gz |
raid: ad '.' to messages. lvchange --writemostly prevention during initial syncdev-lvmguy-add-more-raid-features
-rw-r--r-- | lib/metadata/metadata-exported.h | 1 | ||||
-rw-r--r-- | lib/metadata/raid_manip.c | 132 | ||||
-rw-r--r-- | test/shell/lvchange-raid1-writemostly.sh | 41 | ||||
-rw-r--r-- | test/shell/lvconvert-linear_to_striped.sh | 63 | ||||
-rw-r--r-- | test/shell/lvconvert-raid-reshape.sh | 6 | ||||
-rw-r--r-- | test/shell/lvconvert-striped_to_linear.sh | 65 | ||||
-rw-r--r-- | tools/lvchange.c | 16 |
7 files changed, 131 insertions, 193 deletions
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index b6fe2e9ec..52c12f03d 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -1241,6 +1241,7 @@ uint32_t raid_ensure_min_region_size(const struct logical_volume *lv, uint64_t r int lv_raid_change_region_size(struct logical_volume *lv, int yes, int force, uint32_t new_region_size); uint32_t lv_raid_data_copies(const struct segment_type *segtype, uint32_t area_count); +int lv_raid_in_sync(const struct logical_volume *lv); /* -- metadata/raid_manip.c */ /* ++ metadata/cache_manip.c */ diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c index 89ac8ce9b..e5e05f7d5 100644 --- a/lib/metadata/raid_manip.c +++ b/lib/metadata/raid_manip.c @@ -264,12 +264,12 @@ static int _get_dev_health(struct logical_volume *lv, uint32_t *kernel_devs, *devs_health = *devs_in_sync = 0; if (!lv_raid_dev_count(lv, kernel_devs)) { - log_error("Failed to get device count"); + log_error("Failed to get device count."); return_0; } if (!lv_raid_dev_health(lv, &rh)) { - log_error("Failed to get device health"); + log_error("Failed to get device health."); return_0; } @@ -313,7 +313,7 @@ static int _devs_in_sync_count(struct logical_volume *lv) * Returns: 1 if in-sync, 0 otherwise. */ #define _RAID_IN_SYNC_RETRIES 10 -static int _raid_in_sync(struct logical_volume *lv) +static int _raid_in_sync(const struct logical_volume *lv) { int retries = _RAID_IN_SYNC_RETRIES; dm_percent_t sync_percent; @@ -344,6 +344,12 @@ static int _raid_in_sync(struct logical_volume *lv) return (sync_percent == DM_PERCENT_100) ? 1 : 0; } +/* External interface to raid in-sync check */ +int lv_raid_in_sync(const struct logical_volume *lv) +{ + return _raid_in_sync(lv); +} + /* Check if RaidLV @lv is synced or any raid legs of @lv are not synced */ static int _raid_devs_sync_healthy(struct logical_volume *lv) { @@ -510,7 +516,7 @@ static int _clear_lv(struct logical_volume *lv) * to remove the superblock of any previous RAID devices. It is much * quicker than wiping a potentially larger metadata device completely. */ - log_verbose("Clearing metadata area of %s", display_lvname(lv)); + log_verbose("Clearing metadata area of %s.", display_lvname(lv)); offset = (pv->pe_start + seg_pe(seg, 0) * lv->vg->extent_size) << 9; return dev_set(pv->dev, offset, 4096, 0); @@ -604,7 +610,7 @@ static int _reorder_raid10_near_seg_areas(struct lv_segment *seg, enum raid0_rai /* FIXME: once more data copies supported with raid10 */ if (seg_is_raid10_near(seg) && (stripes % data_copies)) { - log_error("Can't convert %s LV %s with number of stripes not divisable by number of data copies", + log_error("Can't convert %s LV %s with number of stripes not divisable by number of data copies.", lvseg_name(seg), display_lvname(seg->lv)); return 0; } @@ -743,7 +749,7 @@ static int _shift_and_rename_image_components(struct lv_segment *seg) for (s = 0, missing = 0; s < seg->area_count; s++) { if (seg_type(seg, s) == AREA_UNASSIGNED) { if (seg_metatype(seg, s) != AREA_UNASSIGNED) { - log_error(INTERNAL_ERROR "Metadata segment area" + log_error(INTERNAL_ERROR "Metadata segment area." " #%d should be AREA_UNASSIGNED.", s); return 0; } @@ -1305,7 +1311,7 @@ static int _lv_alloc_reshape_space(struct logical_volume *lv, /* Get data_offset and dev_sectors from the kernel */ if (!lv_raid_data_offset(lv, &data_offset)) { - log_error("Can't get data offset and dev size for %s from kernel", + log_error("Can't get data offset and dev size for %s from kernel.", display_lvname(lv)); return 0; } @@ -1381,7 +1387,7 @@ static int _lv_alloc_reshape_space(struct logical_volume *lv, break; default: - log_error(INTERNAL_ERROR "Bogus reshape space allocation request"); + log_error(INTERNAL_ERROR "Bogus reshape space allocation request."); return 0; } @@ -1580,12 +1586,12 @@ static int _raid_reshape_add_images(struct logical_volume *lv, vg = lv->vg; if (!lv_info(vg->cmd, lv, 0, &info, 1, 0) && driver_version(NULL, 0)) { - log_error("lv_info failed: aborting"); + log_error("lv_info failed: aborting."); return 0; } if (seg->segtype != new_segtype) - log_print_unless_silent("Ignoring layout change on device adding reshape"); + log_print_unless_silent("Ignoring layout change on device adding reshape."); if (seg_is_any_raid10(seg) && (new_image_count % seg->data_copies)) { log_error("Can't reshape %s LV %s to odd number of stripes.", @@ -1602,7 +1608,7 @@ static int _raid_reshape_add_images(struct logical_volume *lv, "will grow it from %u to %u extents!", info.open_count ? " and open" : "", display_lvname(lv), current_le_count, grown_le_count); - log_print_unless_silent("Run \"lvresize -l%u %s\" to shrink it or use the additional capacity", + log_print_unless_silent("Run \"lvresize -l%u %s\" to shrink it or use the additional capacity.", current_le_count, display_lvname(lv)); if (!yes && yes_no_prompt("Are you sure you want to add %u images to %s LV %s? [y/n]: ", new_image_count - old_image_count, lvseg_name(seg), display_lvname(lv)) == 'n') { @@ -1612,7 +1618,7 @@ static int _raid_reshape_add_images(struct logical_volume *lv, //printf("%s[%u] lv=%s segtype=%s data_copies=%u lv_size=%s le_count=%u\n", __func__, __LINE__, display_lvname(lv), lvseg_name(seg), seg->data_copies, display_size(lv->vg->cmd, lv->size), lv->le_count); /* Allocate new image component pairs for the additional stripes and grow LV size */ - log_debug_metadata("Adding %u data and metadata image LV pair%s to %s", + log_debug_metadata("Adding %u data and metadata image LV pair%s to %s.", new_image_count - old_image_count, new_image_count - old_image_count > 1 ? "s" : "", display_lvname(lv)); if (!_lv_raid_change_image_count(lv, new_image_count, allocate_pvs, NULL, 0, 0)) @@ -1625,7 +1631,7 @@ static int _raid_reshape_add_images(struct logical_volume *lv, } /* Allocate forward out of place reshape space at the beginning of all data image LVs */ - log_debug_metadata("(Re)allocating reshape space for %s", display_lvname(lv)); + log_debug_metadata("(Re)allocating reshape space for %s.", display_lvname(lv)); if (!_lv_alloc_reshape_space(lv, alloc_begin, NULL, allocate_pvs)) return 0; @@ -1636,7 +1642,7 @@ static int _raid_reshape_add_images(struct logical_volume *lv, * - set delta disks plus flag on new image LVs */ if (old_image_count < seg->area_count) { - log_debug_metadata("Setting delta disk flag on new data LVs of %s", + log_debug_metadata("Setting delta disk flag on new data LVs of %s.", display_lvname(lv)); for (s = old_image_count; s < seg->area_count; s++) { slv = seg_lv(seg, s); @@ -1671,7 +1677,7 @@ static int _raid_reshape_remove_images(struct logical_volume *lv, struct lvinfo info = { 0 }; if (seg_is_any_raid6(seg) && new_stripes < 3) { - log_error("Minimum 3 stripes required for %s LV %s", + log_error("Minimum 3 stripes required for %s LV %s.", lvseg_name(seg), display_lvname(lv)); return 0; } @@ -1692,10 +1698,10 @@ static int _raid_reshape_remove_images(struct logical_volume *lv, * */ if (seg->segtype != new_segtype) - log_print_unless_silent("Ignoring layout change on device removing reshape"); + log_print_unless_silent("Ignoring layout change on device removing reshape."); if (!lv_info(lv->vg->cmd, lv, 0, &info, 1, 0) && driver_version(NULL, 0)) { - log_error("lv_info failed: aborting"); + log_error("lv_info failed: aborting."); return 0; } @@ -1722,7 +1728,7 @@ static int _raid_reshape_remove_images(struct logical_volume *lv, new_stripes, display_lvname(lv)); if (!force) { - log_warn("WARNING: Can't remove stripes without --force option"); + log_warn("WARNING: Can't remove stripes without --force option."); return 0; } @@ -1763,7 +1769,7 @@ static int _raid_reshape_remove_images(struct logical_volume *lv, struct logical_volume *slv; if (!seg_lv(seg, s) || !(slv = seg_lv(seg, s))) { - log_error("Missing image sub lv off LV %s", display_lvname(lv)); + log_error("Missing image sub lv off LV %s.", display_lvname(lv)); return 0; } @@ -1774,12 +1780,12 @@ static int _raid_reshape_remove_images(struct logical_volume *lv, } if (devs_in_sync != new_image_count) { - log_error("No correct kernel/lvm active LV count on %s", display_lvname(lv)); + log_error("No correct kernel/lvm active LV count on %s.", display_lvname(lv)); return 0; } if (active_lvs + removed_lvs != old_image_count) { - log_error ("No correct kernel/lvm total LV count on %s", display_lvname(lv)); + log_error ("No correct kernel/lvm total LV count on %s.", display_lvname(lv)); return 0; } @@ -1789,7 +1795,7 @@ static int _raid_reshape_remove_images(struct logical_volume *lv, return 0; } - log_debug_metadata("Removing %u data and metadata image LV pair%s from %s", + log_debug_metadata("Removing %u data and metadata image LV pair%s from %s.", old_image_count - new_image_count, old_image_count - new_image_count > 1 ? "s" : "", display_lvname(lv)); if (!_lv_raid_change_image_count(lv, new_image_count, allocate_pvs, removal_lvs, 0, 0)) @@ -1825,7 +1831,7 @@ static int _raid_reshape_keep_images(struct logical_volume *lv, struct lv_segment *seg = first_seg(lv); if (seg->segtype != new_segtype) - log_print_unless_silent("Converting %s LV %s to %s", + log_print_unless_silent("Converting %s LV %s to %s.", lvseg_name(seg), display_lvname(lv), new_segtype->name); if (!yes && yes_no_prompt("Are you sure you want to convert %s LV %s? [y/n]: ", lvseg_name(seg), display_lvname(lv)) == 'n') { @@ -1866,20 +1872,20 @@ static int _vg_write_lv_suspend_commit_backup(struct volume_group *vg, int r = 1; if (!vg_write(vg)) { - log_error("Write of VG %s failed", vg->name); + log_error("Write of VG %s failed.", vg->name); return_0; } if (lv && !(r = (origin_only ? suspend_lv_origin(vg->cmd, lv_lock_holder(lv)) : suspend_lv(vg->cmd, lv_lock_holder(lv))))) { - log_error("Failed to suspend %s before committing changes", + log_error("Failed to suspend %s before committing changes.", display_lvname(lv)); vg_revert(lv->vg); } else if (!(r = vg_commit(vg))) stack; /* !vg_commit() has implicit vg_revert() */ if (r && do_backup && !backup(vg)) - log_error("Backup of VG %s failed; continuing", vg->name); + log_error("Backup of VG %s failed; continuing.", vg->name); return r; } @@ -1919,7 +1925,7 @@ static int _activate_sub_lvs_excl_local(struct logical_volume *lv, uint32_t star struct lv_segment *seg = first_seg(lv); /* seg->area_count may be 0 here! */ - log_debug_metadata("Activating %u image component%s of LV %s", + log_debug_metadata("Activating %u image component%s of LV %s.", seg->area_count - start_idx, seg->meta_areas ? " pairs" : "s", display_lvname(lv)); for (s = start_idx; s < seg->area_count; s++) @@ -2022,7 +2028,7 @@ static int _raid_reshape(struct logical_volume *lv, return_0; if (!_raid_in_sync(lv)) { - log_error("Unable to convert %s while it is not in-sync", + log_error("Unable to convert %s while it is not in-sync.", display_lvname(lv)); return 0; } @@ -2040,15 +2046,15 @@ static int _raid_reshape(struct logical_volume *lv, * user requests this to remove any reshape space from the @lv */ if (!_lv_free_reshape_space_with_status(lv, &where_it_was)) { - log_error(INTERNAL_ERROR "Failed to free reshape space of %s", + log_error(INTERNAL_ERROR "Failed to free reshape space of %s.", display_lvname(lv)); return 0; } - log_print_unless_silent("No change in RAID LV %s layout, freeing reshape space", display_lvname(lv)); + log_print_unless_silent("No change in RAID LV %s layout, freeing reshape space.", display_lvname(lv)); if (where_it_was == alloc_none) { - log_print_unless_silent("LV %s does not have reshape space allocated", + log_print_unless_silent("LV %s does not have reshape space allocated.", display_lvname(lv)); return 1; } @@ -2069,7 +2075,7 @@ static int _raid_reshape(struct logical_volume *lv, too_few = 1; if (too_few) { - log_error("Too few stripes requested"); + log_error("Too few stripes requested."); return 0; } @@ -2081,7 +2087,7 @@ static int _raid_reshape(struct logical_volume *lv, * Check for device health */ if (devs_in_sync < devs_health) { - log_error("Can't reshape out of sync LV %s", display_lvname(lv)); + log_error("Can't reshape out of sync LV %s.", display_lvname(lv)); return 0; } @@ -2105,7 +2111,7 @@ static int _raid_reshape(struct logical_volume *lv, } if (seg->stripe_size != new_stripe_size) - log_print_unless_silent("Converting stripesize %s of %s LV %s to %s", + log_print_unless_silent("Converting stripesize %s of %s LV %s to %s.", display_size(lv->vg->cmd, seg->stripe_size), lvseg_name(seg), display_lvname(lv), display_size(lv->vg->cmd, new_stripe_size)); @@ -2199,7 +2205,7 @@ static int _reshape_requested(const struct logical_volume *lv, const struct segm !seg_is_any_raid0(seg) && (region_size || stripe_size) && ((region_size ?: seg->region_size) < (stripe_size ?: seg->stripe_size))) { - log_error("region size may not be smaller than stripe size on LV %s", + log_error("region size may not be smaller than stripe size on LV %s.", display_lvname(lv)); return 2; } @@ -2212,7 +2218,7 @@ static int _reshape_requested(const struct logical_volume *lv, const struct segm (seg_is_raid10_far(seg) && !segtype_is_striped(segtype))) { if (data_copies == seg->data_copies && region_size == seg->region_size) { - log_error("Can't convert %sraid10_far", + log_error("Can't convert %sraid10_far.", seg_is_raid10_far(seg) ? "" : "to "); goto err; } @@ -2220,12 +2226,12 @@ static int _reshape_requested(const struct logical_volume *lv, const struct segm if (seg_is_raid10_far(seg)) { if (stripes != _data_rimages_count(seg, seg->area_count)) { - log_error("Can't change stripes in raid10_far"); + log_error("Can't change stripes in raid10_far."); goto err; } if (stripe_size != seg->stripe_size) { - log_error("Can't change stripe size in raid10_far"); + log_error("Can't change stripe size in raid10_far."); goto err; } } @@ -2245,7 +2251,7 @@ static int _reshape_requested(const struct logical_volume *lv, const struct segm return segtype_is_raid10_far(segtype) ? 1 : 0; if (seg_is_raid10_offset(seg)) { - log_error("Can't change number of data copies on %s LV %s", + log_error("Can't change number of data copies on %s LV %s.", lvseg_name(seg), display_lvname(lv)); goto err; } @@ -2300,9 +2306,9 @@ static int _reshape_requested(const struct logical_volume *lv, const struct segm err: #if 0 if (lv_is_duplicated(lv)) - log_error("Conversion of duplicating sub LV %s rejected", display_lvname(lv)); + log_error("Conversion of duplicating sub LV %s rejected.", display_lvname(lv)); else - log_error("Use \"lvconvert --duplicate --type %s ... %s", segtype->name, display_lvname(lv)); + log_error("Use \"lvconvert --duplicate --type %s ... %s.", segtype->name, display_lvname(lv)); #endif return 2; } @@ -2738,12 +2744,12 @@ static int _raid_extract_images(struct logical_volume *lv, * cannot honor that list because error LVs * must come first. */ - log_error("%s has components with error targets" + log_error("%s has components with error targets." " that must be removed first: %s.", display_lvname(lv), display_lvname(seg_lv(seg, s))); - log_error("Try removing the PV list and rerun" + log_error("Try removing the PV list and rerun." " the command."); return 0; } @@ -2762,7 +2768,7 @@ static int _raid_extract_images(struct logical_volume *lv, */ if (!_raid_devs_sync_healthy(lv) && (!seg_is_mirrored(seg) || (s == 0 && !force))) { - log_error("Unable to extract %sRAID image" + log_error("Unable to extract %sRAID image." " while RAID array is not in-sync%s.", seg_is_mirrored(seg) ? "primary " : "", seg_is_mirrored(seg) ? " (use --force option to replace)" : ""); @@ -3624,7 +3630,7 @@ static int _lv_update_reload_fns_reset_eliminate_lvs(struct logical_volume *lv, /* Call any efn_pre_on_lv before the first update and reload call (e.g. to rename LVs) */ if (fn_pre_on_lv && !(r = fn_pre_on_lv(lv, fn_pre_data))) { - log_error(INTERNAL_ERROR "Pre callout function failed"); + log_error(INTERNAL_ERROR "Pre callout function failed."); goto err; } @@ -3635,7 +3641,7 @@ static int _lv_update_reload_fns_reset_eliminate_lvs(struct logical_volume *lv, */ if (!(origin_only ? resume_lv_origin(lv->vg->cmd, lv_lock_holder(lv)) : resume_lv(lv->vg->cmd, lv_lock_holder(lv)))) { - log_error("Failed to resume %s", display_lvname(lv)); + log_error("Failed to resume %s.", display_lvname(lv)); goto err; } @@ -3656,20 +3662,20 @@ static int _lv_update_reload_fns_reset_eliminate_lvs(struct logical_volume *lv, * Writes and commits metadata if any flags have been reset * and if successful, performs metadata backup. */ - log_debug_metadata("Clearing any flags for %s passed to the kernel", display_lvname(lv)); + log_debug_metadata("Clearing any flags for %s passed to the kernel.", display_lvname(lv)); if (!_reset_flags_passed_to_kernel(lv, &flags_reset)) goto err; /* Call any @fn_post_on_lv before the second update call (e.g. to rename LVs back) */ if (fn_post_on_lv && !(r = fn_post_on_lv(lv, fn_post_data))) { - log_error("Post callout function failed"); + log_error("Post callout function failed."); goto err; } /* Update and reload to clear out reset flags in the metadata and in the kernel */ - log_debug_metadata("Updating metadata mappings for %s", display_lvname(lv)); + log_debug_metadata("Updating metadata mappings for %s.", display_lvname(lv)); if ((r != 2 || flags_reset) && !(origin_only ? lv_update_and_reload_origin(lv) : lv_update_and_reload(lv))) { - log_error(INTERNAL_ERROR "Update of LV %s failed", display_lvname(lv)); + log_error(INTERNAL_ERROR "Update of LV %s failed.", display_lvname(lv)); goto err; } @@ -4389,7 +4395,7 @@ static int _log_possible_conversion(uint64_t *processed_segtypes, void *data) if (!(~*processed_segtypes & segtype->flags)) return 1; - log_error(" %s", segtype->name); + log_error(" %s.", segtype->name); *processed_segtypes |= segtype->flags; @@ -4788,7 +4794,7 @@ static int _takeover_downconvert_wrapper(TAKEOVER_FN_ARGS) } if (seg_is_any_raid10(seg) && (seg->area_count % seg->data_copies)) { - log_error("Can't convert %s LV %s to %s with odd number of stripes", + log_error("Can't convert %s LV %s to %s with odd number of stripes.", lvseg_name(seg), display_lvname(lv), new_segtype->name); return 0; } @@ -4835,7 +4841,7 @@ static int _takeover_downconvert_wrapper(TAKEOVER_FN_ARGS) return 0; } else if (seg_is_raid10_near(seg)) { - log_debug_metadata("Reordering areas for raid10 -> raid0 takeover"); + log_debug_metadata("Reordering areas for raid10 -> raid0 takeover."); if (!_reorder_raid10_near_seg_areas(seg, reorder_from_raid10_near)) return 0; } @@ -5022,7 +5028,7 @@ static int _takeover_upconvert_wrapper(TAKEOVER_FN_ARGS) } if (seg_is_any_raid5(seg) && segtype_is_any_raid6(new_segtype) && seg->area_count < 4) { - log_error("Minimum of 3 stripes needed for conversion from %s to %s", + log_error("Minimum of 3 stripes needed for conversion from %s to %s.", lvseg_name(seg), new_segtype->name); return 0; } @@ -5114,7 +5120,7 @@ static int _takeover_upconvert_wrapper(TAKEOVER_FN_ARGS) /* FIXME: raid10 ; needs to change once more than 2 data copies! */ seg->data_copies = 2; - log_debug_metadata("Reordering areas for raid0 -> raid10 takeover"); + log_debug_metadata("Reordering areas for raid0 -> raid10 takeover."); if (!_reorder_raid10_near_seg_areas(seg, reorder_to_raid10_near)) return 0; /* Set rebuild flags accordingly */ @@ -5711,7 +5717,7 @@ replaced: if (!yes && yes_no_prompt("Do you want to convert %s LV %s to %s? [y/n]: ", segtype_sav->name, display_lvname(seg_from->lv), (*segtype)->name) == 'n') { - log_error("Logical volume %s NOT converted", display_lvname(seg_from->lv)); + log_error("Logical volume %s NOT converted.", display_lvname(seg_from->lv)); return 0; } @@ -5768,7 +5774,7 @@ static int _region_size_change_requested(struct logical_volume *lv, int yes, con if (!yes && yes_no_prompt("Do you really want to change the region_size %s of LV %s to %s? [y/n]: ", display_size(lv->vg->cmd, old_region_size), display_lvname(lv), seg_region_size_str) == 'n') { - log_error("Logical volume %s NOT converted", display_lvname(lv)); + log_error("Logical volume %s NOT converted.", display_lvname(lv)); return 0; } @@ -5818,19 +5824,19 @@ static int _conversion_options_allowed(const struct lv_segment *seg_from, } if (stripes > 1 && !(opts & ALLOW_STRIPES)) { - if (!_log_prohibited_option(seg_from, *segtype_to, "--stripes")) + if (!_log_prohibited_option(seg_from, *segtype_to, "--stripes.")) stack; r = 0; } if (new_stripe_size_supplied && !(opts & ALLOW_STRIPE_SIZE)) { - if (!_log_prohibited_option(seg_from, *segtype_to, "-I/--stripesize")) + if (!_log_prohibited_option(seg_from, *segtype_to, "-I/--stripesize.")) stack; r = 0; } if (new_region_size && !(opts & ALLOW_REGION_SIZE)) { - if (!_log_prohibited_option(seg_from, *segtype_to, "-R/--regionsize")) + if (!_log_prohibited_option(seg_from, *segtype_to, "-R/--regionsize.")) stack; r = 0; } @@ -5896,17 +5902,17 @@ int lv_raid_convert(struct logical_volume *lv, if (!_raid_reshape(lv, new_segtype, yes, force, data_copies, region_size, stripes, stripe_size, allocate_pvs)) { - log_error("Reshape request failed on LV %s", display_lvname(lv)); + log_error("Reshape request failed on LV %s.", display_lvname(lv)); return 0; } return 1; case 2: - log_error("Invalid conversion request on %s", display_lvname(lv)); + log_error("Invalid conversion request on %s.", display_lvname(lv)); /* Error if we got here with stripes and/or stripe size change requested */ return 0; default: - log_error(INTERNAL_ERROR "_reshape_requested failed"); + log_error(INTERNAL_ERROR "_reshape_requested failed."); return 0; } diff --git a/test/shell/lvchange-raid1-writemostly.sh b/test/shell/lvchange-raid1-writemostly.sh new file mode 100644 index 000000000..edf11bd4e --- /dev/null +++ b/test/shell/lvchange-raid1-writemostly.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# Copyright (C) 2017 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing to use, +# modify, copy, or redistribute it subject to the terms and conditions +# of the GNU General Public License v.2. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA2110-1301 USA + +SKIP_WITH_LVMLOCKD=1 +SKIP_WITH_LVMPOLLD=1 + +. lib/inittest + +which mkfs.ext4 || skip +aux have_raid 1 3 5 || skip + +aux prepare_vg 4 + +for d in $dev1 $dev2 $dev3 $dev4 +do + aux delay_dev $d 1 +done + +# +# Test writemostly prohibited on resyncrhonizing raid1 +# + +# Create 4-way striped LV +lvcreate -aey --ty raid1 -m 3 -L 32M -n $lv1 $vg +not lvchange -y --writemostly $dev1 $vg/$lv1 +check lv_field $vg/$lv1 segtype "raid1" +check lv_field $vg/$lv1 stripes 4 +check lv_attr_bit health $vg/${lv1}_rimage_0 "-" +aux wait_for_sync $vg $lv1 +lvchange -y --writemostly $dev1 $vg/$lv1 +check lv_attr_bit health $vg/${lv1}_rimage_0 "w" + +vgremove -ff $vg diff --git a/test/shell/lvconvert-linear_to_striped.sh b/test/shell/lvconvert-linear_to_striped.sh deleted file mode 100644 index 629830f36..000000000 --- a/test/shell/lvconvert-linear_to_striped.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh -# Copyright (C) 2017 Red Hat, Inc. All rights reserved. -# -# This copyrighted material is made available to anyone wishing to use, -# modify, copy, or redistribute it subject to the terms and conditions -# of the GNU General Public License v.2. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA2110-1301 USA - -SKIP_WITH_LVMLOCKD=1 -SKIP_WITH_LVMPOLLD=1 - -. lib/inittest - -which mkfs.ext4 || skip -aux have_raid 1 10 2 || skip - -aux prepare_vg 4 - -# Create linear LV -lvcreate -aey -L16M -n$lv1 $vg -check lv_field $vg/$lv1 segtype "linear" -echo y|mkfs -t ext4 $DM_DEV_DIR/$vg/$lv1 -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -# Upconvert it to 2-legged raid1 -lvconvert -y -m 1 --ty raid1 --regionsize 512K $vg/$lv1 -check lv_field $vg/$lv1 segtype "raid1" -check lv_field $vg/$lv1 stripes 2 -check lv_field $vg/$lv1 regionsize "512.00k" -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -# Convert 2-legged raid1 to raid5_n -lvconvert -y --ty raid5_n $vg/$lv1 -check lv_field $vg/$lv1 segtype "raid5_n" -check lv_field $vg/$lv1 stripes 2 -check lv_field $vg/$lv1 stripesize "64.00k" -check lv_field $vg/$lv1 regionsize "512.00k" -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -# Reshape it to to 3 stripes and 256K stripe size -lvconvert -y --stripes 3 --stripesize 256K $vg/$lv1 -check lv_first_seg_field $vg/$lv1 stripes 4 -check lv_first_seg_field $vg/$lv1 stripesize "256.00k" -fsck -fn $DM_DEV_DIR/$vg/$lv1 -aux wait_for_sync $vg $lv1 -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -# Use the additonal space gained by adding stripes -resize2fs $DM_DEV_DIR/$vg/$lv1 -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -# Convert it to striped -# FIXME: _lvconvert fails here? -lvconvert -y --ty striped $vg/$lv1 -fsck -fn $DM_DEV_DIR/$vg/$lv1 -check lv_first_seg_field $vg/$lv1 segtype "striped" -check lv_first_seg_field $vg/$lv1 stripes 3 -check lv_first_seg_field $vg/$lv1 stripesize "256.00k" - -vgremove -ff $vg diff --git a/test/shell/lvconvert-raid-reshape.sh b/test/shell/lvconvert-raid-reshape.sh index 636a6d370..2c302dd18 100644 --- a/test/shell/lvconvert-raid-reshape.sh +++ b/test/shell/lvconvert-raid-reshape.sh @@ -132,8 +132,12 @@ _reshape_layout raid5_ls 15 $vg $lv1 --stripes 14 # Convert raid5_ls to 63 stripes _reshape_layout raid5_ls 64 $vg $lv1 --stripes 63 +# Convert raid5_ls back to 27 stripes +_reshape_layout raid5_ls 64 $vg $lv1 --stripes 27 --force +_reshape_layout raid5_ls 28 $vg $lv1 --stripes 27 + # Convert raid5_ls back to 4 stripes -_reshape_layout raid5_ls 15 $vg $lv1 --stripes 4 --force +_reshape_layout raid5_ls 28 $vg $lv1 --stripes 4 --force _reshape_layout raid5_ls 5 $vg $lv1 --stripes 4 # Convert raid5_ls back to 3 stripes diff --git a/test/shell/lvconvert-striped_to_linear.sh b/test/shell/lvconvert-striped_to_linear.sh deleted file mode 100644 index 1f13eb8b9..000000000 --- a/test/shell/lvconvert-striped_to_linear.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/sh -# Copyright (C) 2017 Red Hat, Inc. All rights reserved. -# -# This copyrighted material is made available to anyone wishing to use, -# modify, copy, or redistribute it subject to the terms and conditions -# of the GNU General Public License v.2. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA2110-1301 USA - -SKIP_WITH_LVMLOCKD=1 -SKIP_WITH_LVMPOLLD=1 - -. lib/inittest - -which mkfs.ext4 || skip -aux have_raid 1 10 2 || skip - -aux prepare_vg 5 - -# Create 4-way striped LV -lvcreate -aey --ty striped -i4 -L16M -n $lv1 $vg -check lv_field $vg/$lv1 segtype "striped" -check lv_field $vg/$lv1 stripes 4 -echo y|mkfs -t ext4 $DM_DEV_DIR/$vg/$lv1 -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -# Upconvert to raid5_n -lvconvert -y --ty raid5 $vg/$lv1 -check lv_field $vg/$lv1 segtype "raid5_n" -check lv_field $vg/$lv1 stripes 5 -check lv_field $vg/$lv1 stripesize "64.00k" -fsck -fn $DM_DEV_DIR/$vg/$lv1 -aux wait_for_sync $vg $lv1 -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -# Grow it *4 to keep the given fs -lvresize -L64M $vg/$lv1 -fsck -fn $DM_DEV_DIR/$vg/$lv1 -check lv_first_seg_field $vg/$lv1 lv_size "64.00m" -aux wait_for_sync $vg $lv1 - -# Convert to 1 stripe -lvconvert -y -f --stripes 1 $vg/$lv1 -fsck -fn $DM_DEV_DIR/$vg/$lv1 -aux wait_for_sync $vg $lv1 1 -lvconvert --stripes 1 $vg/$lv1 -check lv_first_seg_field $vg/$lv1 stripes 2 -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -# Convert to raid1 -lvconvert -y --ty raid1 $vg/$lv1 -check lv_first_seg_field $vg/$lv1 segtype "raid1" -check lv_first_seg_field $vg/$lv1 stripes 2 -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -# Convert to linear -lvconvert -y --ty linear $vg/$lv1 -# lvconvert -y -m 0 $vg/$lv1 -check lv_first_seg_field $vg/$lv1 segtype "linear" -check lv_first_seg_field $vg/$lv1 stripes 1 -fsck -fn $DM_DEV_DIR/$vg/$lv1 - -vgremove -ff $vg diff --git a/tools/lvchange.c b/tools/lvchange.c index 08d31d716..1c8b14cba 100644 --- a/tools/lvchange.c +++ b/tools/lvchange.c @@ -739,6 +739,21 @@ static int _lvchange_writemostly(struct logical_volume *lv) struct cmd_context *cmd = lv->vg->cmd; struct lv_segment *raid_seg = first_seg(lv); + /* + * Prohibit on synchronization. + * + * FIXME: we can do better once we can distingush between + * an initial sync after a linear -> raid1 upconversion + * and any later additions of legs, requested resyncs + * via lvchange or leg repairs/replacements. + */ + if (!lv_raid_in_sync(lv)) { + log_error("Unable to change write%s on %s while it is not in-sync.", + arg_is_set(cmd, writemostly_ARG) ? "mostly" : "behind", + display_lvname(lv)); + return 0; + } + if (arg_is_set(cmd, writebehind_ARG)) raid_seg->writebehind = arg_uint_value(cmd, writebehind_ARG, 0); @@ -816,7 +831,6 @@ static int _lvchange_writemostly(struct logical_volume *lv) } } - /* FIXME: prohibit on primary if not in-sync! */ if (!lv_update_and_reload(lv)) return_0; |