diff --git a/WHATS_NEW b/WHATS_NEW
index 4d2a6d2cc..f5b79317f 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.112 - 
 =====================================
+  Add internal lvseg_name() function.
   Skip trying to file lock virtual internal vg name.
   Fix selection on {vg,lv}_permissions fields to properly match selection criteria.
   Fix lv_permissions reporting to display read-only{-override} instead of blank.
diff --git a/lib/display/display.c b/lib/display/display.c
index d12c3930b..f86b67f47 100644
--- a/lib/display/display.c
+++ b/lib/display/display.c
@@ -667,7 +667,7 @@ int lvdisplay_segments(const struct logical_volume *lv)
 			  lv_is_virtual(lv) ? "Virtual" : "Logical",
 			  seg->le, seg->le + seg->len - 1);
 
-		log_print("  Type\t\t%s", seg->segtype->ops->name(seg));
+		log_print("  Type\t\t%s", lvseg_name(seg));
 
 		if (seg->segtype->ops->target_monitored)
 			log_print("  Monitoring\t\t%s",
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 23f0991dc..92b38f44c 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -120,7 +120,7 @@ char *lvseg_tags_dup(const struct lv_segment *seg)
 
 char *lvseg_segtype_dup(struct dm_pool *mem, const struct lv_segment *seg)
 {
-	return dm_pool_strdup(mem, seg->segtype->ops->name(seg));
+	return dm_pool_strdup(mem, lvseg_name(seg));
 }
 
 char *lvseg_discards_dup(struct dm_pool *mem, const struct lv_segment *seg)
@@ -183,6 +183,16 @@ uint64_t lvseg_chunksize(const struct lv_segment *seg)
 	return size;
 }
 
+const char *lvseg_name(const struct lv_segment *seg)
+{
+	/* Support even segtypes without 'ops' */
+	if (seg->segtype->ops &&
+	    seg->segtype->ops->name)
+		return seg->segtype->ops->name(seg);
+
+	return seg->segtype->name;
+}
+
 uint64_t lvseg_start(const struct lv_segment *seg)
 {
 	return (uint64_t) seg->le * seg->lv->vg->extent_size;
diff --git a/lib/metadata/lv.h b/lib/metadata/lv.h
index bcd702880..2261913a9 100644
--- a/lib/metadata/lv.h
+++ b/lib/metadata/lv.h
@@ -77,6 +77,7 @@ struct logical_volume *lv_parent(const struct logical_volume *lv);
 char *lv_parent_dup(struct dm_pool *mem, const struct logical_volume *lv);
 char *lv_origin_dup(struct dm_pool *mem, const struct logical_volume *lv);
 uint32_t lv_kernel_read_ahead(const struct logical_volume *lv);
+const char *lvseg_name(const struct lv_segment *seg);
 uint64_t lvseg_start(const struct lv_segment *seg);
 uint64_t lvseg_size(const struct lv_segment *seg);
 uint64_t lvseg_chunksize(const struct lv_segment *seg);
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index f14cec0e1..f60b96412 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -4617,7 +4617,7 @@ static int _lvresize_adjust_extents(struct cmd_context *cmd, struct logical_volu
 			else if (seg_is_raid(first_seg(lv)) &&
 				 (lp->stripes != seg_stripes)) {
 				log_error("Unable to extend \"%s\" segment type with different number of stripes.",
-					  first_seg(lv)->segtype->ops->name(first_seg(lv)));
+					  lvseg_name(first_seg(lv)));
 				return 0;
 			}
 	
diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c
index ad918f18a..c8c9543e3 100644
--- a/lib/metadata/merge.c
+++ b/lib/metadata/merge.c
@@ -481,8 +481,7 @@ static int _lv_split_segment(struct logical_volume *lv, struct lv_segment *seg,
 
 	if (!seg_can_split(seg)) {
 		log_error("Unable to split the %s segment at LE %" PRIu32
-			  " in LV %s", seg->segtype->ops->name(seg),
-			  le, lv->name);
+			  " in LV %s", lvseg_name(seg), le, lv->name);
 		return 0;
 	}
 
diff --git a/lib/metadata/pool_manip.c b/lib/metadata/pool_manip.c
index 439b8ed26..4c0ab7207 100644
--- a/lib/metadata/pool_manip.c
+++ b/lib/metadata/pool_manip.c
@@ -33,7 +33,7 @@ int attach_pool_metadata_lv(struct lv_segment *pool_seg,
 	if (!seg_is_pool(pool_seg)) {
 		log_error(INTERNAL_ERROR
 			  "Unable to attach pool metadata LV to %s segtype.",
-			  pool_seg->segtype->ops->name(pool_seg));
+			  lvseg_name(pool_seg));
 		return 0;
 	}
 	pool_seg->metadata_lv = metadata_lv;
@@ -70,7 +70,7 @@ int attach_pool_data_lv(struct lv_segment *pool_seg,
 	if (!seg_is_pool(pool_seg)) {
 		log_error(INTERNAL_ERROR
 			  "Unable to attach pool data LV to %s segtype.",
-			  pool_seg->segtype->ops->name(pool_seg));
+			  lvseg_name(pool_seg));
 		return 0;
 	}
 
@@ -129,7 +129,7 @@ int detach_pool_lv(struct lv_segment *seg)
 	if (!seg->pool_lv) {
 		log_error(INTERNAL_ERROR
 			  "No pool associated with %s LV, %s.",
-			  seg->segtype->ops->name(seg), seg->lv->name);
+			  lvseg_name(seg), seg->lv->name);
 		return 0;
 	}
 
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index 44272e8e1..821998473 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -117,7 +117,7 @@ static int _raid_remove_top_layer(struct logical_volume *lv,
 	if (!seg_is_mirrored(seg)) {
 		log_error(INTERNAL_ERROR
 			  "Unable to remove RAID layer from segment type %s",
-			  seg->segtype->ops->name(seg));
+			  lvseg_name(seg));
 		return 0;
 	}
 
@@ -579,7 +579,7 @@ static int _raid_add_images(struct logical_volume *lv,
 		dm_list_add(&meta_lvs, &lvl->list);
 	} else if (!seg_is_raid(seg)) {
 		log_error("Unable to add RAID images to %s of segment type %s",
-			  lv->name, seg->segtype->ops->name(seg));
+			  lv->name, lvseg_name(seg));
 		return 0;
 	}
 
@@ -1075,7 +1075,7 @@ int lv_raid_split(struct logical_volume *lv, const char *split_name,
 	if (!seg_is_mirrored(first_seg(lv)) ||
 	    !strcmp(first_seg(lv)->segtype->name, SEG_TYPE_NAME_RAID10)) {
 		log_error("Unable to split logical volume of segment type, %s",
-			  first_seg(lv)->segtype->ops->name(first_seg(lv)));
+			  lvseg_name(first_seg(lv)));
 		return 0;
 	}
 
@@ -1445,7 +1445,7 @@ int lv_raid_reshape(struct logical_volume *lv,
 
 	log_error("Converting the segment type for %s/%s from %s to %s"
 		  " is not yet supported.", lv->vg->name, lv->name,
-		  seg->segtype->ops->name(seg), new_segtype->name);
+		  lvseg_name(seg), new_segtype->name);
 	return 0;
 }
 
@@ -1601,7 +1601,7 @@ int lv_raid_replace(struct logical_volume *lv,
 		   (match_count > raid_seg->segtype->parity_devs)) {
 		log_error("Unable to replace more than %u PVs from (%s) %s/%s",
 			  raid_seg->segtype->parity_devs,
-			  raid_seg->segtype->ops->name(raid_seg),
+			  lvseg_name(raid_seg),
 			  lv->vg->name, lv->name);
 		return 0;
 	} else if (!strcmp(raid_seg->segtype->name, SEG_TYPE_NAME_RAID10)) {
@@ -1790,7 +1790,7 @@ int lv_raid_remove_missing(struct logical_volume *lv)
 		return_0;
 
 	log_debug("Attempting to remove missing devices from %s LV, %s",
-		  seg->segtype->ops->name(seg), lv->name);
+		  lvseg_name(seg), lv->name);
 
 	/*
 	 * FIXME: Make sure # of compromised components will not affect RAID
@@ -1870,7 +1870,7 @@ static int _partial_raid_lv_is_redundant(const struct logical_volume *lv)
 		   (failed_components > raid_seg->segtype->parity_devs)) {
 		log_verbose("More than %u components from %s %s have failed.",
 			    raid_seg->segtype->parity_devs,
-			    raid_seg->segtype->ops->name(raid_seg),
+			    lvseg_name(raid_seg),
 			    display_lvname(lv));
 		return 0;	/* Insufficient redundancy to activate */
 	}
diff --git a/lib/report/report.c b/lib/report/report.c
index e85c34988..445f603d9 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -366,7 +366,7 @@ static int _segtype_disp(struct dm_report *rh __attribute__((unused)),
 	char *name;
 
 	if (!(name = lvseg_segtype_dup(mem, seg))) {
-		log_error("Failed to get segtype.");
+		log_error("Failed to get segtype name.");
 		return 0;
 	}
 
diff --git a/tools/lvchange.c b/tools/lvchange.c
index 114065c04..6cb6f1564 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -355,7 +355,7 @@ static int lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
 			 vg_is_clustered(lv->vg) ? "clustered " : "",
 			 (seg->log_lv) ? "disk-logged " :
 			 seg_is_raid(seg) ? "" : "core-logged ",
-			 seg->segtype->ops->name(seg), lv->name);
+			 lvseg_name(seg), lv->name);
 
 	/*
 	 * If this mirror has a core log (i.e. !seg->log_lv),
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index ad4a6c06e..e976880f2 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -1850,7 +1850,7 @@ static int _lvconvert_raid(struct logical_volume *lv, struct lvconvert_params *l
 	if (arg_count(cmd, mirrors_ARG) &&
 	    !seg_is_mirrored(seg) && !seg_is_linear(seg)) {
 		log_error("'--mirrors/-m' is not compatible with %s",
-			  seg->segtype->ops->name(seg));
+			  lvseg_name(seg));
 		return 0;
 	}
 
@@ -1860,7 +1860,7 @@ static int _lvconvert_raid(struct logical_volume *lv, struct lvconvert_params *l
 	if (!_is_valid_raid_conversion(seg->segtype, lp->segtype)) {
 		log_error("Unable to convert %s/%s from %s to %s",
 			  lv->vg->name, lv->name,
-			  seg->segtype->ops->name(seg), lp->segtype->name);
+			  lvseg_name(seg), lp->segtype->name);
 		return 0;
 	}
 
@@ -2672,7 +2672,7 @@ static int _lvconvert_thin(struct cmd_context *cmd,
 	    lv_is_thin_pool_data(lv) ||
 	    lv_is_thin_pool_metadata(lv)) {
 		log_error("Can't use %s %s as external origin.",
-			  first_seg(lv)->segtype->name,
+			  lvseg_name(first_seg(lv)),
 			  display_lvname(lv));
 		return 0;
 	}
@@ -3294,8 +3294,7 @@ static int _lvconvert_single(struct cmd_context *cmd, struct logical_volume *lv,
 			if (arg_count(cmd, use_policies_ARG))
 				return ECMD_PROCESSED; /* nothing to be done here */
 			log_error("Can't repair LV \"%s\" of segtype %s.",
-				  lv->name,
-				  first_seg(lv)->segtype->ops->name(first_seg(lv)));
+				  lv->name, lvseg_name(first_seg(lv)));
 			return ECMD_FAILED;
 		}
 	}