uint32_t s, area_count;
if (stripes > 1 && mirrors > 1) {
- log_error("striped mirrors are not supported yet");
+ log_error("Striped mirrors are not supported yet");
return NULL;
}
alloc_policy_t alloc)
{
int r = 1;
+ uint32_t m;
struct alloc_handle *ah;
+ struct lv_segment *first_seg;
if (segtype_is_virtual(segtype))
return lv_add_virtual_segment(lv, status, extents, segtype);
return 0;
}
- if (!lv_add_segment(ah, 0, ah->area_count, lv, segtype, stripe_size,
+ if (!mirrors) {
+ if (!lv_add_segment(ah, 0, ah->area_count, lv, segtype, stripe_size,
mirrored_pv, mirrored_pe, status, 0, NULL)) {
- stack;
- goto out;
+ stack;
+ goto out;
+ }
+ } else {
+ list_iterate_items(first_seg, &lv->segments)
+ break;
+ for (m = 0; m < mirrors; m++) {
+ if (!lv_add_segment(ah, m, 1, seg_lv(first_seg, m),
+ get_segtype_from_string(lv->vg->cmd,
+ "striped"),
+ 0, NULL, 0, 0, 0, NULL)) {
+ log_error("Aborting. Failed to extend %s.",
+ seg_lv(first_seg, m)->name);
+ return 0;
+ }
+ }
+ first_seg->area_len += extents;
+ first_seg->len += extents;
+ lv->le_count += extents;
+ lv->size += (uint64_t) extents *lv->vg->extent_size;
}
out:
"\t[-i|--stripes Stripes [-I|--stripesize StripeSize]]\n"
"\t{-l|--extents [+]LogicalExtentsNumber |\n"
"\t -L|--size [+]LogicalVolumeSize[kKmMgGtT]}\n"
+ "\t[-m|--mirrors Mirrors]\n"
"\t[-n|--nofsck]\n"
"\t[-r|--resizefs]\n"
"\t[-t|--test]\n"
"\t[--version]" "\n"
"\tLogicalVolume[Path] [ PhysicalVolumePath... ]\n",
- alloc_ARG, autobackup_ARG, extents_ARG, nofsck_ARG, resizefs_ARG,
- size_ARG, stripes_ARG, stripesize_ARG, test_ARG, type_ARG)
+ alloc_ARG, autobackup_ARG, extents_ARG, mirrors_ARG, nofsck_ARG,
+ resizefs_ARG, size_ARG, stripes_ARG, stripesize_ARG, test_ARG,
+ type_ARG)
xx(lvmchange,
"With the device mapper, this is obsolete and does nothing.",
uint32_t stripes;
uint32_t stripe_size;
+ uint32_t mirrors;
struct segment_type *segtype;
struct lvinfo info;
uint32_t stripesize_extents = 0;
uint32_t seg_stripes = 0, seg_stripesize = 0, seg_size = 0;
+ uint32_t seg_mirrors = 0;
uint32_t extents_used = 0;
uint32_t size_rest;
alloc_policy_t alloc;
log_print("Varied striping not supported. Ignoring.");
}
+ if (arg_count(cmd, mirrors_ARG)) {
+ if (vg->fid->fmt->features & FMT_SEGMENTS)
+ lp->mirrors = arg_uint_value(cmd, mirrors_ARG, 1) + 1;
+ else
+ log_print("Mirrors not supported. Ignoring.");
+ }
+
if (arg_count(cmd, stripesize_ARG)) {
if (arg_sign_value(cmd, stripesize_ARG, 0) == SIGN_MINUS) {
log_error("Stripesize may not be negative.");
stripesize_ARG, 0);
else
log_print("Varied stripesize not supported. Ignoring.");
+ if (lp->mirrors) {
+ log_error("Mirrors and striping cannot be combined yet.");
+ return ECMD_FAILED;
+ }
}
lv = lvl->lv;
}
}
+ /* If extending, find mirrors of last segment */
+ if ((lp->extents > lv->le_count)) {
+ list_iterate_back_items(seg, &lv->segments) {
+ if (seg_is_mirrored(seg))
+ seg_mirrors = seg->area_count;
+ else
+ seg_mirrors = 0;
+ break;
+ }
+ if (!arg_count(cmd, mirrors_ARG) && seg_mirrors) {
+ log_print("Extending %" PRIu32 " mirror images.",
+ seg_mirrors);
+ lp->mirrors = seg_mirrors;
+ }
+ if ((arg_count(cmd, mirrors_ARG) || seg_mirrors) &&
+ (lp->mirrors != seg_mirrors)) {
+ log_error("Cannot vary number of mirrors in LV yet.");
+ return EINVALID_CMD_LINE;
+ }
+ }
+
/* If reducing, find stripes, stripesize & size of last segment */
if (lp->extents < lv->le_count) {
extents_used = 0;
- if (lp->stripes || lp->stripe_size)
- log_error("Ignoring stripes and stripesize arguments "
- "when reducing");
+ if (lp->stripes || lp->stripe_size || lp->mirrors)
+ log_error("Ignoring stripes, stripesize and mirrors "
+ "arguments when reducing");
list_iterate_items(seg, &lv->segments) {
seg_extents = seg->len;
seg_stripes = seg->area_count;
}
+ if (seg_is_mirrored(seg))
+ seg_mirrors = seg->area_count;
+ else
+ seg_mirrors = 0;
+
if (lp->extents <= extents_used + seg_extents)
break;
seg_size = lp->extents - extents_used;
lp->stripe_size = seg_stripesize;
lp->stripes = seg_stripes;
+ lp->mirrors = seg_mirrors;
}
if (lp->stripes > 1 && !lp->stripe_size) {
return ECMD_FAILED;
}
} else if (!lv_extend(lv, lp->segtype, lp->stripes,
- lp->stripe_size, 0u,
+ lp->stripe_size, lp->mirrors,
lp->extents - lv->le_count,
NULL, 0u, 0u, pvh, alloc)) {
stack;