[lvm-devel] master - cache: Fix cache LV not being instantiated in kernel
Jonathan Brassow
jbrassow at fedoraproject.org
Fri Feb 14 22:04:39 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=fa4812bf7b336cf1a301ec7218f905894422e61e
Commit: fa4812bf7b336cf1a301ec7218f905894422e61e
Parent: 554159d519ba5c523d506785d61d10374456a020
Author: Jonathan Brassow <jbrassow at redhat.com>
AuthorDate: Fri Feb 14 16:03:23 2014 -0600
Committer: Jonathan Brassow <jbrassow at redhat.com>
CommitterDate: Fri Feb 14 16:04:31 2014 -0600
cache: Fix cache LV not being instantiated in kernel
When an origin exists and the 'lvcreate' command is used to create
a cache pool + cache LV, the table is loaded into the kernel but
never instantiated (suspend/resume was never called). A user running
LVM commands would never know that the kernel did not have the
proper state unless they also ran the dmsetup 'table/status' command.
The solution is to suspend/resume the cache LV to make the loaded
tables become active.
---
lib/metadata/lv_manip.c | 20 +++++++++++++++++++-
test/shell/lvcreate-cache.sh | 2 ++
2 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index d38dd7c..6b4c9a8 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -6282,7 +6282,25 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
if (lp->temporary)
lv->status |= LV_TEMPORARY;
- if (lv_is_thin_pool(lv) || lv_is_cache_pool(lv)) {
+ if (lv_is_cache_type(lv)) {
+ if (!lv_is_active(lv)) {
+ if (!activate_lv_excl(cmd, lv)) {
+ log_error("Failed to activate pool %s.",
+ lv->name);
+ goto deactivate_and_revert_new_lv;
+ }
+ } else {
+ if (!suspend_lv(cmd, lv)) {
+ log_error("Failed to suspend pool %s.",
+ lv->name);
+ goto deactivate_and_revert_new_lv;
+ }
+ if (!resume_lv(cmd, lv)) {
+ log_error("Failed to resume pool %s.", lv->name);
+ goto deactivate_and_revert_new_lv;
+ }
+ }
+ } else if (lv_is_thin_pool(lv)) {
if (is_change_activating(lp->activate)) {
if (vg_is_clustered(lv->vg)) {
if (!activate_lv_excl(cmd, lv)) {
diff --git a/test/shell/lvcreate-cache.sh b/test/shell/lvcreate-cache.sh
index 39f95c1..01e6f51 100644
--- a/test/shell/lvcreate-cache.sh
+++ b/test/shell/lvcreate-cache.sh
@@ -48,6 +48,7 @@ lvremove -ff $vg
# Create cache_pool, then origin with cache, then remove all
lvcreate --type cache_pool -l 1 -n ${lv}_cache_pool $vg
lvcreate --type cache -l 2 $vg/${lv}_cache_pool -n $lv1
+dmsetup table ${vg}-$lv1 | grep cache # ensure it is loaded in kernel
lvremove -ff $vg
# Create cache_pool, then origin with cache, then remove cache_pool/cache
@@ -75,6 +76,7 @@ lvremove -ff $vg/${lv}_cache_pool
# Create origin, then cache_pool and cache
lvcreate -l 2 -n $lv1 $vg
lvcreate --type cache -l 1 $vg/$lv1
+dmsetup table ${vg}-$lv1 | grep cache # ensure it is loaded in kernel
lvremove -ff $vg
# Shorthand CLI (origin exists, create cache_pool and cache)
More information about the lvm-devel
mailing list