page.
Add ->target_name to segtype_handler to allow a more specific target
name to be returned based on the state of the segment.
Result of trying to merge a snapshot using a kernel that doesn't have
the snapshot-merge target:
Before:
# lvconvert --merge vg/snap
Can't expand LV lv: snapshot target support missing from kernel?
Failed to suspend origin lv
After:
# lvconvert --merge vg/snap
Can't process LV lv: snapshot-merge target support missing from kernel?
Failed to suspend origin lv
Unable to merge LV "snap" into it's origin.
Version 2.02.75 -
=====================================
+ Convey need for snapshot-merge target in lvconvert error message and man page.
Add "devices/disable_after_error_count" to lvm.conf.
Give correct error message when creating a too-small snapshot.
Implement vgextend --restoremissing.
uint32_t s;
struct dm_list *snh;
struct lv_segment *seg_present;
+ const char *target_name;
/* Ensure required device-mapper targets are loaded */
seg_present = find_cow(seg->lv) ? : seg;
+ target_name = (seg_present->segtype->ops->target_name ?
+ seg_present->segtype->ops->target_name(seg_present) :
+ seg_present->segtype->name);
log_debug("Checking kernel supports %s segment type for %s%s%s",
- seg_present->segtype->name, seg->lv->name,
+ target_name, seg->lv->name,
layer ? "-" : "", layer ? : "");
if (seg_present->segtype->ops->target_present &&
!seg_present->segtype->ops->target_present(seg_present->lv->vg->cmd,
seg_present, NULL)) {
- log_error("Can't expand LV %s: %s target support missing "
- "from kernel?", seg->lv->name, seg_present->segtype->name);
+ log_error("Can't process LV %s: %s target support missing "
+ "from kernel?", seg->lv->name, target_name);
return 0;
}
struct segtype_handler {
const char *(*name) (const struct lv_segment * seg);
+ const char *(*target_name) (const struct lv_segment * seg);
void (*display) (const struct lv_segment * seg);
int (*text_export) (const struct lv_segment * seg,
struct formatter * f);
return seg->segtype->name;
}
+static const char *_snap_target_name(const struct lv_segment *seg)
+{
+ if (seg->status & MERGING)
+ return "snapshot-merge";
+
+ return _snap_name(seg);
+}
+
static int _snap_text_import(struct lv_segment *seg, const struct config_node *sn,
struct dm_hash_table *pv_hash __attribute__((unused)))
{
static struct segtype_handler _snapshot_ops = {
.name = _snap_name,
+ .target_name = _snap_target_name,
.text_import = _snap_text_import,
.text_export = _snap_text_export,
.target_status_compatible = _snap_target_status_compatible,
If the volume is read-only the snapshot will not be zeroed.
.TP
.I \-\-merge
-Merges a snapshot into its origin volume. If both the origin and snapshot volume
-are not open the merge will start immediately. Otherwise, the merge will start
+Merges a snapshot into its origin volume. To check if your kernel
+supports this feature, look for 'snapshot-merge' in the output
+of 'dmsetup targets'. If both the origin and snapshot volume are not
+open the merge will start immediately. Otherwise, the merge will start
the first time either the origin or snapshot are activated and both are closed.
Merging a snapshot into an origin that cannot be closed, for example a root
filesystem, is deferred until the next time the origin volume is activated.
return ECMD_FAILED;
}
if (!lvconvert_merge(cmd, lv, lp)) {
- stack;
+ log_error("Unable to merge LV \"%s\" into it's origin.", lv->name);
return ECMD_FAILED;
}
} else if (lp->snapshot) {