[lvm-devel] master - thin: update thin feature detection
Zdenek Kabelac
zkabelac at fedoraproject.org
Mon Dec 3 12:06:51 UTC 2012
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=a530c70b21e2ba93589e862b979aa3cb068d579a
Commit: a530c70b21e2ba93589e862b979aa3cb068d579a
Parent: 5ec20e267fdc627e3bf50679b748c937fe3d79fb
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Mon Dec 3 13:03:41 2012 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Dec 3 13:03:41 2012 +0100
thin: update thin feature detection
Safe 1 static var and keep whole detection within one function.
---
lib/thin/thin.c | 85 ++++++++++++++++++++++++++----------------------------
1 files changed, 41 insertions(+), 44 deletions(-)
diff --git a/lib/thin/thin.c b/lib/thin/thin.c
index 18b819b..d7c45ca 100644
--- a/lib/thin/thin.c
+++ b/lib/thin/thin.c
@@ -37,23 +37,8 @@
log_error(t " segment %s of logical volume %s.", ## p, \
dm_config_parent_name(sn), seg->lv->name), 0;
-/* List of features with their kernel target version */
-static const struct feature {
- uint32_t maj;
- uint32_t min;
- unsigned thin_feature;
- const char *feature;
-} _features[] = {
- { 1, 1, THIN_FEATURE_DISCARDS, "discards" },
- { 1, 1, THIN_FEATURE_EXTERNAL_ORIGIN, "external_origin" },
- { 1, 4, THIN_FEATURE_BLOCK_SIZE, "block_size" },
- { 1, 5, THIN_FEATURE_DISCARDS_NON_POWER_2, "discards_non_power_2" },
-};
-
-static const char _lvmconf[] = "global/thin_disabled_features";
-/* TODO: using static field heer, maybe should be part of segment_type */
+/* TODO: using static field here, maybe should be a part of segment_type */
static unsigned _feature_mask;
-static int _log_feature_mask;
static int _thin_target_present(struct cmd_context *cmd,
const struct lv_segment *seg,
@@ -557,11 +542,28 @@ static int _thin_target_present(struct cmd_context *cmd,
const struct lv_segment *seg,
unsigned *attributes)
{
+ /* List of features with their kernel target version */
+ static const struct feature {
+ uint32_t maj;
+ uint32_t min;
+ unsigned thin_feature;
+ const char *feature;
+ } const _features[] = {
+ { 1, 1, THIN_FEATURE_DISCARDS, "discards" },
+ { 1, 1, THIN_FEATURE_EXTERNAL_ORIGIN, "external_origin" },
+ { 1, 4, THIN_FEATURE_BLOCK_SIZE, "block_size" },
+ { 1, 5, THIN_FEATURE_DISCARDS_NON_POWER_2, "discards_non_power_2" },
+ };
+
+ static const char _lvmconf[] = "global/thin_disabled_features";
static int _checked = 0;
static int _present = 0;
static unsigned _attrs = 0;
uint32_t maj, min, patchlevel;
unsigned i;
+ const struct dm_config_node *cn;
+ const struct dm_config_value *cv;
+ const char *str;
if (!_checked) {
_present = target_present(cmd, THIN_MODULE, 1);
@@ -582,13 +584,32 @@ static int _thin_target_present(struct cmd_context *cmd,
}
if (attributes) {
- if (_log_feature_mask) {
+ if (!_feature_mask) {
+ /* Support runtime lvm.conf changes, N.B. avoid 32 feature */
+ if ((cn = find_config_tree_node(cmd, _lvmconf))) {
+ for (cv = cn->v; cv; cv = cv->next) {
+ if (cv->type != DM_CFG_STRING) {
+ log_error("Ignoring invalid string in config file %s.",
+ _lvmconf);
+ continue;
+ }
+ str = cv->v.str;
+ if (!*str) {
+ log_error("Ignoring empty string in config file %s.",
+ _lvmconf);
+ continue;
+ }
+ for (i = 0; i < sizeof(_features)/sizeof(*_features); i++)
+ if (strcasecmp(str, _features[i].feature) == 0)
+ _feature_mask |= _features[i].thin_feature;
+ }
+ }
+ _feature_mask = ~_feature_mask;
for (i = 0; i < sizeof(_features)/sizeof(*_features); i++)
if ((_attrs & _features[i].thin_feature) &&
!(_feature_mask & _features[i].thin_feature))
log_very_verbose("Target "THIN_MODULE " %s support disabled by %s",
_features[i].feature, _lvmconf);
- _log_feature_mask = 0; /* log just once */
}
*attributes = _attrs & _feature_mask;
}
@@ -664,11 +685,7 @@ int init_multiple_segtypes(struct cmd_context *cmd, struct segtype_library *segl
};
struct segment_type *segtype;
- const struct dm_config_node *cn;
- const struct dm_config_value *cv;
- const char *str;
unsigned i;
- unsigned mask = 0;
for (i = 0; i < sizeof(reg_segtypes)/sizeof(reg_segtypes[0]); ++i) {
segtype = dm_zalloc(sizeof(*segtype));
@@ -697,29 +714,9 @@ int init_multiple_segtypes(struct cmd_context *cmd, struct segtype_library *segl
log_very_verbose("Initialised segtype: %s", segtype->name);
}
- /* Support runtime lvm.conf changes */
- if ((cn = find_config_tree_node(cmd, _lvmconf))) {
- for (cv = cn->v; cv; cv = cv->next) {
- if (cv->type != DM_CFG_STRING) {
- log_error("Ignoring invalid string in config file %s.",
- _lvmconf);
- continue;
- }
- str = cv->v.str;
- if (!*str) {
- log_error("Ignoring empty string in config file %s.",
- _lvmconf);
- continue;
- }
- for (i = 0; i < sizeof(_features)/sizeof(*_features); i++)
- if (strcasecmp(str, _features[i].feature) == 0)
- mask |= _features[i].thin_feature;
- }
- _log_feature_mask = (mask != 0);
- }
- /* Store as 'and' mask in static field */
- _feature_mask = ~mask;
+ /* Reset mask for recalc */
+ _feature_mask = 0;
return 1;
}
More information about the lvm-devel
mailing list