master - config: accept empty values for global/thin_disabled_features
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=bf42119b22731c...
Commit: bf42119b22731c97e8169ee8526ff6bda4a3d7bf
Parent: b995f06abfcd03cb4d7a3c7ebc01bd416abdc0a8
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Mar 12 15:53:20 2014 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Wed Mar 12 15:53:20 2014 +0100
config: accept empty values for global/thin_disabled_features
Let's do this the other way round - this makes more logic than commit b995f06.
So let's allow empty values for global/thin_disabled_features where
such an empty value now means "none of this features are disabled".
---
WHATS_NEW | 1 +
lib/config/config_settings.h | 2 +-
lib/thin/thin.c | 5 +----
3 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 21413aa..c625e5d 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.106 -
====================================
+ Don't print an error and accept empty value for global/thin_disabled_features.
Update API for internal function build_dm_uuid().
Do not try to check empty pool with scheduled messages.
Fix return value in pool_has_message() when quering for any message.
diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h
index e2a5c0c..f033660 100644
--- a/lib/config/config_settings.h
+++ b/lib/config/config_settings.h
@@ -176,7 +176,7 @@ cfg(global_lvdisplay_shows_full_device_path_CFG, "lvdisplay_shows_full_device_pa
cfg(global_use_lvmetad_CFG, "use_lvmetad", global_CFG_SECTION, 0, CFG_TYPE_BOOL, 0, vsn(2, 2, 93), NULL)
cfg(global_thin_check_executable_CFG, "thin_check_executable", global_CFG_SECTION, CFG_ALLOW_EMPTY, CFG_TYPE_STRING, THIN_CHECK_CMD, vsn(2, 2, 94), NULL)
cfg_array(global_thin_check_options_CFG, "thin_check_options", global_CFG_SECTION, 0, CFG_TYPE_STRING, "#S" DEFAULT_THIN_CHECK_OPTIONS, vsn(2, 2, 96), NULL)
-cfg_array(global_thin_disabled_features_CFG, "thin_disabled_features", global_CFG_SECTION, CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, "#S", vsn(2, 2, 99), NULL)
+cfg_array(global_thin_disabled_features_CFG, "thin_disabled_features", global_CFG_SECTION, CFG_ALLOW_EMPTY, CFG_TYPE_STRING, "#S", vsn(2, 2, 99), NULL)
cfg(global_thin_dump_executable_CFG, "thin_dump_executable", global_CFG_SECTION, CFG_ALLOW_EMPTY, CFG_TYPE_STRING, THIN_DUMP_CMD, vsn(2, 2, 100), NULL)
cfg(global_thin_repair_executable_CFG, "thin_repair_executable", global_CFG_SECTION, CFG_ALLOW_EMPTY, CFG_TYPE_STRING, THIN_REPAIR_CMD, vsn(2, 2, 100), NULL)
cfg_array(global_thin_repair_options_CFG, "thin_repair_options", global_CFG_SECTION, 0, CFG_TYPE_STRING, "#S" DEFAULT_THIN_REPAIR_OPTIONS, vsn(2, 2, 100), NULL)
diff --git a/lib/thin/thin.c b/lib/thin/thin.c
index 494fa92..ff4eafd 100644
--- a/lib/thin/thin.c
+++ b/lib/thin/thin.c
@@ -676,11 +676,8 @@ static int _thin_target_present(struct cmd_context *cmd,
continue;
}
str = cv->v.str;
- if (!*str) {
- log_error("Ignoring empty string in config file %s.",
- _lvmconf);
+ if (!*str)
continue;
- }
for (i = 0; i < sizeof(_features)/sizeof(*_features); i++)
if (strcasecmp(str, _features[i].feature) == 0)
_feature_mask |= _features[i].thin_feature;
10 years, 2 months
master - config: mark global/thin_disabled_features as having no default value
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=b995f06abfcd03...
Commit: b995f06abfcd03cb4d7a3c7ebc01bd416abdc0a8
Parent: a2c64e21fd1c32205eb2aff554459a5a6db0aac4
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Mar 12 15:17:52 2014 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Wed Mar 12 15:17:52 2014 +0100
config: mark global/thin_disabled_features as having no default value
The global/thin_disabled_features should be marked as having no default
value. Otherwise the output from 'lvm dumpconfig --type default' would
have 'thin_disabled_features=""' which will produce an error message
'Ignoring empty string in config file ...' if such output is feed
back to lvm.
---
lib/config/config_settings.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h
index e631de6..e2a5c0c 100644
--- a/lib/config/config_settings.h
+++ b/lib/config/config_settings.h
@@ -176,7 +176,7 @@ cfg(global_lvdisplay_shows_full_device_path_CFG, "lvdisplay_shows_full_device_pa
cfg(global_use_lvmetad_CFG, "use_lvmetad", global_CFG_SECTION, 0, CFG_TYPE_BOOL, 0, vsn(2, 2, 93), NULL)
cfg(global_thin_check_executable_CFG, "thin_check_executable", global_CFG_SECTION, CFG_ALLOW_EMPTY, CFG_TYPE_STRING, THIN_CHECK_CMD, vsn(2, 2, 94), NULL)
cfg_array(global_thin_check_options_CFG, "thin_check_options", global_CFG_SECTION, 0, CFG_TYPE_STRING, "#S" DEFAULT_THIN_CHECK_OPTIONS, vsn(2, 2, 96), NULL)
-cfg_array(global_thin_disabled_features_CFG, "thin_disabled_features", global_CFG_SECTION, 0, CFG_TYPE_STRING, "#S", vsn(2, 2, 99), NULL)
+cfg_array(global_thin_disabled_features_CFG, "thin_disabled_features", global_CFG_SECTION, CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, "#S", vsn(2, 2, 99), NULL)
cfg(global_thin_dump_executable_CFG, "thin_dump_executable", global_CFG_SECTION, CFG_ALLOW_EMPTY, CFG_TYPE_STRING, THIN_DUMP_CMD, vsn(2, 2, 100), NULL)
cfg(global_thin_repair_executable_CFG, "thin_repair_executable", global_CFG_SECTION, CFG_ALLOW_EMPTY, CFG_TYPE_STRING, THIN_REPAIR_CMD, vsn(2, 2, 100), NULL)
cfg_array(global_thin_repair_options_CFG, "thin_repair_options", global_CFG_SECTION, 0, CFG_TYPE_STRING, "#S" DEFAULT_THIN_REPAIR_OPTIONS, vsn(2, 2, 100), NULL)
10 years, 2 months
master - tests: check we are no reading pool device
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=a2c64e21fd1c32...
Commit: a2c64e21fd1c32205eb2aff554459a5a6db0aac4
Parent: dd690d5fd1253d7559d43c60194ec0139d426d79
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Mar 12 00:26:47 2014 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Mar 12 00:26:47 2014 +0100
tests: check we are no reading pool device
---
test/shell/pvremove-thin.sh | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/test/shell/pvremove-thin.sh b/test/shell/pvremove-thin.sh
new file mode 100644
index 0000000..03e6ca3
--- /dev/null
+++ b/test/shell/pvremove-thin.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+# Copyright (C) 2014 Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU General Public License v.2.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# Checks we are not reading our own devices
+# https://bugzilla.redhat.com/show_bug.cgi?id=1064374
+
+. lib/test
+
+aux prepare_vg
+
+aux target_at_least dm-thin-pool 1 8 0 || skip
+
+aux extend_filter_LVMTEST
+
+lvcreate -L10 -V10 -n $lv1 -T $vg/pool1
+
+pvcreate "$DM_DEV_DIR/$vg/$lv1"
+pvremove "$DM_DEV_DIR/$vg/$lv1"
+
+vgremove -ff $vg
10 years, 2 months
master - tests: add inactive pool creation test
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=dd690d5fd1253d...
Commit: dd690d5fd1253d7559d43c60194ec0139d426d79
Parent: 4cc5c689b8600fa8490b2f1d60e483362b10c700
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Mar 12 00:25:59 2014 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Mar 12 00:25:59 2014 +0100
tests: add inactive pool creation test
---
test/shell/lvcreate-thin.sh | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/test/shell/lvcreate-thin.sh b/test/shell/lvcreate-thin.sh
index 721f3d1..cfa605e 100644
--- a/test/shell/lvcreate-thin.sh
+++ b/test/shell/lvcreate-thin.sh
@@ -173,7 +173,9 @@ not lvcreate --chunksize 32 -l1 -T $vg/pool1
# Too large chunk size (max is 1GB)
not lvcreate -L4M --chunksize 2G -T $vg/pool1
-lvcreate -L4M -V2G --name lv1 -T $vg/pool1
+# Test creation of inactive pool
+lvcreate -an -L4M -T $vg/pool1
+lvcreate -V2G --name lv1 -T $vg/pool1
# Origin name is not accepted
not lvcreate -s $vg/lv1 -L4M -V2G --name $vg/lv4
10 years, 2 months
master - thin: add pool uuid suffix for pool volume
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=4cc5c689b8600f...
Commit: 4cc5c689b8600fa8490b2f1d60e483362b10c700
Parent: 8a60cbcf45c553dfc168552cf9af3059359ec95d
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Mar 11 17:14:01 2014 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Mar 12 00:16:27 2014 +0100
thin: add pool uuid suffix for pool volume
Even though we make pool volume as a public visible LV,
we still do not want tools to look at this volume.
While we do not create /dev/vg/lv link, device is still
accessible via /dev/mapper/vg-lv and there is no easy
way to recognize it's private without lvm2 metadata.
Enhance UUID with -pool suffix and directly skip
any LV with a suffix in device_is_usable() call.
TODO: enhance other targets with this logic.
blkid may probably use same simple logic.
---
lib/activate/dev_manager.c | 6 ++++++
lib/misc/lvm-string.c | 3 +++
2 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index e9729d4..c723a61 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -446,6 +446,12 @@ static int _device_is_usable(struct device *dev, int check_lv_names)
!dm_split_lvm_name(NULL, NULL, &vgname, &lvname, &layer))
goto_out;
+ if (strlen(uuid) > 68) {
+ log_debug_activation("%s: Reserved uuid %s on internal LV device %s/%s%s%s not usable.",
+ dev_name(dev), uuid, vgname, lvname, *layer ? "-" : "", layer);
+ goto out;
+ }
+
if (lvname && (is_reserved_lvname(lvname) || *layer)) {
log_debug_activation("%s: Reserved internal LV device %s/%s%s%s not usable.",
dev_name(dev), vgname, lvname, *layer ? "-" : "", layer);
diff --git a/lib/misc/lvm-string.c b/lib/misc/lvm-string.c
index 329dee5..b96b5cc 100644
--- a/lib/misc/lvm-string.c
+++ b/lib/misc/lvm-string.c
@@ -166,5 +166,8 @@ char *build_dm_uuid(struct dm_pool *mem, const struct logical_volume *lv,
{
const char *lvid = lv->lvid.s;
+ if (!layer && lv_is_thin_pool(lv))
+ layer = "pool";
+
return dm_build_dm_uuid(mem, UUID_PREFIX, lvid, layer);
}
10 years, 2 months
master - thin: always activate and deactive pool when creating
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=8a60cbcf45c553...
Commit: 8a60cbcf45c553dfc168552cf9af3059359ec95d
Parent: 6a0d97a65c793e5875fc6c4f0a815c37ed4b6d38
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Mar 11 23:07:41 2014 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Mar 12 00:16:27 2014 +0100
thin: always activate and deactive pool when creating
When we create thin-pool we have used trick to keep
volume active, but since we now support TEMPORARY flag,
we could just localy active & deactive metadata LV,
and let the thinpool through normal activation process.
---
lib/metadata/lv_manip.c | 63 +++------------------------------------------
lib/metadata/pool_manip.c | 3 ++
2 files changed, 7 insertions(+), 59 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 1264de7..9246920 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -6288,19 +6288,6 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
if (lv_activation_skip(lv, lp->activate, lp->activation_skip & ACTIVATION_SKIP_IGNORE))
lp->activate = CHANGE_AN;
- /*
- * For thin pools - deactivate when inactive pool is requested or
- * for cluster give-up local lock and take proper exlusive lock
- */
- if (lv_is_thin_pool(lv) &&
- (!is_change_activating(lp->activate) ||
- vg_is_clustered(lv->vg)) &&
- /* Deactivates cleared metadata LV */
- !deactivate_lv(lv->vg->cmd, lv)) {
- stack;
- goto deactivate_failed;
- }
-
/* store vg on disk(s) */
if (!vg_write(vg) || !vg_commit(vg))
return_NULL;
@@ -6319,50 +6306,7 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
if (lp->temporary)
lv->status |= LV_TEMPORARY;
- 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)) {
- log_error("Failed to activate pool %s.", lv->name);
- goto deactivate_and_revert_new_lv;
- }
- } else {
- /*
- * Suspend cleared plain metadata LV
- * but now already commited as pool LV
- * and resume it as a pool LV.
- *
- * This trick avoids collision with udev watch rule.
- */
- 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_volume(lv)) {
+ if (lv_is_thin_volume(lv)) {
/* For snapshot, suspend active thin origin first */
if (org && lv_is_active(org) && lv_is_thin_volume(org)) {
if (!suspend_lv_origin(cmd, org)) {
@@ -6400,7 +6344,9 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
}
} else if (!lv_active_change(cmd, lv, lp->activate)) {
log_error("Failed to activate new LV.");
- if (lp->zero || lp->wipe_signatures)
+ if (lp->zero || lp->wipe_signatures ||
+ lv_is_thin_pool(lv) ||
+ lv_is_cache_type(lv))
goto deactivate_and_revert_new_lv;
return NULL;
}
@@ -6494,7 +6440,6 @@ out:
deactivate_and_revert_new_lv:
if (!deactivate_lv(cmd, lv)) {
-deactivate_failed:
log_error("Unable to deactivate failed new LV \"%s/%s\". "
"Manual intervention required.", lv->vg->name, lv->name);
return NULL;
diff --git a/lib/metadata/pool_manip.c b/lib/metadata/pool_manip.c
index 0c7bf96..f414f3f 100644
--- a/lib/metadata/pool_manip.c
+++ b/lib/metadata/pool_manip.c
@@ -267,6 +267,9 @@ int create_pool(struct logical_volume *pool_lv,
goto bad;
}
pool_lv->status &= ~LV_TEMPORARY;
+ /* Deactivates cleared metadata LV */
+ if (!deactivate_lv_local(pool_lv->vg->cmd, pool_lv))
+ goto_bad;
}
if (dm_snprintf(name, sizeof(name), "%s_%s", pool_lv->name,
10 years, 2 months
master - lvm: change build_dm_uuid API
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=6a0d97a65c793e...
Commit: 6a0d97a65c793e5875fc6c4f0a815c37ed4b6d38
Parent: 4d64e91efde5335eeae6f2e0fcdf4992b054644a
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Mar 11 17:13:47 2014 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Mar 12 00:16:20 2014 +0100
lvm: change build_dm_uuid API
Pass directly 'lv' into this build routine,
so we can eventually add more private UUID suffixes.
---
WHATS_NEW | 1 +
lib/activate/activate.c | 2 +-
lib/activate/dev_manager.c | 62 ++++++++++++++++++++++----------------------
lib/cache_segtype/cache.c | 6 ++--
lib/mirror/mirrored.c | 4 +-
lib/misc/lvm-string.c | 5 +++-
lib/misc/lvm-string.h | 3 +-
lib/thin/thin.c | 8 +++---
8 files changed, 48 insertions(+), 43 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 7814826..21413aa 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.106 -
====================================
+ Update API for internal function build_dm_uuid().
Do not try to check empty pool with scheduled messages.
Fix return value in pool_has_message() when quering for any message.
Cleanup all client resources on clvmd exit.
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 26dc0e1..565634f 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -1546,7 +1546,7 @@ static char *_build_target_uuid(struct cmd_context *cmd, struct logical_volume *
else
layer = NULL;
- return build_dm_uuid(cmd->mem, lv->lvid.s, layer);
+ return build_dm_uuid(cmd->mem, lv, layer);
}
int target_registered_with_dmeventd(struct cmd_context *cmd, const char *dso,
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 006588c..e9729d4 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -505,7 +505,7 @@ int dev_manager_info(struct dm_pool *mem, const struct logical_volume *lv,
return 0;
}
- if (!(dlid = build_dm_uuid(mem, lv->lvid.s, layer))) {
+ if (!(dlid = build_dm_uuid(mem, lv, layer))) {
log_error("dlid build failed for %s", name);
r = 0;
goto out;
@@ -528,7 +528,7 @@ static const struct dm_info *_cached_info(struct dm_pool *mem,
const struct dm_tree_node *dnode;
const struct dm_info *dinfo = NULL;
- if (!(dlid = build_dm_uuid(mem, lv->lvid.s, layer))) {
+ if (!(dlid = build_dm_uuid(mem, lv, layer))) {
log_error("Failed to build dlid for %s.", lv->name);
return NULL;
}
@@ -641,7 +641,7 @@ int lv_has_target_type(struct dm_pool *mem, struct logical_volume *lv,
char *type = NULL;
char *params = NULL;
- if (!(dlid = build_dm_uuid(mem, lv->lvid.s, layer)))
+ if (!(dlid = build_dm_uuid(mem, lv, layer)))
return_0;
if (!(dmt = _setup_task(NULL, dlid, 0,
@@ -872,7 +872,7 @@ int dev_manager_transient(struct dev_manager *dm, struct logical_volume *lv)
const struct dm_list *segh = &lv->segments;
struct lv_segment *seg = NULL;
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, layer)))
return_0;
if (!(dmt = _setup_task(0, dlid, NULL, DM_DEVICE_STATUS, 0, 0)))
@@ -1015,7 +1015,7 @@ int dev_manager_snapshot_percent(struct dev_manager *dm,
if (!(name = dm_build_dm_name(dm->mem, snap_lv->vg->name, snap_lv->name, NULL)))
return_0;
- if (!(dlid = build_dm_uuid(dm->mem, snap_lv->lvid.s, NULL)))
+ if (!(dlid = build_dm_uuid(dm->mem, snap_lv, NULL)))
return_0;
/*
@@ -1047,7 +1047,7 @@ int dev_manager_mirror_percent(struct dev_manager *dm,
if (!(name = dm_build_dm_name(dm->mem, lv->vg->name, lv->name, layer)))
return_0;
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer))) {
+ if (!(dlid = build_dm_uuid(dm->mem, lv, layer))) {
log_error("dlid build failed for %s", lv->name);
return 0;
}
@@ -1074,7 +1074,7 @@ int dev_manager_raid_status(struct dev_manager *dm,
char *params = NULL;
const char *layer = lv_layer(lv);
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, layer)))
return_0;
log_debug_activation("Getting raid device status for %s.", lv->name);
@@ -1138,7 +1138,7 @@ int dev_manager_raid_message(struct dev_manager *dm,
return 0;
}
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, layer)))
return_0;
if (!(dmt = _setup_task(NULL, dlid, 0, DM_DEVICE_TARGET_MSG, 0, 0)))
@@ -1173,7 +1173,7 @@ int dev_manager_cache_status(struct dev_manager *dm,
char *params = NULL;
const char *layer = lv_layer(lv);
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, layer)))
return_0;
log_debug_activation("Getting cache device status for %s.", lv->name);
@@ -1282,7 +1282,7 @@ int dev_manager_thin_pool_status(struct dev_manager *dm,
int r = 0;
/* Build dlid for the thin pool layer */
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, lv_layer(lv))))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, lv_layer(lv))))
return_0;
log_debug_activation("Getting thin pool device status for %s.", lv->name);
@@ -1328,7 +1328,7 @@ int dev_manager_thin_pool_percent(struct dev_manager *dm,
lv_layer(lv))))
return_0;
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, lv_layer(lv))))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, lv_layer(lv))))
return_0;
log_debug_activation("Getting device status percentage for %s", name);
@@ -1351,7 +1351,7 @@ int dev_manager_thin_percent(struct dev_manager *dm,
if (!(name = dm_build_dm_name(dm->mem, lv->vg->name, lv->name, layer)))
return_0;
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, layer)))
return_0;
log_debug_activation("Getting device status percentage for %s", name);
@@ -1374,7 +1374,7 @@ int dev_manager_thin_device_id(struct dev_manager *dm,
int r = 0;
/* Build dlid for the thin layer */
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, lv_layer(lv))))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, lv_layer(lv))))
return_0;
log_debug_activation("Getting device id for %s.", dlid);
@@ -1575,7 +1575,7 @@ static int _add_dev_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
if (!(name = dm_build_dm_name(dm->mem, lv->vg->name, lv->name, layer)))
return_0;
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, layer)))
return_0;
log_debug_activation("Getting device info for %s [%s]", name, dlid);
@@ -1648,7 +1648,7 @@ static int _add_partial_replicator_to_dtree(struct dev_manager *dm,
if (!_add_dev_to_dtree(dm, dtree, rlv, NULL))
return_0;
- if (!(uuid = build_dm_uuid(dm->mem, rlv->lvid.s, NULL)))
+ if (!(uuid = build_dm_uuid(dm->mem, rlv, NULL)))
return_0;
rep_node = dm_tree_find_node_by_uuid(dtree, uuid);
@@ -1670,7 +1670,7 @@ static int _add_partial_replicator_to_dtree(struct dev_manager *dm,
/* If replicator exists - try connect existing heads */
if (rep_node) {
uuid = build_dm_uuid(dm->mem,
- rdev->replicator_dev->lv->lvid.s,
+ rdev->replicator_dev->lv,
NULL);
if (!uuid)
return_0;
@@ -1838,7 +1838,7 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
#if 0
/* ? Use origin_only to avoid 'deep' thin pool suspend ? */
/* FIXME Implement dm_tree_node_skip_childrens optimisation */
- if (!(uuid = build_dm_uuid(dm->mem, lv->lvid.s, lv_layer(lv))))
+ if (!(uuid = build_dm_uuid(dm->mem, lv, lv_layer(lv))))
return_0;
if ((thin_node = dm_tree_find_node_by_uuid(dtree, uuid)))
dm_tree_node_skip_childrens(thin_node, 1);
@@ -1868,7 +1868,7 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
/* Setup callback for non-activation partial tree */
/* Activation gets own callback when needed */
/* TODO: extend _cached_info() to return dnode */
- if (!(uuid = build_dm_uuid(dm->mem, lv->lvid.s, lv_layer(lv))))
+ if (!(uuid = build_dm_uuid(dm->mem, lv, lv_layer(lv))))
return_0;
if ((thin_node = dm_tree_find_node_by_uuid(dtree, uuid)) &&
!_thin_pool_register_callback(dm, thin_node, lv))
@@ -1979,7 +1979,7 @@ static char *_add_error_device(struct dev_manager *dm, struct dm_tree *dtree,
sprintf(errid, "missing_%d_%d", segno, s);
- if (!(dlid = build_dm_uuid(dm->mem, seg->lv->lvid.s, errid)))
+ if (!(dlid = build_dm_uuid(dm->mem, seg->lv, errid)))
return_NULL;
if (!(name = dm_build_dm_name(dm->mem, seg->lv->vg->name,
@@ -2087,18 +2087,18 @@ int add_areas_line(struct dev_manager *dm, struct lv_segment *seg,
return_0;
continue;
}
- if (!(dlid = build_dm_uuid(dm->mem, seg_metalv(seg, s)->lvid.s, NULL)))
+ if (!(dlid = build_dm_uuid(dm->mem, seg_metalv(seg, s), NULL)))
return_0;
if (!dm_tree_node_add_target_area(node, NULL, dlid, extent_size * seg_metale(seg, s)))
return_0;
- if (!(dlid = build_dm_uuid(dm->mem, seg_lv(seg, s)->lvid.s, NULL)))
+ if (!(dlid = build_dm_uuid(dm->mem, seg_lv(seg, s), NULL)))
return_0;
if (!dm_tree_node_add_target_area(node, NULL, dlid, extent_size * seg_le(seg, s)))
return_0;
} else if (seg_type(seg, s) == AREA_LV) {
- if (!(dlid = build_dm_uuid(dm->mem, seg_lv(seg, s)->lvid.s, NULL)))
+ if (!(dlid = build_dm_uuid(dm->mem, seg_lv(seg, s), NULL)))
return_0;
if (!dm_tree_node_add_target_area(node, NULL, dlid, extent_size * seg_le(seg, s)))
return_0;
@@ -2127,7 +2127,7 @@ static int _add_layer_target_to_dtree(struct dev_manager *dm,
{
const char *layer_dlid;
- if (!(layer_dlid = build_dm_uuid(dm->mem, lv->lvid.s, lv_layer(lv))))
+ if (!(layer_dlid = build_dm_uuid(dm->mem, lv, lv_layer(lv))))
return_0;
/* Add linear mapping over layered LV */
@@ -2146,7 +2146,7 @@ static int _add_origin_target_to_dtree(struct dev_manager *dm,
{
const char *real_dlid;
- if (!(real_dlid = build_dm_uuid(dm->mem, lv->lvid.s, "real")))
+ if (!(real_dlid = build_dm_uuid(dm->mem, lv, "real")))
return_0;
if (!dm_tree_node_add_snapshot_origin_target(dnode, lv->size, real_dlid))
@@ -2167,13 +2167,13 @@ static int _add_snapshot_merge_target_to_dtree(struct dev_manager *dm,
return 0;
}
- if (!(origin_dlid = build_dm_uuid(dm->mem, lv->lvid.s, "real")))
+ if (!(origin_dlid = build_dm_uuid(dm->mem, lv, "real")))
return_0;
- if (!(cow_dlid = build_dm_uuid(dm->mem, merging_snap_seg->cow->lvid.s, "cow")))
+ if (!(cow_dlid = build_dm_uuid(dm->mem, merging_snap_seg->cow, "cow")))
return_0;
- if (!(merge_dlid = build_dm_uuid(dm->mem, merging_snap_seg->cow->lvid.s, NULL)))
+ if (!(merge_dlid = build_dm_uuid(dm->mem, merging_snap_seg->cow, NULL)))
return_0;
if (!dm_tree_node_add_snapshot_merge_target(dnode, lv->size, origin_dlid,
@@ -2199,10 +2199,10 @@ static int _add_snapshot_target_to_dtree(struct dev_manager *dm,
return 0;
}
- if (!(origin_dlid = build_dm_uuid(dm->mem, snap_seg->origin->lvid.s, "real")))
+ if (!(origin_dlid = build_dm_uuid(dm->mem, snap_seg->origin, "real")))
return_0;
- if (!(cow_dlid = build_dm_uuid(dm->mem, snap_seg->cow->lvid.s, "cow")))
+ if (!(cow_dlid = build_dm_uuid(dm->mem, snap_seg->cow, "cow")))
return_0;
size = (uint64_t) snap_seg->len * snap_seg->origin->vg->extent_size;
@@ -2516,7 +2516,7 @@ static int _add_new_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
if (!(name = dm_build_dm_name(dm->mem, lv->vg->name, lv->name, layer)))
return_0;
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer)))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, layer)))
return_0;
/* We've already processed this node if it already has a context ptr */
@@ -2776,7 +2776,7 @@ static int _tree_action(struct dev_manager *dm, struct logical_volume *lv,
/* Restore fs cookie */
dm_tree_set_cookie(root, fs_get_cookie());
- if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, laopts->origin_only ? lv_layer(lv) : NULL)))
+ if (!(dlid = build_dm_uuid(dm->mem, lv, laopts->origin_only ? lv_layer(lv) : NULL)))
goto_out;
/* Only process nodes with uuid of "LVM-" plus VG id. */
diff --git a/lib/cache_segtype/cache.c b/lib/cache_segtype/cache.c
index 57c7a5c..df521c4 100644
--- a/lib/cache_segtype/cache.c
+++ b/lib/cache_segtype/cache.c
@@ -360,13 +360,13 @@ static int _cache_add_target_line(struct dev_manager *dm,
struct lv_segment *cache_pool_seg = first_seg(seg->pool_lv);
char *metadata_uuid, *data_uuid, *origin_uuid;
- if (!(metadata_uuid = build_dm_uuid(mem, cache_pool_seg->metadata_lv->lvid.s, NULL)))
+ if (!(metadata_uuid = build_dm_uuid(mem, cache_pool_seg->metadata_lv, NULL)))
return_0;
- if (!(data_uuid = build_dm_uuid(mem, seg_lv(cache_pool_seg, 0)->lvid.s, NULL)))
+ if (!(data_uuid = build_dm_uuid(mem, seg_lv(cache_pool_seg, 0), NULL)))
return_0;
- if (!(origin_uuid = build_dm_uuid(mem, seg_lv(seg, 0)->lvid.s, NULL)))
+ if (!(origin_uuid = build_dm_uuid(mem, seg_lv(seg, 0), NULL)))
return_0;
if (!dm_tree_node_add_cache_target(node, len,
diff --git a/lib/mirror/mirrored.c b/lib/mirror/mirrored.c
index 5088173..e35a372 100644
--- a/lib/mirror/mirrored.c
+++ b/lib/mirror/mirrored.c
@@ -356,14 +356,14 @@ static int _add_log(struct dm_pool *mem, struct lv_segment *seg,
if (seg->log_lv) {
/* If disk log, use its UUID */
- if (!(log_dlid = build_dm_uuid(mem, seg->log_lv->lvid.s, NULL))) {
+ if (!(log_dlid = build_dm_uuid(mem, seg->log_lv, NULL))) {
log_error("Failed to build uuid for log LV %s.",
seg->log_lv->name);
return 0;
}
} else {
/* If core log, use mirror's UUID and set DM_CORELOG flag */
- if (!(log_dlid = build_dm_uuid(mem, seg->lv->lvid.s, NULL))) {
+ if (!(log_dlid = build_dm_uuid(mem, seg->lv, NULL))) {
log_error("Failed to build uuid for mirror LV %s.",
seg->lv->name);
return 0;
diff --git a/lib/misc/lvm-string.c b/lib/misc/lvm-string.c
index 380fe81..329dee5 100644
--- a/lib/misc/lvm-string.c
+++ b/lib/misc/lvm-string.c
@@ -15,6 +15,7 @@
#include "lib.h"
#include "lvm-string.h"
+#include "metadata-exported.h"
#include <ctype.h>
@@ -160,8 +161,10 @@ int is_reserved_lvname(const char *name)
return rc;
}
-char *build_dm_uuid(struct dm_pool *mem, const char *lvid,
+char *build_dm_uuid(struct dm_pool *mem, const struct logical_volume *lv,
const char *layer)
{
+ const char *lvid = lv->lvid.s;
+
return dm_build_dm_uuid(mem, UUID_PREFIX, lvid, layer);
}
diff --git a/lib/misc/lvm-string.h b/lib/misc/lvm-string.h
index 13aacf8..82ebb12 100644
--- a/lib/misc/lvm-string.h
+++ b/lib/misc/lvm-string.h
@@ -23,6 +23,7 @@
#define UUID_PREFIX "LVM-"
struct pool;
+struct logical_volume;
typedef enum name_error { NAME_VALID = 0, NAME_INVALID_EMPTY = -1,
NAME_INVALID_HYPEN = -2, NAME_INVALID_DOTS = -3,
@@ -32,7 +33,7 @@ typedef enum name_error { NAME_VALID = 0, NAME_INVALID_EMPTY = -1,
int emit_to_buffer(char **buffer, size_t *size, const char *fmt, ...)
__attribute__ ((format(printf, 3, 4)));
-char *build_dm_uuid(struct dm_pool *mem, const char *lvid,
+char *build_dm_uuid(struct dm_pool *mem, const struct logical_volume *lvid,
const char *layer);
int validate_name(const char *n);
diff --git a/lib/thin/thin.c b/lib/thin/thin.c
index 7c989f8..494fa92 100644
--- a/lib/thin/thin.c
+++ b/lib/thin/thin.c
@@ -277,13 +277,13 @@ static int _thin_pool_add_target_line(struct dev_manager *dm,
return 0;
}
- if (!(metadata_dlid = build_dm_uuid(mem, seg->metadata_lv->lvid.s, NULL))) {
+ if (!(metadata_dlid = build_dm_uuid(mem, seg->metadata_lv, NULL))) {
log_error("Failed to build uuid for metadata LV %s.",
seg->metadata_lv->name);
return 0;
}
- if (!(pool_dlid = build_dm_uuid(mem, seg_lv(seg, 0)->lvid.s, NULL))) {
+ if (!(pool_dlid = build_dm_uuid(mem, seg_lv(seg, 0), NULL))) {
log_error("Failed to build uuid for pool LV %s.",
seg_lv(seg, 0)->name);
return 0;
@@ -535,7 +535,7 @@ static int _thin_add_target_line(struct dev_manager *dm,
seg->lv->name);
return 0;
}
- if (!(pool_dlid = build_dm_uuid(mem, seg->pool_lv->lvid.s, lv_layer(seg->pool_lv)))) {
+ if (!(pool_dlid = build_dm_uuid(mem, seg->pool_lv, lv_layer(seg->pool_lv)))) {
log_error("Failed to build uuid for pool LV %s.",
seg->pool_lv->name);
return 0;
@@ -573,7 +573,7 @@ static int _thin_add_target_line(struct dev_manager *dm,
return 0;
}
}
- if (!(external_dlid = build_dm_uuid(mem, seg->external_lv->lvid.s,
+ if (!(external_dlid = build_dm_uuid(mem, seg->external_lv,
lv_layer(seg->external_lv)))) {
log_error("Failed to build uuid for external origin LV %s.",
seg->external_lv->name);
10 years, 2 months
master - thin: do not check of empty pool with messages
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=4d64e91efde533...
Commit: 4d64e91efde5335eeae6f2e0fcdf4992b054644a
Parent: 1850a6e454ebbb54aae80a0ad4d5482ecdffcd28
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Mar 11 22:54:33 2014 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Mar 12 00:15:22 2014 +0100
thin: do not check of empty pool with messages
The empty pool is also the pool which has yet queued list of messages
and transaction_id == 1.
Problem is exposed when pool is created inactive.
lvcreate -L10 -T vg/pool -an
lvcreate -V10 -T vg/pool
---
WHATS_NEW | 1 +
lib/activate/dev_manager.c | 4 +++-
2 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 0fd0657..7814826 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.106 -
====================================
+ Do not try to check empty pool with scheduled messages.
Fix return value in pool_has_message() when quering for any message.
Cleanup all client resources on clvmd exit.
Use dm_zalloc to clear members of clvmd client struct.
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 6b5f8c2..006588c 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -1790,7 +1790,9 @@ static int _thin_pool_register_callback(struct dev_manager *dm,
struct thin_cb_data *data;
/* Skip metadata testing for unused pool. */
- if (!first_seg(lv)->transaction_id)
+ if (!first_seg(lv)->transaction_id ||
+ ((first_seg(lv)->transaction_id == 1) &&
+ pool_has_message(first_seg(lv), NULL, 0)))
return 1;
if (!(data = dm_pool_alloc(dm->mem, sizeof(*data)))) {
10 years, 2 months
master - thin: fix pool_has_message return for NULL params
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=1850a6e454ebbb...
Commit: 1850a6e454ebbb54aae80a0ad4d5482ecdffcd28
Parent: 7574b3bc80c8b2db5f4a9da9e7de00c0a3239e26
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Mar 11 22:50:23 2014 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Mar 12 00:13:21 2014 +0100
thin: fix pool_has_message return for NULL params
When pool_has_message() is queried with NULL lv and 0 device_id
it should just return 'true' when there is any message queued.
So it needs to return negative value dm_list_empty().
Since there is no user for this code path in code currently,
this bug has not been triggered.
---
WHATS_NEW | 1 +
lib/metadata/thin_manip.c | 2 +-
2 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 7d6f4d6..0fd0657 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.106 -
====================================
+ Fix return value in pool_has_message() when quering for any message.
Cleanup all client resources on clvmd exit.
Use dm_zalloc to clear members of clvmd client struct.
Use BLKID_CFLAGS when compiling with blkid support.
diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c
index 2e49019..78231a2 100644
--- a/lib/metadata/thin_manip.c
+++ b/lib/metadata/thin_manip.c
@@ -160,7 +160,7 @@ int pool_has_message(const struct lv_segment *seg,
}
if (!lv && !device_id)
- return dm_list_empty(&seg->thin_messages);
+ return !dm_list_empty(&seg->thin_messages);
dm_list_iterate_items(tmsg, &seg->thin_messages) {
switch (tmsg->type) {
10 years, 2 months
master - autoreconf: sync configure with current configure.in
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7574b3bc80c8b2...
Commit: 7574b3bc80c8b2db5f4a9da9e7de00c0a3239e26
Parent: 6c892be4a50049adbaa99c2a8c031a4acb6410f5
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Mar 11 16:32:02 2014 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Mar 11 16:32:02 2014 +0100
autoreconf: sync configure with current configure.in
---
configure | 9 ++-------
1 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/configure b/configure
index ab4f534..d9df1ed 100755
--- a/configure
+++ b/configure
@@ -1624,8 +1624,7 @@ Optional Packages:
--with-thin-check=PATH thin_check tool: [[autodetect]]
--with-thin-dump=PATH thin_dump tool: [[autodetect]]
--with-thin-repair=PATH thin_repair tool: [[autodetect]]
- --with-cache=TYPE cache support: internal/shared/none
- [[TYPE=none]]
+ --with-cache=TYPE cache support: internal/shared/none [[TYPE=none]]
--with-ocfdir=DIR install OCF files in DIR
[[PREFIX/lib/ocf/resource.d/lvm2]]
--with-default-pid-dir=PID_DIR
@@ -10440,7 +10439,7 @@ done
################################################################################
-if test x$READLINE != xno; then
+if test "$READLINE" != no; then
lvm_saved_libs=$LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5
$as_echo_n "checking for library containing tgetent... " >&6; }
@@ -11449,10 +11448,6 @@ LVM_LIBAPI=`echo "$VER" | $AWK -F '[()]' '{print $2}'`
-
-
-
-
################################################################################
ac_config_files="$ac_config_files Makefile make.tmpl daemons/Makefile daemons/clvmd/Makefile daemons/cmirrord/Makefile daemons/dmeventd/Makefile daemons/dmeventd/libdevmapper-event.pc daemons/dmeventd/plugins/Makefile daemons/dmeventd/plugins/lvm2/Makefile daemons/dmeventd/plugins/raid/Makefile daemons/dmeventd/plugins/mirror/Makefile daemons/dmeventd/plugins/snapshot/Makefile daemons/dmeventd/plugins/thin/Makefile daemons/lvmetad/Makefile conf/Makefile conf/example.conf conf/default.profile include/.symlinks include/Makefile lib/Makefile lib/format1/Makefile lib/format_pool/Makefile lib/locking/Makefile lib/mirror/Makefile lib/replicator/Makefile lib/misc/lvm-version.h lib/raid/Makefile lib/snapshot/Makefile lib/thin/Makefile lib/cache_segtype/Makefile libdaemon/Makefile libdaemon/client/Makefile libdaemon/server/Makefile libdm/Makefile libdm/libdevmapper.pc liblvm/Makefile liblvm/liblvm2app.pc man/Makefile po/Makefile python/Makefile python/setup.py scripts/blkdeactivate.s
h scripts/blk_availability_init_red_hat scripts/blk_availability_systemd_red_hat.service scripts/lvm2_cluster_activation_red_hat.sh scripts/lvm2_cluster_activation_systemd_red_hat.service scripts/clvmd_init_red_hat scripts/lvm2_clvmd_systemd_red_hat.service scripts/cmirrord_init_red_hat scripts/lvm2_cmirrord_systemd_red_hat.service scripts/lvm2_lvmetad_init_red_hat scripts/lvm2_lvmetad_systemd_red_hat.socket scripts/lvm2_lvmetad_systemd_red_hat.service scripts/lvm2_pvscan_systemd_red_hat@.service scripts/lvm2_monitoring_init_red_hat scripts/dm_event_systemd_red_hat.socket scripts/dm_event_systemd_red_hat.service scripts/lvm2_monitoring_systemd_red_hat.service scripts/lvm2_tmpfiles_red_hat.conf scripts/Makefile test/Makefile test/api/Makefile test/unit/Makefile tools/Makefile udev/Makefile unit-tests/datastruct/Makefile unit-tests/regex/Makefile unit-tests/mm/Makefile"
10 years, 2 months