diff options
author | Jonathan Earl Brassow <jbrassow@redhat.com> | 2012-02-13 20:13:39 +0000 |
---|---|---|
committer | Jonathan Earl Brassow <jbrassow@redhat.com> | 2012-02-13 20:13:39 +0000 |
commit | ad48a46fc9df2ad75510a975c5b15535fc7da825 (patch) | |
tree | 337d704df8b122eeee01ebefac0f50ece14ddf27 | |
parent | 96f82296ae357325580e1c8512942619750ba1e6 (diff) | |
download | lvm2-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_NEW | 1 | ||||
-rw-r--r-- | lib/raid/raid.c | 6 | ||||
-rw-r--r-- | libdm/libdevmapper.h | 2 | ||||
-rw-r--r-- | libdm/libdm-deptree.c | 3 |
4 files changed, 9 insertions, 3 deletions
@@ -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; } |