summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaushal M <kaushal@redhat.com>2012-04-04 12:00:30 +0530
committerAnand Avati <avati@redhat.com>2012-06-07 11:42:10 -0700
commit81e7464a54165b5d8b40847355d3bb6fe7b6e9df (patch)
tree990c4864efad87fefa6f24fb7a876c28f26c4238
parent86ff555eaaefb616b3dde5924a40271d99314861 (diff)
libglusterfs : Fix validation for integer volume options.
Integer volume options which specified only the min value as 0, would not be validated during "volume set". The range check for an option happened only if both min and max were not 0. In the above case, even though a minium was specified, the range check did not happen as both min and max were 0. To allow forced validation in such cases, a new member, "validate", has been added to volume_options_t. This member takes the values GF_OPT_VALIDATE_BOTH, GF_OPT_VALIDATE_MIN and GF_OPT_VALIDATE_MAX (GF_OPT_VALIDATE_BOTH is the default). Change-Id: I351de0eedb6028120e5c0b073ee5d9c141dee717 BUG: 809847 Signed-off-by: Kaushal M <kaushal@redhat.com> Reviewed-on: http://review.gluster.com/3084 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Amar Tumballi <amarts@redhat.com> Reviewed-by: Anand Avati <avati@redhat.com>
-rw-r--r--libglusterfs/src/options.c24
-rw-r--r--libglusterfs/src/options.h24
-rw-r--r--xlators/cluster/afr/src/afr.c1
3 files changed, 39 insertions, 10 deletions
diff --git a/libglusterfs/src/options.c b/libglusterfs/src/options.c
index 6ec1478ce..e5025e45e 100644
--- a/libglusterfs/src/options.c
+++ b/libglusterfs/src/options.c
@@ -71,7 +71,8 @@ xlator_option_validate_int (xlator_t *xl, const char *key, const char *value,
goto out;
}
- if ((opt->min == 0) && (opt->max == 0)) {
+ if ((opt->min == 0) && (opt->max == 0) &&
+ (opt->validate == GF_OPT_VALIDATE_BOTH)) {
gf_log (xl->name, GF_LOG_TRACE,
"no range check required for 'option %s %s'",
key, value);
@@ -79,7 +80,25 @@ xlator_option_validate_int (xlator_t *xl, const char *key, const char *value,
goto out;
}
- if ((inputll < opt->min) || (inputll > opt->max)) {
+ if ((opt->validate == GF_OPT_VALIDATE_MIN)) {
+ if (inputll < opt->min) {
+ snprintf (errstr, 256,
+ "'%lld' in 'option %s %s' is smaller than "
+ "minimum value '%"PRId64"'", inputll, key,
+ value, opt->min);
+ gf_log (xl->name, GF_LOG_ERROR, "%s", errstr);
+ goto out;
+ }
+ } else if ((opt->validate == GF_OPT_VALIDATE_MAX)) {
+ if ((inputll > opt->max)) {
+ snprintf (errstr, 256,
+ "'%lld' in 'option %s %s' is greater than "
+ "maximum value '%"PRId64"'", inputll, key,
+ value, opt->max);
+ gf_log (xl->name, GF_LOG_ERROR, "%s", errstr);
+ goto out;
+ }
+ } else if ((inputll < opt->min) || (inputll > opt->max)) {
snprintf (errstr, 256,
"'%lld' in 'option %s %s' is out of range "
"[%"PRId64" - %"PRId64"]",
@@ -126,7 +145,6 @@ xlator_option_validate_sizet (xlator_t *xl, const char *key, const char *value,
snprintf (errstr, 256, "Cache size %"PRId64" is out of "
"range [%"PRId64" - %"PRId64"]",
size, opt->min, opt->max);
- //*op_errstr = gf_strdup (errstr);
gf_log (xl->name, GF_LOG_WARNING, "%s", errstr);
ret = 0;
goto out;
diff --git a/libglusterfs/src/options.h b/libglusterfs/src/options.h
index 8c0ff2499..1775ad9ea 100644
--- a/libglusterfs/src/options.h
+++ b/libglusterfs/src/options.h
@@ -41,22 +41,32 @@ typedef enum {
GF_OPTION_TYPE_MAX,
} volume_option_type_t;
+typedef enum {
+ GF_OPT_VALIDATE_BOTH = 0,
+ GF_OPT_VALIDATE_MIN,
+ GF_OPT_VALIDATE_MAX,
+} opt_validate_type_t;
#define ZR_VOLUME_MAX_NUM_KEY 4
#define ZR_OPTION_MAX_ARRAY_SIZE 64
/* Each translator should define this structure */
typedef struct volume_options {
- char *key[ZR_VOLUME_MAX_NUM_KEY];
+ char *key[ZR_VOLUME_MAX_NUM_KEY];
/* different key, same meaning */
- volume_option_type_t type;
- int64_t min; /* 0 means no range */
- int64_t max; /* 0 means no range */
- char *value[ZR_OPTION_MAX_ARRAY_SIZE];
+ volume_option_type_t type;
+ int64_t min; /* 0 means no range */
+ int64_t max; /* 0 means no range */
+ char *value[ZR_OPTION_MAX_ARRAY_SIZE];
/* If specified, will check for one of
the value from this array */
- char *default_value;
- char *description; /* about the key */
+ char *default_value;
+ char *description; /* about the key */
+ /* Required for int options where only the min value
+ * is given and is 0. This will cause validation not to
+ * happen
+ */
+ opt_validate_type_t validate;
} volume_option_t;
diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c
index 4f7bf2de0..ebb9f1ee9 100644
--- a/xlators/cluster/afr/src/afr.c
+++ b/xlators/cluster/afr/src/afr.c
@@ -524,6 +524,7 @@ struct volume_options options[] = {
.type = GF_OPTION_TYPE_INT,
.min = 0,
.default_value = "16",
+ .validate = GF_OPT_VALIDATE_MIN,
},
{ .key = {"data-self-heal"},
.type = GF_OPTION_TYPE_STR,