summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot.c16
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-store.c18
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c29
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.h1
4 files changed, 51 insertions, 13 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
index 7718fb5d16d..8b814acd455 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
@@ -4821,6 +4821,7 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict,
gf_boolean_t add_missed_snap = _gf_false;
int32_t ret = -1;
xlator_t *this = NULL;
+ char abspath[PATH_MAX] = {0};
this = THIS;
GF_ASSERT (this);
@@ -4957,6 +4958,21 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict,
strcpy (snap_brickinfo->hostname, original_brickinfo->hostname);
strcpy (snap_brickinfo->path, snap_brick_path);
+
+ if (!realpath (snap_brick_path, abspath)) {
+ /* ENOENT indicates that brick path has not been created which
+ * is a valid scenario */
+ if (errno != ENOENT) {
+ gf_msg (this->name, GF_LOG_CRITICAL, errno,
+ GD_MSG_BRICKINFO_CREATE_FAIL, "realpath () "
+ "failed for brick %s. The underlying filesystem"
+ " may be in bad state", snap_brick_path);
+ ret = -1;
+ goto out;
+ }
+ }
+ strncpy (snap_brickinfo->real_path, abspath, strlen(abspath));
+
strcpy (snap_brickinfo->mount_dir, original_brickinfo->mount_dir);
gf_uuid_copy (snap_brickinfo->uuid, original_brickinfo->uuid);
/* AFR changelog names are based on brick_id and hence the snap
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
index ca02b10b572..19115ef8943 100644
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
@@ -2252,6 +2252,7 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo)
char tmpkey[4096] = {0,};
gf_store_iter_t *tmpiter = NULL;
char *tmpvalue = NULL;
+ char abspath[PATH_MAX] = {0};
struct pmap_registry *pmap = NULL;
xlator_t *this = NULL;
int brickid = 0;
@@ -2405,7 +2406,22 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo)
GLUSTERD_ASSIGN_BRICKID_TO_BRICKINFO (brickinfo, volinfo,
brickid++);
}
-
+ ret = glusterd_resolve_brick (brickinfo);
+ if (ret)
+ goto out;
+ if (!gf_uuid_compare(brickinfo->uuid, MY_UUID)) {
+ if (!realpath (brickinfo->path, abspath)) {
+ gf_msg (this->name, GF_LOG_CRITICAL, errno,
+ GD_MSG_BRICKINFO_CREATE_FAIL, "realpath"
+ " () failed for brick %s. The "
+ "underlying file system may be in bad"
+ " state", brickinfo->path);
+ ret = -1;
+ goto out;
+ }
+ strncpy (brickinfo->real_path, abspath,
+ strlen(abspath));
+ }
cds_list_add_tail (&brickinfo->brick_list, &volinfo->bricks);
brick_count++;
}
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index a4d6ec592d9..7e9781f190d 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -679,6 +679,7 @@ glusterd_brickinfo_dup (glusterd_brickinfo_t *brickinfo,
strcpy (dup_brickinfo->hostname, brickinfo->hostname);
strcpy (dup_brickinfo->path, brickinfo->path);
+ strcpy (dup_brickinfo->real_path, brickinfo->real_path);
strcpy (dup_brickinfo->device_path, brickinfo->device_path);
strcpy (dup_brickinfo->fstype, brickinfo->fstype);
strcpy (dup_brickinfo->mnt_opts, brickinfo->mnt_opts);
@@ -1072,6 +1073,7 @@ glusterd_brickinfo_new_from_brick (char *brick,
int32_t ret = -1;
glusterd_brickinfo_t *new_brickinfo = NULL;
xlator_t *this = NULL;
+ char abspath[PATH_MAX] = {0};
this = THIS;
GF_ASSERT (this);
@@ -1106,10 +1108,23 @@ glusterd_brickinfo_new_from_brick (char *brick,
ret = gf_canonicalize_path (path);
if (ret)
goto out;
-
strncpy (new_brickinfo->hostname, hostname, 1024);
strncpy (new_brickinfo->path, path, 1024);
+ if (!realpath (new_brickinfo->path, abspath)) {
+ /* ENOENT indicates that brick path has not been created which
+ * is a valid scenario */
+ if (errno != ENOENT) {
+ gf_msg (this->name, GF_LOG_CRITICAL, errno,
+ GD_MSG_BRICKINFO_CREATE_FAIL, "realpath () failed for "
+ "brick %s. The underlying filesystem may be in bad "
+ "state", new_brickinfo->path);
+ ret = -1;
+ goto out;
+ }
+ }
+ strncpy (new_brickinfo->real_path, abspath, strlen(abspath));
+
*brickinfo = new_brickinfo;
ret = 0;
@@ -1171,7 +1186,6 @@ glusterd_is_brickpath_available (uuid_t uuid, char *path)
glusterd_conf_t *priv = NULL;
gf_boolean_t available = _gf_false;
char tmp_path[PATH_MAX+1] = {0};
- char tmp_brickpath[PATH_MAX+1] = {0};
priv = THIS->private;
@@ -1190,16 +1204,7 @@ glusterd_is_brickpath_available (uuid_t uuid, char *path)
brick_list) {
if (gf_uuid_compare (uuid, brickinfo->uuid))
continue;
-
- if (!realpath (brickinfo->path, tmp_brickpath)) {
- if (errno == ENOENT)
- strncpy (tmp_brickpath, brickinfo->path,
- PATH_MAX);
- else
- goto out;
- }
-
- if (_is_prefix (tmp_brickpath, tmp_path))
+ if (_is_prefix (brickinfo->real_path, tmp_path))
goto out;
}
}
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
index c872cd2339c..01dbd5878fb 100644
--- a/xlators/mgmt/glusterd/src/glusterd.h
+++ b/xlators/mgmt/glusterd/src/glusterd.h
@@ -194,6 +194,7 @@ typedef enum gf_brick_status {
struct glusterd_brickinfo {
char hostname[1024];
char path[PATH_MAX];
+ char real_path[PATH_MAX];
char device_path[PATH_MAX];
char mount_dir[PATH_MAX];
char brick_id[1024];/*Client xlator name, AFR changelog name*/