master - tests: drop zeroing
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=51d03acb1c910a...
Commit: 51d03acb1c910a65ff05a0a339ed6a4ff957c0db
Parent: 48abbdf4524f316aa93b2d8b857b59803095ace3
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Mon Feb 6 13:15:39 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Mon Feb 6 13:15:39 2017 +0100
tests: drop zeroing
Well waiting for zeroing may take enough time to finish 'raid' sync.
So make the test running faster without zeroing and better avoid race
to have chance to happen (i.e. lvcreate is finished after array
gets already in sync).
---
test/shell/lvcreate-raid-nosync.sh | 22 +++++++++++-----------
1 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/test/shell/lvcreate-raid-nosync.sh b/test/shell/lvcreate-raid-nosync.sh
index 40baa17..1f01f47 100644
--- a/test/shell/lvcreate-raid-nosync.sh
+++ b/test/shell/lvcreate-raid-nosync.sh
@@ -16,8 +16,8 @@ SKIP_WITH_LVMPOLLD=1
aux have_raid 1 7 0 || skip
-segtypes=raid5
-aux have_raid4 && segtypes="raid4 raid5"
+segtypes="raid5"
+aux have_raid4 && segtypes="raid4 $segtypes"
aux prepare_vg 6
@@ -40,49 +40,49 @@ aux delay_dev "$dev1" 0 90 $(get first_extent_sector "$dev1")
# raid0/raid0_meta don't support resynchronization
for r in raid0 raid0_meta
do
- lvcreate --type $r -i 3 -l 1 -n $lv1 $vg
+ lvcreate --type $r -Zn -i 3 -l 1 -n $lv1 $vg
check raid_leg_status $vg $lv1 "AAA"
lvremove --yes $vg/$lv1
done
# raid1 supports resynchronization
-lvcreate --type raid1 -m 2 -l 4 -n $lv1 $vg
+lvcreate --type raid1 -m 2 -Zn -l 4 -n $lv1 $vg
check raid_leg_status $vg $lv1 "aaa"
_sync "AAA"
# raid1 supports --nosync
-lvcreate --type raid1 --nosync -m 2 -l 1 -n $lv1 $vg
+lvcreate --type raid1 --nosync -Zn -m 2 -l 1 -n $lv1 $vg
check raid_leg_status $vg $lv1 "AAA"
lvremove --yes $vg/$lv1
for r in $segtypes
do
# raid4/5 support resynchronization
- lvcreate --type $r -i 3 -l 4 -n $lv1 $vg
+ lvcreate --type $r -Zn -i 3 -l 4 -n $lv1 $vg
check raid_leg_status $vg $lv1 "aaaa"
_sync "AAAA"
# raid4/5 support --nosync
- lvcreate --type $r --nosync -i 3 -l 1 -n $lv2 $vg
+ lvcreate --type $r -Zn --nosync -i 3 -l 1 -n $lv2 $vg
check raid_leg_status $vg $lv2 "AAAA"
lvremove --yes $vg
done
# raid6 supports resynchronization
-lvcreate --type raid6 -i 3 -l 4 -n $lv1 $vg
+lvcreate --type raid6 -Zn -i 3 -l 4 -n $lv1 $vg
check raid_leg_status $vg $lv1 "aaaaa"
_sync "AAAAA"
# raid6 rejects --nosync; it has to initialize P- and Q-Syndromes
-not lvcreate --type raid6 --nosync -i 3 -l 1 -n $lv1 $vg
+not lvcreate --type raid6 --nosync -Zn -i 3 -l 1 -n $lv1 $vg
# raid10 supports resynchronization
-lvcreate --type raid10 -m 1 -i 3 -l 4 -n $lv1 $vg
+lvcreate --type raid10 -m 1 -Zn -i 3 -l 4 -n $lv1 $vg
check raid_leg_status $vg $lv1 "aaaaaa"
_sync "AAAAAA"
# raid10 supports --nosync
-lvcreate --type raid10 --nosync -m 1 -i 3 -l 1 -n $lv1 $vg
+lvcreate --type raid10 --nosync -m 1 -Zn -i 3 -l 1 -n $lv1 $vg
check raid_leg_status $vg $lv1 "AAAAAA"
vgremove -ff $vg
7 years, 3 months
master - tests: drop /tmp polution
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=48abbdf4524f31...
Commit: 48abbdf4524f316aa93b2d8b857b59803095ace3
Parent: 811d137d3f93da892365f9c9a4772033a891c687
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Mon Feb 6 09:48:19 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Mon Feb 6 11:43:07 2017 +0100
tests: drop /tmp polution
Drop forgotten extra metadata debug.
---
test/shell/lvchange-cache-mode.sh | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/test/shell/lvchange-cache-mode.sh b/test/shell/lvchange-cache-mode.sh
index 947034b..f7b1081 100644
--- a/test/shell/lvchange-cache-mode.sh
+++ b/test/shell/lvchange-cache-mode.sh
@@ -38,8 +38,6 @@ done
lvs -o+cache_dirty_blocks,cache_read_hits,cache_read_misses,cache_write_hits,cache_write_misses $vg/$lv1
-vgcfgbackup -f /tmp/ooo $vg
-
#
# Drop later, code loading dm tables directly without lvm
7 years, 3 months
master - cleanup: hide gcc warning
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=811d137d3f93da...
Commit: 811d137d3f93da892365f9c9a4772033a891c687
Parent: 9fe8c2da36a42a9cf08ef44ede172e1341033a24
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Mon Feb 6 11:41:22 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Mon Feb 6 11:43:07 2017 +0100
cleanup: hide gcc warning
Gcc is not clever enough to see these vars are actually initialize in
given code path so let's just make sure it has a value.
---
libdm/libdm-stats.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/libdm/libdm-stats.c b/libdm/libdm-stats.c
index f0342a0..f68874c 100644
--- a/libdm/libdm-stats.c
+++ b/libdm/libdm-stats.c
@@ -4584,7 +4584,7 @@ static uint64_t *_stats_map_file_regions(struct dm_stats *dms, int fd,
int precise, uint64_t group_id,
uint64_t *count, int *regroup)
{
- struct _extent *extents = NULL, *old_extents;
+ struct _extent *extents = NULL, *old_extents = NULL;
uint64_t *regions = NULL, fail_region;
struct dm_stats_group *group = NULL;
struct dm_pool *extent_mem = NULL;
@@ -4592,7 +4592,7 @@ static uint64_t *_stats_map_file_regions(struct dm_stats *dms, int fd,
char *hist_arg = NULL;
int update, num_bits;
struct statfs fsbuf;
- int64_t nr_kept, i;
+ int64_t nr_kept = 0, i;
struct stat buf;
update = _stats_group_id_present(dms, group_id);
7 years, 3 months
master - debug: add space before uuid
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=9fe8c2da36a42a...
Commit: 9fe8c2da36a42a9cf08ef44ede172e1341033a24
Parent: 12bbfbe89de5201f89ebad372ddd5f393142b13a
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sun Feb 5 17:30:23 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sun Feb 5 17:55:37 2017 +0100
debug: add space before uuid
With commit 88534625282e8d533ae439ed308a285da10e3ef0 we added
uuid right after device name. Add space between them.
(Also fix some indenting)
---
libdm/ioctl/libdm-iface.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c
index 390daa1..cb3e8dc 100644
--- a/libdm/ioctl/libdm-iface.c
+++ b/libdm/ioctl/libdm-iface.c
@@ -1851,10 +1851,10 @@ static struct dm_ioctl *_do_dm_ioctl(struct dm_task *dmt, unsigned command,
dmi->flags &= ~DM_EXISTS_FLAG; /* FIXME */
else {
if (_log_suppress || dmt->ioctl_errno == EINTR)
- log_verbose("device-mapper: %s ioctl on %s%s%s%.0d%s%.0d%s%s "
+ log_verbose("device-mapper: %s ioctl on %s %s%s%.0d%s%.0d%s%s "
"failed: %s",
- _cmd_data_v4[dmt->type].name,
- dmi->name, dmi->uuid,
+ _cmd_data_v4[dmt->type].name,
+ dmi->name, dmi->uuid,
dmt->major > 0 ? "(" : "",
dmt->major > 0 ? dmt->major : 0,
dmt->major > 0 ? ":" : "",
@@ -1863,10 +1863,10 @@ static struct dm_ioctl *_do_dm_ioctl(struct dm_task *dmt, unsigned command,
dmt->major > 0 ? ")" : "",
strerror(dmt->ioctl_errno));
else
- log_error("device-mapper: %s ioctl on %s%s%s%.0d%s%.0d%s%s "
+ log_error("device-mapper: %s ioctl on %s %s%s%.0d%s%.0d%s%s "
"failed: %s",
_cmd_data_v4[dmt->type].name,
- dmi->name, dmi->uuid,
+ dmi->name, dmi->uuid,
dmt->major > 0 ? "(" : "",
dmt->major > 0 ? dmt->major : 0,
dmt->major > 0 ? ":" : "",
7 years, 3 months
master - comment: update
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=12bbfbe89de520...
Commit: 12bbfbe89de5201f89ebad372ddd5f393142b13a
Parent: fb3f4ed72d6be15e99fdfe490049264eecc07997
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Feb 4 15:44:25 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sun Feb 5 17:55:37 2017 +0100
comment: update
Fix can -> cannot.
---
lib/activate/dev_manager.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index d36f113..cde026e 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -3075,7 +3075,7 @@ static int _tree_action(struct dev_manager *dm, const struct logical_volume *lv,
(laopts->origin_only) ? " origin-only" : "",
display_lvname(lv));
- /* Some LV can be used for top level tree */
+ /* Some LV cannot be used for top level tree */
/* TODO: add more.... */
if (lv_is_cache_pool(lv) && !dm_list_empty(&lv->segs_using_this_lv)) {
log_error(INTERNAL_ERROR "Cannot create tree for %s.",
7 years, 3 months
master - cleanup: rename to use track_ prefix
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=fb3f4ed72d6be1...
Commit: fb3f4ed72d6be15e99fdfe490049264eecc07997
Parent: dae4f53acb269219e876c229c8f034fcdaf3ff5a
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Feb 4 15:02:34 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sun Feb 5 17:55:37 2017 +0100
cleanup: rename to use track_ prefix
Since we use 'track_' prefix for other deps tracking,
convert skip_external_lv to use same logical meaning.
(just converts 1->0 0->1)
---
lib/activate/dev_manager.c | 19 ++++++++++---------
1 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 6df254a..d36f113 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -61,7 +61,7 @@ struct dev_manager {
int flush_required;
int activation; /* building activation tree */
int suspend; /* building suspend tree */
- int skip_external_lv;
+ unsigned track_external_lv_deps;
struct dm_list pending_delete; /* str_list of dlid(s) with pending delete */
unsigned track_pending_delete;
unsigned track_pvmove_deps;
@@ -2039,16 +2039,16 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
#endif
}
- if (origin_only && dm->activation && !dm->skip_external_lv &&
+ if (origin_only && dm->activation && dm->track_external_lv_deps &&
lv_is_external_origin(lv)) {
/* Find possible users of external origin lv */
- dm->skip_external_lv = 1; /* avoid recursion */
+ dm->track_external_lv_deps = 0; /* avoid recursion */
dm_list_iterate_items(sl, &lv->segs_using_this_lv)
/* Match only external_lv users */
if ((sl->seg->external_lv == lv) &&
!_add_lv_to_dtree(dm, dtree, sl->seg->lv, 1))
return_0;
- dm->skip_external_lv = 0;
+ dm->track_external_lv_deps = 1;
}
if (lv_is_thin_pool(lv)) {
@@ -2148,7 +2148,7 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
/* Add any LVs used by segments in this LV */
dm_list_iterate_items(seg, &lv->segments) {
- if (seg->external_lv && !dm->skip_external_lv &&
+ if (seg->external_lv && dm->track_external_lv_deps &&
!_add_lv_to_dtree(dm, dtree, seg->external_lv, 1)) /* stack */
return_0;
if (seg->log_lv &&
@@ -2158,7 +2158,7 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
!_add_lv_to_dtree(dm, dtree, seg->metadata_lv, 0))
return_0;
if (seg->pool_lv &&
- (lv_is_cache_pool(seg->pool_lv) || !dm->skip_external_lv) &&
+ (lv_is_cache_pool(seg->pool_lv) || dm->track_external_lv_deps) &&
/* When activating and not origin_only detect linear 'overlay' over pool */
!_add_lv_to_dtree(dm, dtree, seg->pool_lv, dm->activation ? origin_only : 1))
return_0;
@@ -2575,7 +2575,7 @@ static int _add_new_external_lv_to_dtree(struct dev_manager *dm,
struct seg_list *sl;
/* Do not want to recursively add externals again */
- if (dm->skip_external_lv)
+ if (!dm->track_external_lv_deps)
return 1;
/*
@@ -2583,7 +2583,7 @@ static int _add_new_external_lv_to_dtree(struct dev_manager *dm,
* process all LVs related to this LV, and we want to
* skip repeated invocation of external lv processing
*/
- dm->skip_external_lv = 1;
+ dm->track_external_lv_deps = 0;
log_debug_activation("Adding external origin LV %s and all active users.",
display_lvname(external_lv));
@@ -2609,7 +2609,7 @@ static int _add_new_external_lv_to_dtree(struct dev_manager *dm,
log_debug_activation("Finished adding external origin LV %s and all active users.",
display_lvname(external_lv));
- dm->skip_external_lv = 0;
+ dm->track_external_lv_deps = 1;
return 1;
}
@@ -3085,6 +3085,7 @@ static int _tree_action(struct dev_manager *dm, const struct logical_volume *lv,
/* Some targets may build bigger tree for activation */
dm->activation = ((action == PRELOAD) || (action == ACTIVATE));
dm->suspend = (action == SUSPEND_WITH_LOCKFS) || (action == SUSPEND);
+ dm->track_external_lv_deps = 1;
if (!(dtree = _create_partial_dtree(dm, lv, laopts->origin_only)))
return_0;
7 years, 3 months
master - clvmd: add mutex protection for cpg_ call
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=dae4f53acb2692...
Commit: dae4f53acb269219e876c229c8f034fcdaf3ff5a
Parent: a4bbaa3b894f03e4ac21c979ec4e5201120703ad
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Feb 4 14:47:27 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sun Feb 5 17:55:37 2017 +0100
clvmd: add mutex protection for cpg_ call
The library for corosync multicasting is not supporting multithread
usage - add local mutex to avoid parallel call of cpg_mcast_joined().
---
WHATS_NEW | 1 +
daemons/clvmd/clvmd-corosync.c | 4 ++++
2 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 1c0ef6d..cbe6c05 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.169 -
=====================================
+ Avoid parallel usage of cpg_mcast_joined() in clvmd with corosync.
Support raid6_{ls,rs,la,ra}_6 segment types and conversions from/to it.
Support raid6_n_6 segment type and conversions from/to it.
Support raid5_n segment type and conversions from/to it.
diff --git a/daemons/clvmd/clvmd-corosync.c b/daemons/clvmd/clvmd-corosync.c
index 05c9882..2227cbf 100644
--- a/daemons/clvmd/clvmd-corosync.c
+++ b/daemons/clvmd/clvmd-corosync.c
@@ -532,6 +532,7 @@ static int _cluster_fd_callback(struct local_client *fd, char *buf, int len,
static int _cluster_send_message(const void *buf, int msglen, const char *csid,
const char *errtext)
{
+ static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;
struct iovec iov[2];
cs_error_t err;
int target_node;
@@ -546,7 +547,10 @@ static int _cluster_send_message(const void *buf, int msglen, const char *csid,
iov[1].iov_base = (char *)buf;
iov[1].iov_len = msglen;
+ pthread_mutex_lock(&_mutex);
err = cpg_mcast_joined(cpg_handle, CPG_TYPE_AGREED, iov, 2);
+ pthread_mutex_unlock(&_mutex);
+
return cs_to_errno(err);
}
7 years, 3 months
master - lvconvert: add segtypes raid6_{ls, rs, la, ra}_6 and conversions to/from it
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=a4bbaa3b894f03...
Commit: a4bbaa3b894f03e4ac21c979ec4e5201120703ad
Parent: d8568552e460afe477f1baa7c46da81039f85b15
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Sun Feb 5 00:53:36 2017 +0100
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Sun Feb 5 00:56:27 2017 +0100
lvconvert: add segtypes raid6_{ls,rs,la,ra}_6 and conversions to/from it
Add:
- support for segment types raid6_{ls,rs,la,ra}_6
(striped raid with dedicated last Q-Syndrome SubLVs)
- conversion support from raid5_{ls,rs,la,ra} to/from raid6_{ls,rs,la,ra}_6
- setting convenient segtypes on conversions from/to raid4/5/6
- related tests to lvconvert-raid-takeover.sh factoring
out _lvcreate,_lvconvert funxtions
Related: rhbz1366296
---
WHATS_NEW | 1 +
lib/metadata/raid_manip.c | 117 ++++++++-----
lib/metadata/segtype.h | 4 +
lib/raid/raid.c | 6 +-
libdm/libdm-deptree.c | 21 ++
test/shell/lvconvert-raid-takeover.sh | 324 +++++++++++++++------------------
6 files changed, 248 insertions(+), 225 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index cfa1179..1c0ef6d 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.169 -
=====================================
+ Support raid6_{ls,rs,la,ra}_6 segment types and conversions from/to it.
Support raid6_n_6 segment type and conversions from/to it.
Support raid5_n segment type and conversions from/to it.
Support new internal command _dmeventd_thin_command.
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index b769e34..736e2ee 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -2577,6 +2577,31 @@ static struct possible_takeover_reshape_type _possible_takeover_reshape_types[]
.current_areas = ~0U,
.options = ALLOW_NONE }, /* FIXME: ALLOW_REGION_SIZE */
+ /* raid5_ls <-> raid6_ls_6 */
+ { .current_types = SEG_RAID5_LS|SEG_RAID6_LS_6,
+ .possible_types = SEG_RAID5_LS|SEG_RAID6_LS_6,
+ .current_areas = ~0U,
+ .options = ALLOW_NONE }, /* FIXME: ALLOW_REGION_SIZE */
+
+ /* raid5_rs -> raid6_rs_6 */
+ { .current_types = SEG_RAID5_RS|SEG_RAID6_RS_6,
+ .possible_types = SEG_RAID5_RS|SEG_RAID6_RS_6,
+ .current_areas = ~0U,
+ .options = ALLOW_NONE }, /* FIXME: ALLOW_REGION_SIZE */
+
+ /* raid5_ls -> raid6_la_6 */
+ { .current_types = SEG_RAID5_LA|SEG_RAID6_LA_6,
+ .possible_types = SEG_RAID5_LA|SEG_RAID6_LA_6,
+ .current_areas = ~0U,
+ .options = ALLOW_NONE }, /* FIXME: ALLOW_REGION_SIZE */
+
+ /* raid5_ls -> raid6_ra_6 */
+ { .current_types = SEG_RAID5_RA|SEG_RAID6_RA_6,
+ .possible_types = SEG_RAID5_RA|SEG_RAID6_RA_6,
+ .current_areas = ~0U,
+ .options = ALLOW_NONE }, /* FIXME: ALLOW_REGION_SIZE */
+
+
/* mirror <-> raid1 with arbitrary number of legs */
{ .current_types = SEG_MIRROR|SEG_RAID1,
.possible_types = SEG_MIRROR|SEG_RAID1,
@@ -3068,14 +3093,6 @@ static int _raid456_to_raid0_or_striped_wrapper(TAKEOVER_FN_ARGS)
dm_list_init(&removal_lvs);
- if (!seg_is_raid4(seg) &&
- !seg_is_raid5_n(seg) &&
- !seg_is_raid6_n_6(seg)) {
- log_error("LV %s has to be of type raid4/raid5_n/raid6_n_6 to allow for this conversion.",
- display_lvname(lv));
- return 0;
- }
-
/* Necessary when convering to raid0/striped w/o redundancy? */
if (!_raid_in_sync(lv))
return 0;
@@ -3254,7 +3271,7 @@ static int _striped_to_raid0_wrapper(struct logical_volume *lv,
return 1;
}
-/* Helper: striped/raid0* -> raid4/5/6/10 */
+/* Helper: striped/raid0* -> raid4/5/6/10, raid45 -> raid6 wrapper */
static int _striped_or_raid0_to_raid45610_wrapper(TAKEOVER_FN_ARGS)
{
uint32_t extents_copied, region_size, seg_len, stripe_size;
@@ -3263,25 +3280,9 @@ static int _striped_or_raid0_to_raid45610_wrapper(TAKEOVER_FN_ARGS)
dm_list_init(&removal_lvs);
- if (!seg_is_striped_target(seg) &&
- !seg_is_any_raid0(seg) &&
- !seg_is_raid4(seg) &&
- !seg_is_any_raid5(seg)) {
- log_error("Can't convert %s LV %s.", lvseg_name(seg), display_lvname(lv));
- return 0;
- }
-
if (seg_is_raid10(seg))
return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
- if (!segtype_is_raid4(new_segtype) &&
- !segtype_is_raid5_n(new_segtype) &&
- !segtype_is_raid6_n_6(new_segtype)) {
- /* Can't convert to e.g. raid10_offset */
- log_error("Can't convert %s to %s.", display_lvname(lv), new_segtype->name);
- return 0;
- }
-
if (new_data_copies > new_image_count) {
log_error("N number of data_copies \"--mirrors N-1\" may not be larger than number of stripes.");
return 0;
@@ -3292,15 +3293,6 @@ static int _striped_or_raid0_to_raid45610_wrapper(TAKEOVER_FN_ARGS)
return 0;
}
- /* FIXME: restricted to raid4 and raid5_n for the time being... */
- if (!segtype_is_raid4(new_segtype) &&
- !segtype_is_raid5_n(new_segtype) &&
- !segtype_is_raid6_n_6(new_segtype)) {
- /* Can't convert striped/raid0* to e.g. raid10_offset */
- log_error("Can't convert %s to %s.", display_lvname(lv), new_segtype->name);
- return 0;
- }
-
/* Archive metadata */
if (!archive(lv->vg))
return_0;
@@ -3794,30 +3786,65 @@ static int _log_prohibited_option(const struct lv_segment *seg_from,
static int _set_convenient_raid456_segtype_to(const struct lv_segment *seg_from,
const struct segment_type **segtype)
{
- if (seg_is_striped(seg_from) || seg_is_raid4(seg_from)) {
+ size_t len = min(strlen((*segtype)->name), strlen(lvseg_name(seg_from)));
+ const struct segment_type *segtype_sav = *segtype;
+
+ /* Bail out if same RAID level is requested. */
+ if (!strncmp((*segtype)->name, lvseg_name(seg_from), len))
+ return 1;
+
+ /* Striped/raid0 -> raid5/6 */
+ if (seg_is_striped(seg_from) || seg_is_any_raid0(seg_from)) {
/* If this is any raid5 conversion request -> enforce raid5_n, because we convert from striped */
if (segtype_is_any_raid5(*segtype) &&
!segtype_is_raid5_n(*segtype)) {
- log_error("Conversion to raid5_n not yet supported.");
- return 0;
+ if (!(*segtype = get_segtype_from_flag(seg_from->lv->vg->cmd, SEG_RAID5_N)))
+ return_0;
+ goto replaced;
/* If this is any raid6 conversion request -> enforce raid6_n_6, because we convert from striped */
} else if (segtype_is_any_raid6(*segtype) &&
!segtype_is_raid6_n_6(*segtype)) {
- log_error("Conversion to raid6_n_6 not yet supported.");
- return 0;
+ if (!(*segtype = get_segtype_from_flag(seg_from->lv->vg->cmd, SEG_RAID6_N_6)))
+ return_0;
+ goto replaced;
}
- /* ... and raid6 -> raid5 */
- } else if ((seg_is_raid6_zr(seg_from) ||
- seg_is_raid6_nr(seg_from) ||
- seg_is_raid6_nc(seg_from)) &&
+ /* raid4 -> raid5_n */
+ } else if (seg_is_raid4(seg_from) &&
segtype_is_any_raid5(*segtype)) {
- log_error("Conversion not supported.");
- return 0;
+ if (!(*segtype = get_segtype_from_flag(seg_from->lv->vg->cmd, SEG_RAID5_N)))
+ return_0;
+ goto replaced;
+
+ /* raid4/raid5_n -> striped/raid0/raid6 */
+ } else if ((seg_is_raid4(seg_from) || seg_is_raid5_n(seg_from)) &&
+ !segtype_is_striped(*segtype) &&
+ !segtype_is_any_raid0(*segtype) &&
+ !segtype_is_raid4(*segtype) &&
+ !segtype_is_raid5_n(*segtype) &&
+ !segtype_is_raid6_n_6(*segtype)) {
+ if (!(*segtype = get_segtype_from_flag(seg_from->lv->vg->cmd, SEG_RAID6_N_6)))
+ return_0;
+ goto replaced;
+
+ /* ... and raid6 -> striped/raid0/raid4/raid5_n */
+ } else if (seg_is_raid6_n_6(seg_from) &&
+ !segtype_is_striped(*segtype) &&
+ !segtype_is_any_raid0(*segtype) &&
+ !segtype_is_raid4(*segtype) &&
+ !segtype_is_raid5_n(*segtype)) {
+ if (!(*segtype = get_segtype_from_flag(seg_from->lv->vg->cmd, SEG_RAID5_N)))
+ return_0;
+ goto replaced;
}
return 1;
+
+replaced:
+ log_warn("Replaced LV type %s with possible type %s.",
+ segtype_sav->name, (*segtype)->name);
+ return 1;
}
/* Check allowed conversion from seg_from to *segtype_to */
diff --git a/lib/metadata/segtype.h b/lib/metadata/segtype.h
index c20149d..e8fd26f 100644
--- a/lib/metadata/segtype.h
+++ b/lib/metadata/segtype.h
@@ -132,6 +132,10 @@ struct dev_manager;
#define segtype_is_raid6_nr(segtype) ((segtype)->flags & SEG_RAID6_NR ? 1 : 0)
#define segtype_is_raid6_n_6(segtype) ((segtype)->flags & SEG_RAID6_N_6 ? 1 : 0)
#define segtype_is_raid6_zr(segtype) ((segtype)->flags & SEG_RAID6_ZR ? 1 : 0)
+#define segtype_is_raid6_ls_6(segtype) ((segtype)->flags & SEG_RAID6_LS_6 ? 1 : 0)
+#define segtype_is_raid6_rs_6(segtype) ((segtype)->flags & SEG_RAID6_RS_6 ? 1 : 0)
+#define segtype_is_raid6_la_6(segtype) ((segtype)->flags & SEG_RAID6_LA_6 ? 1 : 0)
+#define segtype_is_raid6_ra_6(segtype) ((segtype)->flags & SEG_RAID6_RA_6 ? 1 : 0)
#define segtype_is_any_raid10(segtype) ((segtype)->flags & SEG_RAID10 ? 1 : 0)
#define segtype_is_raid10(segtype) ((segtype)->flags & SEG_RAID10 ? 1 : 0)
#define segtype_is_raid10_near(segtype) segtype_is_raid10(segtype)
diff --git a/lib/raid/raid.c b/lib/raid/raid.c
index 631ffb7..c679207 100644
--- a/lib/raid/raid.c
+++ b/lib/raid/raid.c
@@ -546,7 +546,11 @@ static const struct raid_type {
{ SEG_TYPE_NAME_RAID6_N_6, 2, SEG_RAID6_N_6 },
{ SEG_TYPE_NAME_RAID6_NC, 2, SEG_RAID6_NC },
{ SEG_TYPE_NAME_RAID6_NR, 2, SEG_RAID6_NR },
- { SEG_TYPE_NAME_RAID6_ZR, 2, SEG_RAID6_ZR }
+ { SEG_TYPE_NAME_RAID6_ZR, 2, SEG_RAID6_ZR },
+ { SEG_TYPE_NAME_RAID6_LS_6, 2, SEG_RAID6_LS_6 },
+ { SEG_TYPE_NAME_RAID6_RS_6, 2, SEG_RAID6_RS_6 },
+ { SEG_TYPE_NAME_RAID6_LA_6, 2, SEG_RAID6_LA_6 },
+ { SEG_TYPE_NAME_RAID6_RA_6, 2, SEG_RAID6_RA_6 }
};
static struct segment_type *_init_raid_segtype(struct cmd_context *cmd,
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index bd6c63d..9570b8a 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -56,6 +56,10 @@ enum {
SEG_RAID6_ZR,
SEG_RAID6_NR,
SEG_RAID6_NC,
+ SEG_RAID6_LS_6,
+ SEG_RAID6_RS_6,
+ SEG_RAID6_LA_6,
+ SEG_RAID6_RA_6,
};
/* FIXME Add crypt and multipath support */
@@ -92,6 +96,11 @@ static const struct {
{ SEG_RAID6_ZR, "raid6_zr"},
{ SEG_RAID6_NR, "raid6_nr"},
{ SEG_RAID6_NC, "raid6_nc"},
+ { SEG_RAID6_LS_6, "raid6_ls_6"},
+ { SEG_RAID6_RS_6, "raid6_rs_6"},
+ { SEG_RAID6_LA_6, "raid6_la_6"},
+ { SEG_RAID6_RA_6, "raid6_ra_6"},
+
/*
* WARNING: Since 'raid' target overloads this 1:1 mapping table
@@ -2153,6 +2162,10 @@ static int _emit_areas_line(struct dm_task *dmt __attribute__((unused)),
case SEG_RAID6_ZR:
case SEG_RAID6_NR:
case SEG_RAID6_NC:
+ case SEG_RAID6_LS_6:
+ case SEG_RAID6_RS_6:
+ case SEG_RAID6_LA_6:
+ case SEG_RAID6_RA_6:
if (!area->dev_node) {
EMIT_PARAMS(*pos, " -");
break;
@@ -2603,6 +2616,10 @@ static int _emit_segment_line(struct dm_task *dmt, uint32_t major,
case SEG_RAID6_ZR:
case SEG_RAID6_NR:
case SEG_RAID6_NC:
+ case SEG_RAID6_LS_6:
+ case SEG_RAID6_RS_6:
+ case SEG_RAID6_LA_6:
+ case SEG_RAID6_RA_6:
target_type_is_raid = 1;
r = _raid_emit_segment_line(dmt, major, minor, seg, seg_start,
params, paramsize);
@@ -3886,6 +3903,10 @@ int dm_tree_node_add_null_area(struct dm_tree_node *node, uint64_t offset)
case SEG_RAID6_ZR:
case SEG_RAID6_NR:
case SEG_RAID6_NC:
+ case SEG_RAID6_LS_6:
+ case SEG_RAID6_RS_6:
+ case SEG_RAID6_LA_6:
+ case SEG_RAID6_RA_6:
break;
default:
log_error("dm_tree_node_add_null_area() called on an unsupported segment type");
diff --git a/test/shell/lvconvert-raid-takeover.sh b/test/shell/lvconvert-raid-takeover.sh
index b45088e..4565cc8 100644
--- a/test/shell/lvconvert-raid-takeover.sh
+++ b/test/shell/lvconvert-raid-takeover.sh
@@ -19,7 +19,64 @@ aux have_raid 1 9 0 || skip
correct_raid4_layout=0
aux have_raid 1 9 1 && correct_raid4_layout=1
-aux prepare_vg 9 288
+aux prepare_vg 6 80
+
+function _lvcreate
+{
+ local level=$1
+ local req_stripes=$2
+ local stripes=$3
+ local size=$4
+ local vg=$5
+ local lv=$6
+
+ lvcreate -y -aey --type $level -i $req_stripes -L $size -n $lv $vg
+ check lv_field $vg/$lv segtype "$level"
+ check lv_field $vg/$lv stripes $stripes
+ echo y | mkfs -t ext4 /dev/mapper/$vg-$lv
+ fsck -fn /dev/mapper/$vg-$lv
+}
+
+function _lvconvert
+{
+ local req_level=$1
+ local level=$2
+ local stripes=$3
+ local vg=$4
+ local lv=$5
+ local dont_wait=$6
+
+ lvconvert -y --ty $req_level $vg/$lv
+ [ $? -ne 0 ] && return $?
+ check lv_field $vg/$lv segtype "$level"
+ check lv_field $vg/$lv stripes $stripes
+ if [ -z "$dont_wait" ]
+ then
+ fsck -fn /dev/mapper/$vg-$lv
+ aux wait_for_sync $vg $lv
+ fi
+ fsck -fn /dev/mapper/$vg-$lv
+}
+
+function _invalid_raid5_conversions
+{
+ local lv=$1
+ local vg=$2
+
+ not _lvconvert striped 4 $vg $lv1
+ not _lvconvert raid0 raid0 4 $vg $lv1
+ not _lvconvert raid0_meta raid0_meta 4 $vg $lv1
+ not _lvconvert raid4 raid4 5 $vg $lv1
+ not _lvconvert raid5_ls raid5_ls 5 $vg $lv1
+ not _lvconvert raid5_rs raid5_rs 5 $vg $lv1
+ not _lvconvert raid5_la raid5_la 5 $vg $lv1
+ not _lvconvert raid5_ra raid5_ra 5 $vg $lv1
+ not _lvconvert raid6_zr raid6_zr 6 $vg $lv1
+ not _lvconvert raid6_nr raid6_nr 6 $vg $lv1
+ not _lvconvert raid6_nc raid6_nc 6 $vg $lv1
+ not _lvconvert raid6_n_6 raid6_n_6 6 $vg $lv1
+ not _lvconvert raid6 raid6_n_6 6 $vg $lv1
+}
# Delay 1st leg so that rebuilding status characters
# can be read before resync finished too quick.
@@ -81,240 +138,149 @@ aux wait_for_sync $vg $lv1
# Clean up
lvremove --yes $vg/$lv1
-# Create 3-way striped
-lvcreate -y -aey --type striped -i 3 -L 64M -n $lv1 $vg
-check lv_field $vg/$lv1 segtype "striped"
-check lv_field $vg/$lv1 stripes 3
-echo y | mkfs -t ext4 /dev/mapper/$vg-$lv1
-fsck -fn /dev/mapper/$vg-$lv1
-
-# Create 3-way raid0
-lvcreate -y -aey --type raid0 -i 3 -L 64M -n $lv2 $vg
-check lv_field $vg/$lv2 segtype "raid0"
-check lv_field $vg/$lv2 stripes 3
-echo y | mkfs -t ext4 /dev/mapper/$vg-$lv2
-fsck -fn /dev/mapper/$vg-$lv2
-
-# Create 3-way raid0_meta
-lvcreate -y -aey --type raid0_meta -i 3 -L 64M -n $lv3 $vg
-check lv_field $vg/$lv3 segtype "raid0_meta"
-check lv_field $vg/$lv3 stripes 3
-echo y | mkfs -t ext4 /dev/mapper/$vg-$lv3
-fsck -fn /dev/mapper/$vg-$lv3
if [ $correct_raid4_layout -eq 1 ]
then
-# Create 3-way raid4
-lvcreate -y -aey --type raid4 -i 3 -L 64M -n $lv4 $vg
-check lv_field $vg/$lv4 segtype "raid4"
-check lv_field $vg/$lv4 stripes 4
-echo y | mkfs -t ext4 /dev/mapper/$vg-$lv4
-fsck -fn /dev/mapper/$vg-$lv4
-aux wait_for_sync $vg $lv4
-fsck -fn /dev/mapper/$vg-$lv4
+#
+# Start out with raid4
+#
-# Convert raid4 -> striped (correct raid4 mapping test!)
-lvconvert -y --ty striped $vg/$lv4
-check lv_field $vg/$lv4 segtype "striped"
-check lv_field $vg/$lv4 stripes 3
-fsck -fn /dev/mapper/$vg-$lv4
+# Create 3-way striped raid4 (4 legs total)
+_lvcreate raid4 3 4 64M $vg $lv1
+aux wait_for_sync $vg $lv1
+# Convert raid4 -> striped
+_lvconvert striped striped 3 $vg $lv1 1
# Convert striped -> raid4
-lvconvert -y --ty raid4 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid4"
-check lv_field $vg/$lv1 stripes 4
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid4 raid4 4 $vg $lv1
# Convert raid4 -> raid5_n
-lvconvert -y --ty raid5_n $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid5_n"
-check lv_field $vg/$lv1 stripes 4
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid5 raid5_n 4 $vg $lv1 1
-# Convert raid5 -> striped
-lvconvert -y --ty striped $vg/$lv1
-check lv_field $vg/$lv1 segtype "striped"
-check lv_field $vg/$lv1 stripes 3
-fsck -fn /dev/mapper/$vg-$lv1
+# Convert raid5_n -> striped
+_lvconvert striped striped 3 $vg $lv1 1
# Convert striped -> raid5_n
-lvconvert -y --ty raid5_n $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid5_n"
-check lv_field $vg/$lv1 stripes 4
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid5_n raid5_n 4 $vg $lv1
# Convert raid5_n -> raid4
-lvconvert -y --ty raid4 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid4"
-check lv_field $vg/$lv1 stripes 4
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
-
-
-# Convert raid0 -> raid4
-lvconvert -y --ty raid4 $vg/$lv2
-check lv_field $vg/$lv2 segtype "raid4"
-check lv_field $vg/$lv2 stripes 4
-fsck -fn /dev/mapper/$vg-$lv2
-aux wait_for_sync $vg $lv2
-fsck -fn /dev/mapper/$vg-$lv2
+_lvconvert raid4 raid4 4 $vg $lv1 1
# Convert raid4 -> raid0
-lvconvert -y --ty raid0 $vg/$lv2
-check lv_field $vg/$lv2 segtype "raid0"
-check lv_field $vg/$lv2 stripes 3
-fsck -fn /dev/mapper/$vg-$lv2
+_lvconvert raid0 raid0 3 $vg $lv1 1
# Convert raid0 -> raid5_n
-lvconvert -y --ty raid5_n $vg/$lv2
-check lv_field $vg/$lv2 segtype "raid5_n"
-check lv_field $vg/$lv2 stripes 4
-fsck -fn /dev/mapper/$vg-$lv2
-aux wait_for_sync $vg $lv2
-fsck -fn /dev/mapper/$vg-$lv2
+_lvconvert raid5_n raid5_n 4 $vg $lv1
# Convert raid5_n -> raid0_meta
-lvconvert -y --ty raid0_meta $vg/$lv2
-check lv_field $vg/$lv2 segtype "raid0_meta"
-check lv_field $vg/$lv2 stripes 3
-fsck -fn /dev/mapper/$vg-$lv2
+_lvconvert raid0_meta raid0_meta 3 $vg $lv1 1
# Convert raid0_meta -> raid5_n
-lvconvert -y --ty raid5_n $vg/$lv2
-check lv_field $vg/$lv2 segtype "raid5_n"
-check lv_field $vg/$lv2 stripes 4
-fsck -fn /dev/mapper/$vg-$lv2
-aux wait_for_sync $vg $lv2
-fsck -fn /dev/mapper/$vg-$lv2
-
+_lvconvert raid5 raid5_n 4 $vg $lv1
# Convert raid4 -> raid0_meta
-lvconvert -y --ty raid0_meta $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid0_meta"
-check lv_field $vg/$lv1 stripes 3
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid0_meta raid0_meta 3 $vg $lv1 1
# Convert raid0_meta -> raid4
-lvconvert -y --ty raid4 $vg/$lv1
-fsck -fn /dev/mapper/$vg-$lv1
-check lv_field $vg/$lv1 segtype "raid4"
-check lv_field $vg/$lv1 stripes 4
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid4 raid4 4 $vg $lv1
# Convert raid4 -> raid0
-lvconvert -y --ty raid0 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid0"
-check lv_field $vg/$lv1 stripes 3
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid0 raid0 3 $vg $lv1 1
# Convert raid0 -> raid4
-lvconvert -y --ty raid4 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid4"
-check lv_field $vg/$lv1 stripes 4
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid4 raid4 4 $vg $lv1
# Convert raid4 -> striped
-lvconvert -y --ty striped $vg/$lv1
-check lv_field $vg/$lv1 segtype "striped"
-check lv_field $vg/$lv1 stripes 3
-fsck -fn /dev/mapper/$vg-$lv1
-
-
-
+_lvconvert striped striped 3 $vg $lv1 1
# Convert striped -> raid6_n_6
-lvconvert -y --ty raid6_n_6 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid6_n_6"
-check lv_field $vg/$lv1 stripes 5
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid6_n_6 raid6_n_6 5 $vg $lv1
# Convert raid6_n_6 -> striped
-lvconvert -y --ty striped $vg/$lv1
-check lv_field $vg/$lv1 segtype "striped"
-check lv_field $vg/$lv1 stripes 3
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert striped striped 3 $vg $lv1 1
# Convert striped -> raid6_n_6
-lvconvert -y --ty raid6_n_6 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid6_n_6"
-check lv_field $vg/$lv1 stripes 5
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid6 raid6_n_6 5 $vg $lv1
# Convert raid6_n_6 -> raid5_n
-lvconvert -y --ty raid5_n $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid5_n"
-check lv_field $vg/$lv1 stripes 4
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid5_n raid5_n 4 $vg $lv1 1
# Convert raid5_n -> raid6_n_6
-lvconvert -y --ty raid6_n_6 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid6_n_6"
-check lv_field $vg/$lv1 stripes 5
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid6_n_6 raid6_n_6 5 $vg $lv1
# Convert raid6_n_6 -> raid4
-lvconvert -y --ty raid4 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid4"
-check lv_field $vg/$lv1 stripes 4
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid4 raid4 4 $vg $lv1 1
# Convert raid4 -> raid6_n_6
-lvconvert -y --ty raid6_n_6 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid6_n_6"
-check lv_field $vg/$lv1 stripes 5
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid6 raid6_n_6 5 $vg $lv1
# Convert raid6_n_6 -> raid0
-lvconvert -y --ty raid0 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid0"
-check lv_field $vg/$lv1 stripes 3
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid0 raid0 3 $vg $lv1 1
# Convert raid0 -> raid6_n_6
-lvconvert -y --ty raid6_n_6 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid6_n_6"
-check lv_field $vg/$lv1 stripes 5
-fsck -fn /dev/mapper/$vg-$lv1
-aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid6_n_6 raid6_n_6 5 $vg $lv1
# Convert raid6_n_6 -> raid0_meta
-lvconvert -y --ty raid0_meta $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid0_meta"
-check lv_field $vg/$lv1 stripes 3
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid0_meta raid0_meta 3 $vg $lv1 1
# Convert raid0_meta -> raid6_n_6
-lvconvert -y --ty raid6_n_6 $vg/$lv1
-check lv_field $vg/$lv1 segtype "raid6_n_6"
-check lv_field $vg/$lv1 stripes 5
-fsck -fn /dev/mapper/$vg-$lv1
+_lvconvert raid6 raid6_n_6 5 $vg $lv1
+
+# Clean up
+lvremove -y $vg
+
+# Create + convert 4-way raid5 variations
+_lvcreate raid5 4 5 64M $vg $lv1
aux wait_for_sync $vg $lv1
-fsck -fn /dev/mapper/$vg-$lv1
+_invalid_raid5_conversions $vg $lv1
+not _lvconvert raid6_rs_6 raid6_rs_6 6 $vg $lv1
+not _lvconvert raid6_la_6 raid6_la_6 6 $vg $lv1
+not _lvconvert raid6_ra_6 raid6_ra_6 6 $vg $lv1
+_lvconvert raid6_ls_6 raid6_ls_6 6 $vg $lv1
+_lvconvert raid5_ls raid5_ls 5 $vg $lv1 1
+lvremove -y $vg
+
+_lvcreate raid5_ls 4 5 64M $vg $lv1
+aux wait_for_sync $vg $lv1
+_invalid_raid5_conversions $vg $lv1
+not _lvconvert raid6_rs_6 raid6_rs_6 6 $vg $lv1
+not _lvconvert raid6_la_6 raid6_la_6 6 $vg $lv1
+not _lvconvert raid6_ra_6 raid6_ra_6 6 $vg $lv1
+_lvconvert raid6_ls_6 raid6_ls_6 6 $vg $lv1
+_lvconvert raid5_ls raid5_ls 5 $vg $lv1 1
+lvremove -y $vg
+
+_lvcreate raid5_rs 4 5 64M $vg $lv1
+aux wait_for_sync $vg $lv1
+_invalid_raid5_conversions $vg $lv1
+not _lvconvert raid6_ra_6 raid6_ra_6 6 $vg $lv1
+not _lvconvert raid6_la_6 raid6_la_6 6 $vg $lv1
+not _lvconvert raid6_ra_6 raid6_ra_6 6 $vg $lv1
+_lvconvert raid6_rs_6 raid6_rs_6 6 $vg $lv1
+_lvconvert raid5_rs raid5_rs 5 $vg $lv1 1
+lvremove -y $vg
+
+_lvcreate raid5_la 4 5 64M $vg $lv1
+aux wait_for_sync $vg $lv1
+_invalid_raid5_conversions $vg $lv1
+not _lvconvert raid6_ls_6 raid6_ls_6 6 $vg $lv1
+not _lvconvert raid6_rs_6 raid6_rs_6 6 $vg $lv1
+not _lvconvert raid6_ra_6 raid6_ra_6 6 $vg $lv1
+_lvconvert raid6_la_6 raid6_la_6 6 $vg $lv1
+_lvconvert raid5_la raid5_la 5 $vg $lv1 1
+lvremove -y $vg
+
+_lvcreate raid5_ra 4 5 64M $vg $lv1
+aux wait_for_sync $vg $lv1
+_invalid_raid5_conversions $vg $lv1
+not _lvconvert raid6_ls_6 raid6_ls_6 6 $vg $lv1
+not _lvconvert raid6_rs_6 raid6_rs_6 6 $vg $lv1
+not _lvconvert raid6_la_6 raid6_la_6 6 $vg $lv1
+_lvconvert raid6_ra_6 raid6_ra_6 6 $vg $lv1
+_lvconvert raid5_ra raid5_ra 5 $vg $lv1 1
+lvremove -y $vg
else
7 years, 3 months
master - WHATS_NEW: New segment type raid6_n_6
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=d8568552e460af...
Commit: d8568552e460afe477f1baa7c46da81039f85b15
Parent: 3673ce48e0d6147fe7a24fcce97130fab8914e51
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Sat Feb 4 14:09:26 2017 +0100
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Sat Feb 4 14:09:26 2017 +0100
WHATS_NEW: New segment type raid6_n_6
---
WHATS_NEW | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 95a24ba..cfa1179 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.169 -
=====================================
+ Support raid6_n_6 segment type and conversions from/to it.
Support raid5_n segment type and conversions from/to it.
Support new internal command _dmeventd_thin_command.
Introduce new dmeventd/thin_command configurable setting.
7 years, 3 months
master - lvconvert: add segtype raid6_n_6 and conversions to/from it
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=3673ce48e0d614...
Commit: 3673ce48e0d6147fe7a24fcce97130fab8914e51
Parent: 96f331fe05297259274c04ac7fbd7d99eb911c77
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Sat Feb 4 01:40:58 2017 +0100
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Sat Feb 4 01:42:21 2017 +0100
lvconvert: add segtype raid6_n_6 and conversions to/from it
Add:
- support for segment type raid6_n_6 (striped raid with dedicated last parity/Q-Syndrome SubLVs)
- conversion support from striped/raid0/raid0_meta/raid4 to/from raid6_n_6
- related tests to lvconvert-raid-takeover.sh
Related: rhbz1366296
---
lib/metadata/raid_manip.c | 70 +++++++++++++++++++--------
lib/raid/raid.c | 1 +
libdm/libdm-deptree.c | 5 ++
test/shell/lvconvert-raid-takeover.sh | 85 +++++++++++++++++++++++++++++++++
4 files changed, 140 insertions(+), 21 deletions(-)
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index 3543a69..b769e34 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -2534,11 +2534,7 @@ static struct lv_segment *_convert_striped_to_raid0(struct logical_volume *lv,
* Change the user's requested segment type to
* the appropriate more-refined one for takeover.
*
- * raid0 can take over:
- * raid4
- *
- * raid4 can take over:
- * raid0 - if there is only one stripe zone
+ * raid can takeover striped,raid0 if there is only one stripe zone
*/
#define ALLOW_NONE 0x0
#define ALLOW_STRIPES 0x2
@@ -2575,9 +2571,9 @@ static struct possible_takeover_reshape_type _possible_takeover_reshape_types[]
.current_areas = 1,
.options = ALLOW_NONE }, /* FIXME: ALLOW_REGION_SIZE */
- /* striped,raid0*,raid4,raid5_n <-> striped,raid0*,raid4,raid5_n */
- { .current_types = SEG_STRIPED_TARGET|SEG_RAID0|SEG_RAID0_META|SEG_RAID4|SEG_RAID5_N,
- .possible_types = SEG_STRIPED_TARGET|SEG_RAID0|SEG_RAID0_META|SEG_RAID4|SEG_RAID5_N,
+ /* striped,raid0*,raid4,raid5_n,raid6_n_6 <-> striped,raid0*,raid4,raid5_n,raid6_n_6 */
+ { .current_types = SEG_STRIPED_TARGET|SEG_RAID0|SEG_RAID0_META|SEG_RAID4|SEG_RAID5_N|SEG_RAID6_N_6,
+ .possible_types = SEG_STRIPED_TARGET|SEG_RAID0|SEG_RAID0_META|SEG_RAID4|SEG_RAID5_N|SEG_RAID6_N_6,
.current_areas = ~0U,
.options = ALLOW_NONE }, /* FIXME: ALLOW_REGION_SIZE */
@@ -3061,7 +3057,8 @@ static int _shift_parity_dev(struct lv_segment *seg)
return 1;
}
-/* raid45 -> raid0* / striped */
+/* raid456 -> raid0* / striped */
+static int _raid45_to_raid54_wrapper(TAKEOVER_FN_ARGS);
static int _raid456_to_raid0_or_striped_wrapper(TAKEOVER_FN_ARGS)
{
int rename_sublvs = 0;
@@ -3084,8 +3081,9 @@ static int _raid456_to_raid0_or_striped_wrapper(TAKEOVER_FN_ARGS)
return 0;
if (!yes && yes_no_prompt("Are you sure you want to convert \"%s\" LV %s to \"%s\" "
- "type losing all resilience? [y/n]: ",
- lvseg_name(seg), display_lvname(lv), new_segtype->name) == 'n') {
+ "type losing %s resilience? [y/n]: ",
+ lvseg_name(seg), display_lvname(lv), new_segtype->name,
+ segtype_is_striped(new_segtype) ? "all" : "some") == 'n') {
log_error("Logical volume %s NOT converted to \"%s\"",
display_lvname(lv), new_segtype->name);
return 0;
@@ -3135,8 +3133,13 @@ static int _raid456_to_raid0_or_striped_wrapper(TAKEOVER_FN_ARGS)
!_raid0_add_or_remove_metadata_lvs(lv, 0 /* update_and_reload */, allocate_pvs, &removal_lvs))
return_0;
+ if (segtype_is_raid4(new_segtype)) {
+ if (!(seg->segtype = get_segtype_from_flag(lv->vg->cmd, SEG_RAID5_N)))
+ return_0;
+ } else
+ seg->segtype = new_segtype;
+
seg->region_size = region_size;
- seg->segtype = new_segtype;
if (!_lv_update_reload_fns_reset_eliminate_lvs(lv, &removal_lvs))
return_0;
@@ -3150,6 +3153,10 @@ static int _raid456_to_raid0_or_striped_wrapper(TAKEOVER_FN_ARGS)
return_0;
}
+ if (segtype_is_raid4(new_segtype))
+ return _raid45_to_raid54_wrapper(lv, new_segtype, yes, force, first_seg(lv)->area_count,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs);
+
return 1;
}
@@ -3287,7 +3294,8 @@ static int _striped_or_raid0_to_raid45610_wrapper(TAKEOVER_FN_ARGS)
/* FIXME: restricted to raid4 and raid5_n for the time being... */
if (!segtype_is_raid4(new_segtype) &&
- !segtype_is_raid5_n(new_segtype)) {
+ !segtype_is_raid5_n(new_segtype) &&
+ !segtype_is_raid6_n_6(new_segtype)) {
/* Can't convert striped/raid0* to e.g. raid10_offset */
log_error("Can't convert %s to %s.", display_lvname(lv), new_segtype->name);
return 0;
@@ -3456,7 +3464,9 @@ static int _takeover_from_raid0_to_raid45(TAKEOVER_FN_ARGS)
static int _takeover_from_raid0_to_raid6(TAKEOVER_FN_ARGS)
{
- return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
+ return _striped_or_raid0_to_raid45610_wrapper(lv, new_segtype, yes, force,
+ first_seg(lv)->area_count + 2 /* new_image_count */,
+ 3 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
static int _takeover_from_raid0_to_striped(TAKEOVER_FN_ARGS)
@@ -3504,7 +3514,9 @@ static int _takeover_from_raid0_meta_to_raid45(TAKEOVER_FN_ARGS)
static int _takeover_from_raid0_meta_to_raid6(TAKEOVER_FN_ARGS)
{
- return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
+ return _striped_or_raid0_to_raid45610_wrapper(lv, new_segtype, yes, force,
+ first_seg(lv)->area_count + 2 /* new_image_count */,
+ 3 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
static int _takeover_from_raid0_meta_to_striped(TAKEOVER_FN_ARGS)
@@ -3587,7 +3599,17 @@ static int _takeover_from_raid45_to_raid54(TAKEOVER_FN_ARGS)
static int _takeover_from_raid45_to_raid6(TAKEOVER_FN_ARGS)
{
- return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
+ if (seg_is_raid4(first_seg(lv))) {
+ struct segment_type *segtype = get_segtype_from_flag(lv->vg->cmd, SEG_RAID5_N);
+
+ if (!segtype ||
+ !_raid45_to_raid54_wrapper(lv, segtype, yes, force, first_seg(lv)->area_count,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs))
+ return 0;
+ }
+ return _striped_or_raid0_to_raid45610_wrapper(lv, new_segtype, yes, force,
+ first_seg(lv)->area_count + 1 /* new_image_count */,
+ 3 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
static int _takeover_from_raid45_to_striped(TAKEOVER_FN_ARGS)
@@ -3597,22 +3619,26 @@ static int _takeover_from_raid45_to_striped(TAKEOVER_FN_ARGS)
static int _takeover_from_raid6_to_raid0(TAKEOVER_FN_ARGS)
{
- return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
+ return _raid456_to_raid0_or_striped_wrapper(lv, new_segtype, yes, force, first_seg(lv)->area_count - 2,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
static int _takeover_from_raid6_to_raid0_meta(TAKEOVER_FN_ARGS)
{
- return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
+ return _raid456_to_raid0_or_striped_wrapper(lv, new_segtype, yes, force, first_seg(lv)->area_count - 2,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
static int _takeover_from_raid6_to_raid45(TAKEOVER_FN_ARGS)
{
- return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
+ return _raid456_to_raid0_or_striped_wrapper(lv, new_segtype, yes, force, first_seg(lv)->area_count - 1,
+ 2 /* data_copies */, 0, 0, 0, allocate_pvs);
}
static int _takeover_from_raid6_to_striped(TAKEOVER_FN_ARGS)
{
- return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
+ return _raid456_to_raid0_or_striped_wrapper(lv, new_segtype, yes, force, first_seg(lv)->area_count - 2,
+ 2 /* data_copies */, 0, 0, 0, allocate_pvs);
}
static int _takeover_from_striped_to_raid0(TAKEOVER_FN_ARGS)
@@ -3649,7 +3675,9 @@ static int _takeover_from_striped_to_raid45(TAKEOVER_FN_ARGS)
static int _takeover_from_striped_to_raid6(TAKEOVER_FN_ARGS)
{
- return _takeover_unsupported_yet(lv, new_stripes, new_segtype);
+ return _striped_or_raid0_to_raid45610_wrapper(lv, new_segtype, yes, force,
+ first_seg(lv)->area_count + 2 /* new_image_count */,
+ 3 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/*
diff --git a/lib/raid/raid.c b/lib/raid/raid.c
index 7dfafef..631ffb7 100644
--- a/lib/raid/raid.c
+++ b/lib/raid/raid.c
@@ -543,6 +543,7 @@ static const struct raid_type {
{ SEG_TYPE_NAME_RAID5_RA, 1, SEG_RAID5_RA },
{ SEG_TYPE_NAME_RAID5_RS, 1, SEG_RAID5_RS },
{ SEG_TYPE_NAME_RAID6, 2, SEG_RAID6 },
+ { SEG_TYPE_NAME_RAID6_N_6, 2, SEG_RAID6_N_6 },
{ SEG_TYPE_NAME_RAID6_NC, 2, SEG_RAID6_NC },
{ SEG_TYPE_NAME_RAID6_NR, 2, SEG_RAID6_NR },
{ SEG_TYPE_NAME_RAID6_ZR, 2, SEG_RAID6_ZR }
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index 8a32320..bd6c63d 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -52,6 +52,7 @@ enum {
SEG_RAID5_RA,
SEG_RAID5_LS,
SEG_RAID5_RS,
+ SEG_RAID6_N_6,
SEG_RAID6_ZR,
SEG_RAID6_NR,
SEG_RAID6_NC,
@@ -87,6 +88,7 @@ static const struct {
{ SEG_RAID5_RA, "raid5_ra"},
{ SEG_RAID5_LS, "raid5_ls"},
{ SEG_RAID5_RS, "raid5_rs"},
+ { SEG_RAID6_N_6,"raid6_n_6"},
{ SEG_RAID6_ZR, "raid6_zr"},
{ SEG_RAID6_NR, "raid6_nr"},
{ SEG_RAID6_NC, "raid6_nc"},
@@ -2147,6 +2149,7 @@ static int _emit_areas_line(struct dm_task *dmt __attribute__((unused)),
case SEG_RAID5_RA:
case SEG_RAID5_LS:
case SEG_RAID5_RS:
+ case SEG_RAID6_N_6:
case SEG_RAID6_ZR:
case SEG_RAID6_NR:
case SEG_RAID6_NC:
@@ -2596,6 +2599,7 @@ static int _emit_segment_line(struct dm_task *dmt, uint32_t major,
case SEG_RAID5_RA:
case SEG_RAID5_LS:
case SEG_RAID5_RS:
+ case SEG_RAID6_N_6:
case SEG_RAID6_ZR:
case SEG_RAID6_NR:
case SEG_RAID6_NC:
@@ -3878,6 +3882,7 @@ int dm_tree_node_add_null_area(struct dm_tree_node *node, uint64_t offset)
case SEG_RAID5_RA:
case SEG_RAID5_LS:
case SEG_RAID5_RS:
+ case SEG_RAID6_N_6:
case SEG_RAID6_ZR:
case SEG_RAID6_NR:
case SEG_RAID6_NC:
diff --git a/test/shell/lvconvert-raid-takeover.sh b/test/shell/lvconvert-raid-takeover.sh
index 0b7d326..b45088e 100644
--- a/test/shell/lvconvert-raid-takeover.sh
+++ b/test/shell/lvconvert-raid-takeover.sh
@@ -231,6 +231,91 @@ check lv_field $vg/$lv1 segtype "striped"
check lv_field $vg/$lv1 stripes 3
fsck -fn /dev/mapper/$vg-$lv1
+
+
+
+# Convert striped -> raid6_n_6
+lvconvert -y --ty raid6_n_6 $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid6_n_6"
+check lv_field $vg/$lv1 stripes 5
+fsck -fn /dev/mapper/$vg-$lv1
+aux wait_for_sync $vg $lv1
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert raid6_n_6 -> striped
+lvconvert -y --ty striped $vg/$lv1
+check lv_field $vg/$lv1 segtype "striped"
+check lv_field $vg/$lv1 stripes 3
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert striped -> raid6_n_6
+lvconvert -y --ty raid6_n_6 $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid6_n_6"
+check lv_field $vg/$lv1 stripes 5
+fsck -fn /dev/mapper/$vg-$lv1
+aux wait_for_sync $vg $lv1
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert raid6_n_6 -> raid5_n
+lvconvert -y --ty raid5_n $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid5_n"
+check lv_field $vg/$lv1 stripes 4
+fsck -fn /dev/mapper/$vg-$lv1
+aux wait_for_sync $vg $lv1
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert raid5_n -> raid6_n_6
+lvconvert -y --ty raid6_n_6 $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid6_n_6"
+check lv_field $vg/$lv1 stripes 5
+fsck -fn /dev/mapper/$vg-$lv1
+aux wait_for_sync $vg $lv1
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert raid6_n_6 -> raid4
+lvconvert -y --ty raid4 $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid4"
+check lv_field $vg/$lv1 stripes 4
+fsck -fn /dev/mapper/$vg-$lv1
+aux wait_for_sync $vg $lv1
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert raid4 -> raid6_n_6
+lvconvert -y --ty raid6_n_6 $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid6_n_6"
+check lv_field $vg/$lv1 stripes 5
+fsck -fn /dev/mapper/$vg-$lv1
+aux wait_for_sync $vg $lv1
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert raid6_n_6 -> raid0
+lvconvert -y --ty raid0 $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid0"
+check lv_field $vg/$lv1 stripes 3
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert raid0 -> raid6_n_6
+lvconvert -y --ty raid6_n_6 $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid6_n_6"
+check lv_field $vg/$lv1 stripes 5
+fsck -fn /dev/mapper/$vg-$lv1
+aux wait_for_sync $vg $lv1
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert raid6_n_6 -> raid0_meta
+lvconvert -y --ty raid0_meta $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid0_meta"
+check lv_field $vg/$lv1 stripes 3
+fsck -fn /dev/mapper/$vg-$lv1
+
+# Convert raid0_meta -> raid6_n_6
+lvconvert -y --ty raid6_n_6 $vg/$lv1
+check lv_field $vg/$lv1 segtype "raid6_n_6"
+check lv_field $vg/$lv1 stripes 5
+fsck -fn /dev/mapper/$vg-$lv1
+aux wait_for_sync $vg $lv1
+fsck -fn /dev/mapper/$vg-$lv1
+
else
not lvcreate -y -aey --type raid4 -i 3 -L 64M -n $lv4 $vg
7 years, 3 months