summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra Bhat <raghavendrabhat@gluster.com>2011-04-18 14:23:17 +0000
committerAnand Avati <avati@gluster.com>2011-04-21 03:35:45 -0700
commitc1b2279adcc3b3a311221f247c6ee563214cf32c (patch)
tree1a71ab2081c8a5c71decb9d84d112015662fa0a4
parent14b9fab371eb7a160fbf15ea4b979d0d98a0e5e0 (diff)
do not allow create volume or add-brick if given path or any brick is a part of either
Signed-off-by: Raghavendra Bhat <raghavendrabhat@gluster.com> Signed-off-by: Anand Avati <avati@gluster.com> BUG: 2803 ([glusterfs-3.2.0qa14]: volume create succeeds even though there is a volume with an export directory in the path of current volume) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2803
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index c80b3ae95c7..88f9754bd7d 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -696,6 +696,10 @@ glusterd_volume_brickinfo_get (uuid_t uuid, char *hostname, char *path,
glusterd_brickinfo_t *brickiter = NULL;
uuid_t peer_uuid = {0};
int32_t ret = -1;
+ int32_t brick_path_len = 0;
+ int32_t path_len = 0;
+ int32_t smaller_path = 0;
+ gf_boolean_t is_path_smaller = _gf_true;
if (uuid) {
uuid_copy (peer_uuid, uuid);
@@ -705,6 +709,7 @@ glusterd_volume_brickinfo_get (uuid_t uuid, char *hostname, char *path,
goto out;
}
ret = -1;
+ path_len = strlen (path);
list_for_each_entry (brickiter, &volinfo->bricks, brick_list) {
if (uuid_is_null (brickiter->uuid)) {
@@ -712,6 +717,10 @@ glusterd_volume_brickinfo_get (uuid_t uuid, char *hostname, char *path,
if (ret)
goto out;
}
+ brick_path_len = strlen (brickiter->path);
+ smaller_path = min (brick_path_len, path_len);
+ if (smaller_path != path_len)
+ is_path_smaller = _gf_false;
if ((!uuid_compare (peer_uuid, brickiter->uuid)) &&
!strcmp (brickiter->path, path)) {
gf_log ("", GF_LOG_INFO, "Found brick");
@@ -720,6 +729,27 @@ glusterd_volume_brickinfo_get (uuid_t uuid, char *hostname, char *path,
*brickinfo = brickiter;
break;
} else {
+ if ((!uuid_compare (peer_uuid, brickiter->uuid)) &&
+ !strncmp (brickiter->path, path, smaller_path)) {
+ if (is_path_smaller == _gf_true) {
+ if (brickiter->path[smaller_path] == '/') {
+ ret = 0;
+ gf_log ("", GF_LOG_INFO,
+ "given path %s lies"
+ " within %s", path,
+ brickiter->path);
+ break;
+ }
+ } else
+ if (path[smaller_path] == '/') {
+ gf_log ("", GF_LOG_INFO,
+ "brick %s is a part of"
+ " %s", brickiter->path,
+ path);
+ ret = 0;
+ break;
+ }
+ }
ret = -1;
}
}