summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Earl Brassow <jbrassow@redhat.com>2012-02-13 20:13:39 +0000
committerJonathan Earl Brassow <jbrassow@redhat.com>2012-02-13 20:13:39 +0000
commitad48a46fc9df2ad75510a975c5b15535fc7da825 (patch)
tree337d704df8b122eeee01ebefac0f50ece14ddf27
parent96f82296ae357325580e1c8512942619750ba1e6 (diff)
downloadlvm2-ad48a46fc9df2ad75510a975c5b15535fc7da825.tar.gz
lvm2-ad48a46fc9df2ad75510a975c5b15535fc7da825.tar.xz
lvm2-ad48a46fc9df2ad75510a975c5b15535fc7da825.zip
Make conversion from a synced 'mirror' to 'raid1' not cause a full resync.
It was not possible to pass down the DM_[FORCE|NO]SYNC flags to 'dm_tree_node_add_raid_target'. This meant that converting to 'raid1' from 'mirror' would cause a full resync. (It also meant that '--nosync' was ineffective when creating a 'raid1' LV.) I've taken the 'reserved' parameter in 'dm_tree_node_add_raid_target' and used it for the "flags" parameter. Now it is possible to pass the sync flags and any other flags that may come up.
-rw-r--r--WHATS_NEW1
-rw-r--r--lib/raid/raid.c6
-rw-r--r--libdm/libdevmapper.h2
-rw-r--r--libdm/libdm-deptree.c3
4 files changed, 9 insertions, 3 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index 740c5dc8..74ae927f 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.92 -
====================================
+ Make conversion from a synced 'mirror' to 'raid1' not cause a full resync.
Properly test buffer for unit check in units_to_bytes().
Add configure --with-systemdsystemunitdir.
Add check for allocation failure in _build_matcher().
diff --git a/lib/raid/raid.c b/lib/raid/raid.c
index 3656dada..211f8070 100644
--- a/lib/raid/raid.c
+++ b/lib/raid/raid.c
@@ -159,6 +159,7 @@ static int _raid_add_target_line(struct dev_manager *dm __attribute__((unused)),
uint32_t *pvmove_mirror_count __attribute__((unused)))
{
uint32_t s;
+ uint64_t flags = 0;
uint64_t rebuilds = 0;
if (!seg->area_count) {
@@ -186,9 +187,12 @@ static int _raid_add_target_line(struct dev_manager *dm __attribute__((unused)),
if (seg_lv(seg, s)->status & LV_REBUILD)
rebuilds |= 1 << s;
+ if (mirror_in_sync())
+ flags = DM_NOSYNC;
+
if (!dm_tree_node_add_raid_target(node, len, _raid_name(seg),
seg->region_size, seg->stripe_size,
- rebuilds, 0))
+ rebuilds, flags))
return_0;
return add_areas_line(dm, seg, node, 0u, seg->area_count);
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 4ebee2fb..61a4374f 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -548,7 +548,7 @@ int dm_tree_node_add_raid_target(struct dm_tree_node *node,
uint32_t region_size,
uint32_t stripe_size,
uint64_t rebuilds,
- uint64_t reserved2);
+ uint64_t flags);
/*
* Replicator operation mode
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index dabd7225..06133163 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -2751,7 +2751,7 @@ int dm_tree_node_add_raid_target(struct dm_tree_node *node,
uint32_t region_size,
uint32_t stripe_size,
uint64_t rebuilds,
- uint64_t reserved2)
+ uint64_t flags)
{
int i;
struct load_segment *seg = NULL;
@@ -2769,6 +2769,7 @@ int dm_tree_node_add_raid_target(struct dm_tree_node *node,
seg->stripe_size = stripe_size;
seg->area_count = 0;
seg->rebuilds = rebuilds;
+ seg->flags = flags;
return 1;
}