master - raid: correct raid6_n_6 -> raid5 convenience type
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=ebd0fed0ceb982503ac...
Commit: ebd0fed0ceb982503ac474c2e6579a45a983e305
Parent: 00acae12a4295075f1b93786f60327e5d3c26e70
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Mon Nov 13 18:03:50 2017 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Nov 14 14:41:06 2017 +0000
raid: correct raid6_n_6 -> raid5 convenience type
Fix "lvconvert --type raid5 RaidLV" on a "raid6_n_6" LV offering
false "raid6_ls_6" instead of "raid5_n".
---
lib/metadata/raid_manip.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index a904666..2d8aaed 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -6141,9 +6141,12 @@ static int _set_convenient_raid145610_segtype_to(const struct lv_segment *seg_fr
seg_flag = SEG_RAID6_N_6;
} else if (segtype_is_any_raid5(*segtype))
- /* No result for raid6_{zr,nr,nc} */
- if (!(seg_flag = _raid_seg_flag_6_to_5(seg_from)) ||
- !(seg_flag & (*segtype)->flags))
+ if (!(seg_flag = _raid_seg_flag_6_to_5(seg_from)))
+ /*
+ * No result for raid6_{zr,nr,nc}.
+ *
+ * Offer to convert to corresponding raid6_*_6 type first.
+ */
seg_flag = _raid_segtype_flag_5_to_6(*segtype);
/* -> raid1 */
6 years, 5 months
master - test: additional avoid have_raid overhead
by Heinz Mauelshagen
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=b147ce00686beea3a55...
Commit: b147ce00686beea3a55b74e1a5eeb2d194259a49
Parent: 80f5fb7ebb677f875df172451def5544c17c3c8d
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Tue Nov 14 14:17:54 2017 +0100
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Tue Nov 14 14:17:54 2017 +0100
test: additional avoid have_raid overhead
---
test/shell/lvcreate-large-raid.sh | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/test/shell/lvcreate-large-raid.sh b/test/shell/lvcreate-large-raid.sh
index 1082731..3488db4 100644
--- a/test/shell/lvcreate-large-raid.sh
+++ b/test/shell/lvcreate-large-raid.sh
@@ -21,6 +21,8 @@ SKIP_WITH_LVMPOLLD=1
aux can_use_16T || skip
aux have_raid 1 3 0 || skip
+v1_9_0=0
+aux have_raid 1 9 0 && v1_9_0=1
segtypes="raid5"
aux have_raid4 && segtypes="raid4 raid5"
@@ -78,7 +80,7 @@ lvremove -ff $vg1
# Check --nosync is rejected for raid6
-if aux have_raid 1 9 0 ; then
+if [ $v1_9_0 -eq 1 ] ; then
not lvcreate --type raid6 -i 3 -L 750T -n $lv1 $vg1 --nosync
fi
@@ -103,7 +105,7 @@ lvremove -ff $vg1
lvcreate -aey -L 200T -n $lv1 $vg1
lvconvert -y --type raid1 -m 1 $vg1/$lv1
check lv_field $vg1/$lv1 size "200.00t"
-if aux have_raid 1 9 0; then
+if [ $v1_9_0 -eq 1 ] ; then
# The 1.9.0 version of dm-raid is capable of performing
# linear -> RAID1 upconverts as "recover" not "resync"
# The LVM code now checks the dm-raid version when
6 years, 5 months
master - test: avoid have_raid overhead
by Heinz Mauelshagen
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=80f5fb7ebb677f875df...
Commit: 80f5fb7ebb677f875df172451def5544c17c3c8d
Parent: bda0790949dccdd68b304437afa6a83bddc3ffca
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Tue Nov 14 14:15:09 2017 +0100
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Tue Nov 14 14:15:09 2017 +0100
test: avoid have_raid overhead
---
test/shell/lvchange-rebuild-raid.sh | 26 ++++++++++++++------------
1 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/test/shell/lvchange-rebuild-raid.sh b/test/shell/lvchange-rebuild-raid.sh
index 4f535e6..5579106 100644
--- a/test/shell/lvchange-rebuild-raid.sh
+++ b/test/shell/lvchange-rebuild-raid.sh
@@ -16,6 +16,8 @@ SKIP_WITH_LVMPOLLD=1
. lib/inittest
aux have_raid 1 3 2 || skip
+v1_9_0=0
+aux have_raid 1 9 && v1_9_0=1
aux prepare_vg 8
get_devs
@@ -47,17 +49,17 @@ _sync
# Rebuild 1st and 2nd device would rebuild a
# whole mirror group and needs to be rejected.
not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" $vg/$lv1
-not check raid_leg_status $vg $lv1 "aAaAAAAA"
+not check raid_leg_status $vg $lv1 "aaAAAAA"
_sync "AAAAAAAA"
# Rebuild 1st and 3rd device from different mirror groups is fine.
lvchange --yes --rebuild "$dev1" --rebuild "$dev3" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "aAaAAAAA"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "aAaAAAAA"
_sync "AAAAAAAA"
# Rebuild devices 1, 3, 6 from different mirror groups is fine.
lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev6" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "aAaAAaAA"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "aAaAAaAA"
_sync "AAAAAAAA"
# Rebuild devices 1, 3, 5 and 6 with 5+6 being
@@ -68,12 +70,12 @@ _sync "AAAAAAAA"
# Rebuild devices 1, 3, 5 and 7 from different mirror groups is fine.
lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev5" --rebuild "$dev7" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "aAaAaAaA"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "aAaAaAaA"
_sync
# Rebuild devices 2, 4, 6 and 8 from different mirror groups is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" --rebuild "$dev8" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "AaAaAaAa"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "AaAaAaAa"
_sync "AAAAAAAA"
##############################################
@@ -91,17 +93,17 @@ _sync "AAAAAAAA"
# Rebuilding all but the raid1 master leg is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev3" --rebuild "$dev4" \
--rebuild "$dev5" --rebuild "$dev6" --rebuild "$dev7" --rebuild "$dev8" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "Aaaaaaaa"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "Aaaaaaaa"
_sync "AAAAAAAA"
# Rebuilding the raid1 master leg is fine.
lvchange --yes --rebuild "$dev1" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "aAAAAAAA"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "aAAAAAAA"
_sync "AAAAAAAA"
# Rebuild legs on devices 2, 4, 6 and 8 is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" --rebuild "$dev8" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "AaAaAaAa"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "AaAaAaAa"
_sync "AAAAAAAA"
##############################################
@@ -123,20 +125,20 @@ _sync "AAAAAA"
# Rebuilding any 1 raid6 stripe is fine.
lvchange --yes --rebuild "$dev2" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "AaAAAA"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "AaAAAA"
_sync
lvchange --yes --rebuild "$dev5" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "AAAAaA"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "AAAAaA"
_sync "AAAAAA"
# Rebuilding any 2 raid6 stripes is fine.
lvchange --yes --rebuild "$dev2" --rebuild "$dev4" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "AaAaAA"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "AaAaAA"
_sync "AAAAAA"
lvchange --yes --rebuild "$dev1" --rebuild "$dev5" $vg/$lv1
-aux have_raid 1 9 && check raid_leg_status $vg $lv1 "aAAAaA"
+[ $v1_9_0 -eq 1 ] && check raid_leg_status $vg $lv1 "aAAAaA"
_sync "AAAAAA"
vgremove -ff $vg
6 years, 5 months
master - raid: correct raid6_n_6 -> raid5 convenience type
by Heinz Mauelshagen
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=bda0790949dccdd68b3...
Commit: bda0790949dccdd68b304437afa6a83bddc3ffca
Parent: 762606a8c4070db7b3719c492bd9319d36ec271d
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Mon Nov 13 18:03:50 2017 +0100
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Tue Nov 14 14:08:20 2017 +0100
raid: correct raid6_n_6 -> raid5 convenience type
Fix "lvconvert --type raid5 RaidLV" on a "raid6_n_6" LV offering
false "raid6_ls_6" instead of "raid5_n".
---
lib/metadata/raid_manip.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index a904666..2d8aaed 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -6141,9 +6141,12 @@ static int _set_convenient_raid145610_segtype_to(const struct lv_segment *seg_fr
seg_flag = SEG_RAID6_N_6;
} else if (segtype_is_any_raid5(*segtype))
- /* No result for raid6_{zr,nr,nc} */
- if (!(seg_flag = _raid_seg_flag_6_to_5(seg_from)) ||
- !(seg_flag & (*segtype)->flags))
+ if (!(seg_flag = _raid_seg_flag_6_to_5(seg_from)))
+ /*
+ * No result for raid6_{zr,nr,nc}.
+ *
+ * Offer to convert to corresponding raid6_*_6 type first.
+ */
seg_flag = _raid_segtype_flag_5_to_6(*segtype);
/* -> raid1 */
6 years, 5 months
master - metadata: Eliminate redundant nested VG metadata
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=762606a8c4070db7b37...
Commit: 762606a8c4070db7b3719c492bd9319d36ec271d
Parent: 00acae12a4295075f1b93786f60327e5d3c26e70
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Nov 14 01:57:14 2017 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Nov 14 01:57:14 2017 +0000
metadata: Eliminate redundant nested VG metadata
Only lv_committed() now uses vg->vg_committed and it appears redundant
if its contents match the enclosing VG so don't waste cycles creating it
when that's known to be true.
---
WHATS_NEW | 1 +
lib/metadata/metadata.c | 44 ++++++++++++++++++--------------------------
2 files changed, 19 insertions(+), 26 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 1c8838c..04229da 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.177 -
====================================
+ Eliminate redundant nested VG metadata in VG struct.
Avoid importing persistent filter in vgscan/pvscan/vgrename.
Fix memleak of string buffer when vgcfgbackup runs in secure mode.
Do not print error when clvmd cannot find running clvmd.
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 56c11e6..9c4c24d 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -897,6 +897,19 @@ int vgcreate_params_validate(struct cmd_context *cmd,
return 1;
}
+static void _vg_wipe_cached_precommitted(struct volume_group *vg)
+{
+ release_vg(vg->vg_precommitted);
+ vg->vg_precommitted = NULL;
+}
+
+static void _vg_move_cached_precommitted_to_committed(struct volume_group *vg)
+{
+ release_vg(vg->vg_committed);
+ vg->vg_committed = vg->vg_precommitted;
+ vg->vg_precommitted = NULL;
+}
+
/*
* Update content of precommitted VG
*
@@ -907,8 +920,7 @@ static int _vg_update_vg_precommitted(struct volume_group *vg)
{
struct dm_config_tree *cft_precommitted;
- release_vg(vg->vg_precommitted);
- vg->vg_precommitted = NULL;
+ _vg_wipe_cached_precommitted(vg);
/* Copy the VG using an export followed by import */
if (!(cft_precommitted = export_vg_to_config_tree(vg)))
@@ -924,23 +936,6 @@ static int _vg_update_vg_precommitted(struct volume_group *vg)
return 1;
}
-static int _vg_update_vg_committed(struct volume_group *vg)
-{
- if (dm_pool_locked(vg->vgmem))
- return 1;
-
- if (vg->vg_committed || is_orphan_vg(vg->name)) /* we already have it */
- return 1;
-
- if (!_vg_update_vg_precommitted(vg))
- return_0;
-
- vg->vg_committed = vg->vg_precommitted;
- vg->vg_precommitted = NULL;
-
- return 1;
-}
-
/*
* Create a (struct volume_group) volume group handle from a struct volume_group pointer and a
* possible failure code or zero for success.
@@ -961,8 +956,8 @@ static struct volume_group *_vg_make_handle(struct cmd_context *cmd,
vg->read_status = failure;
- if (vg->fid && !_vg_update_vg_committed(vg))
- vg->read_status |= FAILED_ALLOCATION;
+ if (vg->fid && !dm_pool_locked(vg->vgmem))
+ _vg_wipe_cached_precommitted(vg);
return vg;
}
@@ -3177,9 +3172,7 @@ int vg_commit(struct volume_group *vg)
pvl->pv->status &= ~PV_MOVED_VG;
/* This *is* the original now that it's commited. */
- release_vg(vg->vg_committed);
- vg->vg_committed = vg->vg_precommitted;
- vg->vg_precommitted = NULL;
+ _vg_move_cached_precommitted_to_committed(vg);
}
/* If update failed, remove any cached precommitted metadata. */
@@ -3212,8 +3205,7 @@ void vg_revert(struct volume_group *vg)
}
}
- release_vg(vg->vg_precommitted); /* VG is no longer needed */
- vg->vg_precommitted = NULL;
+ _vg_wipe_cached_precommitted(vg); /* VG is no longer needed */
dm_list_iterate_items(mda, &vg->fid->metadata_areas_in_use) {
if (mda->ops->vg_revert &&
6 years, 5 months
master - metadata: Remove unused vg.cft_precommitted
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=00acae12a4295075f1b...
Commit: 00acae12a4295075f1b93786f60327e5d3c26e70
Parent: 6bf0f04ae2cb4e2c33a9836125a41e9e6b21e4d7
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Nov 14 01:09:58 2017 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Nov 14 01:22:09 2017 +0000
metadata: Remove unused vg.cft_precommitted
The precommitted metadata config_tree is now only referenced from a
single function so just use a local variable instead.
---
lib/metadata/metadata.c | 29 ++++++++---------------------
lib/metadata/vg.c | 2 --
lib/metadata/vg.h | 3 +--
3 files changed, 9 insertions(+), 25 deletions(-)
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index d823ef2..56c11e6 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -905,23 +905,22 @@ int vgcreate_params_validate(struct cmd_context *cmd,
*/
static int _vg_update_vg_precommitted(struct volume_group *vg)
{
+ struct dm_config_tree *cft_precommitted;
+
release_vg(vg->vg_precommitted);
vg->vg_precommitted = NULL;
- if (vg->cft_precommitted) {
- dm_config_destroy(vg->cft_precommitted);
- vg->cft_precommitted = NULL;
- }
-
- if (!(vg->cft_precommitted = export_vg_to_config_tree(vg)))
+ /* Copy the VG using an export followed by import */
+ if (!(cft_precommitted = export_vg_to_config_tree(vg)))
return_0;
- if (!(vg->vg_precommitted = import_vg_from_config_tree(vg->cft_precommitted, vg->fid))) {
- dm_config_destroy(vg->cft_precommitted);
- vg->cft_precommitted = NULL;
+ if (!(vg->vg_precommitted = import_vg_from_config_tree(cft_precommitted, vg->fid))) {
+ dm_config_destroy(cft_precommitted);
return_0;
}
+ dm_config_destroy(cft_precommitted);
+
return 1;
}
@@ -938,10 +937,6 @@ static int _vg_update_vg_committed(struct volume_group *vg)
vg->vg_committed = vg->vg_precommitted;
vg->vg_precommitted = NULL;
- if (vg->cft_precommitted) {
- dm_config_destroy(vg->cft_precommitted);
- vg->cft_precommitted = NULL;
- }
return 1;
}
@@ -3185,10 +3180,6 @@ int vg_commit(struct volume_group *vg)
release_vg(vg->vg_committed);
vg->vg_committed = vg->vg_precommitted;
vg->vg_precommitted = NULL;
- if (vg->cft_precommitted) {
- dm_config_destroy(vg->cft_precommitted);
- vg->cft_precommitted = NULL;
- }
}
/* If update failed, remove any cached precommitted metadata. */
@@ -3223,10 +3214,6 @@ void vg_revert(struct volume_group *vg)
release_vg(vg->vg_precommitted); /* VG is no longer needed */
vg->vg_precommitted = NULL;
- if (vg->cft_precommitted) {
- dm_config_destroy(vg->cft_precommitted);
- vg->cft_precommitted = NULL;
- }
dm_list_iterate_items(mda, &vg->fid->metadata_areas_in_use) {
if (mda->ops->vg_revert &&
diff --git a/lib/metadata/vg.c b/lib/metadata/vg.c
index f90ac82..4c808da 100644
--- a/lib/metadata/vg.c
+++ b/lib/metadata/vg.c
@@ -104,8 +104,6 @@ void release_vg(struct volume_group *vg)
release_vg(vg->vg_committed);
release_vg(vg->vg_precommitted);
- if (vg->cft_precommitted)
- dm_config_destroy(vg->cft_precommitted);
_free_vg(vg);
}
diff --git a/lib/metadata/vg.h b/lib/metadata/vg.h
index bc2c2dd..086a42c 100644
--- a/lib/metadata/vg.h
+++ b/lib/metadata/vg.h
@@ -59,8 +59,7 @@ struct volume_group {
* _vg_update_vg_committed.
*/
struct volume_group *vg_committed;
- struct dm_config_tree *cft_precommitted; /* Precommitted metadata */
- struct volume_group *vg_precommitted; /* Parsed from cft */
+ struct volume_group *vg_precommitted;
alloc_policy_t alloc;
struct profile *profile;
6 years, 5 months
master - log: Improve various device-related messages
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=6bf0f04ae2cb4e2c33a...
Commit: 6bf0f04ae2cb4e2c33a9836125a41e9e6b21e4d7
Parent: 598fcccf458010dac5d9e319db943629e15d5b16
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Mon Nov 13 14:43:32 2017 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Mon Nov 13 19:45:33 2017 +0000
log: Improve various device-related messages
- Use 'lvmcache' consistently instead of 'metadata cache'
- Always use 5 characters for source line number
- Remember to convert uuids into printable form
- Use <no name> rather than (null) when VG has no name.
---
lib/cache/lvmcache.c | 10 +++++-----
lib/device/dev-cache.c | 6 +++---
lib/device/dev-ext.c | 14 ++++++--------
lib/device/dev-io.c | 12 +++++-------
lib/filters/filter-internal.c | 2 +-
lib/filters/filter-persistent.c | 1 +
lib/log/log.c | 8 ++++----
lib/metadata/metadata.c | 10 ++++++++--
lib/metadata/vg.c | 4 ++--
tools/lvmcmdline.c | 8 ++++----
tools/toollib.c | 6 +++---
11 files changed, 42 insertions(+), 39 deletions(-)
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index c51e157..5d4732c 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -154,7 +154,7 @@ static void _free_cached_vgmetadata(struct lvmcache_vginfo *vginfo)
vginfo->cft = NULL;
}
- log_debug_cache("Metadata cache: VG %s wiped.", vginfo->vgname);
+ log_debug_cache("lvmcache: VG %s wiped.", vginfo->vgname);
release_vg(vginfo->cached_vg);
}
@@ -197,7 +197,7 @@ static void _store_metadata(struct volume_group *vg, unsigned precommitted)
return;
}
- log_debug_cache("Metadata cache: VG %s (%s) stored (%" PRIsize_t " bytes%s).",
+ log_debug_cache("lvmcache: VG %s (%s) stored (%" PRIsize_t " bytes%s).",
vginfo->vgname, uuid, size,
precommitted ? ", precommitted" : "");
}
@@ -289,7 +289,7 @@ void lvmcache_commit_metadata(const char *vgname)
return;
if (vginfo->precommitted) {
- log_debug_cache("Precommitted metadata cache: VG %s upgraded to committed.",
+ log_debug_cache("lvmcache: Upgraded pre-committed VG %s metadata to committed.",
vginfo->vgname);
vginfo->precommitted = 0;
}
@@ -616,7 +616,7 @@ struct lvmcache_vginfo *lvmcache_vginfo_from_vgid(const char *vgid)
id[ID_LEN] = '\0';
if (!(vginfo = dm_hash_lookup(_vgid_hash, id))) {
- log_debug_cache("Metadata cache has no info for vgid \"%s\"", id);
+ log_debug_cache("lvmcache has no info for vgid \"%s\"", id);
return NULL;
}
@@ -1870,7 +1870,7 @@ static int _lvmcache_update_vgname(struct lvmcache_info *info,
vginfo->vgid[0] ? vginfo->vgid : "",
vginfo->vgid[0] ? ")" : "", mdabuf);
} else
- log_debug_cache("lvmcache initialised VG %s.", vgname);
+ log_debug_cache("lvmcache: Initialised VG %s.", vgname);
return 1;
}
diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c
index dd12da1..2cd38f4 100644
--- a/lib/device/dev-cache.c
+++ b/lib/device/dev-cache.c
@@ -708,7 +708,7 @@ static int _insert_dev(const char *path, dev_t d)
if (dm_hash_lookup(_cache.names, path) == dev) {
/* Hash already has matching entry present */
- log_debug("Path already cached %s.", path);
+ log_debug("%s: Path already cached.", path);
return 1;
}
@@ -1423,7 +1423,7 @@ struct device *dev_cache_get(const char *name, struct dev_filter *f)
if (!d || (f && !(d->flags & DEV_REGULAR) && !(f->passes_filter(f, d))))
return NULL;
- log_debug_devs("Using %s", dev_name(d));
+ log_debug_devs("%s: Using device (%d:%d)", dev_name(d), (int) MAJOR(d->dev), (int) MINOR(d->dev));
return d;
}
@@ -1533,7 +1533,7 @@ struct device *dev_iter_get(struct dev_iter *iter)
struct device *d = _iter_next(iter);
if (!iter->filter || (d->flags & DEV_REGULAR) ||
iter->filter->passes_filter(iter->filter, d)) {
- log_debug_devs("Using %s", dev_name(d));
+ log_debug_devs("%s: Using device (%d:%d)", dev_name(d), (int) MAJOR(d->dev), (int) MINOR(d->dev));
return d;
}
}
diff --git a/lib/device/dev-ext.c b/lib/device/dev-ext.c
index 0cc8279..0c3b435 100644
--- a/lib/device/dev-ext.c
+++ b/lib/device/dev-ext.c
@@ -100,8 +100,6 @@ const char *dev_ext_name(struct device *dev)
return _ext_registry[dev->ext.src].name;
}
-static const char *_ext_attached_msg = "External handle attached to device";
-
struct dev_ext *dev_ext_get(struct device *dev)
{
struct dev_ext *ext;
@@ -110,10 +108,10 @@ struct dev_ext *dev_ext_get(struct device *dev)
handle_ptr = dev->ext.handle;
if (!(ext = _ext_registry[dev->ext.src].dev_ext_get(dev)))
- log_error("Failed to get external handle for device %s [%s].",
+ log_error("%s: Failed to get external handle [%s].",
dev_name(dev), dev_ext_name(dev));
else if (handle_ptr != dev->ext.handle)
- log_debug_devs("%s %s [%s:%p]", _ext_attached_msg, dev_name(dev),
+ log_debug_devs("%s: External handle [%s:%p] attached", dev_name(dev),
dev_ext_name(dev), dev->ext.handle);
return ext;
@@ -131,10 +129,10 @@ int dev_ext_release(struct device *dev)
handle_ptr = dev->ext.handle;
if (!(r = _ext_registry[dev->ext.src].dev_ext_release(dev)))
- log_error("Failed to release external handle for device %s [%s:%p].",
+ log_error("%s: Failed to release external handle [%s:%p]",
dev_name(dev), dev_ext_name(dev), dev->ext.handle);
else
- log_debug_devs("External handle detached from device %s [%s:%p]",
+ log_debug_devs("%s: External handle [%s:%p] detached",
dev_name(dev), dev_ext_name(dev), handle_ptr);
return r;
@@ -143,7 +141,7 @@ int dev_ext_release(struct device *dev)
int dev_ext_enable(struct device *dev, dev_ext_t src)
{
if (dev->ext.enabled && (dev->ext.src != src) && !dev_ext_release(dev)) {
- log_error("Failed to enable external handle for device %s [%s].",
+ log_error("%s: Failed to enable external handle [%s].",
dev_name(dev), _ext_registry[src].name);
return 0;
}
@@ -160,7 +158,7 @@ int dev_ext_disable(struct device *dev)
return 1;
if (!dev_ext_release(dev)) {
- log_error("Failed to disable external handle for device %s [%s].",
+ log_error("%s: Failed to disable external handle [%s].",
dev_name(dev), dev_ext_name(dev));
return 0;
}
diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c
index 519b5c7..328ec30 100644
--- a/lib/device/dev-io.c
+++ b/lib/device/dev-io.c
@@ -142,7 +142,7 @@ int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, un
r = 0;
goto out;
}
- log_debug_devs("%s: block size is %u bytes", name, dev->block_size);
+ log_debug_devs("%s: Block size is %u bytes", name, dev->block_size);
}
#ifdef BLKPBSZGET
@@ -153,7 +153,7 @@ int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, un
r = 0;
goto out;
}
- log_debug_devs("%s: physical block size is %u bytes", name, dev->phys_block_size);
+ log_debug_devs("%s: Physical block size is %u bytes", name, dev->phys_block_size);
}
#elif defined (BLKSSZGET)
/* if we can't get physical block size, just use logical block size instead */
@@ -163,15 +163,13 @@ int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, un
r = 0;
goto out;
}
- log_debug_devs("%s: physical block size can't be determined, using logical "
- "block size of %u bytes", name, dev->phys_block_size);
+ log_debug_devs("%s: Physical block size can't be determined: Using logical block size of %u bytes", name, dev->phys_block_size);
}
#else
/* if even BLKSSZGET is not available, use default 512b */
if (dev->phys_block_size == -1) {
dev->phys_block_size = 512;
- log_debug_devs("%s: physical block size can't be determined, using block "
- "size of %u bytes instead", name, dev->phys_block_size);
+ log_debug_devs("%s: Physical block size can't be determined: Using block size of %u bytes instead", name, dev->phys_block_size);
}
#endif
@@ -464,7 +462,7 @@ int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
}
if (dev->open_count && !need_excl) {
- log_debug_devs("%s already opened read-only. Upgrading "
+ log_debug_devs("%s: Already opened read-only. Upgrading "
"to read-write.", dev_name(dev));
dev->open_count++;
}
diff --git a/lib/filters/filter-internal.c b/lib/filters/filter-internal.c
index 1a58a37..cdaee4e 100644
--- a/lib/filters/filter-internal.c
+++ b/lib/filters/filter-internal.c
@@ -74,7 +74,7 @@ struct dev_filter *internal_filter_create(void)
f->destroy = _destroy;
f->use_count = 0;
- log_debug_devs("internal filter initialised.");
+ log_debug_devs("Internal filter initialised.");
return f;
}
diff --git a/lib/filters/filter-persistent.c b/lib/filters/filter-persistent.c
index 4e8161e..5bc0861 100644
--- a/lib/filters/filter-persistent.c
+++ b/lib/filters/filter-persistent.c
@@ -119,6 +119,7 @@ int persistent_filter_load(struct dev_filter *f, struct dm_config_tree **cft_out
if (!config_file_read(cft))
goto_out;
+ log_debug_devs("Loading persistent filter cache from %s", pf->file);
_read_array(pf, cft, "persistent_filter_cache/valid_devices",
PF_GOOD_DEVICE);
/* We don't gain anything by holding invalid devices */
diff --git a/lib/log/log.c b/lib/log/log.c
index c0789b4..208959b 100644
--- a/lib/log/log.c
+++ b/lib/log/log.c
@@ -594,7 +594,7 @@ static void _vprint_log(int level, const char *file, int line, int dm_errno_or_c
log_it:
if (!logged_via_report && ((verbose_level() >= level) && !_log_suppress)) {
if (verbose_level() > _LOG_DEBUG) {
- (void) dm_snprintf(buf, sizeof(buf), "#%s:%d ",
+ (void) dm_snprintf(buf, sizeof(buf), "#%s:%-5d ",
file, line);
} else
buf[0] = '\0';
@@ -639,7 +639,7 @@ static void _vprint_log(int level, const char *file, int line, int dm_errno_or_c
}
if (_log_to_file && (_log_while_suspended || !critical_section())) {
- fprintf(_log_file, "%s:%d %s%s", file, line, log_command_name(),
+ fprintf(_log_file, "%s:%-5d %s%s", file, line, log_command_name(),
_msg_prefix);
va_copy(ap, orig_ap);
@@ -647,7 +647,7 @@ static void _vprint_log(int level, const char *file, int line, int dm_errno_or_c
va_end(ap);
if (_log_file_max_lines && ++_log_file_lines >= _log_file_max_lines) {
- fprintf(_log_file, "\n%s:%d %sAborting. Command has reached limit "
+ fprintf(_log_file, "\n%s:%-5d %sAborting. Command has reached limit "
"for logged lines (LVM_LOG_FILE_MAX_LINES=" FMTu64 ").",
file, line, _msg_prefix,
_log_file_max_lines);
@@ -673,7 +673,7 @@ static void _vprint_log(int level, const char *file, int line, int dm_errno_or_c
memset(&buf, ' ', sizeof(buf));
bufused = 0;
if ((n = dm_snprintf(buf, sizeof(buf),
- "%s:%d %s%s", file, line, log_command_name(),
+ "%s:%-5d %s%s", file, line, log_command_name(),
_msg_prefix)) == -1)
goto done;
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index b5acf07..d823ef2 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -3797,12 +3797,18 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
struct dm_list *pvids;
struct pv_list *pvl;
struct dm_list all_pvs;
+ char uuid[64] __attribute__((aligned(8)));
+
unsigned seqno = 0;
int reappeared = 0;
struct cached_vg_fmtdata *vg_fmtdata = NULL; /* Additional format-specific data about the vg */
unsigned use_previous_vg;
- log_very_verbose("Reading VG %s %.32s", vgname ?: "<no name>", vgid ?: "<no vgid>");
+ uuid[0] = '\0';
+ if (vgid && !id_write_format((const struct id*)vgid, uuid, sizeof(uuid)))
+ stack;
+
+ log_very_verbose("Reading VG %s %s", vgname ?: "<no name>", vgid ? uuid : "<no vgid>");
if (is_orphan_vg(vgname)) {
if (use_precommitted) {
@@ -3879,7 +3885,7 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
/* Now determine the correct vgname if none was supplied */
if (!vgname && !(vgname = lvmcache_vgname_from_vgid(cmd->mem, vgid))) {
- log_debug_metadata("Cache did not find VG name from vgid %.32s", vgid);
+ log_debug_metadata("Cache did not find VG name from vgid %s", uuid);
return_NULL;
}
diff --git a/lib/metadata/vg.c b/lib/metadata/vg.c
index 9f48a9b..f90ac82 100644
--- a/lib/metadata/vg.c
+++ b/lib/metadata/vg.c
@@ -71,7 +71,7 @@ struct volume_group *alloc_vg(const char *pool_name, struct cmd_context *cmd,
dm_list_init(&vg->removed_historical_lvs);
dm_list_init(&vg->removed_pvs);
- log_debug_mem("Allocated VG %s at %p.", vg->name, vg);
+ log_debug_mem("Allocated VG %s at %p.", vg->name ? : "<no name>", vg);
return vg;
}
@@ -86,7 +86,7 @@ static void _free_vg(struct volume_group *vg)
return;
}
- log_debug_mem("Freeing VG %s at %p.", vg->name, vg);
+ log_debug_mem("Freeing VG %s at %p.", vg->name ? : "<no name>", vg);
dm_hash_destroy(vg->hostnames);
dm_pool_destroy(vg->vgmem);
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index ed73b8d..22f1c60 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -1864,8 +1864,8 @@ out:
}
}
- log_debug("Using command index %d id %s enum %d.",
- best_i, commands[best_i].command_id, commands[best_i].command_enum);
+ log_debug("Recognised command %s (id %d / enum %d).",
+ commands[best_i].command_id, best_i, commands[best_i].command_enum);
return &commands[best_i];
}
@@ -2873,9 +2873,9 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
goto_out;
init_dmeventd_monitor(monitoring);
- log_debug("Processing: %s", cmd->cmd_line);
+ log_debug("Processing command: %s", cmd->cmd_line);
log_debug("Command pid: %d", getpid());
- log_debug("system ID: %s", cmd->system_id ? : "");
+ log_debug("System ID: %s", cmd->system_id ? : "");
#ifdef O_DIRECT_SUPPORT
log_debug("O_DIRECT will be used");
diff --git a/tools/toollib.c b/tools/toollib.c
index 2898525..9b88341 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -1967,7 +1967,7 @@ static int _process_vgnameid_list(struct cmd_context *cmd, uint32_t read_flags,
(!dm_list_empty(arg_tags) && str_list_match_list(arg_tags, &vg->tags, NULL))) &&
select_match_vg(cmd, handle, vg) && _select_matches(handle)) {
- log_very_verbose("Process single VG %s", vg_name);
+ log_very_verbose("Processing VG %s %s", vg_name, vg_uuid ? uuid : "");
ret = process_single_vg(cmd, vg_name, vg, handle);
_update_selection_result(handle, &whole_selected);
@@ -2231,7 +2231,7 @@ int process_each_vg(struct cmd_context *cmd,
* . A VG name is specified which may refer to one
* of multiple VGs on the system with that name.
*/
- log_debug("Get list of VGs on system");
+ log_very_verbose("Obtaining the complete list of VGs to process");
if (!get_vgnameids(cmd, &vgnameids_on_system, NULL, include_internal)) {
ret_max = ECMD_FAILED;
@@ -3733,7 +3733,7 @@ int process_each_lv(struct cmd_context *cmd,
* . A VG name is specified which may refer to one
* of multiple VGs on the system with that name.
*/
- log_debug("Get list of VGs on system");
+ log_very_verbose("Obtaining the complete list of VGs before processing their LVs");
if (!get_vgnameids(cmd, &vgnameids_on_system, NULL, 0)) {
ret_max = ECMD_FAILED;
6 years, 5 months
master - persistent filter: Skip import before rescan
by Alasdair Kergon
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=598fcccf458010dac5d...
Commit: 598fcccf458010dac5d9e319db943629e15d5b16
Parent: fe69a8d21573f37cb3fd503ee40ceb00b555a7e2
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Mon Nov 13 19:45:16 2017 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Mon Nov 13 19:45:16 2017 +0000
persistent filter: Skip import before rescan
The persistent filter should not be imported by any command that doesn't
use it so take addtional note of REQUIRES_FULL_LABEL_SCAN (for vgrename)
and introduce IGNORE_PERSISTENT_FILTER for vgscan and pvscan.
---
WHATS_NEW | 1 +
tools/command.c | 1 +
tools/commands.h | 4 ++--
tools/lvmcmdline.c | 21 +++++++++++++++++++--
tools/tools.h | 2 ++
5 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 0775d7b..1c8838c 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.177 -
====================================
+ Avoid importing persistent filter in vgscan/pvscan/vgrename.
Fix memleak of string buffer when vgcfgbackup runs in secure mode.
Do not print error when clvmd cannot find running clvmd.
Prevent start of new merge of snapshot if origin is already being merged.
diff --git a/tools/command.c b/tools/command.c
index 17b5eb4..1a712cc 100644
--- a/tools/command.c
+++ b/tools/command.c
@@ -140,6 +140,7 @@ static inline int configtype_arg(struct cmd_context *cmd __attribute__((unused))
#define ENABLE_DUPLICATE_DEVS 0x00000400
#define DISALLOW_TAG_ARGS 0x00000800
#define GET_VGNAME_FROM_OPTIONS 0x00001000
+#define IGNORE_PERSISTENT_FILTER 0x00002000
/* create foo_CMD enums for command def ID's in command-lines.in */
diff --git a/tools/commands.h b/tools/commands.h
index 4739479..d65330a 100644
--- a/tools/commands.h
+++ b/tools/commands.h
@@ -149,7 +149,7 @@ xx(pvs,
xx(pvscan,
"List all physical volumes",
- PERMITTED_READ_ONLY | LOCKD_VG_SH | NO_LVMETAD_AUTOSCAN)
+ PERMITTED_READ_ONLY | LOCKD_VG_SH | NO_LVMETAD_AUTOSCAN | IGNORE_PERSISTENT_FILTER)
xx(segtypes,
"List available segment types",
@@ -233,7 +233,7 @@ xx(vgs,
xx(vgscan,
"Search for all volume groups",
- PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | NO_LVMETAD_AUTOSCAN)
+ PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH | NO_LVMETAD_AUTOSCAN | IGNORE_PERSISTENT_FILTER)
xx(vgsplit,
"Move physical volumes into a new or existing volume group",
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index f2e208c..ed73b8d 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -2706,6 +2706,21 @@ static int _cmd_no_meta_proc(struct cmd_context *cmd)
return cmd->cname->flags & NO_METADATA_PROCESSING;
}
+static int _cmd_no_lvmetad_autoscan(struct cmd_context *cmd)
+{
+ return cmd->cname->flags & NO_LVMETAD_AUTOSCAN;
+}
+
+static int _cmd_requires_full_label_scan(struct cmd_context *cmd)
+{
+ return cmd->cname->flags & REQUIRES_FULL_LABEL_SCAN;
+}
+
+static int _cmd_ignores_persistent_filter(struct cmd_context *cmd)
+{
+ return cmd->cname->flags & IGNORE_PERSISTENT_FILTER;
+}
+
int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
{
struct dm_config_tree *config_string_cft, *config_profile_command_cft, *config_profile_metadata_cft;
@@ -2831,8 +2846,10 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
/* Note: Load persistent cache only if we haven't refreshed toolcontext!
* If toolcontext has been refreshed, it means config has changed
* and we can't rely on persistent cache anymore.
+ * Similarly ignore the persistent cache if the command is going to discard it regardless.
*/
- if (!cmd->initialized.filters && !_cmd_no_meta_proc(cmd) && !init_filters(cmd, !refresh_done))
+ if (!cmd->initialized.filters && !_cmd_no_meta_proc(cmd) &&
+ !init_filters(cmd, !(refresh_done || _cmd_requires_full_label_scan(cmd) || _cmd_ignores_persistent_filter(cmd))))
return_ECMD_FAILED;
if (arg_is_set(cmd, readonly_ARG))
@@ -2945,7 +2962,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
* In this case, disable the *use* of lvmetad by this command, reverting to
* disk scanning.
*/
- if (lvmetad_used() && !(cmd->cname->flags & NO_LVMETAD_AUTOSCAN)) {
+ if (lvmetad_used() && !_cmd_no_lvmetad_autoscan(cmd)) {
if (cmd->include_foreign_vgs || !lvmetad_token_matches(cmd)) {
if (lvmetad_used() && !lvmetad_pvscan_all_devs(cmd, cmd->include_foreign_vgs ? 1 : 0)) {
log_warn("WARNING: Not using lvmetad because cache update failed.");
diff --git a/tools/tools.h b/tools/tools.h
index 53f8ddc..dc29e4b 100644
--- a/tools/tools.h
+++ b/tools/tools.h
@@ -137,6 +137,8 @@ struct arg_value_group_list {
#define DISALLOW_TAG_ARGS 0x00000800
/* Command may need to find VG name in an option value. */
#define GET_VGNAME_FROM_OPTIONS 0x00001000
+/* Command must not load the contents saved by the persistent filter */
+#define IGNORE_PERSISTENT_FILTER 0x00002000
void usage(const char *name);
6 years, 5 months
master - tests: use nonflusing status
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=fe69a8d21573f37cb3f...
Commit: fe69a8d21573f37cb3fd503ee40ceb00b555a7e2
Parent: dd06a0a4a68d5619050da76acdd508a89390d5f2
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Nov 10 16:18:41 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Nov 11 01:00:35 2017 +0100
tests: use nonflusing status
Avoid being blocked when reporting status with flushing on some stacked
device tree.
---
test/lib/utils.sh | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/test/lib/utils.sh b/test/lib/utils.sh
index 65bb1e6..bf472a4 100644
--- a/test/lib/utils.sh
+++ b/test/lib/utils.sh
@@ -180,7 +180,7 @@ STACKTRACE() {
echo "<======== Inactive table ========>"
dmsetup table --inactive | grep "$PREFIX" | sed -e "s,^,## DMITABLE: ,"
echo "<======== Status ========>"
- dmsetup status | grep "$PREFIX" | sed -e "s,^,## DMSTATUS: ,"
+ dmsetup status --noflush | grep "$PREFIX" | sed -e "s,^,## DMSTATUS: ,"
echo "<======== Tree ========>"
dmsetup ls --tree | sed -e "s,^,## DMTREE: ,"
echo "<======== Recursive list of $DM_DEV_DIR ========>"
6 years, 5 months
master - lv_lock_holder: unused cache-pool is not lock holder
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=dd06a0a4a68d5619050...
Commit: dd06a0a4a68d5619050da76acdd508a89390d5f2
Parent: 52cee9dd83da0b9b6766a4b3ee6bdd3699bf4346
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Nov 11 00:18:22 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Nov 11 00:59:46 2017 +0100
lv_lock_holder: unused cache-pool is not lock holder
Unused cache-pool is only a constainer for data and metadata,
and does not present localble entity.
---
lib/metadata/lv.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index e50b2bb..4d35efe 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -1613,6 +1613,9 @@ const struct logical_volume *lv_lock_holder(const struct logical_volume *lv)
continue; /* Skip thin snaphost */
if (lv_is_pending_delete(sl->seg->lv))
continue; /* Skip deleted LVs */
+ if (lv_is_cache_pool(sl->seg->lv) &&
+ !lv_is_used_cache_pool(sl->seg->lv))
+ continue; /* Skip unused cache-pool */
return lv_lock_holder(sl->seg->lv);
}
6 years, 5 months