diff options
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 16 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 18 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 29 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 1 |
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 297add57be6..2b106b63d4d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -4819,6 +4819,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); @@ -4956,6 +4957,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 c17a2e10a83..7c8bc545f6d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -2248,6 +2248,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; @@ -2401,7 +2402,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 c19da91db41..f5206cd3e63 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -675,6 +675,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); @@ -1068,6 +1069,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); @@ -1102,10 +1104,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; @@ -1167,7 +1182,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; @@ -1186,16 +1200,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 34de8801385..34e3e19d32c 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -189,6 +189,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*/ |