diff options
| author | Atin Mukherjee <amukherj@redhat.com> | 2016-01-19 10:45:22 +0530 | 
|---|---|---|
| committer | Jeff Darcy <jdarcy@redhat.com> | 2016-02-29 03:55:23 -0800 | 
| commit | a60c39de31e8258cb56d8db6bd8ec2491a942a4e (patch) | |
| tree | e8823b94d7f9b91a52e3bfefd4af64461e68d0db /xlators | |
| parent | 1f673d141fb06282583175357348a7a2fc19e604 (diff) | |
glusterd: use string comparison for realpath checks in glusterd_is_brickpath_available
glusterd_is_brickpath_available () used to call realpath() for checking the
whether the new brick path matches with the existing ones. The problem with this
is if the underlying file system is bad for any one of the existing bricks then
realpath() would fail and we wouldn't allow to create the new brick even if it
should be allowed.
Fix is to use string comparison with having a new field real_path in brickinfo
to store the absolute path
Change-Id: I1250ea5345f00fca0f6128056ebd08750d604f0a
BUG: 1299710
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-on: http://review.gluster.org/13258
Smoke: Gluster Build System <jenkins@build.gluster.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
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*/  | 
