diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 23563 | 
1 files changed, 11581 insertions, 11982 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index fc078b37a55..d1efce4aef1 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -82,81 +82,83 @@  #include <sys/sockio.h>  #endif -#define NFS_PROGRAM         100003 -#define NFSV3_VERSION       3 +#define NFS_PROGRAM 100003 +#define NFSV3_VERSION 3 -#define MOUNT_PROGRAM       100005 -#define MOUNTV3_VERSION     3 -#define MOUNTV1_VERSION     1 +#define MOUNT_PROGRAM 100005 +#define MOUNTV3_VERSION 3 +#define MOUNTV1_VERSION 1 -#define NLM_PROGRAM         100021 -#define NLMV4_VERSION       4 -#define NLMV1_VERSION       1 +#define NLM_PROGRAM 100021 +#define NLMV4_VERSION 4 +#define NLMV1_VERSION 1  gf_boolean_t -is_brick_mx_enabled (void) +is_brick_mx_enabled(void)  { -        char            *value = NULL; -        int             ret = 0; -        gf_boolean_t    enabled = _gf_false; -        xlator_t        *this = NULL; -        glusterd_conf_t *priv = NULL; +    char *value = NULL; +    int ret = 0; +    gf_boolean_t enabled = _gf_false; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; -        this = THIS; +    this = THIS; -        priv = this->private; +    priv = this->private; -        ret = dict_get_strn (priv->opts, GLUSTERD_BRICK_MULTIPLEX_KEY, -                             SLEN (GLUSTERD_BRICK_MULTIPLEX_KEY), &value); +    ret = dict_get_strn(priv->opts, GLUSTERD_BRICK_MULTIPLEX_KEY, +                        SLEN(GLUSTERD_BRICK_MULTIPLEX_KEY), &value); -        if (!ret) -                ret = gf_string2boolean (value, &enabled); +    if (!ret) +        ret = gf_string2boolean(value, &enabled); -        return ret ? _gf_false: enabled; +    return ret ? _gf_false : enabled;  }  int -get_mux_limit_per_process (int *mux_limit) +get_mux_limit_per_process(int *mux_limit)  { -        char            *value = NULL; -        int             ret = -1; -        int             max_bricks_per_proc = 0; -        xlator_t        *this = NULL; -        glusterd_conf_t *priv = NULL; +    char *value = NULL; +    int ret = -1; +    int max_bricks_per_proc = 0; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; -        this = THIS; -        GF_VALIDATE_OR_GOTO ("glusterd", this, out); +    this = THIS; +    GF_VALIDATE_OR_GOTO("glusterd", this, out); -        priv = this->private; -        GF_VALIDATE_OR_GOTO (this->name, priv, out); +    priv = this->private; +    GF_VALIDATE_OR_GOTO(this->name, priv, out); -        if (!is_brick_mx_enabled()) { -                max_bricks_per_proc = 1; -                ret = 0; -                goto out; -        } - -        ret = dict_get_strn (priv->opts, GLUSTERD_BRICKMUX_LIMIT_KEY, -                             SLEN (GLUSTERD_BRICKMUX_LIMIT_KEY), &value); -        if (ret) { -                gf_msg_debug (this->name, 0, "Limit for number of bricks per " -                              "brick process not yet set in dict. Returning " -                              "limit as 0 denoting that multiplexing can " -                              "happen with no limit set."); -                ret = 0; -                goto out; -        } +    if (!is_brick_mx_enabled()) { +        max_bricks_per_proc = 1; +        ret = 0; +        goto out; +    } + +    ret = dict_get_strn(priv->opts, GLUSTERD_BRICKMUX_LIMIT_KEY, +                        SLEN(GLUSTERD_BRICKMUX_LIMIT_KEY), &value); +    if (ret) { +        gf_msg_debug(this->name, 0, +                     "Limit for number of bricks per " +                     "brick process not yet set in dict. Returning " +                     "limit as 0 denoting that multiplexing can " +                     "happen with no limit set."); +        ret = 0; +        goto out; +    } -        ret = gf_string2int (value, &max_bricks_per_proc); -        if (ret) -                goto out; +    ret = gf_string2int(value, &max_bricks_per_proc); +    if (ret) +        goto out;  out: -        *mux_limit = max_bricks_per_proc; +    *mux_limit = max_bricks_per_proc; -        gf_msg_debug ("glusterd", 0, "Mux limit set to %d bricks per process", *mux_limit); +    gf_msg_debug("glusterd", 0, "Mux limit set to %d bricks per process", +                 *mux_limit); -        return ret; +    return ret;  }  extern struct volopt_map_entry glusterd_volopt_map[]; @@ -165,522 +167,516 @@ extern glusterd_all_vol_opts valid_all_vol_opts[];  static glusterd_lock_t lock;  static int -_brick_for_each (glusterd_volinfo_t *volinfo, dict_t *mod_dict, -                         void *data, -               int (*fn) (glusterd_volinfo_t *, glusterd_brickinfo_t *, +_brick_for_each(glusterd_volinfo_t *volinfo, dict_t *mod_dict, void *data, +                int (*fn)(glusterd_volinfo_t *, glusterd_brickinfo_t *,                            dict_t *mod_dict, void *))  { -        int                  ret        = 0; -        glusterd_brickinfo_t *brickinfo = NULL; -        xlator_t             *this = THIS; +    int ret = 0; +    glusterd_brickinfo_t *brickinfo = NULL; +    xlator_t *this = THIS; -        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                gf_msg_debug (this->name, 0, "Found a brick - %s:%s", -                              brickinfo->hostname, brickinfo->path); -                ret = fn (volinfo, brickinfo, mod_dict, data); -                if (ret) -                        goto out; -        } +    cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        gf_msg_debug(this->name, 0, "Found a brick - %s:%s", +                     brickinfo->hostname, brickinfo->path); +        ret = fn(volinfo, brickinfo, mod_dict, data); +        if (ret) +            goto out; +    }  out: -        return ret; +    return ret;  }  /* This is going to be a O(n^2) operation as we have to pick a brick,     make sure it belong to this machine, and compare another brick belonging     to this machine (if exists), is sharing the backend */  static void -gd_set_shared_brick_count (glusterd_volinfo_t *volinfo) +gd_set_shared_brick_count(glusterd_volinfo_t *volinfo)  { -        glusterd_brickinfo_t *brickinfo = NULL; -        glusterd_brickinfo_t *trav = NULL; +    glusterd_brickinfo_t *brickinfo = NULL; +    glusterd_brickinfo_t *trav = NULL; -        cds_list_for_each_entry (brickinfo, &volinfo->bricks, -                                 brick_list) { -                if (gf_uuid_compare (brickinfo->uuid, MY_UUID)) -                        continue; -                brickinfo->fs_share_count = 0; -                cds_list_for_each_entry (trav, &volinfo->bricks, -                                         brick_list) { -                        if (!gf_uuid_compare (trav->uuid, MY_UUID) && -                            (trav->statfs_fsid == brickinfo->statfs_fsid)) { -                                brickinfo->fs_share_count++; -                        } -                } +    cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        if (gf_uuid_compare(brickinfo->uuid, MY_UUID)) +            continue; +        brickinfo->fs_share_count = 0; +        cds_list_for_each_entry(trav, &volinfo->bricks, brick_list) +        { +            if (!gf_uuid_compare(trav->uuid, MY_UUID) && +                (trav->statfs_fsid == brickinfo->statfs_fsid)) { +                brickinfo->fs_share_count++; +            }          } +    } -        return; +    return;  }  int -glusterd_volume_brick_for_each (glusterd_volinfo_t *volinfo, void *data, -               int (*fn) (glusterd_volinfo_t *, glusterd_brickinfo_t *, -                          dict_t *mod_dict, void *)) +glusterd_volume_brick_for_each(glusterd_volinfo_t *volinfo, void *data, +                               int (*fn)(glusterd_volinfo_t *, +                                         glusterd_brickinfo_t *, +                                         dict_t *mod_dict, void *))  { -        dict_t             *mod_dict    = NULL; -        glusterd_volinfo_t *dup_volinfo = NULL; -        int                ret          = 0; +    dict_t *mod_dict = NULL; +    glusterd_volinfo_t *dup_volinfo = NULL; +    int ret = 0; -        gd_set_shared_brick_count (volinfo); +    gd_set_shared_brick_count(volinfo); -        if (volinfo->type != GF_CLUSTER_TYPE_TIER) { -                ret = _brick_for_each (volinfo, NULL, data, fn); -                if (ret) -                        goto out; -        } else { -                ret = glusterd_create_sub_tier_volinfo (volinfo, &dup_volinfo, -                                                        _gf_true, -                                                        volinfo->volname); -                if (ret) -                        goto out; +    if (volinfo->type != GF_CLUSTER_TYPE_TIER) { +        ret = _brick_for_each(volinfo, NULL, data, fn); +        if (ret) +            goto out; +    } else { +        ret = glusterd_create_sub_tier_volinfo(volinfo, &dup_volinfo, _gf_true, +                                               volinfo->volname); +        if (ret) +            goto out; -                mod_dict = dict_new(); -                if (!mod_dict) { -                        ret = -1; -                        goto out; -                } +        mod_dict = dict_new(); +        if (!mod_dict) { +            ret = -1; +            goto out; +        } -                ret = dict_set_nstrn (mod_dict, -                                      "hot-brick", SLEN ("hot-brick"), -                                      "on", SLEN ("on")); -                if (ret) -                        goto out; +        ret = dict_set_nstrn(mod_dict, "hot-brick", SLEN("hot-brick"), "on", +                             SLEN("on")); +        if (ret) +            goto out; -                ret = _brick_for_each (dup_volinfo, mod_dict, data, fn); -                if (ret) -                        goto out; -                GF_FREE (dup_volinfo); -                dup_volinfo = NULL; -                ret = glusterd_create_sub_tier_volinfo (volinfo, &dup_volinfo, -                                                        _gf_false, -                                                        volinfo->volname); -                if (ret) -                        goto out; -                ret = _brick_for_each (dup_volinfo, NULL, data, fn); -                if (ret) -                        goto out; -        } +        ret = _brick_for_each(dup_volinfo, mod_dict, data, fn); +        if (ret) +            goto out; +        GF_FREE(dup_volinfo); +        dup_volinfo = NULL; +        ret = glusterd_create_sub_tier_volinfo(volinfo, &dup_volinfo, _gf_false, +                                               volinfo->volname); +        if (ret) +            goto out; +        ret = _brick_for_each(dup_volinfo, NULL, data, fn); +        if (ret) +            goto out; +    }  out: -        if (dup_volinfo) -                glusterd_volinfo_delete (dup_volinfo); +    if (dup_volinfo) +        glusterd_volinfo_delete(dup_volinfo); -        if (mod_dict) -                dict_unref (mod_dict); -        return ret; +    if (mod_dict) +        dict_unref(mod_dict); +    return ret;  }  int32_t -glusterd_get_lock_owner (uuid_t *uuid) +glusterd_get_lock_owner(uuid_t *uuid)  { -        gf_uuid_copy (*uuid, lock.owner) ; -        return 0; +    gf_uuid_copy(*uuid, lock.owner); +    return 0;  }  static int32_t -glusterd_set_lock_owner (uuid_t owner) +glusterd_set_lock_owner(uuid_t owner)  { -        gf_uuid_copy (lock.owner, owner); -        //TODO: set timestamp -        return 0; +    gf_uuid_copy(lock.owner, owner); +    // TODO: set timestamp +    return 0;  }  static int32_t -glusterd_unset_lock_owner (uuid_t owner) +glusterd_unset_lock_owner(uuid_t owner)  { -        gf_uuid_clear (lock.owner); -        //TODO: set timestamp -        return 0; +    gf_uuid_clear(lock.owner); +    // TODO: set timestamp +    return 0;  }  gf_boolean_t -glusterd_is_fuse_available () +glusterd_is_fuse_available()  { - -        int     fd = 0; +    int fd = 0;  #ifdef __NetBSD__ -	fd = open ("/dev/puffs", O_RDWR); +    fd = open("/dev/puffs", O_RDWR);  #else -        fd = open ("/dev/fuse", O_RDWR); +    fd = open("/dev/fuse", O_RDWR);  #endif -        if (fd > -1 && !sys_close (fd)) -                return _gf_true; -        else -                return _gf_false; +    if (fd > -1 && !sys_close(fd)) +        return _gf_true; +    else +        return _gf_false;  }  int32_t -glusterd_lock (uuid_t   uuid) +glusterd_lock(uuid_t uuid)  { +    uuid_t owner; +    char new_owner_str[50] = ""; +    char owner_str[50] = ""; +    int ret = -1; +    xlator_t *this = NULL; -        uuid_t  owner; -        char    new_owner_str[50] = ""; -        char    owner_str[50] = ""; -        int     ret = -1; -        xlator_t *this = NULL; +    this = THIS; +    GF_ASSERT(this); -        this = THIS; -        GF_ASSERT (this); +    GF_ASSERT(uuid); -        GF_ASSERT (uuid); +    glusterd_get_lock_owner(&owner); -        glusterd_get_lock_owner (&owner); +    if (!gf_uuid_is_null(owner)) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_GLUSTERD_LOCK_FAIL, +               "Unable to get lock" +               " for uuid: %s, lock held by: %s", +               uuid_utoa_r(uuid, new_owner_str), uuid_utoa_r(owner, owner_str)); +        goto out; +    } -        if (!gf_uuid_is_null (owner)) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_GLUSTERD_LOCK_FAIL, "Unable to get lock" -                        " for uuid: %s, lock held by: %s", -                        uuid_utoa_r (uuid, new_owner_str), -                        uuid_utoa_r (owner, owner_str)); -                goto out; -        } +    ret = glusterd_set_lock_owner(uuid); -        ret = glusterd_set_lock_owner (uuid); - -        if (!ret) { -                gf_msg_debug (this->name, 0, "Cluster lock held by" -                         " %s", uuid_utoa (uuid)); -        } +    if (!ret) { +        gf_msg_debug(this->name, 0, +                     "Cluster lock held by" +                     " %s", +                     uuid_utoa(uuid)); +    }  out: -        return ret; +    return ret;  } -  int32_t -glusterd_unlock (uuid_t uuid) +glusterd_unlock(uuid_t uuid)  { -        uuid_t  owner; -        char    new_owner_str[50] = ""; -        char    owner_str[50] = ""; -        int32_t ret = -1; -        xlator_t *this = NULL; +    uuid_t owner; +    char new_owner_str[50] = ""; +    char owner_str[50] = ""; +    int32_t ret = -1; +    xlator_t *this = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        GF_ASSERT (uuid); +    GF_ASSERT(uuid); -        glusterd_get_lock_owner (&owner); +    glusterd_get_lock_owner(&owner); -        if (gf_uuid_is_null (owner)) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_GLUSTERD_LOCK_FAIL, "Cluster lock not held!"); -                goto out; -        } +    if (gf_uuid_is_null(owner)) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_GLUSTERD_LOCK_FAIL, +               "Cluster lock not held!"); +        goto out; +    } -        ret = gf_uuid_compare (uuid, owner); +    ret = gf_uuid_compare(uuid, owner); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_GLUSTERD_LOCK_FAIL, "Cluster lock held by %s ," -                        "unlock req from %s!", uuid_utoa_r (owner, owner_str), -                        uuid_utoa_r (uuid, new_owner_str)); -                goto out; -        } +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_GLUSTERD_LOCK_FAIL, +               "Cluster lock held by %s ," +               "unlock req from %s!", +               uuid_utoa_r(owner, owner_str), uuid_utoa_r(uuid, new_owner_str)); +        goto out; +    } -        ret = glusterd_unset_lock_owner (uuid); +    ret = glusterd_unset_lock_owner(uuid); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_GLUSTERD_UNLOCK_FAIL, "Unable to clear cluster " -                        "lock"); -                goto out; -        } +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_GLUSTERD_UNLOCK_FAIL, +               "Unable to clear cluster " +               "lock"); +        goto out; +    } -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  } -  int -glusterd_get_uuid (uuid_t *uuid) +glusterd_get_uuid(uuid_t *uuid)  { -        glusterd_conf_t         *priv = NULL; +    glusterd_conf_t *priv = NULL; -        priv = THIS->private; +    priv = THIS->private; -        GF_ASSERT (priv); +    GF_ASSERT(priv); -        gf_uuid_copy (*uuid, MY_UUID); +    gf_uuid_copy(*uuid, MY_UUID); -        return 0; +    return 0;  }  int -glusterd_submit_request (struct rpc_clnt *rpc, void *req, -                         call_frame_t *frame, rpc_clnt_prog_t *prog, -                         int procnum, struct iobref *iobref, -                         xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc) +glusterd_submit_request(struct rpc_clnt *rpc, void *req, call_frame_t *frame, +                        rpc_clnt_prog_t *prog, int procnum, +                        struct iobref *iobref, xlator_t *this, +                        fop_cbk_fn_t cbkfn, xdrproc_t xdrproc)  { -        char                    new_iobref  = 0; -        int                     ret         = -1; -        int                     count       = 0; -        ssize_t                 req_size    = 0; -        struct iobuf           *iobuf       = NULL; -        struct iovec            iov         = {0, }; +    char new_iobref = 0; +    int ret = -1; +    int count = 0; +    ssize_t req_size = 0; +    struct iobuf *iobuf = NULL; +    struct iovec iov = { +        0, +    }; -        GF_ASSERT (rpc); -        GF_ASSERT (this); +    GF_ASSERT(rpc); +    GF_ASSERT(this); -        if (req) { -                req_size = xdr_sizeof (xdrproc, req); -                iobuf = iobuf_get2 (this->ctx->iobuf_pool, req_size); -                if (!iobuf) { -                        goto out; -                }; +    if (req) { +        req_size = xdr_sizeof(xdrproc, req); +        iobuf = iobuf_get2(this->ctx->iobuf_pool, req_size); +        if (!iobuf) { +            goto out; +        }; -                if (!iobref) { -                        iobref = iobref_new (); -                        if (!iobref) { -                                goto out; -                        } +        if (!iobref) { +            iobref = iobref_new(); +            if (!iobref) { +                goto out; +            } -                        new_iobref = 1; -                } +            new_iobref = 1; +        } -                iobref_add (iobref, iobuf); +        iobref_add(iobref, iobuf); -                iov.iov_base = iobuf->ptr; -                iov.iov_len  = iobuf_pagesize (iobuf); +        iov.iov_base = iobuf->ptr; +        iov.iov_len = iobuf_pagesize(iobuf); -                /* Create the xdr payload */ -                ret = xdr_serialize_generic (iov, req, xdrproc); -                if (ret == -1) { -                        goto out; -                } -                iov.iov_len = ret; -                count = 1; +        /* Create the xdr payload */ +        ret = xdr_serialize_generic(iov, req, xdrproc); +        if (ret == -1) { +            goto out;          } +        iov.iov_len = ret; +        count = 1; +    } -        /* Send the msg */ -        rpc_clnt_submit (rpc, prog, procnum, cbkfn, &iov, count, NULL, 0, -                         iobref, frame, NULL, 0, NULL, 0, NULL); +    /* Send the msg */ +    rpc_clnt_submit(rpc, prog, procnum, cbkfn, &iov, count, NULL, 0, iobref, +                    frame, NULL, 0, NULL, 0, NULL); -        /* Unconditionally set ret to 0 here. This is to guard against a double -         * STACK_DESTROY in case of a failure in rpc_clnt_submit AFTER the -         * request is sent over the wire: once in the callback function of the -         * request and once in the error codepath of some of the callers of -         * glusterd_submit_request(). -         */ -        ret = 0; +    /* Unconditionally set ret to 0 here. This is to guard against a double +     * STACK_DESTROY in case of a failure in rpc_clnt_submit AFTER the +     * request is sent over the wire: once in the callback function of the +     * request and once in the error codepath of some of the callers of +     * glusterd_submit_request(). +     */ +    ret = 0;  out: -        if (new_iobref) { -                iobref_unref (iobref); -        } +    if (new_iobref) { +        iobref_unref(iobref); +    } -        iobuf_unref (iobuf); +    iobuf_unref(iobuf); -        return ret; +    return ret;  } - - -  struct iobuf * -glusterd_serialize_reply (rpcsvc_request_t *req, void *arg, -                          struct iovec *outmsg, xdrproc_t xdrproc) -{ -        struct iobuf            *iob = NULL; -        ssize_t                  retlen = -1; -        ssize_t                  rsp_size = 0; - -        /* First, get the io buffer into which the reply in arg will -         * be serialized. -         */ -        rsp_size = xdr_sizeof (xdrproc, arg); -        iob = iobuf_get2 (req->svc->ctx->iobuf_pool, rsp_size); -        if (!iob) { -                gf_msg ("glusterd", GF_LOG_ERROR, ENOMEM, -                        GD_MSG_NO_MEMORY, -                        "Failed to get iobuf"); -                goto ret; -        } - -        iobuf_to_iovec (iob, outmsg); -        /* Use the given serializer to translate the give C structure in arg -         * to XDR format which will be written into the buffer in outmsg. -         */ -        /* retlen is used to received the error since size_t is unsigned and we -         * need -1 for error notification during encoding. -         */ -        retlen = xdr_serialize_generic (*outmsg, arg, xdrproc); -        if (retlen == -1) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_ENCODE_FAIL, "Failed to encode message"); -                goto ret; -        } - -        outmsg->iov_len = retlen; +glusterd_serialize_reply(rpcsvc_request_t *req, void *arg, struct iovec *outmsg, +                         xdrproc_t xdrproc) +{ +    struct iobuf *iob = NULL; +    ssize_t retlen = -1; +    ssize_t rsp_size = 0; + +    /* First, get the io buffer into which the reply in arg will +     * be serialized. +     */ +    rsp_size = xdr_sizeof(xdrproc, arg); +    iob = iobuf_get2(req->svc->ctx->iobuf_pool, rsp_size); +    if (!iob) { +        gf_msg("glusterd", GF_LOG_ERROR, ENOMEM, GD_MSG_NO_MEMORY, +               "Failed to get iobuf"); +        goto ret; +    } + +    iobuf_to_iovec(iob, outmsg); +    /* Use the given serializer to translate the give C structure in arg +     * to XDR format which will be written into the buffer in outmsg. +     */ +    /* retlen is used to received the error since size_t is unsigned and we +     * need -1 for error notification during encoding. +     */ +    retlen = xdr_serialize_generic(*outmsg, arg, xdrproc); +    if (retlen == -1) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_ENCODE_FAIL, +               "Failed to encode message"); +        goto ret; +    } + +    outmsg->iov_len = retlen;  ret: -        if (retlen == -1) { -                iobuf_unref (iob); -                iob = NULL; -        } +    if (retlen == -1) { +        iobuf_unref(iob); +        iob = NULL; +    } -        return iob; +    return iob;  }  int -glusterd_submit_reply (rpcsvc_request_t *req, void *arg, -                       struct iovec *payload, int payloadcount, -                       struct iobref *iobref, xdrproc_t xdrproc) +glusterd_submit_reply(rpcsvc_request_t *req, void *arg, struct iovec *payload, +                      int payloadcount, struct iobref *iobref, +                      xdrproc_t xdrproc)  { -        struct iobuf           *iob        = NULL; -        int                     ret        = -1; -        struct iovec            rsp        = {0,}; -        char                    new_iobref = 0; +    struct iobuf *iob = NULL; +    int ret = -1; +    struct iovec rsp = { +        0, +    }; +    char new_iobref = 0; -        if (!req) { -                GF_ASSERT (req); -                goto out; -        } +    if (!req) { +        GF_ASSERT(req); +        goto out; +    } +    if (!iobref) { +        iobref = iobref_new();          if (!iobref) { -                iobref = iobref_new (); -                if (!iobref) { -                        gf_msg ("glusterd", GF_LOG_ERROR, ENOMEM, -                                GD_MSG_NO_MEMORY, "out of memory"); -                        goto out; -                } - -                new_iobref = 1; +            gf_msg("glusterd", GF_LOG_ERROR, ENOMEM, GD_MSG_NO_MEMORY, +                   "out of memory"); +            goto out;          } -        iob = glusterd_serialize_reply (req, arg, &rsp, xdrproc); -        if (!iob) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_SERIALIZE_MSG_FAIL, "Failed to serialize reply"); -        } else { -                iobref_add (iobref, iob); -        } +        new_iobref = 1; +    } -        ret = rpcsvc_submit_generic (req, &rsp, 1, payload, payloadcount, -                                     iobref); +    iob = glusterd_serialize_reply(req, arg, &rsp, xdrproc); +    if (!iob) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_SERIALIZE_MSG_FAIL, +               "Failed to serialize reply"); +    } else { +        iobref_add(iobref, iob); +    } -        /* Now that we've done our job of handing the message to the RPC layer -         * we can safely unref the iob in the hope that RPC layer must have -         * ref'ed the iob on receiving into the txlist. -         */ -        if (ret == -1) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_REPLY_SUBMIT_FAIL, "Reply submission failed"); -                goto out; -        } +    ret = rpcsvc_submit_generic(req, &rsp, 1, payload, payloadcount, iobref); -        ret = 0; +    /* Now that we've done our job of handing the message to the RPC layer +     * we can safely unref the iob in the hope that RPC layer must have +     * ref'ed the iob on receiving into the txlist. +     */ +    if (ret == -1) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_REPLY_SUBMIT_FAIL, +               "Reply submission failed"); +        goto out; +    } + +    ret = 0;  out: -        if (new_iobref) { -                iobref_unref (iobref); -        } +    if (new_iobref) { +        iobref_unref(iobref); +    } -        if (iob) -                iobuf_unref (iob); -        return ret; +    if (iob) +        iobuf_unref(iob); +    return ret;  }  gf_boolean_t -glusterd_check_volume_exists (char *volname) +glusterd_check_volume_exists(char *volname)  { -        glusterd_volinfo_t *volinfo = NULL; +    glusterd_volinfo_t *volinfo = NULL; -        return (glusterd_volinfo_find (volname, &volinfo) == 0); +    return (glusterd_volinfo_find(volname, &volinfo) == 0);  }  glusterd_volinfo_t * -glusterd_volinfo_unref (glusterd_volinfo_t *volinfo) +glusterd_volinfo_unref(glusterd_volinfo_t *volinfo)  { -        int refcnt = -1; +    int refcnt = -1; -        pthread_mutex_lock (&volinfo->reflock); -        { -                refcnt = --volinfo->refcnt; -        } -        pthread_mutex_unlock (&volinfo->reflock); +    pthread_mutex_lock(&volinfo->reflock); +    { +        refcnt = --volinfo->refcnt; +    } +    pthread_mutex_unlock(&volinfo->reflock); -        if (!refcnt) { -                glusterd_volinfo_delete (volinfo); -                return NULL; -        } +    if (!refcnt) { +        glusterd_volinfo_delete(volinfo); +        return NULL; +    } -        return volinfo; +    return volinfo;  }  glusterd_volinfo_t * -glusterd_volinfo_ref (glusterd_volinfo_t *volinfo) +glusterd_volinfo_ref(glusterd_volinfo_t *volinfo)  { -        pthread_mutex_lock (&volinfo->reflock); -        { -                ++volinfo->refcnt; -        } -        pthread_mutex_unlock (&volinfo->reflock); +    pthread_mutex_lock(&volinfo->reflock); +    { +        ++volinfo->refcnt; +    } +    pthread_mutex_unlock(&volinfo->reflock); -        return volinfo; +    return volinfo;  }  int32_t -glusterd_volinfo_new (glusterd_volinfo_t **volinfo) +glusterd_volinfo_new(glusterd_volinfo_t **volinfo)  { -        glusterd_volinfo_t      *new_volinfo = NULL; -        int32_t                 ret = -1; +    glusterd_volinfo_t *new_volinfo = NULL; +    int32_t ret = -1; -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        new_volinfo = GF_CALLOC (1, sizeof(*new_volinfo), -                                 gf_gld_mt_glusterd_volinfo_t); +    new_volinfo = GF_CALLOC(1, sizeof(*new_volinfo), +                            gf_gld_mt_glusterd_volinfo_t); -        if (!new_volinfo) -                goto out; +    if (!new_volinfo) +        goto out; -        LOCK_INIT (&new_volinfo->lock); -        CDS_INIT_LIST_HEAD (&new_volinfo->vol_list); -        CDS_INIT_LIST_HEAD (&new_volinfo->snapvol_list); -        CDS_INIT_LIST_HEAD (&new_volinfo->bricks); -        CDS_INIT_LIST_HEAD (&new_volinfo->snap_volumes); +    LOCK_INIT(&new_volinfo->lock); +    CDS_INIT_LIST_HEAD(&new_volinfo->vol_list); +    CDS_INIT_LIST_HEAD(&new_volinfo->snapvol_list); +    CDS_INIT_LIST_HEAD(&new_volinfo->bricks); +    CDS_INIT_LIST_HEAD(&new_volinfo->snap_volumes); -        new_volinfo->dict = dict_new (); -        if (!new_volinfo->dict) { -                GF_FREE (new_volinfo); +    new_volinfo->dict = dict_new(); +    if (!new_volinfo->dict) { +        GF_FREE(new_volinfo); -                goto out; -        } +        goto out; +    } -        new_volinfo->gsync_slaves = dict_new (); -        if (!new_volinfo->gsync_slaves) { -                dict_unref (new_volinfo->dict); -                GF_FREE (new_volinfo); -                goto out; -        } +    new_volinfo->gsync_slaves = dict_new(); +    if (!new_volinfo->gsync_slaves) { +        dict_unref(new_volinfo->dict); +        GF_FREE(new_volinfo); +        goto out; +    } -        new_volinfo->gsync_active_slaves = dict_new (); -        if (!new_volinfo->gsync_active_slaves) { -                dict_unref (new_volinfo->dict); -                dict_unref (new_volinfo->gsync_slaves); -                GF_FREE (new_volinfo); -                goto out; -        } +    new_volinfo->gsync_active_slaves = dict_new(); +    if (!new_volinfo->gsync_active_slaves) { +        dict_unref(new_volinfo->dict); +        dict_unref(new_volinfo->gsync_slaves); +        GF_FREE(new_volinfo); +        goto out; +    } -        snprintf (new_volinfo->parent_volname, GD_VOLUME_NAME_MAX, "N/A"); +    snprintf(new_volinfo->parent_volname, GD_VOLUME_NAME_MAX, "N/A"); -        new_volinfo->snap_max_hard_limit = GLUSTERD_SNAPS_MAX_HARD_LIMIT; +    new_volinfo->snap_max_hard_limit = GLUSTERD_SNAPS_MAX_HARD_LIMIT; -        new_volinfo->xl = THIS; +    new_volinfo->xl = THIS; -        glusterd_snapdsvc_build (&new_volinfo->snapd.svc); -        glusterd_tierdsvc_build (&new_volinfo->tierd.svc); -        glusterd_gfproxydsvc_build (&new_volinfo->gfproxyd.svc); +    glusterd_snapdsvc_build(&new_volinfo->snapd.svc); +    glusterd_tierdsvc_build(&new_volinfo->tierd.svc); +    glusterd_gfproxydsvc_build(&new_volinfo->gfproxyd.svc); -        pthread_mutex_init (&new_volinfo->reflock, NULL); -        *volinfo = glusterd_volinfo_ref (new_volinfo); +    pthread_mutex_init(&new_volinfo->reflock, NULL); +    *volinfo = glusterd_volinfo_ref(new_volinfo); -        ret = 0; +    ret = 0;  out: -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  /* This function will create a new volinfo and then @@ -693,65 +689,62 @@ out:   * @return 0 on success else -1   */  int32_t -glusterd_volinfo_dup (glusterd_volinfo_t *volinfo, -                      glusterd_volinfo_t **dup_volinfo, -                      gf_boolean_t set_userauth) -{ -        int32_t                 ret             = -1; -        xlator_t                *this           = NULL; -        glusterd_volinfo_t      *new_volinfo    = NULL; - -        this = THIS; -        GF_ASSERT (this); -        GF_VALIDATE_OR_GOTO (this->name, volinfo, out); -        GF_VALIDATE_OR_GOTO (this->name, dup_volinfo, out); - -        ret = glusterd_volinfo_new (&new_volinfo); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_VOLINFO_SET_FAIL, "not able to create the " -                        "duplicate volinfo for the volume %s", -                        volinfo->volname); -                goto out; -        } - -        new_volinfo->type = volinfo->type; -        new_volinfo->replica_count = volinfo->replica_count; -        new_volinfo->arbiter_count = volinfo->arbiter_count; -        new_volinfo->stripe_count = volinfo->stripe_count; -        new_volinfo->disperse_count = volinfo->disperse_count; -        new_volinfo->redundancy_count = volinfo->redundancy_count; -        new_volinfo->dist_leaf_count = volinfo->dist_leaf_count; -        new_volinfo->sub_count = volinfo->sub_count; -        new_volinfo->subvol_count = volinfo->subvol_count; -        new_volinfo->transport_type = volinfo->transport_type; -        new_volinfo->brick_count = volinfo->brick_count; -        new_volinfo->tier_info = volinfo->tier_info; -        new_volinfo->quota_conf_version = volinfo->quota_conf_version; -        new_volinfo->quota_xattr_version = volinfo->quota_xattr_version; -        new_volinfo->snap_max_hard_limit = volinfo->snap_max_hard_limit; -        new_volinfo->quota_conf_cksum = volinfo->quota_conf_cksum; - -        dict_copy (volinfo->dict, new_volinfo->dict); -        dict_copy (volinfo->gsync_slaves, new_volinfo->gsync_slaves); -        dict_copy (volinfo->gsync_active_slaves, -                   new_volinfo->gsync_active_slaves); -        gd_update_volume_op_versions (new_volinfo); - -        if (set_userauth) { -                glusterd_auth_set_username (new_volinfo, -                                            volinfo->auth.username); -                glusterd_auth_set_password (new_volinfo, -                                            volinfo->auth.password); -        } - -        *dup_volinfo = new_volinfo; -        ret = 0; -out: -        if (ret && (NULL != new_volinfo)) { -                (void) glusterd_volinfo_delete (new_volinfo); -        } -        return ret; +glusterd_volinfo_dup(glusterd_volinfo_t *volinfo, +                     glusterd_volinfo_t **dup_volinfo, +                     gf_boolean_t set_userauth) +{ +    int32_t ret = -1; +    xlator_t *this = NULL; +    glusterd_volinfo_t *new_volinfo = NULL; + +    this = THIS; +    GF_ASSERT(this); +    GF_VALIDATE_OR_GOTO(this->name, volinfo, out); +    GF_VALIDATE_OR_GOTO(this->name, dup_volinfo, out); + +    ret = glusterd_volinfo_new(&new_volinfo); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_SET_FAIL, +               "not able to create the " +               "duplicate volinfo for the volume %s", +               volinfo->volname); +        goto out; +    } + +    new_volinfo->type = volinfo->type; +    new_volinfo->replica_count = volinfo->replica_count; +    new_volinfo->arbiter_count = volinfo->arbiter_count; +    new_volinfo->stripe_count = volinfo->stripe_count; +    new_volinfo->disperse_count = volinfo->disperse_count; +    new_volinfo->redundancy_count = volinfo->redundancy_count; +    new_volinfo->dist_leaf_count = volinfo->dist_leaf_count; +    new_volinfo->sub_count = volinfo->sub_count; +    new_volinfo->subvol_count = volinfo->subvol_count; +    new_volinfo->transport_type = volinfo->transport_type; +    new_volinfo->brick_count = volinfo->brick_count; +    new_volinfo->tier_info = volinfo->tier_info; +    new_volinfo->quota_conf_version = volinfo->quota_conf_version; +    new_volinfo->quota_xattr_version = volinfo->quota_xattr_version; +    new_volinfo->snap_max_hard_limit = volinfo->snap_max_hard_limit; +    new_volinfo->quota_conf_cksum = volinfo->quota_conf_cksum; + +    dict_copy(volinfo->dict, new_volinfo->dict); +    dict_copy(volinfo->gsync_slaves, new_volinfo->gsync_slaves); +    dict_copy(volinfo->gsync_active_slaves, new_volinfo->gsync_active_slaves); +    gd_update_volume_op_versions(new_volinfo); + +    if (set_userauth) { +        glusterd_auth_set_username(new_volinfo, volinfo->auth.username); +        glusterd_auth_set_password(new_volinfo, volinfo->auth.password); +    } + +    *dup_volinfo = new_volinfo; +    ret = 0; +out: +    if (ret && (NULL != new_volinfo)) { +        (void)glusterd_volinfo_delete(new_volinfo); +    } +    return ret;  }  /* This function will duplicate brickinfo @@ -762,133 +755,131 @@ out:   * @return 0 on success else -1   */  int32_t -glusterd_brickinfo_dup (glusterd_brickinfo_t *brickinfo, -                        glusterd_brickinfo_t *dup_brickinfo) -{ -        int32_t         ret     = -1; -        xlator_t        *this   = NULL; - -        this = THIS; -        GF_ASSERT (this); - -        GF_VALIDATE_OR_GOTO (this->name, brickinfo, out); -        GF_VALIDATE_OR_GOTO (this->name, dup_brickinfo, out); - -        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); -        ret = gf_canonicalize_path (dup_brickinfo->path); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_CANONICALIZE_FAIL, "Failed to canonicalize " -                        "brick path"); -                goto out; -        } -        gf_uuid_copy (dup_brickinfo->uuid, brickinfo->uuid); - -        dup_brickinfo->port = brickinfo->port; -        dup_brickinfo->rdma_port = brickinfo->rdma_port; -        if (NULL != brickinfo->logfile) { -                dup_brickinfo->logfile = gf_strdup (brickinfo->logfile); -                if (NULL == dup_brickinfo->logfile) { -                        ret = -1; -                        goto out; -                } +glusterd_brickinfo_dup(glusterd_brickinfo_t *brickinfo, +                       glusterd_brickinfo_t *dup_brickinfo) +{ +    int32_t ret = -1; +    xlator_t *this = NULL; + +    this = THIS; +    GF_ASSERT(this); + +    GF_VALIDATE_OR_GOTO(this->name, brickinfo, out); +    GF_VALIDATE_OR_GOTO(this->name, dup_brickinfo, out); + +    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); +    ret = gf_canonicalize_path(dup_brickinfo->path); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_CANONICALIZE_FAIL, +               "Failed to canonicalize " +               "brick path"); +        goto out; +    } +    gf_uuid_copy(dup_brickinfo->uuid, brickinfo->uuid); + +    dup_brickinfo->port = brickinfo->port; +    dup_brickinfo->rdma_port = brickinfo->rdma_port; +    if (NULL != brickinfo->logfile) { +        dup_brickinfo->logfile = gf_strdup(brickinfo->logfile); +        if (NULL == dup_brickinfo->logfile) { +            ret = -1; +            goto out;          } -        strcpy (dup_brickinfo->brick_id, brickinfo->brick_id); -        strcpy (dup_brickinfo->mount_dir, brickinfo->mount_dir); -        dup_brickinfo->status = brickinfo->status; -        dup_brickinfo->snap_status = brickinfo->snap_status; +    } +    strcpy(dup_brickinfo->brick_id, brickinfo->brick_id); +    strcpy(dup_brickinfo->mount_dir, brickinfo->mount_dir); +    dup_brickinfo->status = brickinfo->status; +    dup_brickinfo->snap_status = brickinfo->snap_status;  out: -        return ret; +    return ret;  }  int32_t -glusterd_create_sub_tier_volinfo (glusterd_volinfo_t *volinfo, -                                  glusterd_volinfo_t **dup_volinfo, -                                  gf_boolean_t is_hot_tier, -                                  const char *new_volname) +glusterd_create_sub_tier_volinfo(glusterd_volinfo_t *volinfo, +                                 glusterd_volinfo_t **dup_volinfo, +                                 gf_boolean_t is_hot_tier, +                                 const char *new_volname)  { -        glusterd_brickinfo_t *brickinfo       = NULL; -        glusterd_brickinfo_t *brickinfo_dup   = NULL; -        gd_tier_info_t       *tier_info       = NULL; -        int                   i               = 0; -        int                   ret             = -1; - -        tier_info = &(volinfo->tier_info); - -        ret = glusterd_volinfo_dup (volinfo, dup_volinfo, _gf_true); -        if (ret) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, GD_MSG_VOL_OP_FAILED, -                        "Failed to create volinfo"); -                return ret; -        } - -        gf_uuid_copy ((*dup_volinfo)->volume_id, volinfo->volume_id); -        (*dup_volinfo)->is_snap_volume   = volinfo->is_snap_volume; -        (*dup_volinfo)->status           = volinfo->status; -        (*dup_volinfo)->snapshot         = volinfo->snapshot; +    glusterd_brickinfo_t *brickinfo = NULL; +    glusterd_brickinfo_t *brickinfo_dup = NULL; +    gd_tier_info_t *tier_info = NULL; +    int i = 0; +    int ret = -1; -        if (snprintf ((*dup_volinfo)->volname, -                      sizeof ((*dup_volinfo)->volname), "%s", new_volname) >= -            sizeof ((*dup_volinfo)->volname)) { -                        ret = -1; -                        goto out; -        } +    tier_info = &(volinfo->tier_info); -        memcpy (&(*dup_volinfo)->tier_info, &volinfo->tier_info, -                sizeof (volinfo->tier_info)); - -        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                i++; +    ret = glusterd_volinfo_dup(volinfo, dup_volinfo, _gf_true); +    if (ret) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_VOL_OP_FAILED, +               "Failed to create volinfo"); +        return ret; +    } -                if (is_hot_tier) { -                        if (i > volinfo->tier_info.hot_brick_count) -                                break; -                } else { -                        if (i <= volinfo->tier_info.hot_brick_count) -                                continue; -                } +    gf_uuid_copy((*dup_volinfo)->volume_id, volinfo->volume_id); +    (*dup_volinfo)->is_snap_volume = volinfo->is_snap_volume; +    (*dup_volinfo)->status = volinfo->status; +    (*dup_volinfo)->snapshot = volinfo->snapshot; -                ret = glusterd_brickinfo_new (&brickinfo_dup); -                if (ret) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_BRICK_NEW_INFO_FAIL, "Failed to create " -                                "new brickinfo"); -                        goto out; -                } +    if (snprintf((*dup_volinfo)->volname, sizeof((*dup_volinfo)->volname), "%s", +                 new_volname) >= sizeof((*dup_volinfo)->volname)) { +        ret = -1; +        goto out; +    } +    memcpy(&(*dup_volinfo)->tier_info, &volinfo->tier_info, +           sizeof(volinfo->tier_info)); -                glusterd_brickinfo_dup (brickinfo, brickinfo_dup); -                cds_list_add_tail (&brickinfo_dup->brick_list, -                              &((*dup_volinfo)->bricks)); -        } +    cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        i++;          if (is_hot_tier) { -            (*dup_volinfo)->type             = tier_info->hot_type; -            (*dup_volinfo)->replica_count    = tier_info->hot_replica_count; -            (*dup_volinfo)->brick_count      = tier_info->hot_brick_count; -            (*dup_volinfo)->dist_leaf_count  = -                                   glusterd_get_dist_leaf_count(*dup_volinfo); - +            if (i > volinfo->tier_info.hot_brick_count) +                break;          } else { -            (*dup_volinfo)->type             = tier_info->cold_type; -            (*dup_volinfo)->replica_count    = tier_info->cold_replica_count; -            (*dup_volinfo)->disperse_count   = tier_info->cold_disperse_count; -            (*dup_volinfo)->redundancy_count = tier_info->cold_redundancy_count; -            (*dup_volinfo)->dist_leaf_count  = tier_info->cold_dist_leaf_count; -            (*dup_volinfo)->brick_count      = tier_info->cold_brick_count; +            if (i <= volinfo->tier_info.hot_brick_count) +                continue;          } -out: -        if (ret && *dup_volinfo) { -                glusterd_volinfo_delete (*dup_volinfo); -                *dup_volinfo = NULL; + +        ret = glusterd_brickinfo_new(&brickinfo_dup); +        if (ret) { +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_BRICK_NEW_INFO_FAIL, +                   "Failed to create " +                   "new brickinfo"); +            goto out;          } -        return ret; +        glusterd_brickinfo_dup(brickinfo, brickinfo_dup); +        cds_list_add_tail(&brickinfo_dup->brick_list, +                          &((*dup_volinfo)->bricks)); +    } + +    if (is_hot_tier) { +        (*dup_volinfo)->type = tier_info->hot_type; +        (*dup_volinfo)->replica_count = tier_info->hot_replica_count; +        (*dup_volinfo)->brick_count = tier_info->hot_brick_count; +        (*dup_volinfo)->dist_leaf_count = glusterd_get_dist_leaf_count( +            *dup_volinfo); +    } else { +        (*dup_volinfo)->type = tier_info->cold_type; +        (*dup_volinfo)->replica_count = tier_info->cold_replica_count; +        (*dup_volinfo)->disperse_count = tier_info->cold_disperse_count; +        (*dup_volinfo)->redundancy_count = tier_info->cold_redundancy_count; +        (*dup_volinfo)->dist_leaf_count = tier_info->cold_dist_leaf_count; +        (*dup_volinfo)->brick_count = tier_info->cold_brick_count; +    } +out: +    if (ret && *dup_volinfo) { +        glusterd_volinfo_delete(*dup_volinfo); +        *dup_volinfo = NULL; +    } + +    return ret;  }  /* @@ -902,524 +893,520 @@ out:   */  gf_boolean_t -gd_vol_is_geo_rep_active (glusterd_volinfo_t *volinfo) +gd_vol_is_geo_rep_active(glusterd_volinfo_t *volinfo)  { -        gf_boolean_t     active = _gf_false; +    gf_boolean_t active = _gf_false; -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        if (volinfo->gsync_active_slaves && -            volinfo->gsync_active_slaves->count > 0) -                active = _gf_true; +    if (volinfo->gsync_active_slaves && volinfo->gsync_active_slaves->count > 0) +        active = _gf_true; -        return active; +    return active;  }  void -glusterd_auth_cleanup (glusterd_volinfo_t *volinfo) { - -        GF_ASSERT (volinfo); +glusterd_auth_cleanup(glusterd_volinfo_t *volinfo) +{ +    GF_ASSERT(volinfo); -        GF_FREE (volinfo->auth.username); +    GF_FREE(volinfo->auth.username); -        GF_FREE (volinfo->auth.password); +    GF_FREE(volinfo->auth.password);  }  char * -glusterd_auth_get_username (glusterd_volinfo_t *volinfo) { - -        GF_ASSERT (volinfo); +glusterd_auth_get_username(glusterd_volinfo_t *volinfo) +{ +    GF_ASSERT(volinfo); -        return volinfo->auth.username; +    return volinfo->auth.username;  }  char * -glusterd_auth_get_password (glusterd_volinfo_t *volinfo) { - -        GF_ASSERT (volinfo); +glusterd_auth_get_password(glusterd_volinfo_t *volinfo) +{ +    GF_ASSERT(volinfo); -        return volinfo->auth.password; +    return volinfo->auth.password;  }  int32_t -glusterd_auth_set_username (glusterd_volinfo_t *volinfo, char *username) { - -        GF_ASSERT (volinfo); -        GF_ASSERT (username); +glusterd_auth_set_username(glusterd_volinfo_t *volinfo, char *username) +{ +    GF_ASSERT(volinfo); +    GF_ASSERT(username); -        volinfo->auth.username = gf_strdup (username); -        return 0; +    volinfo->auth.username = gf_strdup(username); +    return 0;  }  int32_t -glusterd_auth_set_password (glusterd_volinfo_t *volinfo, char *password) { - -        GF_ASSERT (volinfo); -        GF_ASSERT (password); +glusterd_auth_set_password(glusterd_volinfo_t *volinfo, char *password) +{ +    GF_ASSERT(volinfo); +    GF_ASSERT(password); -        volinfo->auth.password = gf_strdup (password); -        return 0; +    volinfo->auth.password = gf_strdup(password); +    return 0;  }  int32_t -glusterd_brickinfo_delete (glusterd_brickinfo_t *brickinfo) +glusterd_brickinfo_delete(glusterd_brickinfo_t *brickinfo)  { -        int32_t         ret = -1; +    int32_t ret = -1; -        GF_ASSERT (brickinfo); +    GF_ASSERT(brickinfo); -        cds_list_del_init (&brickinfo->brick_list); +    cds_list_del_init(&brickinfo->brick_list); -        (void) gf_store_handle_destroy (brickinfo->shandle); +    (void)gf_store_handle_destroy(brickinfo->shandle); -        GF_FREE (brickinfo->logfile); -        GF_FREE (brickinfo); +    GF_FREE(brickinfo->logfile); +    GF_FREE(brickinfo); -        ret = 0; +    ret = 0; -        return ret; +    return ret;  }  int32_t -glusterd_volume_brickinfos_delete (glusterd_volinfo_t *volinfo) +glusterd_volume_brickinfos_delete(glusterd_volinfo_t *volinfo)  { -        glusterd_brickinfo_t    *brickinfo = NULL; -        glusterd_brickinfo_t    *tmp = NULL; -        int32_t                 ret = 0; +    glusterd_brickinfo_t *brickinfo = NULL; +    glusterd_brickinfo_t *tmp = NULL; +    int32_t ret = 0; -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        cds_list_for_each_entry_safe (brickinfo, tmp, &volinfo->bricks, -                                      brick_list) { -                ret = glusterd_brickinfo_delete (brickinfo); -                if (ret) -                        goto out; -        } +    cds_list_for_each_entry_safe(brickinfo, tmp, &volinfo->bricks, brick_list) +    { +        ret = glusterd_brickinfo_delete(brickinfo); +        if (ret) +            goto out; +    }  out: -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  int -glusterd_volinfo_remove (glusterd_volinfo_t *volinfo) +glusterd_volinfo_remove(glusterd_volinfo_t *volinfo)  { -        cds_list_del_init (&volinfo->vol_list); -        glusterd_volinfo_unref (volinfo); -        return 0; +    cds_list_del_init(&volinfo->vol_list); +    glusterd_volinfo_unref(volinfo); +    return 0;  }  int32_t -glusterd_volinfo_delete (glusterd_volinfo_t *volinfo) +glusterd_volinfo_delete(glusterd_volinfo_t *volinfo)  { -        int32_t                 ret = -1; +    int32_t ret = -1; -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        cds_list_del_init (&volinfo->vol_list); -        cds_list_del_init (&volinfo->snapvol_list); +    cds_list_del_init(&volinfo->vol_list); +    cds_list_del_init(&volinfo->snapvol_list); -        ret = glusterd_volume_brickinfos_delete (volinfo); -        if (ret) -                goto out; -        if (volinfo->dict) -                dict_unref (volinfo->dict); -        if (volinfo->gsync_slaves) -                dict_unref (volinfo->gsync_slaves); -        if (volinfo->gsync_active_slaves) -                dict_unref (volinfo->gsync_active_slaves); -        GF_FREE (volinfo->logdir); -        if (volinfo->rebal.dict) -                dict_unref (volinfo->rebal.dict); - -        /* Destroy the connection object for per volume svc daemons */ -        glusterd_conn_term (&volinfo->snapd.svc.conn); -        glusterd_conn_term (&volinfo->tierd.svc.conn); -        glusterd_conn_term (&volinfo->gfproxyd.svc.conn); - -        gf_store_handle_destroy (volinfo->quota_conf_shandle); -        gf_store_handle_destroy (volinfo->shandle); -        gf_store_handle_destroy (volinfo->node_state_shandle); -        gf_store_handle_destroy (volinfo->snapd.handle); - -        glusterd_auth_cleanup (volinfo); - -        pthread_mutex_destroy (&volinfo->reflock); -        GF_FREE (volinfo); -        ret = 0; +    ret = glusterd_volume_brickinfos_delete(volinfo); +    if (ret) +        goto out; +    if (volinfo->dict) +        dict_unref(volinfo->dict); +    if (volinfo->gsync_slaves) +        dict_unref(volinfo->gsync_slaves); +    if (volinfo->gsync_active_slaves) +        dict_unref(volinfo->gsync_active_slaves); +    GF_FREE(volinfo->logdir); +    if (volinfo->rebal.dict) +        dict_unref(volinfo->rebal.dict); + +    /* Destroy the connection object for per volume svc daemons */ +    glusterd_conn_term(&volinfo->snapd.svc.conn); +    glusterd_conn_term(&volinfo->tierd.svc.conn); +    glusterd_conn_term(&volinfo->gfproxyd.svc.conn); + +    gf_store_handle_destroy(volinfo->quota_conf_shandle); +    gf_store_handle_destroy(volinfo->shandle); +    gf_store_handle_destroy(volinfo->node_state_shandle); +    gf_store_handle_destroy(volinfo->snapd.handle); + +    glusterd_auth_cleanup(volinfo); + +    pthread_mutex_destroy(&volinfo->reflock); +    GF_FREE(volinfo); +    ret = 0;  out: -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_brickprocess_new (glusterd_brick_proc_t **brickprocess) +glusterd_brickprocess_new(glusterd_brick_proc_t **brickprocess)  { -        glusterd_brick_proc_t   *new_brickprocess = NULL; -        int32_t                  ret = -1; +    glusterd_brick_proc_t *new_brickprocess = NULL; +    int32_t ret = -1; -        GF_VALIDATE_OR_GOTO (THIS->name, brickprocess, out); +    GF_VALIDATE_OR_GOTO(THIS->name, brickprocess, out); -        new_brickprocess = GF_CALLOC (1, sizeof(*new_brickprocess), -                                      gf_gld_mt_glusterd_brick_proc_t); +    new_brickprocess = GF_CALLOC(1, sizeof(*new_brickprocess), +                                 gf_gld_mt_glusterd_brick_proc_t); -        if (!new_brickprocess) -                goto out; +    if (!new_brickprocess) +        goto out; -        CDS_INIT_LIST_HEAD (&new_brickprocess->bricks); -        CDS_INIT_LIST_HEAD (&new_brickprocess->brick_proc_list); +    CDS_INIT_LIST_HEAD(&new_brickprocess->bricks); +    CDS_INIT_LIST_HEAD(&new_brickprocess->brick_proc_list); -        new_brickprocess->brick_count = 0; -        *brickprocess = new_brickprocess; +    new_brickprocess->brick_count = 0; +    *brickprocess = new_brickprocess; -        ret = 0; +    ret = 0;  out: -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_brickinfo_new (glusterd_brickinfo_t **brickinfo) +glusterd_brickinfo_new(glusterd_brickinfo_t **brickinfo)  { -        glusterd_brickinfo_t      *new_brickinfo = NULL; -        int32_t                   ret = -1; +    glusterd_brickinfo_t *new_brickinfo = NULL; +    int32_t ret = -1; -        GF_ASSERT (brickinfo); +    GF_ASSERT(brickinfo); -        new_brickinfo = GF_CALLOC (1, sizeof(*new_brickinfo), -                                   gf_gld_mt_glusterd_brickinfo_t); +    new_brickinfo = GF_CALLOC(1, sizeof(*new_brickinfo), +                              gf_gld_mt_glusterd_brickinfo_t); -        if (!new_brickinfo) -                goto out; +    if (!new_brickinfo) +        goto out; -        CDS_INIT_LIST_HEAD (&new_brickinfo->brick_list); -        pthread_mutex_init (&new_brickinfo->restart_mutex, NULL); -        *brickinfo = new_brickinfo; +    CDS_INIT_LIST_HEAD(&new_brickinfo->brick_list); +    pthread_mutex_init(&new_brickinfo->restart_mutex, NULL); +    *brickinfo = new_brickinfo; -        ret = 0; +    ret = 0;  out: -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  int -glusterd_get_next_available_brickid (glusterd_volinfo_t *volinfo) +glusterd_get_next_available_brickid(glusterd_volinfo_t *volinfo)  { -        glusterd_brickinfo_t *brickinfo    = NULL; -        char                 *token        = NULL; -        int                   brickid      = 0; -        int                   max_brickid  = -1; -        int                   ret          = -1; +    glusterd_brickinfo_t *brickinfo = NULL; +    char *token = NULL; +    int brickid = 0; +    int max_brickid = -1; +    int ret = -1; -        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                token = strrchr (brickinfo->brick_id, '-'); -                ret = gf_string2int32 (++token, &brickid); -                if (ret < 0) { -                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_BRICK_ID_GEN_FAILED, -                                "Unable to generate brick ID"); -                        return ret; -                } -                if (brickid > max_brickid) -                        max_brickid = brickid; +    cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        token = strrchr(brickinfo->brick_id, '-'); +        ret = gf_string2int32(++token, &brickid); +        if (ret < 0) { +            gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_ID_GEN_FAILED, +                   "Unable to generate brick ID"); +            return ret;          } +        if (brickid > max_brickid) +            max_brickid = brickid; +    } -        return max_brickid + 1 ; +    return max_brickid + 1;  }  int32_t -glusterd_resolve_brick (glusterd_brickinfo_t *brickinfo) +glusterd_resolve_brick(glusterd_brickinfo_t *brickinfo)  { -        int32_t                  ret      = -1; -        xlator_t                *this     = NULL; +    int32_t ret = -1; +    xlator_t *this = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        GF_ASSERT (brickinfo); -        if (!gf_uuid_compare(brickinfo->uuid, MY_UUID) || -            (glusterd_peerinfo_find_by_uuid (brickinfo->uuid) != NULL)) { -                ret = 0; -                goto out; -        } +    GF_ASSERT(brickinfo); +    if (!gf_uuid_compare(brickinfo->uuid, MY_UUID) || +        (glusterd_peerinfo_find_by_uuid(brickinfo->uuid) != NULL)) { +        ret = 0; +        goto out; +    } -        ret = glusterd_hostname_to_uuid (brickinfo->hostname, brickinfo->uuid); +    ret = glusterd_hostname_to_uuid(brickinfo->hostname, brickinfo->uuid);  out: -        gf_msg_debug (this->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(this->name, 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_get_brick_mount_dir (char *brickpath, char *hostname, char *mount_dir) -{ -        char                   *mnt_pt        = NULL; -        char                   *brick_dir     = NULL; -        int32_t                 ret           = -1; -        uuid_t                  brick_uuid    = {0, }; -        xlator_t               *this          = NULL; - -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (brickpath); -        GF_ASSERT (hostname); -        GF_ASSERT (mount_dir); - -        ret = glusterd_hostname_to_uuid (hostname, brick_uuid); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_HOSTNAME_TO_UUID_FAIL, -                        "Failed to convert hostname %s to uuid", -                        hostname); -                goto out; +glusterd_get_brick_mount_dir(char *brickpath, char *hostname, char *mount_dir) +{ +    char *mnt_pt = NULL; +    char *brick_dir = NULL; +    int32_t ret = -1; +    uuid_t brick_uuid = { +        0, +    }; +    xlator_t *this = NULL; + +    this = THIS; +    GF_ASSERT(this); +    GF_ASSERT(brickpath); +    GF_ASSERT(hostname); +    GF_ASSERT(mount_dir); + +    ret = glusterd_hostname_to_uuid(hostname, brick_uuid); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_HOSTNAME_TO_UUID_FAIL, +               "Failed to convert hostname %s to uuid", hostname); +        goto out; +    } + +    if (!gf_uuid_compare(brick_uuid, MY_UUID)) { +        ret = glusterd_get_brick_root(brickpath, &mnt_pt); +        if (ret) { +            gf_msg(this->name, GF_LOG_WARNING, 0, +                   GD_MSG_BRICKPATH_ROOT_GET_FAIL, +                   "Could not get the root of the brick path %s", brickpath); +            goto out;          } -        if (!gf_uuid_compare (brick_uuid, MY_UUID)) { -                ret = glusterd_get_brick_root (brickpath, &mnt_pt); -                if (ret) { -                        gf_msg (this->name, GF_LOG_WARNING, 0, -                                GD_MSG_BRICKPATH_ROOT_GET_FAIL, -                                "Could not get the root of the brick path %s", -                                brickpath); -                        goto out; -                } +        if (strncmp(brickpath, mnt_pt, strlen(mnt_pt))) { +            gf_msg(this->name, GF_LOG_WARNING, 0, +                   GD_MSG_BRKPATH_MNTPNT_MISMATCH, "brick: %s brick mount: %s", +                   brickpath, mnt_pt); +            ret = -1; +            goto out; +        } -                if (strncmp (brickpath, mnt_pt, strlen(mnt_pt))) { -                        gf_msg (this->name, GF_LOG_WARNING, 0, -                                GD_MSG_BRKPATH_MNTPNT_MISMATCH, -                                "brick: %s brick mount: %s", -                                brickpath, mnt_pt); -                        ret = -1; -                        goto out; -                } +        brick_dir = &brickpath[strlen(mnt_pt)]; +        brick_dir++; -                brick_dir = &brickpath[strlen (mnt_pt)]; -                brick_dir++; - -                snprintf (mount_dir, VALID_GLUSTERD_PATHMAX, "/%s", brick_dir); -        } +        snprintf(mount_dir, VALID_GLUSTERD_PATHMAX, "/%s", brick_dir); +    }  out: -        if (mnt_pt) -                GF_FREE(mnt_pt); +    if (mnt_pt) +        GF_FREE(mnt_pt); -        gf_msg_trace (this->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_trace(this->name, 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_brickinfo_new_from_brick (char *brick, -                                   glusterd_brickinfo_t **brickinfo, -                                   gf_boolean_t construct_real_path, -                                   char **op_errstr) +glusterd_brickinfo_new_from_brick(char *brick, glusterd_brickinfo_t **brickinfo, +                                  gf_boolean_t construct_real_path, +                                  char **op_errstr)  { -        char                   *hostname      = NULL; -        char                   *path          = NULL; -        char                   *tmp_host      = NULL; -        char                   *tmp_path      = NULL; +    char *hostname = NULL; +    char *path = NULL; +    char *tmp_host = NULL; +    char *tmp_path = NULL;  #ifdef HAVE_BD_XLATOR -        char                   *vg            = NULL; +    char *vg = NULL;  #endif -        int32_t                 ret           = -1; -        glusterd_brickinfo_t   *new_brickinfo = NULL; -        xlator_t               *this          = NULL; -        char                    abspath[PATH_MAX] = ""; - -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (brick); -        GF_ASSERT (brickinfo); - -        tmp_host = gf_strdup (brick); -        if (tmp_host && !get_host_name (tmp_host, &hostname)) -                goto out; -        tmp_path = gf_strdup (brick); -        if (tmp_path && !get_path_name (tmp_path, &path)) -                goto out; - -        GF_ASSERT (hostname); -        GF_ASSERT (path); - -        ret = glusterd_brickinfo_new (&new_brickinfo); -        if (ret) -                goto out; +    int32_t ret = -1; +    glusterd_brickinfo_t *new_brickinfo = NULL; +    xlator_t *this = NULL; +    char abspath[PATH_MAX] = ""; + +    this = THIS; +    GF_ASSERT(this); +    GF_ASSERT(brick); +    GF_ASSERT(brickinfo); + +    tmp_host = gf_strdup(brick); +    if (tmp_host && !get_host_name(tmp_host, &hostname)) +        goto out; +    tmp_path = gf_strdup(brick); +    if (tmp_path && !get_path_name(tmp_path, &path)) +        goto out; + +    GF_ASSERT(hostname); +    GF_ASSERT(path); + +    ret = glusterd_brickinfo_new(&new_brickinfo); +    if (ret) +        goto out;  #ifdef HAVE_BD_XLATOR -        vg = strchr (path, '?'); -        /* ? is used as a delimiter for vg */ -        if (vg) { -                if (snprintf (new_brickinfo->vg, PATH_MAX, "%s", -                              vg + 1) >= PATH_MAX) { -                        ret = -1; -                        goto out; -                } -                *vg = '\0'; +    vg = strchr(path, '?'); +    /* ? is used as a delimiter for vg */ +    if (vg) { +        if (snprintf(new_brickinfo->vg, PATH_MAX, "%s", vg + 1) >= PATH_MAX) { +            ret = -1; +            goto out;          } -        new_brickinfo->caps = CAPS_BD; +        *vg = '\0'; +    } +    new_brickinfo->caps = CAPS_BD;  #endif -        ret = gf_canonicalize_path (path); -        if (ret) -                goto out; -        ret = snprintf (new_brickinfo->hostname, -                        sizeof (new_brickinfo->hostname), "%s", hostname); -        if (ret < 0 || ret >= sizeof (new_brickinfo->hostname)) { -                ret = -1; -                goto out; +    ret = gf_canonicalize_path(path); +    if (ret) +        goto out; +    ret = snprintf(new_brickinfo->hostname, sizeof(new_brickinfo->hostname), +                   "%s", hostname); +    if (ret < 0 || ret >= sizeof(new_brickinfo->hostname)) { +        ret = -1; +        goto out; +    } +    ret = snprintf(new_brickinfo->path, sizeof(new_brickinfo->path), "%s", +                   path); +    if (ret < 0 || ret >= sizeof(new_brickinfo->path)) { +        ret = -1; +        goto out; +    } + +    if (construct_real_path) { +        ret = glusterd_hostname_to_uuid(new_brickinfo->hostname, +                                        new_brickinfo->uuid); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_HOSTNAME_TO_UUID_FAIL, +                   "Failed to convert hostname %s to uuid", hostname); +            if (op_errstr) +                gf_asprintf(op_errstr, +                            "Host %s is not in " +                            "\'Peer in Cluster\' state", +                            new_brickinfo->hostname); +            goto out;          } -        ret  = snprintf (new_brickinfo->path, sizeof (new_brickinfo->path), -                         "%s", path); -        if (ret < 0 || ret >= sizeof (new_brickinfo->path)) { +    } + +    if (construct_real_path && !gf_uuid_compare(new_brickinfo->uuid, MY_UUID) && +        new_brickinfo->real_path[0] == '\0') { +        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. Error - %s", +                       new_brickinfo->path, strerror(errno));                  ret = -1;                  goto out; +            }          } +        strncpy(new_brickinfo->real_path, abspath, strlen(abspath)); +    } -        if (construct_real_path) { -                ret = glusterd_hostname_to_uuid (new_brickinfo->hostname, -                                                 new_brickinfo->uuid); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_HOSTNAME_TO_UUID_FAIL, -                                "Failed to convert hostname %s to uuid", -                                hostname); -                        if (op_errstr) -                                gf_asprintf (op_errstr, "Host %s is not in " -                                             "\'Peer in Cluster\' state", -                                             new_brickinfo->hostname); -                        goto out; -                } -        } +    *brickinfo = new_brickinfo; -        if (construct_real_path && -            !gf_uuid_compare (new_brickinfo->uuid, MY_UUID) -            && new_brickinfo->real_path[0] == '\0') { -                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. Error - %s", -                                        new_brickinfo->path, strerror(errno)); -                                ret = -1; -                                goto out; -                        } -                } -                strncpy (new_brickinfo->real_path, abspath, strlen(abspath)); -        } - -        *brickinfo = new_brickinfo; - -        ret = 0; +    ret = 0;  out: -        GF_FREE (tmp_host); -        if (tmp_host) -                GF_FREE (tmp_path); +    GF_FREE(tmp_host); +    if (tmp_host) +        GF_FREE(tmp_path); -        gf_msg_debug (this->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(this->name, 0, "Returning %d", ret); +    return ret;  }  static gf_boolean_t -_is_prefix (char *str1, char *str2) -{ -        GF_ASSERT (str1); -        GF_ASSERT (str2); - -        int             i = 0; -        int             len1 = 0; -        int             len2 = 0; -        int             small_len = 0; -        char            *bigger = NULL; -        gf_boolean_t    prefix = _gf_true; - -        len1 = strlen (str1); -        len2 = strlen (str2); -        small_len = min (len1, len2); - -        /* -         * If either one (not both) of the strings are 0-length, they are not -         * prefixes of each other. -         */ -        if ((small_len == 0) && (len1 != len2)) { -                return _gf_false; -        } +_is_prefix(char *str1, char *str2) +{ +    GF_ASSERT(str1); +    GF_ASSERT(str2); + +    int i = 0; +    int len1 = 0; +    int len2 = 0; +    int small_len = 0; +    char *bigger = NULL; +    gf_boolean_t prefix = _gf_true; + +    len1 = strlen(str1); +    len2 = strlen(str2); +    small_len = min(len1, len2); + +    /* +     * If either one (not both) of the strings are 0-length, they are not +     * prefixes of each other. +     */ +    if ((small_len == 0) && (len1 != len2)) { +        return _gf_false; +    } -        for (i = 0; i < small_len; i++) { -                if (str1[i] != str2[i]) { -                        prefix = _gf_false; -                        break; -                } +    for (i = 0; i < small_len; i++) { +        if (str1[i] != str2[i]) { +            prefix = _gf_false; +            break;          } +    } -        if (len1 < len2) -            bigger = str2; +    if (len1 < len2) +        bigger = str2; -        else if (len1 > len2) -            bigger = str1; +    else if (len1 > len2) +        bigger = str1; -        else -            return prefix; +    else +        return prefix; -        if (bigger[small_len] != '/') -            prefix = _gf_false; +    if (bigger[small_len] != '/') +        prefix = _gf_false; -        return prefix; +    return prefix;  }  /* Checks if @path is available in the peer identified by @uuid   * 'availability' is determined by querying current state of volumes   * in the cluster. */  gf_boolean_t -glusterd_is_brickpath_available (uuid_t uuid, char *path) -{ -        glusterd_brickinfo_t    *brickinfo = NULL; -        glusterd_volinfo_t      *volinfo   = NULL; -        glusterd_conf_t         *priv      = NULL; -        gf_boolean_t            available  = _gf_false; -        char                    tmp_path[PATH_MAX+1] = ""; - -        priv = THIS->private; +glusterd_is_brickpath_available(uuid_t uuid, char *path) +{ +    glusterd_brickinfo_t *brickinfo = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    glusterd_conf_t *priv = NULL; +    gf_boolean_t available = _gf_false; +    char tmp_path[PATH_MAX + 1] = ""; + +    priv = THIS->private; + +    if (snprintf(tmp_path, PATH_MAX, "%s", path) >= PATH_MAX) +        goto out; +    /* path may not yet exist */ +    if (!realpath(path, tmp_path)) { +        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. Error - %s", +                   path, strerror(errno)); +            goto out; +        } +        /* When realpath(3) fails, tmp_path is undefined. */ +        strncpy(tmp_path, path, PATH_MAX); +    } -        if (snprintf (tmp_path, PATH_MAX, "%s", path) >= PATH_MAX) +    cds_list_for_each_entry(volinfo, &priv->volumes, vol_list) +    { +        cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +        { +            if (gf_uuid_compare(uuid, brickinfo->uuid)) +                continue; +            if (_is_prefix(brickinfo->real_path, tmp_path)) { +                gf_msg(THIS->name, GF_LOG_CRITICAL, 0, +                       GD_MSG_BRICKINFO_CREATE_FAIL, +                       "_is_prefix call failed for brick %s " +                       "against brick %s", +                       tmp_path, brickinfo->real_path);                  goto out; -        /* path may not yet exist */ -        if (!realpath (path, tmp_path)) { -                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. Error - %s", -                                        path, strerror(errno)); -                        goto out; -                } -                /* When realpath(3) fails, tmp_path is undefined. */ -                strncpy(tmp_path,path,PATH_MAX); -        } - -        cds_list_for_each_entry (volinfo, &priv->volumes, vol_list) { -                cds_list_for_each_entry (brickinfo, &volinfo->bricks, -                                         brick_list) { -                        if (gf_uuid_compare (uuid, brickinfo->uuid)) -                                continue; -                        if (_is_prefix (brickinfo->real_path, tmp_path)) { -                                gf_msg (THIS->name, GF_LOG_CRITICAL, 0, -                                        GD_MSG_BRICKINFO_CREATE_FAIL, -                                        "_is_prefix call failed for brick %s " -                                        "against brick %s", tmp_path, -                                        brickinfo->real_path); -                                goto out; -                        } -                } +            }          } -        available = _gf_true; +    } +    available = _gf_true;  out: -        return available; +    return available;  }  #ifdef HAVE_BD_XLATOR @@ -1430,1542 +1417,1538 @@ out:   * to the caller   */  int -glusterd_bd_set_vg_tag (unsigned char *volume_id, glusterd_brickinfo_t *brick, -                        char *msg, int msg_size) +glusterd_bd_set_vg_tag(unsigned char *volume_id, glusterd_brickinfo_t *brick, +                       char *msg, int msg_size)  { -        lvm_t        handle    = NULL; -        vg_t         vg        = NULL; -        char        *uuid      = NULL; -        int          ret       = -1; - -        gf_asprintf (&uuid, "%s:%s", GF_XATTR_VOL_ID_KEY, -                     uuid_utoa (volume_id)); -        if (!uuid) { -                snprintf (msg, sizeof(*msg), "Could not allocate memory " -                          "for tag"); -                return -1; -        } +    lvm_t handle = NULL; +    vg_t vg = NULL; +    char *uuid = NULL; +    int ret = -1; -        handle = lvm_init (NULL); -        if (!handle) { -                snprintf (msg, sizeof(*msg), "lvm_init failed"); -                goto out; -        } - -        vg = lvm_vg_open (handle, brick->vg, "w", 0); -        if (!vg) { -                snprintf (msg, sizeof(*msg), "Could not open VG %s", -                          brick->vg); -                goto out; -        } - -        if (lvm_vg_add_tag (vg, uuid) < 0) { -                snprintf (msg, sizeof(*msg), "Could not set tag %s for " -                          "VG %s", uuid, brick->vg); -                goto out; -        } -        lvm_vg_write (vg); -        ret = 0; -out: -        GF_FREE (uuid); - -        if (vg) -                lvm_vg_close (vg); -        if (handle) -                lvm_quit (handle); - -        return ret; +    gf_asprintf(&uuid, "%s:%s", GF_XATTR_VOL_ID_KEY, uuid_utoa(volume_id)); +    if (!uuid) { +        snprintf(msg, sizeof(*msg), +                 "Could not allocate memory " +                 "for tag"); +        return -1; +    } + +    handle = lvm_init(NULL); +    if (!handle) { +        snprintf(msg, sizeof(*msg), "lvm_init failed"); +        goto out; +    } + +    vg = lvm_vg_open(handle, brick->vg, "w", 0); +    if (!vg) { +        snprintf(msg, sizeof(*msg), "Could not open VG %s", brick->vg); +        goto out; +    } + +    if (lvm_vg_add_tag(vg, uuid) < 0) { +        snprintf(msg, sizeof(*msg), +                 "Could not set tag %s for " +                 "VG %s", +                 uuid, brick->vg); +        goto out; +    } +    lvm_vg_write(vg); +    ret = 0; +out: +    GF_FREE(uuid); + +    if (vg) +        lvm_vg_close(vg); +    if (handle) +        lvm_quit(handle); + +    return ret;  }  #endif -  int -glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo, -                                        uuid_t volume_id, char **op_errstr, -                                        gf_boolean_t is_force, -                                        gf_boolean_t ignore_partition) -{ -        int          ret                 = -1; -        char         parentdir[PATH_MAX] = ""; -        struct stat  parent_st           = {0,}; -        struct stat  brick_st            = {0,}; -        struct stat  root_st             = {0,}; -        char         msg[2048]           = ""; -        gf_boolean_t is_created          = _gf_false; -        char         glusterfs_dir_path[PATH_MAX] = ""; -        int32_t      len                 = 0; - -        ret = sys_mkdir (brickinfo->path, 0777); -        if (ret) { -                if (errno != EEXIST) { -                        len = snprintf (msg, sizeof (msg), "Failed to create " -                                        "brick directory for brick %s:%s. " -                                        "Reason : %s ", brickinfo->hostname, -                                        brickinfo->path, strerror (errno)); -                        goto out; -                } -        } else { -                is_created = _gf_true; -        } - -        ret = sys_lstat (brickinfo->path, &brick_st); -        if (ret) { -                len = snprintf (msg, sizeof (msg), "lstat failed on %s. " -                                "Reason : %s", brickinfo->path, -                                strerror (errno)); -                goto out; -        } - -        if ((!is_created) && (!S_ISDIR (brick_st.st_mode))) { -                len = snprintf (msg, sizeof (msg), "The provided path %s " -                                "which is already present, is not a directory", -                                brickinfo->path); -                ret = -1; -                goto out; -        } - -        len = snprintf (parentdir, sizeof (parentdir), "%s/..", -                        brickinfo->path); -        if ((len < 0) || (len >= sizeof(parentdir))) { -                ret = -1; -                goto out; -        } - -        ret = sys_lstat ("/", &root_st); -        if (ret) { -                len = snprintf (msg, sizeof (msg), "lstat failed on /. " -                                "Reason : %s", strerror (errno)); -                goto out; -        } - -        ret = sys_lstat (parentdir, &parent_st); -        if (ret) { -                len = snprintf (msg, sizeof (msg), "lstat failed on %s. " -                                "Reason : %s", parentdir, strerror (errno)); -                goto out; +glusterd_validate_and_create_brickpath(glusterd_brickinfo_t *brickinfo, +                                       uuid_t volume_id, char **op_errstr, +                                       gf_boolean_t is_force, +                                       gf_boolean_t ignore_partition) +{ +    int ret = -1; +    char parentdir[PATH_MAX] = ""; +    struct stat parent_st = { +        0, +    }; +    struct stat brick_st = { +        0, +    }; +    struct stat root_st = { +        0, +    }; +    char msg[2048] = ""; +    gf_boolean_t is_created = _gf_false; +    char glusterfs_dir_path[PATH_MAX] = ""; +    int32_t len = 0; + +    ret = sys_mkdir(brickinfo->path, 0777); +    if (ret) { +        if (errno != EEXIST) { +            len = snprintf(msg, sizeof(msg), +                           "Failed to create " +                           "brick directory for brick %s:%s. " +                           "Reason : %s ", +                           brickinfo->hostname, brickinfo->path, +                           strerror(errno)); +            goto out;          } +    } else { +        is_created = _gf_true; +    } + +    ret = sys_lstat(brickinfo->path, &brick_st); +    if (ret) { +        len = snprintf(msg, sizeof(msg), +                       "lstat failed on %s. " +                       "Reason : %s", +                       brickinfo->path, strerror(errno)); +        goto out; +    } + +    if ((!is_created) && (!S_ISDIR(brick_st.st_mode))) { +        len = snprintf(msg, sizeof(msg), +                       "The provided path %s " +                       "which is already present, is not a directory", +                       brickinfo->path); +        ret = -1; +        goto out; +    } -        if (sizeof(GLUSTERD_DEFAULT_WORKDIR) <= (strlen(brickinfo->path) + 1) && -            !strncmp(brickinfo->path, GLUSTERD_DEFAULT_WORKDIR, -                     (sizeof(GLUSTERD_DEFAULT_WORKDIR) - 1))) { -                len = snprintf (msg, sizeof (msg), "Brick isn't allowed to be " -                                "created inside glusterd's working directory."); +    len = snprintf(parentdir, sizeof(parentdir), "%s/..", brickinfo->path); +    if ((len < 0) || (len >= sizeof(parentdir))) { +        ret = -1; +        goto out; +    } + +    ret = sys_lstat("/", &root_st); +    if (ret) { +        len = snprintf(msg, sizeof(msg), +                       "lstat failed on /. " +                       "Reason : %s", +                       strerror(errno)); +        goto out; +    } + +    ret = sys_lstat(parentdir, &parent_st); +    if (ret) { +        len = snprintf(msg, sizeof(msg), +                       "lstat failed on %s. " +                       "Reason : %s", +                       parentdir, strerror(errno)); +        goto out; +    } + +    if (sizeof(GLUSTERD_DEFAULT_WORKDIR) <= (strlen(brickinfo->path) + 1) && +        !strncmp(brickinfo->path, GLUSTERD_DEFAULT_WORKDIR, +                 (sizeof(GLUSTERD_DEFAULT_WORKDIR) - 1))) { +        len = snprintf(msg, sizeof(msg), +                       "Brick isn't allowed to be " +                       "created inside glusterd's working directory."); +        ret = -1; +        goto out; +    } + +    if (!is_force) { +        if (brick_st.st_dev != parent_st.st_dev) { +            len = snprintf(msg, sizeof(msg), +                           "The brick %s:%s " +                           "is a mount point. Please create a " +                           "sub-directory under the mount point " +                           "and use that as the brick directory. " +                           "Or use 'force' at the end of the " +                           "command if you want to override this " +                           "behavior.", +                           brickinfo->hostname, brickinfo->path); +            ret = -1; +            goto out; +        } else if (parent_st.st_dev == root_st.st_dev) { +            len = snprintf(msg, sizeof(msg), +                           "The brick %s:%s " +                           "is being created in the root " +                           "partition. It is recommended that " +                           "you don't use the system's root " +                           "partition for storage backend. Or " +                           "use 'force' at the end of the " +                           "command if you want to override this " +                           "behavior.", +                           brickinfo->hostname, brickinfo->path); + +            /* If --wignore-partition flag is used, ignore warnings +             * related to bricks being on root partition when 'force' +             * is not used */ +            if ((len < 0) || (len >= sizeof(msg)) || !ignore_partition) {                  ret = -1;                  goto out; +            }          } - -        if (!is_force) { -                if (brick_st.st_dev != parent_st.st_dev) { -                        len = snprintf (msg, sizeof (msg), "The brick %s:%s " -                                        "is a mount point. Please create a " -                                        "sub-directory under the mount point " -                                        "and use that as the brick directory. " -                                        "Or use 'force' at the end of the " -                                        "command if you want to override this " -                                        "behavior.", brickinfo->hostname, -                                        brickinfo->path); -                        ret = -1; -                        goto out; -                } -                else if (parent_st.st_dev == root_st.st_dev) { -                        len = snprintf (msg, sizeof (msg), "The brick %s:%s " -                                        "is being created in the root " -                                        "partition. It is recommended that " -                                        "you don't use the system's root " -                                        "partition for storage backend. Or " -                                        "use 'force' at the end of the " -                                        "command if you want to override this " -                                        "behavior.", brickinfo->hostname, -                                        brickinfo->path); - -                        /* If --wignore-partition flag is used, ignore warnings -                         * related to bricks being on root partition when 'force' -                         * is not used */ -                        if ((len < 0) || (len >= sizeof(msg)) || -                            !ignore_partition) { -                                ret = -1; -                                goto out; -                        } -                } -        } +    }  #ifdef HAVE_BD_XLATOR -        if (brickinfo->vg[0]) { -                ret = glusterd_bd_set_vg_tag (volume_id, brickinfo, msg, -                                              sizeof(msg)); -                if (ret) -                        goto out; -        } -#endif -        ret = glusterd_check_and_set_brick_xattr (brickinfo->hostname, -                                                  brickinfo->path, volume_id, -                                                  op_errstr, is_force); +    if (brickinfo->vg[0]) { +        ret = glusterd_bd_set_vg_tag(volume_id, brickinfo, msg, sizeof(msg));          if (ret) -                goto out; - -        /* create .glusterfs directory */ -        len = snprintf (glusterfs_dir_path, sizeof (glusterfs_dir_path), -                        "%s/%s", brickinfo->path, ".glusterfs"); -        if ((len < 0) || (len >= sizeof(glusterfs_dir_path))) { -                ret = -1; -                goto out; -        } +            goto out; +    } +#endif +    ret = glusterd_check_and_set_brick_xattr( +        brickinfo->hostname, brickinfo->path, volume_id, op_errstr, is_force); +    if (ret) +        goto out; + +    /* create .glusterfs directory */ +    len = snprintf(glusterfs_dir_path, sizeof(glusterfs_dir_path), "%s/%s", +                   brickinfo->path, ".glusterfs"); +    if ((len < 0) || (len >= sizeof(glusterfs_dir_path))) { +        ret = -1; +        goto out; +    } -        ret = sys_mkdir (glusterfs_dir_path, 0600); -        if (ret && (errno != EEXIST)) { -                len = snprintf (msg, sizeof (msg), "Failed to create " -                                ".glusterfs directory for brick %s:%s. " -                                "Reason : %s ", brickinfo->hostname, -                                brickinfo->path, strerror (errno)); -                goto out; -        } +    ret = sys_mkdir(glusterfs_dir_path, 0600); +    if (ret && (errno != EEXIST)) { +        len = snprintf(msg, sizeof(msg), +                       "Failed to create " +                       ".glusterfs directory for brick %s:%s. " +                       "Reason : %s ", +                       brickinfo->hostname, brickinfo->path, strerror(errno)); +        goto out; +    } -        ret = 0; +    ret = 0;  out: -        if (len < 0) { -                ret = -1; -        } -        if (ret && is_created) { -               (void)recursive_rmdir (brickinfo->path); -        } -        if (ret && !*op_errstr && msg[0] != '\0') -                *op_errstr = gf_strdup (msg); +    if (len < 0) { +        ret = -1; +    } +    if (ret && is_created) { +        (void)recursive_rmdir(brickinfo->path); +    } +    if (ret && !*op_errstr && msg[0] != '\0') +        *op_errstr = gf_strdup(msg); -        return ret; +    return ret;  }  int32_t -glusterd_volume_brickinfo_get (uuid_t uuid, char *hostname, char *path, -                               glusterd_volinfo_t *volinfo, -                               glusterd_brickinfo_t **brickinfo) +glusterd_volume_brickinfo_get(uuid_t uuid, char *hostname, char *path, +                              glusterd_volinfo_t *volinfo, +                              glusterd_brickinfo_t **brickinfo)  { -        glusterd_brickinfo_t    *brickiter = NULL; -        uuid_t                  peer_uuid = {0}; -        int32_t                 ret = -1; -        xlator_t                *this = NULL; +    glusterd_brickinfo_t *brickiter = NULL; +    uuid_t peer_uuid = {0}; +    int32_t ret = -1; +    xlator_t *this = NULL; -        this = THIS; - -        if (uuid) { -                gf_uuid_copy (peer_uuid, uuid); -        } else { -                ret = glusterd_hostname_to_uuid (hostname, peer_uuid); -                if (ret) -                        goto out; -        } -        ret = -1; -        cds_list_for_each_entry (brickiter, &volinfo->bricks, brick_list) { +    this = THIS; -                if ((gf_uuid_is_null (brickiter->uuid)) && -                    (glusterd_resolve_brick (brickiter) != 0)) -                        goto out; -                if (gf_uuid_compare (peer_uuid, brickiter->uuid)) -                        continue; +    if (uuid) { +        gf_uuid_copy(peer_uuid, uuid); +    } else { +        ret = glusterd_hostname_to_uuid(hostname, peer_uuid); +        if (ret) +            goto out; +    } +    ret = -1; +    cds_list_for_each_entry(brickiter, &volinfo->bricks, brick_list) +    { +        if ((gf_uuid_is_null(brickiter->uuid)) && +            (glusterd_resolve_brick(brickiter) != 0)) +            goto out; +        if (gf_uuid_compare(peer_uuid, brickiter->uuid)) +            continue; -                if (strcmp (brickiter->path, path) == 0) { -                        gf_msg_debug (this->name, 0, LOGSTR_FOUND_BRICK, -                                brickiter->hostname, brickiter->path, -                                volinfo->volname); -                        ret = 0; -                        if (brickinfo) -                                *brickinfo = brickiter; -                        break; -                } +        if (strcmp(brickiter->path, path) == 0) { +            gf_msg_debug(this->name, 0, LOGSTR_FOUND_BRICK, brickiter->hostname, +                         brickiter->path, volinfo->volname); +            ret = 0; +            if (brickinfo) +                *brickinfo = brickiter; +            break;          } +    }  out: -        gf_msg_debug (this->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(this->name, 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_volume_brickinfo_get_by_brick (char *brick, -                                        glusterd_volinfo_t *volinfo, -                                        glusterd_brickinfo_t **brickinfo, -                                        gf_boolean_t construct_real_path) +glusterd_volume_brickinfo_get_by_brick(char *brick, glusterd_volinfo_t *volinfo, +                                       glusterd_brickinfo_t **brickinfo, +                                       gf_boolean_t construct_real_path)  { -        int32_t                 ret = -1; -        glusterd_brickinfo_t    *tmp_brickinfo = NULL; +    int32_t ret = -1; +    glusterd_brickinfo_t *tmp_brickinfo = NULL; -        GF_ASSERT (brick); -        GF_ASSERT (volinfo); +    GF_ASSERT(brick); +    GF_ASSERT(volinfo); -        ret = glusterd_brickinfo_new_from_brick (brick, &tmp_brickinfo, -                                                 construct_real_path, NULL); -        if (ret) -                goto out; +    ret = glusterd_brickinfo_new_from_brick(brick, &tmp_brickinfo, +                                            construct_real_path, NULL); +    if (ret) +        goto out; -        ret = glusterd_volume_brickinfo_get (NULL, tmp_brickinfo->hostname, -                                             tmp_brickinfo->path, volinfo, -                                             brickinfo); -        (void) glusterd_brickinfo_delete (tmp_brickinfo); +    ret = glusterd_volume_brickinfo_get( +        NULL, tmp_brickinfo->hostname, tmp_brickinfo->path, volinfo, brickinfo); +    (void)glusterd_brickinfo_delete(tmp_brickinfo);  out: -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  gf_boolean_t -glusterd_is_brick_decommissioned (glusterd_volinfo_t *volinfo, char *hostname, -                                  char *path) +glusterd_is_brick_decommissioned(glusterd_volinfo_t *volinfo, char *hostname, +                                 char *path)  { -        gf_boolean_t            decommissioned = _gf_false; -        glusterd_brickinfo_t    *brickinfo = NULL; -        int                     ret = -1; +    gf_boolean_t decommissioned = _gf_false; +    glusterd_brickinfo_t *brickinfo = NULL; +    int ret = -1; -        ret = glusterd_volume_brickinfo_get (NULL, hostname, path, volinfo, -                                             &brickinfo); -        if (ret) -                goto out; -        decommissioned = brickinfo->decommissioned; +    ret = glusterd_volume_brickinfo_get(NULL, hostname, path, volinfo, +                                        &brickinfo); +    if (ret) +        goto out; +    decommissioned = brickinfo->decommissioned;  out: -        return decommissioned; +    return decommissioned;  }  int -glusterd_volinfo_find_by_volume_id (uuid_t volume_id, glusterd_volinfo_t **volinfo) +glusterd_volinfo_find_by_volume_id(uuid_t volume_id, +                                   glusterd_volinfo_t **volinfo)  { -        int32_t                 ret = -1; -        xlator_t                *this = NULL; -        glusterd_volinfo_t      *voliter = NULL; -        glusterd_conf_t         *priv = NULL; +    int32_t ret = -1; +    xlator_t *this = NULL; +    glusterd_volinfo_t *voliter = NULL; +    glusterd_conf_t *priv = NULL; -        if (!volume_id) -                return -1; +    if (!volume_id) +        return -1; -        this = THIS; -        priv = this->private; +    this = THIS; +    priv = this->private; -        cds_list_for_each_entry (voliter, &priv->volumes, vol_list) { -                if (gf_uuid_compare (volume_id, voliter->volume_id)) -                        continue; -                *volinfo = voliter; -                ret = 0; -                gf_msg_debug (this->name, 0, "Volume %s found", -                        voliter->volname); -                break; -        } -        return ret; +    cds_list_for_each_entry(voliter, &priv->volumes, vol_list) +    { +        if (gf_uuid_compare(volume_id, voliter->volume_id)) +            continue; +        *volinfo = voliter; +        ret = 0; +        gf_msg_debug(this->name, 0, "Volume %s found", voliter->volname); +        break; +    } +    return ret;  }  int32_t -glusterd_volinfo_find (const char *volname, glusterd_volinfo_t **volinfo) -{ -        glusterd_volinfo_t      *tmp_volinfo = NULL; -        int32_t                 ret = -1; -        xlator_t                *this = NULL; -        glusterd_conf_t         *priv = NULL; - -        GF_ASSERT (volname); -        this = THIS; -        GF_ASSERT (this); - -        priv = this->private; -        GF_ASSERT (priv); - -        cds_list_for_each_entry (tmp_volinfo, &priv->volumes, vol_list) { -                if (!strcmp (tmp_volinfo->volname, volname)) { -                        gf_msg_debug (this->name, 0, "Volume %s found", -                                volname); -                        ret = 0; -                        *volinfo = tmp_volinfo; -                        break; -                } +glusterd_volinfo_find(const char *volname, glusterd_volinfo_t **volinfo) +{ +    glusterd_volinfo_t *tmp_volinfo = NULL; +    int32_t ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; + +    GF_ASSERT(volname); +    this = THIS; +    GF_ASSERT(this); + +    priv = this->private; +    GF_ASSERT(priv); + +    cds_list_for_each_entry(tmp_volinfo, &priv->volumes, vol_list) +    { +        if (!strcmp(tmp_volinfo->volname, volname)) { +            gf_msg_debug(this->name, 0, "Volume %s found", volname); +            ret = 0; +            *volinfo = tmp_volinfo; +            break;          } +    } -        gf_msg_debug (this->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(this->name, 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_service_stop (const char *service, char *pidfile, int sig, -                       gf_boolean_t force_kill) +glusterd_service_stop(const char *service, char *pidfile, int sig, +                      gf_boolean_t force_kill)  { -        int32_t  ret = -1; -        pid_t    pid = -1; -        xlator_t *this = NULL; +    int32_t ret = -1; +    pid_t pid = -1; +    xlator_t *this = NULL; -        this = THIS; -        GF_ASSERT (this); -        if (!gf_is_service_running (pidfile, &pid)) { +    this = THIS; +    GF_ASSERT(this); +    if (!gf_is_service_running(pidfile, &pid)) { +        ret = 0; +        gf_msg(this->name, GF_LOG_INFO, 0, GD_MSG_ALREADY_STOPPED, +               "%s already stopped", service); +        goto out; +    } +    gf_msg_debug(this->name, 0, +                 "Stopping gluster %s running in pid: " +                 "%d", +                 service, pid); + +    ret = kill(pid, sig); +    if (ret) { +        switch (errno) { +            case ESRCH: +                gf_msg_debug(this->name, 0, "%s is already stopped", service);                  ret = 0; -                gf_msg (this->name, GF_LOG_INFO, 0, -                        GD_MSG_ALREADY_STOPPED, -                        "%s already stopped", service);                  goto out; +            default: +                gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_SVC_KILL_FAIL, +                       "Unable to kill %s " +                       "service, reason:%s", +                       service, strerror(errno));          } -        gf_msg_debug (this->name, 0, "Stopping gluster %s running in pid: " -                "%d", service, pid); +    } +    if (!force_kill) +        goto out; -        ret = kill (pid, sig); +    sleep(1); +    if (gf_is_service_running(pidfile, &pid)) { +        ret = kill(pid, SIGKILL);          if (ret) { -                switch (errno) { -                case ESRCH: -                        gf_msg_debug (this->name, 0, "%s is already stopped", -                                service); -                        ret = 0; -                        goto out; -                default: -                        gf_msg (this->name, GF_LOG_ERROR, errno, -                                GD_MSG_SVC_KILL_FAIL, "Unable to kill %s " -                                "service, reason:%s", service, -                                strerror (errno)); -                } -        } -        if (!force_kill) -                goto out; - -        sleep (1); -        if (gf_is_service_running (pidfile, &pid)) { -                ret = kill (pid, SIGKILL); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, errno, -                                GD_MSG_PID_KILL_FAIL, "Unable to kill pid:%d, " -                                "reason:%s", pid, strerror(errno)); -                        goto out; -                } +            gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_PID_KILL_FAIL, +                   "Unable to kill pid:%d, " +                   "reason:%s", +                   pid, strerror(errno)); +            goto out;          } +    } -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  }  int32_t -glusterd_service_stop_nolock (const char *service, char *pidfile, int sig, -                              gf_boolean_t force_kill) -{ -        int32_t    ret                = -1; -        pid_t      pid                = -1; -        xlator_t  *this               = NULL; -        FILE      *file               = NULL; - -        this = THIS; -        GF_ASSERT (this); - -        file = fopen (pidfile, "r+"); -        if (file) { -                ret = fscanf (file, "%d", &pid); -                if (ret <= 0) { -                        gf_msg_debug (this->name, 0, -                                      "Unable to read pidfile: %s", pidfile); -                        goto out; -                } +glusterd_service_stop_nolock(const char *service, char *pidfile, int sig, +                             gf_boolean_t force_kill) +{ +    int32_t ret = -1; +    pid_t pid = -1; +    xlator_t *this = NULL; +    FILE *file = NULL; + +    this = THIS; +    GF_ASSERT(this); + +    file = fopen(pidfile, "r+"); +    if (file) { +        ret = fscanf(file, "%d", &pid); +        if (ret <= 0) { +            gf_msg_debug(this->name, 0, "Unable to read pidfile: %s", pidfile); +            goto out;          } +    } -        if (kill (pid, 0) < 0) { +    if (kill(pid, 0) < 0) { +        ret = 0; +        gf_msg_debug(this->name, 0, "%s process not running: (%d) %s", service, +                     pid, strerror(errno)); +        goto out; +    } +    gf_msg_debug(this->name, 0, +                 "Stopping gluster %s service running with " +                 "pid: %d", +                 service, pid); + +    ret = kill(pid, sig); +    if (ret) { +        switch (errno) { +            case ESRCH: +                gf_msg_debug(this->name, 0, "%s is already stopped", service);                  ret = 0; -                gf_msg_debug (this->name, 0, "%s process not running: (%d) %s", -                              service, pid, strerror (errno));                  goto out; -        } -        gf_msg_debug (this->name, 0, "Stopping gluster %s service running with " -                      "pid: %d", service, pid); - -        ret = kill (pid, sig); -        if (ret) { -                switch (errno) { -                case ESRCH: -                        gf_msg_debug (this->name, 0, "%s is already stopped", -                                service); -                        ret = 0; -                        goto out; -                default: -                        gf_msg (this->name, GF_LOG_ERROR, errno, -                                GD_MSG_SVC_KILL_FAIL, "Unable to kill %s " -                                "service, reason:%s", service, -                                strerror (errno)); -                } -        } -        if (!force_kill) +            default: +                gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_SVC_KILL_FAIL, +                       "Unable to kill %s " +                       "service, reason:%s", +                       service, strerror(errno)); +        } +    } +    if (!force_kill) +        goto out; + +    sleep(1); +    if (kill(pid, 0) == 0) { +        ret = kill(pid, SIGKILL); +        if (ret) { +            /* Process is already dead, don't fail */ +            if (errno == ESRCH) { +                gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_PID_KILL_FAIL, +                       "Unable to find pid:%d, " +                       "must be dead already. Ignoring.", +                       pid); +                ret = 0; +            } else { +                gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_PID_KILL_FAIL, +                       "Unable to kill pid:%d, " +                       "reason:%s", +                       pid, strerror(errno));                  goto out; - -        sleep (1); -        if (kill(pid, 0) == 0) { -                ret = kill (pid, SIGKILL); -                if (ret) { -                        /* Process is already dead, don't fail */ -                        if (errno == ESRCH) { -                                gf_msg (this->name, GF_LOG_ERROR, errno, -                                        GD_MSG_PID_KILL_FAIL, -                                        "Unable to find pid:%d, " -                                        "must be dead already. Ignoring.", pid); -                                ret = 0; -                        } else { -                                gf_msg (this->name, GF_LOG_ERROR, errno, -                                        GD_MSG_PID_KILL_FAIL, -                                        "Unable to kill pid:%d, " -                                        "reason:%s", pid, strerror(errno)); -                                goto out; -                        } -                } +            }          } +    } -        ret = 0; +    ret = 0;  out: -        if (file) -                fclose (file); +    if (file) +        fclose(file); -        return ret; +    return ret;  }  void -glusterd_set_socket_filepath (char *sock_filepath, char *sockpath, size_t len) +glusterd_set_socket_filepath(char *sock_filepath, char *sockpath, size_t len)  { -        char xxh64[GF_XXH64_DIGEST_LENGTH*2+1] = {0,}; +    char xxh64[GF_XXH64_DIGEST_LENGTH * 2 + 1] = { +        0, +    }; -        gf_xxh64_wrapper ((unsigned char *)sock_filepath, -                          strlen(sock_filepath), -                          GF_XXHSUM64_DEFAULT_SEED, xxh64); -        snprintf (sockpath, len, "%s/%s.socket", GLUSTERD_SOCK_DIR, xxh64); +    gf_xxh64_wrapper((unsigned char *)sock_filepath, strlen(sock_filepath), +                     GF_XXHSUM64_DEFAULT_SEED, xxh64); +    snprintf(sockpath, len, "%s/%s.socket", GLUSTERD_SOCK_DIR, xxh64);  }  void -glusterd_set_brick_socket_filepath (glusterd_volinfo_t *volinfo, -                                    glusterd_brickinfo_t *brickinfo, -                                    char *sockpath, size_t len) -{ -        char                    volume_dir[PATH_MAX] = ""; -        xlator_t                *this = NULL; -        glusterd_conf_t         *priv = NULL; -        int                     expected_file_len = 0; -        char                    export_path[PATH_MAX] = ""; -        char                    sock_filepath[PATH_MAX] = ""; -        int32_t                 slen = 0; - -        expected_file_len = SLEN (GLUSTERD_SOCK_DIR) + -                            SLEN ("/") + -                            SHA256_DIGEST_LENGTH*2 + -                            SLEN (".socket") + 1; -        GF_ASSERT (len >= expected_file_len); -        this = THIS; -        GF_ASSERT (this); - -        priv = this->private; - -        GLUSTERD_GET_VOLUME_PID_DIR (volume_dir, volinfo, priv); -        GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, export_path); -        slen = snprintf (sock_filepath, PATH_MAX, "%s/run/%s-%s", -                         volume_dir, brickinfo->hostname, export_path); -        if (slen < 0) { -                sock_filepath[0] = 0; -        } -        glusterd_set_socket_filepath (sock_filepath, sockpath, len); +glusterd_set_brick_socket_filepath(glusterd_volinfo_t *volinfo, +                                   glusterd_brickinfo_t *brickinfo, +                                   char *sockpath, size_t len) +{ +    char volume_dir[PATH_MAX] = ""; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    int expected_file_len = 0; +    char export_path[PATH_MAX] = ""; +    char sock_filepath[PATH_MAX] = ""; +    int32_t slen = 0; + +    expected_file_len = SLEN(GLUSTERD_SOCK_DIR) + SLEN("/") + +                        SHA256_DIGEST_LENGTH * 2 + SLEN(".socket") + 1; +    GF_ASSERT(len >= expected_file_len); +    this = THIS; +    GF_ASSERT(this); + +    priv = this->private; + +    GLUSTERD_GET_VOLUME_PID_DIR(volume_dir, volinfo, priv); +    GLUSTERD_REMOVE_SLASH_FROM_PATH(brickinfo->path, export_path); +    slen = snprintf(sock_filepath, PATH_MAX, "%s/run/%s-%s", volume_dir, +                    brickinfo->hostname, export_path); +    if (slen < 0) { +        sock_filepath[0] = 0; +    } +    glusterd_set_socket_filepath(sock_filepath, sockpath, len);  }  /* connection happens only if it is not already connected,   * reconnections are taken care by rpc-layer   */  int32_t -glusterd_brick_connect (glusterd_volinfo_t  *volinfo, -                        glusterd_brickinfo_t  *brickinfo, char *socketpath) -{ -        int                     ret = 0; -        char                    volume_id_str[64] = ""; -        char                    *brickid = NULL; -        dict_t                  *options = NULL; -        struct rpc_clnt         *rpc = NULL; - -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); -        GF_ASSERT (socketpath); - -        if (brickinfo->rpc == NULL) { -                /* Setting frame-timeout to 10mins (600seconds). -                 * Unix domain sockets ensures that the connection is reliable. -                 * The default timeout of 30mins used for unreliable network -                 * connections is too long for unix domain socket connections. -                 */ -                ret = rpc_transport_unix_options_build (&options, socketpath, -                                                        600); -                if (ret) -                        goto out; +glusterd_brick_connect(glusterd_volinfo_t *volinfo, +                       glusterd_brickinfo_t *brickinfo, char *socketpath) +{ +    int ret = 0; +    char volume_id_str[64] = ""; +    char *brickid = NULL; +    dict_t *options = NULL; +    struct rpc_clnt *rpc = NULL; + +    GF_ASSERT(volinfo); +    GF_ASSERT(brickinfo); +    GF_ASSERT(socketpath); + +    if (brickinfo->rpc == NULL) { +        /* Setting frame-timeout to 10mins (600seconds). +         * Unix domain sockets ensures that the connection is reliable. +         * The default timeout of 30mins used for unreliable network +         * connections is too long for unix domain socket connections. +         */ +        ret = rpc_transport_unix_options_build(&options, socketpath, 600); +        if (ret) +            goto out; -                uuid_utoa_r (volinfo->volume_id, volume_id_str); -                ret = gf_asprintf (&brickid, "%s:%s:%s", volume_id_str, -                                   brickinfo->hostname, brickinfo->path); -                if (ret < 0) -                        goto out; +        uuid_utoa_r(volinfo->volume_id, volume_id_str); +        ret = gf_asprintf(&brickid, "%s:%s:%s", volume_id_str, +                          brickinfo->hostname, brickinfo->path); +        if (ret < 0) +            goto out; -                ret = glusterd_rpc_create (&rpc, options, -                                           glusterd_brick_rpc_notify, -                                           brickid, _gf_false); -                if (ret) { -                        GF_FREE (brickid); -                        goto out; -                } -                brickinfo->rpc = rpc; +        ret = glusterd_rpc_create(&rpc, options, glusterd_brick_rpc_notify, +                                  brickid, _gf_false); +        if (ret) { +            GF_FREE(brickid); +            goto out;          } +        brickinfo->rpc = rpc; +    }  out: -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  static int -_mk_rundir_p (glusterd_volinfo_t *volinfo) +_mk_rundir_p(glusterd_volinfo_t *volinfo)  { -        char rundir[PATH_MAX]   = ""; -        glusterd_conf_t *priv   = NULL; -        xlator_t        *this   = NULL; -        int             ret     = -1; +    char rundir[PATH_MAX] = ""; +    glusterd_conf_t *priv = NULL; +    xlator_t *this = NULL; +    int ret = -1; -        this = THIS; -        priv = this->private; -        GLUSTERD_GET_VOLUME_PID_DIR (rundir, volinfo, priv); -        ret =  mkdir_p (rundir, 0777, _gf_true); -        if (ret) -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_CREATE_DIR_FAILED, "Failed to create rundir"); -        return ret; +    this = THIS; +    priv = this->private; +    GLUSTERD_GET_VOLUME_PID_DIR(rundir, volinfo, priv); +    ret = mkdir_p(rundir, 0777, _gf_true); +    if (ret) +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_CREATE_DIR_FAILED, +               "Failed to create rundir"); +    return ret;  }  int32_t -glusterd_volume_start_glusterfs (glusterd_volinfo_t  *volinfo, -                                 glusterd_brickinfo_t  *brickinfo, -                                 gf_boolean_t wait) -{ -        int32_t                 ret = -1; -        xlator_t                *this = NULL; -        glusterd_conf_t         *priv = NULL; -        char                    pidfile[PATH_MAX+1] = ""; -        char                    volfile[PATH_MAX] = ""; -        runner_t                runner = {0,}; -        char                    exp_path[PATH_MAX] = ""; -        char                    logfile[PATH_MAX] = ""; -        int                     port = 0; -        int                     rdma_port = 0; -        char                    *bind_address = NULL; -        char                    *localtime_logging = NULL; -        char                    socketpath[PATH_MAX] = ""; -        char                    glusterd_uuid[1024] = ""; -        char                    valgrind_logfile[PATH_MAX] = ""; -        char                    rdma_brick_path[PATH_MAX] = ""; -        struct rpc_clnt         *rpc = NULL; -        rpc_clnt_connection_t   *conn  = NULL; -        int                     pid    = -1; -        int32_t                 len = 0; - -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); - -        this = THIS; -        GF_ASSERT (this); - -        priv = this->private; -        GF_ASSERT (priv); - -        if (brickinfo->snap_status == -1) { -                gf_msg (this->name, GF_LOG_INFO, 0, -                        GD_MSG_SNAPSHOT_PENDING, -                        "Snapshot is pending on %s:%s. " -                        "Hence not starting the brick", -                        brickinfo->hostname, -                        brickinfo->path); -                ret = 0; -                goto out; -        } - -        GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, brickinfo, priv); -        if (gf_is_service_running (pidfile, &pid)) { -                goto connect; -        } - -        /* -         * There are all sorts of races in the start/stop code that could leave -         * a UNIX-domain socket or RPC-client object associated with a -         * long-dead incarnation of this brick, while the new incarnation is -         * listening on a new socket at the same path and wondering why we -         * haven't shown up.  To avoid the whole mess and be on the safe side, -         * we just blow away anything that might have been left over, and start -         * over again. -         */ -        glusterd_set_brick_socket_filepath (volinfo, brickinfo, socketpath, -                                            sizeof (socketpath)); -        (void) glusterd_unlink_file (socketpath); -        rpc = brickinfo->rpc; -        if (rpc) { -                brickinfo->rpc = NULL; -                conn = &rpc->conn; -                pthread_mutex_lock (&conn->lock); -                if (conn->reconnect) { -                        (void ) gf_timer_call_cancel (rpc->ctx, conn->reconnect); -                        conn->reconnect = NULL; -                } -                pthread_mutex_unlock (&conn->lock); -                rpc_clnt_unref (rpc); -        } - -        port = pmap_assign_port (THIS, brickinfo->port, brickinfo->path); -        if (!port) { -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_PORTS_EXHAUSTED, -                        "All the ports in the range are exhausted, can't start " -                        "brick %s for volume %s", brickinfo->path, -                        volinfo->volname); -                ret = -1; -                goto out; -        } -        /* Build the exp_path, before starting the glusterfsd even in -           valgrind mode. Otherwise all the glusterfsd processes start -           writing the valgrind log to the same file. -        */ -        GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, exp_path); +glusterd_volume_start_glusterfs(glusterd_volinfo_t *volinfo, +                                glusterd_brickinfo_t *brickinfo, +                                gf_boolean_t wait) +{ +    int32_t ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    char pidfile[PATH_MAX + 1] = ""; +    char volfile[PATH_MAX] = ""; +    runner_t runner = { +        0, +    }; +    char exp_path[PATH_MAX] = ""; +    char logfile[PATH_MAX] = ""; +    int port = 0; +    int rdma_port = 0; +    char *bind_address = NULL; +    char *localtime_logging = NULL; +    char socketpath[PATH_MAX] = ""; +    char glusterd_uuid[1024] = ""; +    char valgrind_logfile[PATH_MAX] = ""; +    char rdma_brick_path[PATH_MAX] = ""; +    struct rpc_clnt *rpc = NULL; +    rpc_clnt_connection_t *conn = NULL; +    int pid = -1; +    int32_t len = 0; + +    GF_ASSERT(volinfo); +    GF_ASSERT(brickinfo); + +    this = THIS; +    GF_ASSERT(this); + +    priv = this->private; +    GF_ASSERT(priv); + +    if (brickinfo->snap_status == -1) { +        gf_msg(this->name, GF_LOG_INFO, 0, GD_MSG_SNAPSHOT_PENDING, +               "Snapshot is pending on %s:%s. " +               "Hence not starting the brick", +               brickinfo->hostname, brickinfo->path); +        ret = 0; +        goto out; +    } + +    GLUSTERD_GET_BRICK_PIDFILE(pidfile, volinfo, brickinfo, priv); +    if (gf_is_service_running(pidfile, &pid)) { +        goto connect; +    } + +    /* +     * There are all sorts of races in the start/stop code that could leave +     * a UNIX-domain socket or RPC-client object associated with a +     * long-dead incarnation of this brick, while the new incarnation is +     * listening on a new socket at the same path and wondering why we +     * haven't shown up.  To avoid the whole mess and be on the safe side, +     * we just blow away anything that might have been left over, and start +     * over again. +     */ +    glusterd_set_brick_socket_filepath(volinfo, brickinfo, socketpath, +                                       sizeof(socketpath)); +    (void)glusterd_unlink_file(socketpath); +    rpc = brickinfo->rpc; +    if (rpc) { +        brickinfo->rpc = NULL; +        conn = &rpc->conn; +        pthread_mutex_lock(&conn->lock); +        if (conn->reconnect) { +            (void)gf_timer_call_cancel(rpc->ctx, conn->reconnect); +            conn->reconnect = NULL; +        } +        pthread_mutex_unlock(&conn->lock); +        rpc_clnt_unref(rpc); +    } + +    port = pmap_assign_port(THIS, brickinfo->port, brickinfo->path); +    if (!port) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_PORTS_EXHAUSTED, +               "All the ports in the range are exhausted, can't start " +               "brick %s for volume %s", +               brickinfo->path, volinfo->volname); +        ret = -1; +        goto out; +    } +    /* Build the exp_path, before starting the glusterfsd even in +       valgrind mode. Otherwise all the glusterfsd processes start +       writing the valgrind log to the same file. +    */ +    GLUSTERD_REMOVE_SLASH_FROM_PATH(brickinfo->path, exp_path);  retry: -        runinit (&runner); - -        if (this->ctx->cmd_args.valgrind) { -                /* Run bricks with valgrind */ -                if (volinfo->logdir) { -                        len = snprintf (valgrind_logfile, PATH_MAX, -                                        "%s/valgrind-%s-%s.log", -                                        volinfo->logdir, -                                        volinfo->volname, exp_path); -                } else { -                        len = snprintf (valgrind_logfile, PATH_MAX, -                                        "%s/bricks/valgrind-%s-%s.log", -                                        DEFAULT_LOG_FILE_DIRECTORY, -                                        volinfo->volname, exp_path); -                } -                if ((len < 0) || (len >= PATH_MAX)) { -                        ret = -1; -                        goto out; -                } - -                runner_add_args (&runner, "valgrind", "--leak-check=full", -                                 "--trace-children=yes", "--track-origins=yes", -                                 NULL); -                runner_argprintf (&runner, "--log-file=%s", valgrind_logfile); -        } - -        if (volinfo->is_snap_volume) { -                len = snprintf (volfile, PATH_MAX, "/%s/%s/%s.%s.%s", -                                GLUSTERD_VOL_SNAP_DIR_PREFIX, -                                volinfo->snapshot->snapname, volinfo->volname, -                                brickinfo->hostname, exp_path); -        } else { -                len = snprintf (volfile, PATH_MAX, "%s.%s.%s", -                                volinfo->volname, brickinfo->hostname, -                                exp_path); -        } -        if ((len < 0) || (len >= PATH_MAX)) { -                ret = -1; -                goto out; -        } +    runinit(&runner); +    if (this->ctx->cmd_args.valgrind) { +        /* Run bricks with valgrind */          if (volinfo->logdir) { -                len = snprintf (logfile, PATH_MAX, "%s/%s.log", -                                volinfo->logdir, exp_path); +            len = snprintf(valgrind_logfile, PATH_MAX, "%s/valgrind-%s-%s.log", +                           volinfo->logdir, volinfo->volname, exp_path);          } else { -                len = snprintf (logfile, PATH_MAX, "%s/bricks/%s.log", -                                DEFAULT_LOG_FILE_DIRECTORY, exp_path); +            len = snprintf( +                valgrind_logfile, PATH_MAX, "%s/bricks/valgrind-%s-%s.log", +                DEFAULT_LOG_FILE_DIRECTORY, volinfo->volname, exp_path);          }          if ((len < 0) || (len >= PATH_MAX)) { -                ret = -1; -                goto out; -        } - -        if (!brickinfo->logfile) -                brickinfo->logfile = gf_strdup (logfile); - -        (void) snprintf (glusterd_uuid, 1024, "*-posix.glusterd-uuid=%s", -                         uuid_utoa (MY_UUID)); -        runner_add_args (&runner, SBIN_DIR"/glusterfsd", -                         "-s", brickinfo->hostname, "--volfile-id", volfile, -                         "-p", pidfile, "-S", socketpath, -                         "--brick-name", brickinfo->path, -                         "-l", brickinfo->logfile, -                         "--xlator-option", glusterd_uuid, -                         "--process-name", "brick", -                         NULL); - -        if (dict_get_strn (priv->opts, GLUSTERD_LOCALTIME_LOGGING_KEY, -                           SLEN (GLUSTERD_LOCALTIME_LOGGING_KEY), -                           &localtime_logging) == 0) { -                if (strcmp (localtime_logging, "enable") == 0) -                        runner_add_arg (&runner, "--localtime-logging"); -        } - -        runner_add_arg (&runner, "--brick-port"); -        if (volinfo->transport_type != GF_TRANSPORT_BOTH_TCP_RDMA) { -                runner_argprintf (&runner, "%d", port); -        } else { -                len = snprintf (rdma_brick_path, sizeof(rdma_brick_path), -                                "%s.rdma", brickinfo->path); -                if ((len < 0) || (len >= sizeof(rdma_brick_path))) { -                        ret = -1; -                        goto out; -                } -                rdma_port = pmap_assign_port (THIS, brickinfo->rdma_port, -                                              rdma_brick_path); -                if (!rdma_port) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_PORTS_EXHAUSTED, "All rdma ports in the " -                                "range are exhausted, can't start brick %s for " -                                "volume %s", rdma_brick_path, -                                volinfo->volname); -                        ret = -1; -                        goto out; -                } -                runner_argprintf (&runner, "%d,%d", port, rdma_port); -                runner_add_arg (&runner, "--xlator-option"); -                runner_argprintf (&runner, "%s-server.transport.rdma.listen-port=%d", -                                  volinfo->volname, rdma_port); -        } - -        runner_add_arg (&runner, "--xlator-option"); -        runner_argprintf (&runner, "%s-server.listen-port=%d", -                          volinfo->volname, port); - -        if (dict_get_strn (this->options, "transport.socket.bind-address", -                           SLEN ("transport.socket.bind-address"), -                           &bind_address) == 0) { -                runner_add_arg (&runner, "--xlator-option"); -                runner_argprintf (&runner, "transport.socket.bind-address=%s", -                                  bind_address); +            ret = -1; +            goto out;          } -        if (volinfo->transport_type == GF_TRANSPORT_RDMA) -                runner_argprintf (&runner, "--volfile-server-transport=rdma"); -        else if (volinfo->transport_type == GF_TRANSPORT_BOTH_TCP_RDMA) -                runner_argprintf (&runner, -                                  "--volfile-server-transport=socket,rdma"); - -        if (volinfo->memory_accounting) -                runner_add_arg (&runner, "--mem-accounting"); - -        runner_log (&runner, "", 0, "Starting GlusterFS"); - -        brickinfo->port = port; -        brickinfo->rdma_port = rdma_port; -        brickinfo->status = GF_BRICK_STARTING; -        brickinfo->port_registered = _gf_false; - -        if (wait) { -                synclock_unlock (&priv->big_lock); -                ret = runner_run (&runner); -                synclock_lock (&priv->big_lock); - -                if (ret == EADDRINUSE) { -                        /* retry after getting a new port */ -                        gf_msg (this->name, GF_LOG_WARNING, -ret, -                                GD_MSG_SRC_BRICK_PORT_UNAVAIL, -                                "Port %d is used by other process", port); - -                        port = pmap_registry_alloc (this); -                        if (!port) { -                                gf_msg (this->name, GF_LOG_CRITICAL, 0, -                                        GD_MSG_NO_FREE_PORTS, -                                        "Couldn't allocate a port"); -                                ret = -1; -                                goto out; -                        } -                        gf_msg (this->name, GF_LOG_NOTICE, 0, -                                GD_MSG_RETRY_WITH_NEW_PORT, -                                "Retrying to start brick %s with new port %d", -                                brickinfo->path, port); -                        goto retry; -                } -        } else { -                ret = runner_run_nowait (&runner); +        runner_add_args(&runner, "valgrind", "--leak-check=full", +                        "--trace-children=yes", "--track-origins=yes", NULL); +        runner_argprintf(&runner, "--log-file=%s", valgrind_logfile); +    } + +    if (volinfo->is_snap_volume) { +        len = snprintf(volfile, PATH_MAX, "/%s/%s/%s.%s.%s", +                       GLUSTERD_VOL_SNAP_DIR_PREFIX, +                       volinfo->snapshot->snapname, volinfo->volname, +                       brickinfo->hostname, exp_path); +    } else { +        len = snprintf(volfile, PATH_MAX, "%s.%s.%s", volinfo->volname, +                       brickinfo->hostname, exp_path); +    } +    if ((len < 0) || (len >= PATH_MAX)) { +        ret = -1; +        goto out; +    } + +    if (volinfo->logdir) { +        len = snprintf(logfile, PATH_MAX, "%s/%s.log", volinfo->logdir, +                       exp_path); +    } else { +        len = snprintf(logfile, PATH_MAX, "%s/bricks/%s.log", +                       DEFAULT_LOG_FILE_DIRECTORY, exp_path); +    } +    if ((len < 0) || (len >= PATH_MAX)) { +        ret = -1; +        goto out; +    } + +    if (!brickinfo->logfile) +        brickinfo->logfile = gf_strdup(logfile); + +    (void)snprintf(glusterd_uuid, 1024, "*-posix.glusterd-uuid=%s", +                   uuid_utoa(MY_UUID)); +    runner_add_args(&runner, SBIN_DIR "/glusterfsd", "-s", brickinfo->hostname, +                    "--volfile-id", volfile, "-p", pidfile, "-S", socketpath, +                    "--brick-name", brickinfo->path, "-l", brickinfo->logfile, +                    "--xlator-option", glusterd_uuid, "--process-name", "brick", +                    NULL); + +    if (dict_get_strn(priv->opts, GLUSTERD_LOCALTIME_LOGGING_KEY, +                      SLEN(GLUSTERD_LOCALTIME_LOGGING_KEY), +                      &localtime_logging) == 0) { +        if (strcmp(localtime_logging, "enable") == 0) +            runner_add_arg(&runner, "--localtime-logging"); +    } + +    runner_add_arg(&runner, "--brick-port"); +    if (volinfo->transport_type != GF_TRANSPORT_BOTH_TCP_RDMA) { +        runner_argprintf(&runner, "%d", port); +    } else { +        len = snprintf(rdma_brick_path, sizeof(rdma_brick_path), "%s.rdma", +                       brickinfo->path); +        if ((len < 0) || (len >= sizeof(rdma_brick_path))) { +            ret = -1; +            goto out;          } - -        if (ret) { -                brickinfo->port = 0; -                brickinfo->rdma_port = 0; -                goto out; +        rdma_port = pmap_assign_port(THIS, brickinfo->rdma_port, +                                     rdma_brick_path); +        if (!rdma_port) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_PORTS_EXHAUSTED, +                   "All rdma ports in the " +                   "range are exhausted, can't start brick %s for " +                   "volume %s", +                   rdma_brick_path, volinfo->volname); +            ret = -1; +            goto out;          } - -        ret = glusterd_brick_process_add_brick (brickinfo); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BRICKPROC_ADD_BRICK_FAILED, "Adding brick %s:%s " -                        "to brick process failed.", brickinfo->hostname, -                        brickinfo->path); +        runner_argprintf(&runner, "%d,%d", port, rdma_port); +        runner_add_arg(&runner, "--xlator-option"); +        runner_argprintf(&runner, "%s-server.transport.rdma.listen-port=%d", +                         volinfo->volname, rdma_port); +    } + +    runner_add_arg(&runner, "--xlator-option"); +    runner_argprintf(&runner, "%s-server.listen-port=%d", volinfo->volname, +                     port); + +    if (dict_get_strn(this->options, "transport.socket.bind-address", +                      SLEN("transport.socket.bind-address"), +                      &bind_address) == 0) { +        runner_add_arg(&runner, "--xlator-option"); +        runner_argprintf(&runner, "transport.socket.bind-address=%s", +                         bind_address); +    } + +    if (volinfo->transport_type == GF_TRANSPORT_RDMA) +        runner_argprintf(&runner, "--volfile-server-transport=rdma"); +    else if (volinfo->transport_type == GF_TRANSPORT_BOTH_TCP_RDMA) +        runner_argprintf(&runner, "--volfile-server-transport=socket,rdma"); + +    if (volinfo->memory_accounting) +        runner_add_arg(&runner, "--mem-accounting"); + +    runner_log(&runner, "", 0, "Starting GlusterFS"); + +    brickinfo->port = port; +    brickinfo->rdma_port = rdma_port; +    brickinfo->status = GF_BRICK_STARTING; +    brickinfo->port_registered = _gf_false; + +    if (wait) { +        synclock_unlock(&priv->big_lock); +        ret = runner_run(&runner); +        synclock_lock(&priv->big_lock); + +        if (ret == EADDRINUSE) { +            /* retry after getting a new port */ +            gf_msg(this->name, GF_LOG_WARNING, -ret, +                   GD_MSG_SRC_BRICK_PORT_UNAVAIL, +                   "Port %d is used by other process", port); + +            port = pmap_registry_alloc(this); +            if (!port) { +                gf_msg(this->name, GF_LOG_CRITICAL, 0, GD_MSG_NO_FREE_PORTS, +                       "Couldn't allocate a port"); +                ret = -1;                  goto out; -        } +            } +            gf_msg(this->name, GF_LOG_NOTICE, 0, GD_MSG_RETRY_WITH_NEW_PORT, +                   "Retrying to start brick %s with new port %d", +                   brickinfo->path, port); +            goto retry; +        } +    } else { +        ret = runner_run_nowait(&runner); +    } + +    if (ret) { +        brickinfo->port = 0; +        brickinfo->rdma_port = 0; +        goto out; +    } + +    ret = glusterd_brick_process_add_brick(brickinfo); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICKPROC_ADD_BRICK_FAILED, +               "Adding brick %s:%s " +               "to brick process failed.", +               brickinfo->hostname, brickinfo->path); +        goto out; +    }  connect: -        ret = glusterd_brick_connect (volinfo, brickinfo, socketpath); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BRICK_DISCONNECTED, -                        "Failed to connect to brick %s:%s on %s", -                        brickinfo->hostname, brickinfo->path, socketpath); -                goto out; -        } +    ret = glusterd_brick_connect(volinfo, brickinfo, socketpath); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_DISCONNECTED, +               "Failed to connect to brick %s:%s on %s", brickinfo->hostname, +               brickinfo->path, socketpath); +        goto out; +    }  out: -        if (ret) -                brickinfo->status = GF_BRICK_STOPPED; -        return ret; +    if (ret) +        brickinfo->status = GF_BRICK_STOPPED; +    return ret;  }  int32_t -glusterd_brick_unlink_socket_file (glusterd_volinfo_t *volinfo, -                                   glusterd_brickinfo_t *brickinfo) +glusterd_brick_unlink_socket_file(glusterd_volinfo_t *volinfo, +                                  glusterd_brickinfo_t *brickinfo)  { -        char                    path[PATH_MAX] = ""; -        char                    socketpath[PATH_MAX] = ""; -        xlator_t                *this = NULL; -        glusterd_conf_t         *priv = NULL; +    char path[PATH_MAX] = ""; +    char socketpath[PATH_MAX] = ""; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); +    GF_ASSERT(volinfo); +    GF_ASSERT(brickinfo); -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        priv = this->private; -        GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv); -        glusterd_set_brick_socket_filepath (volinfo, brickinfo, socketpath, -                                            sizeof (socketpath)); +    priv = this->private; +    GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv); +    glusterd_set_brick_socket_filepath(volinfo, brickinfo, socketpath, +                                       sizeof(socketpath)); -        return glusterd_unlink_file (socketpath); +    return glusterd_unlink_file(socketpath);  }  int32_t -glusterd_brick_disconnect (glusterd_brickinfo_t *brickinfo) +glusterd_brick_disconnect(glusterd_brickinfo_t *brickinfo)  { -        rpc_clnt_t              *rpc = NULL; -        glusterd_conf_t         *priv = THIS->private; +    rpc_clnt_t *rpc = NULL; +    glusterd_conf_t *priv = THIS->private; -        GF_ASSERT (brickinfo); +    GF_ASSERT(brickinfo); -        if (!brickinfo) { -                gf_msg_callingfn ("glusterd", GF_LOG_WARNING, EINVAL, -                                  GD_MSG_BRICK_NOT_FOUND, "!brickinfo"); -                return -1; -        } +    if (!brickinfo) { +        gf_msg_callingfn("glusterd", GF_LOG_WARNING, EINVAL, +                         GD_MSG_BRICK_NOT_FOUND, "!brickinfo"); +        return -1; +    } -        rpc            = brickinfo->rpc; -        brickinfo->rpc = NULL; +    rpc = brickinfo->rpc; +    brickinfo->rpc = NULL; -        if (rpc) { -                glusterd_rpc_clnt_unref (priv, rpc); -        } +    if (rpc) { +        glusterd_rpc_clnt_unref(priv, rpc); +    } -        return 0; +    return 0;  }  static gf_boolean_t -unsafe_option (dict_t *this, char *key, data_t *value, void *arg) -{ -        /* -         * Certain options are safe because they're already being handled other -         * ways, such as being copied down to the bricks (all auth options) or -         * being made irrelevant (event-threads).  All others are suspect and -         * must be checked in the next function. -         */ -        if (fnmatch ("*auth*", key, 0) == 0) { -                return _gf_false; -        } +unsafe_option(dict_t *this, char *key, data_t *value, void *arg) +{ +    /* +     * Certain options are safe because they're already being handled other +     * ways, such as being copied down to the bricks (all auth options) or +     * being made irrelevant (event-threads).  All others are suspect and +     * must be checked in the next function. +     */ +    if (fnmatch("*auth*", key, 0) == 0) { +        return _gf_false; +    } -        if (fnmatch ("*event-threads", key, 0) == 0) { -                return _gf_false; -        } +    if (fnmatch("*event-threads", key, 0) == 0) { +        return _gf_false; +    } -        if (fnmatch ("*diagnostics.brick-log*", key, 0) == 0) { -                return _gf_false; -        } +    if (fnmatch("*diagnostics.brick-log*", key, 0) == 0) { +        return _gf_false; +    } -        return _gf_true; +    return _gf_true;  }  static int -opts_mismatch (dict_t *dict1, char *key, data_t *value1, void *dict2) -{ -        data_t  *value2         = dict_get (dict2, key); -        int32_t min_len; - -        /* -         * If the option is only present on one, we can either look at the -         * default or assume a mismatch.  Looking at the default is pretty -         * hard, because that's part of a structure within each translator and -         * there's no dlopen interface to get at it, so we assume a mismatch. -         * If the user really wants them to match (and for their bricks to be -         * multiplexed, they can always reset the option). -         */ -        if (!value2) { -                gf_log (THIS->name, GF_LOG_DEBUG, "missing option %s", key); -                return -1; -        } +opts_mismatch(dict_t *dict1, char *key, data_t *value1, void *dict2) +{ +    data_t *value2 = dict_get(dict2, key); +    int32_t min_len; + +    /* +     * If the option is only present on one, we can either look at the +     * default or assume a mismatch.  Looking at the default is pretty +     * hard, because that's part of a structure within each translator and +     * there's no dlopen interface to get at it, so we assume a mismatch. +     * If the user really wants them to match (and for their bricks to be +     * multiplexed, they can always reset the option). +     */ +    if (!value2) { +        gf_log(THIS->name, GF_LOG_DEBUG, "missing option %s", key); +        return -1; +    } -        min_len = MIN (value1->len, value2->len); -        if (strncmp (value1->data, value2->data, min_len) != 0) { -                gf_log (THIS->name, GF_LOG_DEBUG, -                        "option mismatch, %s, %s != %s", -                        key, value1->data, value2->data); -                return -1; -        } +    min_len = MIN(value1->len, value2->len); +    if (strncmp(value1->data, value2->data, min_len) != 0) { +        gf_log(THIS->name, GF_LOG_DEBUG, "option mismatch, %s, %s != %s", key, +               value1->data, value2->data); +        return -1; +    } -        return 0; +    return 0;  }  int -glusterd_brickprocess_delete (glusterd_brick_proc_t *brick_proc) +glusterd_brickprocess_delete(glusterd_brick_proc_t *brick_proc)  { -        cds_list_del_init (&brick_proc->brick_proc_list); -        cds_list_del_init (&brick_proc->bricks); +    cds_list_del_init(&brick_proc->brick_proc_list); +    cds_list_del_init(&brick_proc->bricks); -        GF_FREE (brick_proc); +    GF_FREE(brick_proc); -        return 0; +    return 0;  }  int -glusterd_brick_process_remove_brick (glusterd_brickinfo_t *brickinfo, -                                     int *last_brick) +glusterd_brick_process_remove_brick(glusterd_brickinfo_t *brickinfo, +                                    int *last_brick)  { -        int                      ret = -1; -        xlator_t                *this = NULL; -        glusterd_conf_t         *priv = NULL; -        glusterd_brick_proc_t   *brick_proc = NULL; -        glusterd_brickinfo_t    *brickinfoiter = NULL; -        glusterd_brick_proc_t   *brick_proc_tmp = NULL; -        glusterd_brickinfo_t    *tmp = NULL; +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    glusterd_brick_proc_t *brick_proc = NULL; +    glusterd_brickinfo_t *brickinfoiter = NULL; +    glusterd_brick_proc_t *brick_proc_tmp = NULL; +    glusterd_brickinfo_t *tmp = NULL; -        this = THIS; -        GF_VALIDATE_OR_GOTO ("glusterd", this, out); +    this = THIS; +    GF_VALIDATE_OR_GOTO("glusterd", this, out); -        priv = this->private; -        GF_VALIDATE_OR_GOTO (this->name, priv, out); -        GF_VALIDATE_OR_GOTO (this->name, brickinfo, out); +    priv = this->private; +    GF_VALIDATE_OR_GOTO(this->name, priv, out); +    GF_VALIDATE_OR_GOTO(this->name, brickinfo, out); -        cds_list_for_each_entry_safe (brick_proc, brick_proc_tmp, -                                      &priv->brick_procs, brick_proc_list) { -                if (brickinfo->port != brick_proc->port) { -                        continue; -                } - -                GF_VALIDATE_OR_GOTO (this->name, (brick_proc->brick_count > 0), out); +    cds_list_for_each_entry_safe(brick_proc, brick_proc_tmp, &priv->brick_procs, +                                 brick_proc_list) +    { +        if (brickinfo->port != brick_proc->port) { +            continue; +        } -                cds_list_for_each_entry_safe (brickinfoiter, tmp, -                                              &brick_proc->bricks, brick_list) { -                        if (strcmp (brickinfoiter->path, brickinfo->path) == 0) { -                                cds_list_del_init (&brickinfoiter->brick_list); +        GF_VALIDATE_OR_GOTO(this->name, (brick_proc->brick_count > 0), out); -                                GF_FREE (brickinfoiter->logfile); -                                GF_FREE (brickinfoiter); -                                brick_proc->brick_count--; -                                break; -                        } -                } +        cds_list_for_each_entry_safe(brickinfoiter, tmp, &brick_proc->bricks, +                                     brick_list) +        { +            if (strcmp(brickinfoiter->path, brickinfo->path) == 0) { +                cds_list_del_init(&brickinfoiter->brick_list); -                /* If all bricks have been removed, delete the brick process */ -                if (brick_proc->brick_count == 0) { -                        if (last_brick != NULL) -                                *last_brick = 1; -                        ret = glusterd_brickprocess_delete (brick_proc); -                        if (ret) -                                goto out; -                } +                GF_FREE(brickinfoiter->logfile); +                GF_FREE(brickinfoiter); +                brick_proc->brick_count--;                  break; +            }          } -        ret = 0; +        /* If all bricks have been removed, delete the brick process */ +        if (brick_proc->brick_count == 0) { +            if (last_brick != NULL) +                *last_brick = 1; +            ret = glusterd_brickprocess_delete(brick_proc); +            if (ret) +                goto out; +        } +        break; +    } + +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_brick_process_add_brick (glusterd_brickinfo_t *brickinfo) +glusterd_brick_process_add_brick(glusterd_brickinfo_t *brickinfo)  { -        int                      ret = -1; -        xlator_t                *this = NULL; -        glusterd_conf_t         *priv = NULL; -        glusterd_brick_proc_t   *brick_proc = NULL; -        glusterd_brickinfo_t    *brickinfo_dup = NULL; +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    glusterd_brick_proc_t *brick_proc = NULL; +    glusterd_brickinfo_t *brickinfo_dup = NULL; -        this = THIS; -        GF_VALIDATE_OR_GOTO ("glusterd", this, out); +    this = THIS; +    GF_VALIDATE_OR_GOTO("glusterd", this, out); -        priv = this->private; -        GF_VALIDATE_OR_GOTO (this->name, priv, out); -        GF_VALIDATE_OR_GOTO (this->name, brickinfo, out); +    priv = this->private; +    GF_VALIDATE_OR_GOTO(this->name, priv, out); +    GF_VALIDATE_OR_GOTO(this->name, brickinfo, out); -        ret = glusterd_brickinfo_new (&brickinfo_dup); -        if (ret) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_BRICK_NEW_INFO_FAIL, -                        "Failed to create new brickinfo"); -                goto out; -        } +    ret = glusterd_brickinfo_new(&brickinfo_dup); +    if (ret) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_BRICK_NEW_INFO_FAIL, +               "Failed to create new brickinfo"); +        goto out; +    } -        ret = glusterd_brickinfo_dup (brickinfo, brickinfo_dup); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BRICK_SET_INFO_FAIL, "Failed to dup brickinfo"); -                goto out; -        } +    ret = glusterd_brickinfo_dup(brickinfo, brickinfo_dup); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_SET_INFO_FAIL, +               "Failed to dup brickinfo"); +        goto out; +    } -        ret = glusterd_brick_proc_for_port (brickinfo->port, &brick_proc); +    ret = glusterd_brick_proc_for_port(brickinfo->port, &brick_proc); +    if (ret) { +        ret = glusterd_brickprocess_new(&brick_proc);          if (ret) { -                ret = glusterd_brickprocess_new (&brick_proc); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_BRICKPROC_NEW_FAILED, "Failed to create " -                                "new brick process instance"); -                        goto out; -                } +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICKPROC_NEW_FAILED, +                   "Failed to create " +                   "new brick process instance"); +            goto out; +        } -                brick_proc->port = brickinfo->port; +        brick_proc->port = brickinfo->port; -                cds_list_add_tail (&brick_proc->brick_proc_list, &priv->brick_procs); -        } +        cds_list_add_tail(&brick_proc->brick_proc_list, &priv->brick_procs); +    } -        cds_list_add_tail (&brickinfo_dup->brick_list, &brick_proc->bricks); -        brick_proc->brick_count++; +    cds_list_add_tail(&brickinfo_dup->brick_list, &brick_proc->bricks); +    brick_proc->brick_count++;  out: -        return ret; +    return ret;  }  /* ret = 0 only when you get a brick process associated with the port   * ret = -1 otherwise   */  int -glusterd_brick_proc_for_port (int port, glusterd_brick_proc_t **brickprocess) +glusterd_brick_proc_for_port(int port, glusterd_brick_proc_t **brickprocess)  { -        int                      ret = -1; -        xlator_t                *this = NULL; -        glusterd_conf_t         *priv = NULL; -        glusterd_brick_proc_t   *brick_proc = NULL; +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    glusterd_brick_proc_t *brick_proc = NULL; -        this = THIS; -        GF_VALIDATE_OR_GOTO ("glusterd", this, out); +    this = THIS; +    GF_VALIDATE_OR_GOTO("glusterd", this, out); -        priv = this->private; -        GF_VALIDATE_OR_GOTO (this->name, priv, out); +    priv = this->private; +    GF_VALIDATE_OR_GOTO(this->name, priv, out); -        cds_list_for_each_entry (brick_proc, &priv->brick_procs, brick_proc_list) { -                if (brick_proc->port == port) { -                        *brickprocess = brick_proc; -                        ret = 0; -                        break; -                } +    cds_list_for_each_entry(brick_proc, &priv->brick_procs, brick_proc_list) +    { +        if (brick_proc->port == port) { +            *brickprocess = brick_proc; +            ret = 0; +            break;          } +    }  out: -        return ret; +    return ret;  }  int32_t -glusterd_volume_stop_glusterfs (glusterd_volinfo_t *volinfo, -                                glusterd_brickinfo_t *brickinfo, -                                gf_boolean_t del_brick) +glusterd_volume_stop_glusterfs(glusterd_volinfo_t *volinfo, +                               glusterd_brickinfo_t *brickinfo, +                               gf_boolean_t del_brick)  { -        xlator_t        *this                   = NULL; -        glusterd_conf_t *conf                   = NULL; -        int             ret                     = -1; -        char            *op_errstr              = NULL; -        char            pidfile[PATH_MAX]       = ""; -        int             last_brick              = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    int ret = -1; +    char *op_errstr = NULL; +    char pidfile[PATH_MAX] = ""; +    int last_brick = -1; -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); +    GF_ASSERT(volinfo); +    GF_ASSERT(brickinfo); -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        conf = this->private; -        GF_VALIDATE_OR_GOTO (this->name, conf, out); +    conf = this->private; +    GF_VALIDATE_OR_GOTO(this->name, conf, out); -        ret = 0; +    ret = 0; -        ret = glusterd_brick_process_remove_brick (brickinfo, &last_brick); -        if (ret) { -                gf_msg_debug (this->name, 0, "Couldn't remove brick from" -                              " brick process"); -                goto out; -        } +    ret = glusterd_brick_process_remove_brick(brickinfo, &last_brick); +    if (ret) { +        gf_msg_debug(this->name, 0, +                     "Couldn't remove brick from" +                     " brick process"); +        goto out; +    } -        if (del_brick) -                cds_list_del_init (&brickinfo->brick_list); - -        if (GLUSTERD_STATUS_STARTED == volinfo->status) { -                /* -                 * In a post-multiplexing world, even if we're not actually -                 * doing any multiplexing, just dropping the RPC connection -                 * isn't enough.  There might be many such connections during -                 * the brick daemon's lifetime, even if we only consider the -                 * management RPC port (because tests etc. might be manually -                 * attaching and detaching bricks).  Therefore, we have to send -                 * an actual signal instead. -                 */ -                if (is_brick_mx_enabled () && last_brick != 1) { -                        ret = send_attach_req (this, brickinfo->rpc, -                                               brickinfo->path, NULL, NULL, -                                               GLUSTERD_BRICK_TERMINATE); -                        if (ret && brickinfo->status == GF_BRICK_STARTED) { -                                gf_msg (this->name, GF_LOG_ERROR, 0, -                                        GD_MSG_BRICK_STOP_FAIL, "Failed to send" -                                        " detach request for brick %s", -                                        brickinfo->path); -                                goto out; -                        } -                        gf_log (this->name, GF_LOG_INFO, "Detach request for " -                                "brick %s:%s is sent successfully", -                                brickinfo->hostname, brickinfo->path); +    if (del_brick) +        cds_list_del_init(&brickinfo->brick_list); -                } else { -                        gf_msg_debug (this->name, 0, "About to stop glusterfsd" -                                      " for brick %s:%s", brickinfo->hostname, -                                      brickinfo->path); -                        ret = glusterd_brick_terminate (volinfo, brickinfo, -                                                        NULL, 0, &op_errstr); -                        if (ret && brickinfo->status == GF_BRICK_STARTED) { -                                gf_msg (this->name, GF_LOG_ERROR, 0, -                                        GD_MSG_BRICK_STOP_FAIL, "Failed to kill" -                                        " the brick %s", brickinfo->path); -                                goto out; -                        } - -                        if (op_errstr) { -                                GF_FREE (op_errstr); -                        } -                        if (is_brick_mx_enabled ()) { -                                /* In case of brick multiplexing we need to make -                                 * sure the port is cleaned up from here as the -                                 * RPC connection may not have been originated -                                 * for the same brick instance -                                 */ -                                pmap_registry_remove (THIS, brickinfo->port, -                                                      brickinfo->path, -                                                      GF_PMAP_PORT_BRICKSERVER, -                                                      NULL, _gf_true); -                        } -                } +    if (GLUSTERD_STATUS_STARTED == volinfo->status) { +        /* +         * In a post-multiplexing world, even if we're not actually +         * doing any multiplexing, just dropping the RPC connection +         * isn't enough.  There might be many such connections during +         * the brick daemon's lifetime, even if we only consider the +         * management RPC port (because tests etc. might be manually +         * attaching and detaching bricks).  Therefore, we have to send +         * an actual signal instead. +         */ +        if (is_brick_mx_enabled() && last_brick != 1) { +            ret = send_attach_req(this, brickinfo->rpc, brickinfo->path, NULL, +                                  NULL, GLUSTERD_BRICK_TERMINATE); +            if (ret && brickinfo->status == GF_BRICK_STARTED) { +                gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_STOP_FAIL, +                       "Failed to send" +                       " detach request for brick %s", +                       brickinfo->path); +                goto out; +            } +            gf_log(this->name, GF_LOG_INFO, +                   "Detach request for " +                   "brick %s:%s is sent successfully", +                   brickinfo->hostname, brickinfo->path); -                (void) glusterd_brick_disconnect (brickinfo); -                ret = 0; +        } else { +            gf_msg_debug(this->name, 0, +                         "About to stop glusterfsd" +                         " for brick %s:%s", +                         brickinfo->hostname, brickinfo->path); +            ret = glusterd_brick_terminate(volinfo, brickinfo, NULL, 0, +                                           &op_errstr); +            if (ret && brickinfo->status == GF_BRICK_STARTED) { +                gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_STOP_FAIL, +                       "Failed to kill" +                       " the brick %s", +                       brickinfo->path); +                goto out; +            } + +            if (op_errstr) { +                GF_FREE(op_errstr); +            } +            if (is_brick_mx_enabled()) { +                /* In case of brick multiplexing we need to make +                 * sure the port is cleaned up from here as the +                 * RPC connection may not have been originated +                 * for the same brick instance +                 */ +                pmap_registry_remove(THIS, brickinfo->port, brickinfo->path, +                                     GF_PMAP_PORT_BRICKSERVER, NULL, _gf_true); +            }          } -        GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, brickinfo, conf); -        gf_msg_debug (this->name,  0, "Unlinking pidfile %s", pidfile); -        (void) sys_unlink (pidfile); +        (void)glusterd_brick_disconnect(brickinfo); +        ret = 0; +    } -        brickinfo->status = GF_BRICK_STOPPED; -        brickinfo->start_triggered = _gf_false; -        if (del_brick) -                glusterd_delete_brick (volinfo, brickinfo); +    GLUSTERD_GET_BRICK_PIDFILE(pidfile, volinfo, brickinfo, conf); +    gf_msg_debug(this->name, 0, "Unlinking pidfile %s", pidfile); +    (void)sys_unlink(pidfile); + +    brickinfo->status = GF_BRICK_STOPPED; +    brickinfo->start_triggered = _gf_false; +    if (del_brick) +        glusterd_delete_brick(volinfo, brickinfo);  out: -        return ret; +    return ret;  }  /* Free LINE[0..N-1] and then the LINE buffer.  */  static void -free_lines (char **line, size_t n) +free_lines(char **line, size_t n)  { -  size_t i; -  for (i = 0; i < n; i++) -    GF_FREE (line[i]); -  GF_FREE (line); +    size_t i; +    for (i = 0; i < n; i++) +        GF_FREE(line[i]); +    GF_FREE(line);  }  char ** -glusterd_readin_file (const char *filepath, int *line_count) -{ -        int         ret                    = -1; -        int         n                      = 8; -        int         counter                = 0; -        char        buffer[PATH_MAX + 256] = ""; -        char      **lines                  = NULL; -        FILE       *fp                     = NULL; -        void       *p; - -        fp = fopen (filepath, "r"); -        if (!fp) -                goto out; - -        lines = GF_CALLOC (1, n * sizeof (*lines), gf_gld_mt_charptr); -        if (!lines) -                goto out; - -        for (counter = 0; fgets (buffer, sizeof (buffer), fp); counter++) { - -                if (counter == n-1) { -                        n *= 2; -                        p = GF_REALLOC (lines, n * sizeof (char *)); -                        if (!p) { -                                free_lines (lines, n/2); -                                lines = NULL; -                                goto out; -                        } -                        lines = p; -                } - -                lines[counter] = gf_strdup (buffer); -        } - -        lines[counter] = NULL; -        /* Reduce allocation to minimal size.  */ -        p = GF_REALLOC (lines, (counter + 1) * sizeof (char *)); -        if (!p) { -                free_lines (lines, counter); +glusterd_readin_file(const char *filepath, int *line_count) +{ +    int ret = -1; +    int n = 8; +    int counter = 0; +    char buffer[PATH_MAX + 256] = ""; +    char **lines = NULL; +    FILE *fp = NULL; +    void *p; + +    fp = fopen(filepath, "r"); +    if (!fp) +        goto out; + +    lines = GF_CALLOC(1, n * sizeof(*lines), gf_gld_mt_charptr); +    if (!lines) +        goto out; + +    for (counter = 0; fgets(buffer, sizeof(buffer), fp); counter++) { +        if (counter == n - 1) { +            n *= 2; +            p = GF_REALLOC(lines, n * sizeof(char *)); +            if (!p) { +                free_lines(lines, n / 2);                  lines = NULL;                  goto out; +            } +            lines = p;          } -        lines = p; -        *line_count = counter; -        ret = 0; +        lines[counter] = gf_strdup(buffer); +    } - out: -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_READIN_FILE_FAILED, "%s", strerror (errno)); -        if (fp) -                fclose (fp); +    lines[counter] = NULL; +    /* Reduce allocation to minimal size.  */ +    p = GF_REALLOC(lines, (counter + 1) * sizeof(char *)); +    if (!p) { +        free_lines(lines, counter); +        lines = NULL; +        goto out; +    } +    lines = p; -        return lines; -} +    *line_count = counter; +    ret = 0; -int -glusterd_compare_lines (const void *a, const void *b) { +out: +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_READIN_FILE_FAILED, "%s", +               strerror(errno)); +    if (fp) +        fclose(fp); -        return strcmp(* (char * const *) a, * (char * const *) b); +    return lines;  }  int -glusterd_sort_and_redirect (const char *src_filepath, int dest_fd) +glusterd_compare_lines(const void *a, const void *b)  { -        int            ret          = -1; -        int            line_count   = 0; -        int            counter      = 0; -        char         **lines        = NULL; - +    return strcmp(*(char *const *)a, *(char *const *)b); +} -        if (!src_filepath || dest_fd < 0) -                goto out; +int +glusterd_sort_and_redirect(const char *src_filepath, int dest_fd) +{ +    int ret = -1; +    int line_count = 0; +    int counter = 0; +    char **lines = NULL; -        lines = glusterd_readin_file (src_filepath, &line_count); -        if (!lines) -                goto out; +    if (!src_filepath || dest_fd < 0) +        goto out; -        qsort (lines, line_count, sizeof (*lines), glusterd_compare_lines); +    lines = glusterd_readin_file(src_filepath, &line_count); +    if (!lines) +        goto out; -        for (counter = 0; lines[counter]; counter++) { +    qsort(lines, line_count, sizeof(*lines), glusterd_compare_lines); -                ret = sys_write (dest_fd, lines[counter], -                             strlen (lines[counter])); -                if (ret < 0) -                        goto out; +    for (counter = 0; lines[counter]; counter++) { +        ret = sys_write(dest_fd, lines[counter], strlen(lines[counter])); +        if (ret < 0) +            goto out; -                GF_FREE (lines[counter]); -        } +        GF_FREE(lines[counter]); +    } -        ret = 0; - out: -        GF_FREE (lines); +    ret = 0; +out: +    GF_FREE(lines); -        return ret; +    return ret;  }  int -glusterd_volume_compute_cksum (glusterd_volinfo_t  *volinfo, char *cksum_path, -                               char *filepath, gf_boolean_t is_quota_conf, -                               uint32_t *cs) +glusterd_volume_compute_cksum(glusterd_volinfo_t *volinfo, char *cksum_path, +                              char *filepath, gf_boolean_t is_quota_conf, +                              uint32_t *cs)  { -        int32_t                 ret                     = -1; -        uint32_t                cksum                   = 0; -        int                     fd                      = -1; -        int                     sort_fd                 = 0; -        char                    sort_filepath[PATH_MAX] = ""; -        char                   *cksum_path_final        = NULL; -        char                    buf[4096]               = ""; -        gf_boolean_t            unlink_sortfile         = _gf_false; -        glusterd_conf_t        *priv                    = NULL; -        xlator_t               *this                    = NULL; -        mode_t                  orig_umask              = 0; - -        GF_ASSERT (volinfo); -        this = THIS; -        priv = THIS->private; -        GF_ASSERT (priv); - -        fd = open (cksum_path, O_RDWR | O_APPEND | O_CREAT| O_TRUNC, 0600); - -        if (-1 == fd) { -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, "Unable to open %s," -                        " errno: %d", cksum_path, errno); -                ret = -1; -                goto out; -        } +    int32_t ret = -1; +    uint32_t cksum = 0; +    int fd = -1; +    int sort_fd = 0; +    char sort_filepath[PATH_MAX] = ""; +    char *cksum_path_final = NULL; +    char buf[4096] = ""; +    gf_boolean_t unlink_sortfile = _gf_false; +    glusterd_conf_t *priv = NULL; +    xlator_t *this = NULL; +    mode_t orig_umask = 0; -        if (!is_quota_conf) { -                snprintf (sort_filepath, sizeof (sort_filepath), -                          "/tmp/%s.XXXXXX", volinfo->volname); +    GF_ASSERT(volinfo); +    this = THIS; +    priv = THIS->private; +    GF_ASSERT(priv); -                orig_umask = umask(S_IRWXG | S_IRWXO); -                sort_fd = mkstemp (sort_filepath); -                umask(orig_umask); -                if (sort_fd < 0) { -                        gf_msg (this->name, GF_LOG_ERROR, errno, -                                GD_MSG_FILE_OP_FAILED, "Could not generate " -                                "temp file, reason: %s for volume: %s", -                                strerror (errno), volinfo->volname); -                        goto out; -                } else { -                        unlink_sortfile = _gf_true; -                } - -                /* sort the info file, result in sort_filepath */ - -                ret = glusterd_sort_and_redirect (filepath, sort_fd); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_FILE_OP_FAILED, "sorting info file " -                                "failed"); -                        goto out; -                } +    fd = open(cksum_path, O_RDWR | O_APPEND | O_CREAT | O_TRUNC, 0600); -                ret = sys_close (sort_fd); -                if (ret) -                        goto out; +    if (-1 == fd) { +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "Unable to open %s," +               " errno: %d", +               cksum_path, errno); +        ret = -1; +        goto out; +    } + +    if (!is_quota_conf) { +        snprintf(sort_filepath, sizeof(sort_filepath), "/tmp/%s.XXXXXX", +                 volinfo->volname); + +        orig_umask = umask(S_IRWXG | S_IRWXO); +        sort_fd = mkstemp(sort_filepath); +        umask(orig_umask); +        if (sort_fd < 0) { +            gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +                   "Could not generate " +                   "temp file, reason: %s for volume: %s", +                   strerror(errno), volinfo->volname); +            goto out; +        } else { +            unlink_sortfile = _gf_true;          } -        cksum_path_final = is_quota_conf ? filepath : sort_filepath; +        /* sort the info file, result in sort_filepath */ -        ret = get_checksum_for_path (cksum_path_final, &cksum); +        ret = glusterd_sort_and_redirect(filepath, sort_fd);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_CKSUM_GET_FAIL, "unable to get " -                        "checksum for path: %s", cksum_path_final); -                goto out; -        } -        if (!is_quota_conf) { -                snprintf (buf, sizeof (buf), "%s=%u\n", "info", cksum); -                ret = sys_write (fd, buf, strlen (buf)); -                if (ret <= 0) { -                        ret = -1; -                        goto out; -                } +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_FILE_OP_FAILED, +                   "sorting info file " +                   "failed"); +            goto out;          } -        ret = get_checksum_for_file (fd, &cksum); +        ret = sys_close(sort_fd);          if (ret) -                goto out; - -        *cs = cksum; - -out: -        if (fd > 0) -               sys_close (fd); -        if (unlink_sortfile) -               sys_unlink (sort_filepath); -        gf_msg_debug (this->name, 0, "Returning with %d", ret); - -        return ret; -} - -int glusterd_compute_cksum (glusterd_volinfo_t *volinfo, -                            gf_boolean_t is_quota_conf) -{ -        int               ret                  = -1; -        uint32_t          cs                   = 0; -        char              cksum_path[PATH_MAX] = ""; -        char              path[PATH_MAX]       = ""; -        char              filepath[PATH_MAX]   = ""; -        glusterd_conf_t  *conf                 = NULL; -        xlator_t         *this                 = NULL; -        int32_t           len1                 = 0; -        int32_t           len2                 = 0; - -        this = THIS; -        GF_ASSERT (this); -        conf = this->private; -        GF_ASSERT (conf); - -        GLUSTERD_GET_VOLUME_DIR (path, volinfo, conf); - -        if (is_quota_conf) { -                len1 = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", -                                 path, GLUSTERD_VOL_QUOTA_CKSUM_FILE); -                len2 = snprintf (filepath, sizeof (filepath), "%s/%s", path, -                                 GLUSTERD_VOLUME_QUOTA_CONFIG); -        } else { -                len1 = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", -                                 path, GLUSTERD_CKSUM_FILE); -                len2 = snprintf (filepath, sizeof (filepath), "%s/%s", path, -                                 GLUSTERD_VOLUME_INFO_FILE); -        } -        if ((len1 < 0) || (len2 < 0) || -            (len1 >= sizeof(cksum_path)) || (len2 >= sizeof(filepath))) { -                goto out; +            goto out; +    } + +    cksum_path_final = is_quota_conf ? filepath : sort_filepath; + +    ret = get_checksum_for_path(cksum_path_final, &cksum); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_CKSUM_GET_FAIL, +               "unable to get " +               "checksum for path: %s", +               cksum_path_final); +        goto out; +    } +    if (!is_quota_conf) { +        snprintf(buf, sizeof(buf), "%s=%u\n", "info", cksum); +        ret = sys_write(fd, buf, strlen(buf)); +        if (ret <= 0) { +            ret = -1; +            goto out;          } +    } -        ret = glusterd_volume_compute_cksum (volinfo, cksum_path, filepath, -                                             is_quota_conf, &cs); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_CKSUM_COMPUTE_FAIL, "Failed to compute checksum " -                        "for volume %s", volinfo->volname); -                goto out; -        } +    ret = get_checksum_for_file(fd, &cksum); +    if (ret) +        goto out; -        if (is_quota_conf) -                volinfo->quota_conf_cksum = cs; -        else -                volinfo->cksum = cs; +    *cs = cksum; -        ret = 0;  out: -        return ret; +    if (fd > 0) +        sys_close(fd); +    if (unlink_sortfile) +        sys_unlink(sort_filepath); +    gf_msg_debug(this->name, 0, "Returning with %d", ret); + +    return ret;  }  int -_add_dict_to_prdict (dict_t *this, char *key, data_t *value, void *data) +glusterd_compute_cksum(glusterd_volinfo_t *volinfo, gf_boolean_t is_quota_conf)  { -        glusterd_dict_ctx_t     *ctx = NULL; -        char                    optkey[512] = ""; -        int                     ret = -1; +    int ret = -1; +    uint32_t cs = 0; +    char cksum_path[PATH_MAX] = ""; +    char path[PATH_MAX] = ""; +    char filepath[PATH_MAX] = ""; +    glusterd_conf_t *conf = NULL; +    xlator_t *this = NULL; +    int32_t len1 = 0; +    int32_t len2 = 0; -        ctx = data; -        ret = snprintf (optkey, sizeof (optkey), "%s.%s%d", ctx->prefix, -                  ctx->key_name, ctx->opt_count); -        ret = dict_set_strn (ctx->dict, optkey, ret, key); -        if (ret) -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, "option add for %s%d %s", -                        ctx->key_name, ctx->opt_count, key); -        ret = snprintf (optkey, sizeof (optkey), "%s.%s%d", ctx->prefix, -                  ctx->val_name, ctx->opt_count); -        ret = dict_set_strn (ctx->dict, optkey, ret, value->data); -        if (ret) -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "option add for %s%d %s", -                        ctx->val_name, ctx->opt_count, value->data); -        ctx->opt_count++; +    this = THIS; +    GF_ASSERT(this); +    conf = this->private; +    GF_ASSERT(conf); -        return ret; +    GLUSTERD_GET_VOLUME_DIR(path, volinfo, conf); + +    if (is_quota_conf) { +        len1 = snprintf(cksum_path, sizeof(cksum_path), "%s/%s", path, +                        GLUSTERD_VOL_QUOTA_CKSUM_FILE); +        len2 = snprintf(filepath, sizeof(filepath), "%s/%s", path, +                        GLUSTERD_VOLUME_QUOTA_CONFIG); +    } else { +        len1 = snprintf(cksum_path, sizeof(cksum_path), "%s/%s", path, +                        GLUSTERD_CKSUM_FILE); +        len2 = snprintf(filepath, sizeof(filepath), "%s/%s", path, +                        GLUSTERD_VOLUME_INFO_FILE); +    } +    if ((len1 < 0) || (len2 < 0) || (len1 >= sizeof(cksum_path)) || +        (len2 >= sizeof(filepath))) { +        goto out; +    } + +    ret = glusterd_volume_compute_cksum(volinfo, cksum_path, filepath, +                                        is_quota_conf, &cs); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_CKSUM_COMPUTE_FAIL, +               "Failed to compute checksum " +               "for volume %s", +               volinfo->volname); +        goto out; +    } + +    if (is_quota_conf) +        volinfo->quota_conf_cksum = cs; +    else +        volinfo->cksum = cs; + +    ret = 0; +out: +    return ret; +} + +int +_add_dict_to_prdict(dict_t *this, char *key, data_t *value, void *data) +{ +    glusterd_dict_ctx_t *ctx = NULL; +    char optkey[512] = ""; +    int ret = -1; + +    ctx = data; +    ret = snprintf(optkey, sizeof(optkey), "%s.%s%d", ctx->prefix, +                   ctx->key_name, ctx->opt_count); +    ret = dict_set_strn(ctx->dict, optkey, ret, key); +    if (ret) +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "option add for %s%d %s", ctx->key_name, ctx->opt_count, key); +    ret = snprintf(optkey, sizeof(optkey), "%s.%s%d", ctx->prefix, +                   ctx->val_name, ctx->opt_count); +    ret = dict_set_strn(ctx->dict, optkey, ret, value->data); +    if (ret) +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "option add for %s%d %s", ctx->val_name, ctx->opt_count, +               value->data); +    ctx->opt_count++; + +    return ret;  }  int32_t -glusterd_add_bricks_hname_path_to_dict (dict_t *dict, -                                        glusterd_volinfo_t *volinfo) +glusterd_add_bricks_hname_path_to_dict(dict_t *dict, +                                       glusterd_volinfo_t *volinfo)  { -        glusterd_brickinfo_t    *brickinfo = NULL; -        int                     ret = 0; -        char                    key[64] = ""; -        int                     index = 0; - +    glusterd_brickinfo_t *brickinfo = NULL; +    int ret = 0; +    char key[64] = ""; +    int index = 0; -        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                ret = snprintf (key, sizeof (key), "%d-hostname", index); -                ret = dict_set_strn (dict, key, ret, brickinfo->hostname); -                if (ret) -                        goto out; +    cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        ret = snprintf(key, sizeof(key), "%d-hostname", index); +        ret = dict_set_strn(dict, key, ret, brickinfo->hostname); +        if (ret) +            goto out; -                ret = snprintf (key, sizeof (key), "%d-path", index); -                ret = dict_set_strn (dict, key, ret, brickinfo->path); -                if (ret) -                        goto out; +        ret = snprintf(key, sizeof(key), "%d-path", index); +        ret = dict_set_strn(dict, key, ret, brickinfo->path); +        if (ret) +            goto out; -                index++; -        } +        index++; +    }  out: -        return ret; +    return ret;  }  /* The prefix represents the type of volume to be added. @@ -2973,340 +2956,315 @@ out:   * snap1, snap2, for snapshot volumes   */  int32_t -glusterd_add_volume_to_dict (glusterd_volinfo_t *volinfo, -                             dict_t  *dict, int32_t count, -                             char *prefix) -{ -        int32_t                 ret               = -1; -        char                    pfx[512]          = ""; -        char                    key[512]          = ""; -        int                     keylen; -        glusterd_brickinfo_t    *brickinfo        = NULL; -        int32_t                 i                 = 1; -        char                    *volume_id_str    = NULL; -        char                    *str              = NULL; -        glusterd_dict_ctx_t     ctx               = {0}; -        char                    *rebalance_id_str = NULL; -        char                    *rb_id_str        = NULL; -        xlator_t                *this             = NULL; - -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (dict); -        GF_ASSERT (volinfo); -        GF_ASSERT (prefix); - -        keylen = snprintf (key, sizeof (key), "%s%d.name", prefix, count); -        ret = dict_set_strn (dict, key, keylen, volinfo->volname); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.type", prefix, count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->type); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.brick_count", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->brick_count); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.version", prefix, count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->version); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.status", prefix, count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->status); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.sub_count", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->sub_count); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.stripe_count", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->stripe_count); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.replica_count", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->replica_count); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.arbiter_count", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->arbiter_count); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.disperse_count", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->disperse_count); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.redundancy_count", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->redundancy_count); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s%d.dist_count", prefix, count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->dist_leaf_count); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.ckusm", prefix, count); -        ret = dict_set_int64 (dict, key, volinfo->cksum); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.transport_type", prefix, count); -        ret = dict_set_uint32 (dict, key, volinfo->transport_type); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.stage_deleted", prefix, count); -        ret = dict_set_uint32 (dict, key, (uint32_t)volinfo->stage_deleted); -        if (ret) -                goto out; - -         /* tiering related variables */ - -        snprintf (key, sizeof (key), "%s%d.cold_brick_count", prefix, count); -        ret = dict_set_uint32 (dict, key, volinfo->tier_info.cold_brick_count); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.cold_type", prefix, count); -        ret = dict_set_uint32 (dict, key, volinfo->tier_info.cold_type); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.cold_replica_count", prefix, count); -        ret = dict_set_uint32 (dict, key, -                               volinfo->tier_info.cold_replica_count); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.cold_disperse_count", prefix, count); -        ret = dict_set_uint32 (dict, key, -                               volinfo->tier_info.cold_disperse_count); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.cold_redundancy_count", -                               prefix, count); -        ret = dict_set_uint32 (dict, key, -                               volinfo->tier_info.cold_redundancy_count); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.cold_dist_count", prefix, count); -        ret = dict_set_uint32 (dict, key, -                               volinfo->tier_info.cold_dist_leaf_count); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.hot_brick_count", prefix, count); -        ret = dict_set_uint32 (dict, key, volinfo->tier_info.hot_brick_count); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.hot_type", prefix, count); -        ret = dict_set_uint32 (dict, key, volinfo->tier_info.hot_type); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d.hot_replica_count", prefix, count); -        ret = dict_set_uint32 (dict, key, -                               volinfo->tier_info.hot_replica_count); -        if (ret) -                goto out; - -        snprintf (key, sizeof (key), "%s%d", prefix, count); -        ret = gd_add_vol_snap_details_to_dict (dict, key, volinfo); -        if (ret) -                goto out; - -        volume_id_str = gf_strdup (uuid_utoa (volinfo->volume_id)); -        if (!volume_id_str) { -                ret = -1; -                goto out; -        } -        keylen = snprintf (key, sizeof (key), "%s%d.volume_id", prefix, -                           count); -        ret = dict_set_dynstrn (dict, key, keylen, volume_id_str); -        if (ret) -                goto out; -        volume_id_str = NULL; - -        keylen = snprintf (key, sizeof (key), "%s%d.username", prefix, count); -        str = glusterd_auth_get_username (volinfo); -        if (str) { -                ret = dict_set_dynstrn (dict, key, keylen, gf_strdup (str)); -                if (ret) -                        goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.password", prefix, count); -        str = glusterd_auth_get_password (volinfo); -        if (str) { -                ret = dict_set_dynstrn (dict, key, keylen, gf_strdup (str)); -                if (ret) -                        goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.rebalance", prefix, count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->rebal.defrag_cmd); -        if (ret) -                goto out; - -        rebalance_id_str = gf_strdup (uuid_utoa -                        (volinfo->rebal.rebalance_id)); -        if (!rebalance_id_str) { -                ret = -1; -                goto out; -        } -        keylen = snprintf (key, sizeof (key), "%s%d.rebalance-id", prefix, -                           count); -        ret = dict_set_dynstrn (dict, key, keylen, rebalance_id_str); +glusterd_add_volume_to_dict(glusterd_volinfo_t *volinfo, dict_t *dict, +                            int32_t count, char *prefix) +{ +    int32_t ret = -1; +    char pfx[512] = ""; +    char key[512] = ""; +    int keylen; +    glusterd_brickinfo_t *brickinfo = NULL; +    int32_t i = 1; +    char *volume_id_str = NULL; +    char *str = NULL; +    glusterd_dict_ctx_t ctx = {0}; +    char *rebalance_id_str = NULL; +    char *rb_id_str = NULL; +    xlator_t *this = NULL; + +    this = THIS; +    GF_ASSERT(this); +    GF_ASSERT(dict); +    GF_ASSERT(volinfo); +    GF_ASSERT(prefix); + +    keylen = snprintf(key, sizeof(key), "%s%d.name", prefix, count); +    ret = dict_set_strn(dict, key, keylen, volinfo->volname); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.type", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->type); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.brick_count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->brick_count); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.version", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->version); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.status", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->status); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.sub_count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->sub_count); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.stripe_count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->stripe_count); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.replica_count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->replica_count); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.arbiter_count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->arbiter_count); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.disperse_count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->disperse_count); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.redundancy_count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->redundancy_count); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.dist_count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->dist_leaf_count); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.ckusm", prefix, count); +    ret = dict_set_int64(dict, key, volinfo->cksum); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.transport_type", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->transport_type); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.stage_deleted", prefix, count); +    ret = dict_set_uint32(dict, key, (uint32_t)volinfo->stage_deleted); +    if (ret) +        goto out; + +    /* tiering related variables */ + +    snprintf(key, sizeof(key), "%s%d.cold_brick_count", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->tier_info.cold_brick_count); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.cold_type", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->tier_info.cold_type); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.cold_replica_count", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->tier_info.cold_replica_count); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.cold_disperse_count", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->tier_info.cold_disperse_count); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.cold_redundancy_count", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->tier_info.cold_redundancy_count); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.cold_dist_count", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->tier_info.cold_dist_leaf_count); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.hot_brick_count", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->tier_info.hot_brick_count); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.hot_type", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->tier_info.hot_type); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.hot_replica_count", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->tier_info.hot_replica_count); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d", prefix, count); +    ret = gd_add_vol_snap_details_to_dict(dict, key, volinfo); +    if (ret) +        goto out; + +    volume_id_str = gf_strdup(uuid_utoa(volinfo->volume_id)); +    if (!volume_id_str) { +        ret = -1; +        goto out; +    } +    keylen = snprintf(key, sizeof(key), "%s%d.volume_id", prefix, count); +    ret = dict_set_dynstrn(dict, key, keylen, volume_id_str); +    if (ret) +        goto out; +    volume_id_str = NULL; + +    keylen = snprintf(key, sizeof(key), "%s%d.username", prefix, count); +    str = glusterd_auth_get_username(volinfo); +    if (str) { +        ret = dict_set_dynstrn(dict, key, keylen, gf_strdup(str));          if (ret) -                goto out; -        rebalance_id_str = NULL; +            goto out; +    } -        snprintf (key, sizeof (key), "%s%d.rebalance-op", prefix, count); -        ret = dict_set_uint32 (dict, key, volinfo->rebal.op); +    keylen = snprintf(key, sizeof(key), "%s%d.password", prefix, count); +    str = glusterd_auth_get_password(volinfo); +    if (str) { +        ret = dict_set_dynstrn(dict, key, keylen, gf_strdup(str));          if (ret) -                goto out; +            goto out; +    } -        if (volinfo->rebal.dict) { -                snprintf (pfx, sizeof (pfx), "%s%d", prefix, count); -                ctx.dict = dict; -                ctx.prefix = pfx; -                ctx.opt_count = 1; -                ctx.key_name = "rebal-dict-key"; -                ctx.val_name = "rebal-dict-value"; - -                dict_foreach (volinfo->rebal.dict, _add_dict_to_prdict, &ctx); -                ctx.opt_count--; -                keylen = snprintf (key, sizeof (key), -                                   "volume%d.rebal-dict-count", count); -                ret = dict_set_int32n (dict, key, keylen, ctx.opt_count); -                if (ret) -                        goto out; -        } +    keylen = snprintf(key, sizeof(key), "%s%d.rebalance", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->rebal.defrag_cmd); +    if (ret) +        goto out; -        snprintf (pfx, sizeof (pfx), "%s%d", prefix, count); +    rebalance_id_str = gf_strdup(uuid_utoa(volinfo->rebal.rebalance_id)); +    if (!rebalance_id_str) { +        ret = -1; +        goto out; +    } +    keylen = snprintf(key, sizeof(key), "%s%d.rebalance-id", prefix, count); +    ret = dict_set_dynstrn(dict, key, keylen, rebalance_id_str); +    if (ret) +        goto out; +    rebalance_id_str = NULL; + +    snprintf(key, sizeof(key), "%s%d.rebalance-op", prefix, count); +    ret = dict_set_uint32(dict, key, volinfo->rebal.op); +    if (ret) +        goto out; + +    if (volinfo->rebal.dict) { +        snprintf(pfx, sizeof(pfx), "%s%d", prefix, count);          ctx.dict = dict;          ctx.prefix = pfx;          ctx.opt_count = 1; -        ctx.key_name = "key"; -        ctx.val_name = "value"; -        GF_ASSERT (volinfo->dict); +        ctx.key_name = "rebal-dict-key"; +        ctx.val_name = "rebal-dict-value"; -        dict_foreach (volinfo->dict, _add_dict_to_prdict, &ctx); +        dict_foreach(volinfo->rebal.dict, _add_dict_to_prdict, &ctx);          ctx.opt_count--; -        keylen = snprintf (key, sizeof (key), "%s%d.opt-count", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, ctx.opt_count); +        keylen = snprintf(key, sizeof(key), "volume%d.rebal-dict-count", count); +        ret = dict_set_int32n(dict, key, keylen, ctx.opt_count);          if (ret) -                goto out; - -        ctx.dict = dict; -        ctx.prefix = pfx; -        ctx.opt_count = 1; -        ctx.key_name = "slave-num"; -        ctx.val_name = "slave-val"; -        GF_ASSERT (volinfo->gsync_slaves); - -        dict_foreach (volinfo->gsync_slaves, _add_dict_to_prdict, &ctx); -        ctx.opt_count--; - -        keylen = snprintf (key, sizeof (key), "%s%d.gsync-count", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, ctx.opt_count); +            goto out; +    } + +    snprintf(pfx, sizeof(pfx), "%s%d", prefix, count); +    ctx.dict = dict; +    ctx.prefix = pfx; +    ctx.opt_count = 1; +    ctx.key_name = "key"; +    ctx.val_name = "value"; +    GF_ASSERT(volinfo->dict); + +    dict_foreach(volinfo->dict, _add_dict_to_prdict, &ctx); +    ctx.opt_count--; +    keylen = snprintf(key, sizeof(key), "%s%d.opt-count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, ctx.opt_count); +    if (ret) +        goto out; + +    ctx.dict = dict; +    ctx.prefix = pfx; +    ctx.opt_count = 1; +    ctx.key_name = "slave-num"; +    ctx.val_name = "slave-val"; +    GF_ASSERT(volinfo->gsync_slaves); + +    dict_foreach(volinfo->gsync_slaves, _add_dict_to_prdict, &ctx); +    ctx.opt_count--; + +    keylen = snprintf(key, sizeof(key), "%s%d.gsync-count", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, ctx.opt_count); +    if (ret) +        goto out; + +    cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        keylen = snprintf(key, sizeof(key), "%s%d.brick%d.hostname", prefix, +                          count, i); +        ret = dict_set_strn(dict, key, keylen, brickinfo->hostname);          if (ret) -                goto out; +            goto out; -        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                keylen = snprintf (key, sizeof (key), "%s%d.brick%d.hostname", -                                   prefix, count, i); -                ret = dict_set_strn (dict, key, keylen, brickinfo->hostname); -                if (ret) -                        goto out; +        keylen = snprintf(key, sizeof(key), "%s%d.brick%d.path", prefix, count, +                          i); +        ret = dict_set_strn(dict, key, keylen, brickinfo->path); +        if (ret) +            goto out; -                keylen = snprintf (key, sizeof (key), "%s%d.brick%d.path", +        keylen = snprintf(key, sizeof(key), "%s%d.brick%d.decommissioned",                            prefix, count, i); -                ret = dict_set_strn (dict, key, keylen, brickinfo->path); -                if (ret) -                        goto out; - -                keylen = snprintf (key, sizeof (key), -                                   "%s%d.brick%d.decommissioned", -                                   prefix, count, i); -                ret = dict_set_int32n (dict, key, keylen, -                                       brickinfo->decommissioned); -                if (ret) -                        goto out; +        ret = dict_set_int32n(dict, key, keylen, brickinfo->decommissioned); +        if (ret) +            goto out; -                keylen = snprintf (key, sizeof (key), "%s%d.brick%d.brick_id", -                          prefix, count, i); -                ret = dict_set_strn (dict, key, keylen, brickinfo->brick_id); -                if (ret) -                        goto out; +        keylen = snprintf(key, sizeof(key), "%s%d.brick%d.brick_id", prefix, +                          count, i); +        ret = dict_set_strn(dict, key, keylen, brickinfo->brick_id); +        if (ret) +            goto out; -                snprintf (key, sizeof (key), "%s%d.brick%d.uuid", -                          prefix, count, i); -                ret = dict_set_dynstr_with_alloc (dict, key, -                                                  uuid_utoa(brickinfo->uuid)); -                if (ret) -                        goto out; +        snprintf(key, sizeof(key), "%s%d.brick%d.uuid", prefix, count, i); +        ret = dict_set_dynstr_with_alloc(dict, key, uuid_utoa(brickinfo->uuid)); +        if (ret) +            goto out; -                snprintf (key, sizeof (key), "%s%d.brick%d", prefix, count, i); -                ret = gd_add_brick_snap_details_to_dict (dict, key, brickinfo); -                if (ret) -                        goto out; +        snprintf(key, sizeof(key), "%s%d.brick%d", prefix, count, i); +        ret = gd_add_brick_snap_details_to_dict(dict, key, brickinfo); +        if (ret) +            goto out; -                i++; -        } +        i++; +    } -        /* Add volume op-versions to dict. This prevents volume inconsistencies -         * in the cluster -         */ -        keylen = snprintf (key, sizeof (key), "%s%d.op-version", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->op_version); -        if (ret) -                goto out; -        keylen = snprintf (key, sizeof (key), "%s%d.client-op-version", prefix, -                           count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->client_op_version); -        if (ret) -                goto out; +    /* Add volume op-versions to dict. This prevents volume inconsistencies +     * in the cluster +     */ +    keylen = snprintf(key, sizeof(key), "%s%d.op-version", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->op_version); +    if (ret) +        goto out; +    keylen = snprintf(key, sizeof(key), "%s%d.client-op-version", prefix, +                      count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->client_op_version); +    if (ret) +        goto out; -        /*Add volume Capability (BD Xlator) to dict*/ -        keylen = snprintf (key, sizeof (key), "%s%d.caps", prefix, count); -        ret = dict_set_int32n (dict, key, keylen, volinfo->caps); +    /*Add volume Capability (BD Xlator) to dict*/ +    keylen = snprintf(key, sizeof(key), "%s%d.caps", prefix, count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->caps); -        keylen = snprintf (key, sizeof (key), "%s%d.quota-xattr-version", -                           prefix, count); -        ret = dict_set_int32n (dict, key, keylen, -                               volinfo->quota_xattr_version); +    keylen = snprintf(key, sizeof(key), "%s%d.quota-xattr-version", prefix, +                      count); +    ret = dict_set_int32n(dict, key, keylen, volinfo->quota_xattr_version);  out: -        GF_FREE (volume_id_str); -        GF_FREE (rebalance_id_str); -        GF_FREE (rb_id_str); +    GF_FREE(volume_id_str); +    GF_FREE(rebalance_id_str); +    GF_FREE(rb_id_str); -        gf_msg_debug (this->name, 0, "Returning with %d", ret); -        return ret; +    gf_msg_debug(this->name, 0, "Returning with %d", ret); +    return ret;  }  /* The prefix represents the type of volume to be added. @@ -3314,416 +3272,420 @@ out:   * snap1, snap2, for snapshot volumes   */  int -glusterd_vol_add_quota_conf_to_dict (glusterd_volinfo_t *volinfo, dict_t* load, -                                     int vol_idx, char *prefix) +glusterd_vol_add_quota_conf_to_dict(glusterd_volinfo_t *volinfo, dict_t *load, +                                    int vol_idx, char *prefix)  { -        int            fd                    = -1; -        unsigned char  buf[16]               = ""; -        char           key[PATH_MAX]         = ""; -        int            gfid_idx              = 0; -        int            ret                   = -1; -        xlator_t      *this                  = NULL; -        char           type                  = 0; -        float          version               = 0.0f; +    int fd = -1; +    unsigned char buf[16] = ""; +    char key[PATH_MAX] = ""; +    int gfid_idx = 0; +    int ret = -1; +    xlator_t *this = NULL; +    char type = 0; +    float version = 0.0f; -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (prefix); +    this = THIS; +    GF_ASSERT(this); +    GF_ASSERT(prefix); -        ret = glusterd_store_create_quota_conf_sh_on_absence (volinfo); -        if (ret) -                goto out; +    ret = glusterd_store_create_quota_conf_sh_on_absence(volinfo); +    if (ret) +        goto out; -        fd = open (volinfo->quota_conf_shandle->path, O_RDONLY); -        if (fd == -1) { -                ret = -1; -                goto out; -        } - -        ret = quota_conf_read_version (fd, &version); -        if (ret) -                goto out; - -        for (gfid_idx=0; ; gfid_idx++) { -                ret = quota_conf_read_gfid (fd, buf, &type, version); -                if (ret == 0) { -                        break; -                } else if (ret < 0) { -                        gf_msg (this->name, GF_LOG_CRITICAL, 0, -                                GD_MSG_QUOTA_CONF_CORRUPT, "Quota " -                                "configuration store may be corrupt."); -                        goto out; -                } +    fd = open(volinfo->quota_conf_shandle->path, O_RDONLY); +    if (fd == -1) { +        ret = -1; +        goto out; +    } -                snprintf (key, sizeof(key)-1, "%s%d.gfid%d", prefix, -                          vol_idx, gfid_idx); -                ret = dict_set_dynstr_with_alloc (load, key, uuid_utoa (buf)); -                if (ret) -                        goto out; +    ret = quota_conf_read_version(fd, &version); +    if (ret) +        goto out; -                snprintf (key, sizeof(key)-1, "%s%d.gfid-type%d", prefix, -                          vol_idx, gfid_idx); -                ret = dict_set_int8 (load, key, type); -                if (ret) -                        goto out; +    for (gfid_idx = 0;; gfid_idx++) { +        ret = quota_conf_read_gfid(fd, buf, &type, version); +        if (ret == 0) { +            break; +        } else if (ret < 0) { +            gf_msg(this->name, GF_LOG_CRITICAL, 0, GD_MSG_QUOTA_CONF_CORRUPT, +                   "Quota " +                   "configuration store may be corrupt."); +            goto out;          } -        ret = snprintf (key, sizeof (key), "%s%d.gfid-count", prefix, -                        vol_idx); -        ret = dict_set_int32n (load, key, ret, gfid_idx); +        snprintf(key, sizeof(key) - 1, "%s%d.gfid%d", prefix, vol_idx, +                 gfid_idx); +        ret = dict_set_dynstr_with_alloc(load, key, uuid_utoa(buf));          if (ret) -                goto out; +            goto out; -        snprintf (key, sizeof (key), "%s%d.quota-cksum", prefix, -                  vol_idx); -        ret = dict_set_uint32 (load, key, volinfo->quota_conf_cksum); +        snprintf(key, sizeof(key) - 1, "%s%d.gfid-type%d", prefix, vol_idx, +                 gfid_idx); +        ret = dict_set_int8(load, key, type);          if (ret) -                goto out; +            goto out; +    } -        snprintf (key, sizeof (key), "%s%d.quota-version", prefix, vol_idx); -        ret = dict_set_uint32 (load, key, volinfo->quota_conf_version); -        if (ret) -                goto out; +    ret = snprintf(key, sizeof(key), "%s%d.gfid-count", prefix, vol_idx); +    ret = dict_set_int32n(load, key, ret, gfid_idx); +    if (ret) +        goto out; -        ret = 0; +    snprintf(key, sizeof(key), "%s%d.quota-cksum", prefix, vol_idx); +    ret = dict_set_uint32(load, key, volinfo->quota_conf_cksum); +    if (ret) +        goto out; + +    snprintf(key, sizeof(key), "%s%d.quota-version", prefix, vol_idx); +    ret = dict_set_uint32(load, key, volinfo->quota_conf_version); +    if (ret) +        goto out; + +    ret = 0;  out: -        if (fd != -1) -                sys_close (fd); -        return ret; +    if (fd != -1) +        sys_close(fd); +    return ret;  }  int32_t -glusterd_add_volumes_to_export_dict (dict_t **peer_data) -{ -        int32_t                 ret = -1; -        dict_t                  *dict = NULL; -        glusterd_conf_t         *priv = NULL; -        glusterd_volinfo_t      *volinfo = NULL; -        int32_t                 count = 0; -        glusterd_dict_ctx_t     ctx            = {0}; -        xlator_t               *this = NULL; - -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); - -        dict = dict_new (); -        if (!dict) -                goto out; - -        cds_list_for_each_entry (volinfo, &priv->volumes, vol_list) { -                count++; -                ret = glusterd_add_volume_to_dict (volinfo, dict, count, -                                                   "volume"); -                if (ret) -                        goto out; -                if (!glusterd_is_volume_quota_enabled (volinfo)) -                        continue; -                ret = glusterd_vol_add_quota_conf_to_dict (volinfo, dict, -                                                           count, "volume"); -                if (ret) -                        goto out; -        } - -        ret = dict_set_int32n (dict, "count", SLEN ("count"), count); +glusterd_add_volumes_to_export_dict(dict_t **peer_data) +{ +    int32_t ret = -1; +    dict_t *dict = NULL; +    glusterd_conf_t *priv = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    int32_t count = 0; +    glusterd_dict_ctx_t ctx = {0}; +    xlator_t *this = NULL; + +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); + +    dict = dict_new(); +    if (!dict) +        goto out; + +    cds_list_for_each_entry(volinfo, &priv->volumes, vol_list) +    { +        count++; +        ret = glusterd_add_volume_to_dict(volinfo, dict, count, "volume");          if (ret) -                goto out; - -        ctx.dict = dict; -        ctx.prefix = "global"; -        ctx.opt_count = 1; -        ctx.key_name = "key"; -        ctx.val_name = "val"; -        dict_foreach (priv->opts, _add_dict_to_prdict, &ctx); -        ctx.opt_count--; -        ret = dict_set_int32n (dict, "global-opt-count", -                               SLEN ("global-opt-count"), ctx.opt_count); +            goto out; +        if (!glusterd_is_volume_quota_enabled(volinfo)) +            continue; +        ret = glusterd_vol_add_quota_conf_to_dict(volinfo, dict, count, +                                                  "volume");          if (ret) -                goto out; +            goto out; +    } + +    ret = dict_set_int32n(dict, "count", SLEN("count"), count); +    if (ret) +        goto out; + +    ctx.dict = dict; +    ctx.prefix = "global"; +    ctx.opt_count = 1; +    ctx.key_name = "key"; +    ctx.val_name = "val"; +    dict_foreach(priv->opts, _add_dict_to_prdict, &ctx); +    ctx.opt_count--; +    ret = dict_set_int32n(dict, "global-opt-count", SLEN("global-opt-count"), +                          ctx.opt_count); +    if (ret) +        goto out; -        *peer_data = dict; +    *peer_data = dict;  out: -        if (ret) -                dict_unref (dict); +    if (ret) +        dict_unref(dict); -        gf_msg_trace (this->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_trace(this->name, 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_compare_friend_volume (dict_t *peer_data, int32_t count, -                                int32_t *status, char *hostname) -{ - -        int32_t                 ret = -1; -        char                    key[64] = ""; -        int                     keylen; -        glusterd_volinfo_t      *volinfo = NULL; -        char                    *volname = NULL; -        uint32_t                cksum = 0; -        uint32_t                quota_cksum = 0; -        uint32_t                quota_version = 0; -        uint32_t                stage_deleted = 0; -        int32_t                 version = 0; -        xlator_t                *this = NULL; - -        GF_ASSERT (peer_data); -        GF_ASSERT (status); - -        this = THIS; -        GF_ASSERT (this); - -        keylen = snprintf (key, sizeof (key), "volume%d.name", count); -        ret = dict_get_strn (peer_data, key, keylen, &volname); -        if (ret) -                goto out; - -        ret = glusterd_volinfo_find (volname, &volinfo); -        if (ret) { -                snprintf (key, sizeof (key), "volume%d.stage_deleted", count); -                ret = dict_get_uint32 (peer_data, key, &stage_deleted); -                /* stage_deleted = 1 means the volume is still in the process of -                 * deleting a volume, so we shouldn't be trying to create a -                 * fresh volume here which would lead to a stale entry -                 */ -                if (stage_deleted == 0) -                        *status = GLUSTERD_VOL_COMP_UPDATE_REQ; -                ret = 0; -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "volume%d.version", count); -        ret = dict_get_int32n (peer_data, key, keylen, &version); -        if (ret) -                goto out; +glusterd_compare_friend_volume(dict_t *peer_data, int32_t count, +                               int32_t *status, char *hostname) +{ +    int32_t ret = -1; +    char key[64] = ""; +    int keylen; +    glusterd_volinfo_t *volinfo = NULL; +    char *volname = NULL; +    uint32_t cksum = 0; +    uint32_t quota_cksum = 0; +    uint32_t quota_version = 0; +    uint32_t stage_deleted = 0; +    int32_t version = 0; +    xlator_t *this = NULL; + +    GF_ASSERT(peer_data); +    GF_ASSERT(status); + +    this = THIS; +    GF_ASSERT(this); + +    keylen = snprintf(key, sizeof(key), "volume%d.name", count); +    ret = dict_get_strn(peer_data, key, keylen, &volname); +    if (ret) +        goto out; + +    ret = glusterd_volinfo_find(volname, &volinfo); +    if (ret) { +        snprintf(key, sizeof(key), "volume%d.stage_deleted", count); +        ret = dict_get_uint32(peer_data, key, &stage_deleted); +        /* stage_deleted = 1 means the volume is still in the process of +         * deleting a volume, so we shouldn't be trying to create a +         * fresh volume here which would lead to a stale entry +         */ +        if (stage_deleted == 0) +            *status = GLUSTERD_VOL_COMP_UPDATE_REQ; +        ret = 0; +        goto out; +    } -        if (version > volinfo->version) { -                //Mismatch detected -                ret = 0; -                gf_msg (this->name, GF_LOG_INFO, 0, GD_MSG_VOL_VERS_MISMATCH, -                        "Version of volume %s differ. local version = %d, " -                        "remote version = %d on peer %s", volinfo->volname, -                        volinfo->version, version, hostname); -                *status = GLUSTERD_VOL_COMP_UPDATE_REQ; -                goto out; -        } else if (version < volinfo->version) { -                *status = GLUSTERD_VOL_COMP_SCS; -                goto out; -        } +    keylen = snprintf(key, sizeof(key), "volume%d.version", count); +    ret = dict_get_int32n(peer_data, key, keylen, &version); +    if (ret) +        goto out; -        //Now, versions are same, compare cksums. -        // -        snprintf (key, sizeof (key), "volume%d.ckusm", count); -        ret = dict_get_uint32 (peer_data, key, &cksum); -        if (ret) -                goto out; +    if (version > volinfo->version) { +        // Mismatch detected +        ret = 0; +        gf_msg(this->name, GF_LOG_INFO, 0, GD_MSG_VOL_VERS_MISMATCH, +               "Version of volume %s differ. local version = %d, " +               "remote version = %d on peer %s", +               volinfo->volname, volinfo->version, version, hostname); +        *status = GLUSTERD_VOL_COMP_UPDATE_REQ; +        goto out; +    } else if (version < volinfo->version) { +        *status = GLUSTERD_VOL_COMP_SCS; +        goto out; +    } -        if (cksum != volinfo->cksum) { -                ret = 0; -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_CKSUM_VERS_MISMATCH, -                        "Version of Cksums %s differ. local cksum = %u, remote " -                        "cksum = %u on peer %s", volinfo->volname, -                        volinfo->cksum, cksum, hostname); -                *status = GLUSTERD_VOL_COMP_RJT; -                goto out; -        } +    // Now, versions are same, compare cksums. +    // +    snprintf(key, sizeof(key), "volume%d.ckusm", count); +    ret = dict_get_uint32(peer_data, key, &cksum); +    if (ret) +        goto out; -        snprintf (key, sizeof (key), "volume%d.quota-version", count); -        ret = dict_get_uint32 (peer_data, key, "a_version); -        if (ret) { -                gf_msg_debug (this->name, 0, "quota-version key absent for" -                        " volume %s in peer %s's response", volinfo->volname, -                        hostname); -                ret = 0; -        } else { -                if (quota_version > volinfo->quota_conf_version) { -                        //Mismatch detected -                        ret = 0; -                        gf_msg (this->name, GF_LOG_INFO, 0, -                                GD_MSG_QUOTA_CONFIG_VERS_MISMATCH, -                                "Quota configuration versions of volume %s " -                                "differ. local version = %d, remote version = " -                                "%d on peer %s", volinfo->volname, -                                volinfo->quota_conf_version, -                                quota_version, hostname); -                        *status = GLUSTERD_VOL_COMP_UPDATE_REQ; -                        goto out; -                } else if (quota_version < volinfo->quota_conf_version) { -                        *status = GLUSTERD_VOL_COMP_SCS; -                        goto out; -                } +    if (cksum != volinfo->cksum) { +        ret = 0; +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_CKSUM_VERS_MISMATCH, +               "Version of Cksums %s differ. local cksum = %u, remote " +               "cksum = %u on peer %s", +               volinfo->volname, volinfo->cksum, cksum, hostname); +        *status = GLUSTERD_VOL_COMP_RJT; +        goto out; +    } + +    snprintf(key, sizeof(key), "volume%d.quota-version", count); +    ret = dict_get_uint32(peer_data, key, "a_version); +    if (ret) { +        gf_msg_debug(this->name, 0, +                     "quota-version key absent for" +                     " volume %s in peer %s's response", +                     volinfo->volname, hostname); +        ret = 0; +    } else { +        if (quota_version > volinfo->quota_conf_version) { +            // Mismatch detected +            ret = 0; +            gf_msg(this->name, GF_LOG_INFO, 0, +                   GD_MSG_QUOTA_CONFIG_VERS_MISMATCH, +                   "Quota configuration versions of volume %s " +                   "differ. local version = %d, remote version = " +                   "%d on peer %s", +                   volinfo->volname, volinfo->quota_conf_version, quota_version, +                   hostname); +            *status = GLUSTERD_VOL_COMP_UPDATE_REQ; +            goto out; +        } else if (quota_version < volinfo->quota_conf_version) { +            *status = GLUSTERD_VOL_COMP_SCS; +            goto out;          } - -        //Now, versions are same, compare cksums. -        // -        snprintf (key, sizeof (key), "volume%d.quota-cksum", count); -        ret = dict_get_uint32 (peer_data, key, "a_cksum); -        if (ret) { -                gf_msg_debug (this->name, 0, "quota checksum absent for " -                        "volume %s in peer %s's response", volinfo->volname, -                        hostname); -                ret = 0; -        } else { -                if (quota_cksum != volinfo->quota_conf_cksum) { -                        ret = 0; -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_QUOTA_CONFIG_CKSUM_MISMATCH, "Cksums of " -                                "quota configuration of volume %s differ. local" -                                " cksum = %u, remote  cksum = %u on peer %s", -                                volinfo->volname, volinfo->quota_conf_cksum, -                                quota_cksum, hostname); -                        *status = GLUSTERD_VOL_COMP_RJT; -                        goto out; -                } +    } + +    // Now, versions are same, compare cksums. +    // +    snprintf(key, sizeof(key), "volume%d.quota-cksum", count); +    ret = dict_get_uint32(peer_data, key, "a_cksum); +    if (ret) { +        gf_msg_debug(this->name, 0, +                     "quota checksum absent for " +                     "volume %s in peer %s's response", +                     volinfo->volname, hostname); +        ret = 0; +    } else { +        if (quota_cksum != volinfo->quota_conf_cksum) { +            ret = 0; +            gf_msg(this->name, GF_LOG_ERROR, 0, +                   GD_MSG_QUOTA_CONFIG_CKSUM_MISMATCH, +                   "Cksums of " +                   "quota configuration of volume %s differ. local" +                   " cksum = %u, remote  cksum = %u on peer %s", +                   volinfo->volname, volinfo->quota_conf_cksum, quota_cksum, +                   hostname); +            *status = GLUSTERD_VOL_COMP_RJT; +            goto out;          } -        *status = GLUSTERD_VOL_COMP_SCS; +    } +    *status = GLUSTERD_VOL_COMP_SCS;  out: -        keylen = snprintf (key, sizeof (key), "volume%d.update", count); +    keylen = snprintf(key, sizeof(key), "volume%d.update", count); -        if (*status == GLUSTERD_VOL_COMP_UPDATE_REQ) { -                ret = dict_set_int32n (peer_data, key, keylen, 1); -        } else { -                ret = dict_set_int32n (peer_data, key, keylen, 0); -        } -        if (*status == GLUSTERD_VOL_COMP_RJT) { -                gf_event (EVENT_COMPARE_FRIEND_VOLUME_FAILED, "volume=%s", -                          volinfo->volname); -        } -        gf_msg_debug (this->name, 0, "Returning with ret: %d, status: %d", -                ret, *status); -        return ret; +    if (*status == GLUSTERD_VOL_COMP_UPDATE_REQ) { +        ret = dict_set_int32n(peer_data, key, keylen, 1); +    } else { +        ret = dict_set_int32n(peer_data, key, keylen, 0); +    } +    if (*status == GLUSTERD_VOL_COMP_RJT) { +        gf_event(EVENT_COMPARE_FRIEND_VOLUME_FAILED, "volume=%s", +                 volinfo->volname); +    } +    gf_msg_debug(this->name, 0, "Returning with ret: %d, status: %d", ret, +                 *status); +    return ret;  }  static int32_t -import_prdict_dict (dict_t *peer_data, dict_t  *dst_dict, char *key_prefix, -                    char *value_prefix, int opt_count, char *prefix) -{ -        char                    key[512] = ""; -        int                     keylen; -        int32_t                 ret = 0; -        int                     i = 1; -        char                    *opt_key = NULL; -        char                    *opt_val = NULL; -        char                    *dup_opt_val = NULL; -        char                    msg[2048] = ""; - -        while (i <= opt_count) { -                keylen = snprintf (key, sizeof (key), "%s.%s%d", -                                   prefix, key_prefix, i); -                ret = dict_get_strn (peer_data, key, keylen, &opt_key); -                if (ret) { -                        snprintf (msg, sizeof (msg), "Volume dict key not " -                                  "specified"); -                        goto out; -                } +import_prdict_dict(dict_t *peer_data, dict_t *dst_dict, char *key_prefix, +                   char *value_prefix, int opt_count, char *prefix) +{ +    char key[512] = ""; +    int keylen; +    int32_t ret = 0; +    int i = 1; +    char *opt_key = NULL; +    char *opt_val = NULL; +    char *dup_opt_val = NULL; +    char msg[2048] = ""; + +    while (i <= opt_count) { +        keylen = snprintf(key, sizeof(key), "%s.%s%d", prefix, key_prefix, i); +        ret = dict_get_strn(peer_data, key, keylen, &opt_key); +        if (ret) { +            snprintf(msg, sizeof(msg), +                     "Volume dict key not " +                     "specified"); +            goto out; +        } -                keylen = snprintf (key, sizeof (key), "%s.%s%d", -                                   prefix, value_prefix, i); -                ret = dict_get_strn (peer_data, key, keylen, &opt_val); -                if (ret) { -                        snprintf (msg, sizeof (msg), "Volume dict value not " -                                  "specified"); -                        goto out; -                } -                dup_opt_val = gf_strdup (opt_val); -                if (!dup_opt_val) { -                        ret = -1; -                        goto out; -                } -                ret = dict_set_dynstr (dst_dict, opt_key, dup_opt_val); -                if (ret) { -                        snprintf (msg, sizeof (msg), "Volume set %s %s " -                                  "unsuccessful", opt_key, dup_opt_val); -                        goto out; -                } -                i++; +        keylen = snprintf(key, sizeof(key), "%s.%s%d", prefix, value_prefix, i); +        ret = dict_get_strn(peer_data, key, keylen, &opt_val); +        if (ret) { +            snprintf(msg, sizeof(msg), +                     "Volume dict value not " +                     "specified"); +            goto out;          } +        dup_opt_val = gf_strdup(opt_val); +        if (!dup_opt_val) { +            ret = -1; +            goto out; +        } +        ret = dict_set_dynstr(dst_dict, opt_key, dup_opt_val); +        if (ret) { +            snprintf(msg, sizeof(msg), +                     "Volume set %s %s " +                     "unsuccessful", +                     opt_key, dup_opt_val); +            goto out; +        } +        i++; +    }  out: -        if (msg[0]) -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_IMPORT_PRDICT_DICT, "%s", msg); -        gf_msg_debug ("glusterd", 0, "Returning with %d", ret); -        return ret; - +    if (msg[0]) +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_IMPORT_PRDICT_DICT, "%s", +               msg); +    gf_msg_debug("glusterd", 0, "Returning with %d", ret); +    return ret;  } -  int -glusterd_spawn_daemons (void *opaque) +glusterd_spawn_daemons(void *opaque)  { -        glusterd_conf_t *conf   = THIS->private; -        int             ret     = -1; +    glusterd_conf_t *conf = THIS->private; +    int ret = -1; -        synclock_lock (&conf->big_lock); -        glusterd_restart_bricks (); -        glusterd_restart_gsyncds (conf); -        glusterd_restart_rebalance (conf); -        ret = glusterd_snapdsvc_restart (); -        ret = glusterd_tierdsvc_restart (); -        ret = glusterd_gfproxydsvc_restart (); -        return ret; +    synclock_lock(&conf->big_lock); +    glusterd_restart_bricks(); +    glusterd_restart_gsyncds(conf); +    glusterd_restart_rebalance(conf); +    ret = glusterd_snapdsvc_restart(); +    ret = glusterd_tierdsvc_restart(); +    ret = glusterd_gfproxydsvc_restart(); +    return ret;  } -  int32_t -glusterd_import_friend_volume_opts (dict_t *peer_data, int count, -                                    glusterd_volinfo_t *volinfo, -                                    char *prefix) -{ -        char                    key[512] = ""; -        int                     keylen; -        int32_t                 ret = -1; -        int                     opt_count = 0; -        char                    msg[2048] = ""; -        char                    volume_prefix[1024] = ""; - -        GF_ASSERT (peer_data); -        GF_ASSERT (volinfo); - -        keylen = snprintf (key, sizeof (key), "%s%d.opt-count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, &opt_count); -        if (ret) { -                snprintf (msg, sizeof (msg), "Volume option count not " -                          "specified for %s", volinfo->volname); -                goto out; -        } - -        snprintf (volume_prefix, sizeof (volume_prefix), "%s%d", prefix, count); -        ret = import_prdict_dict (peer_data, volinfo->dict, "key", "value", -                                  opt_count, volume_prefix); -        if (ret) { -                snprintf (msg, sizeof (msg), "Unable to import options dict " -                          "specified for %s", volinfo->volname); -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.gsync-count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, &opt_count); -        if (ret) { -                snprintf (msg, sizeof (msg), "Gsync count not " -                          "specified for %s", volinfo->volname); -                goto out; -        } - -        ret = import_prdict_dict (peer_data, volinfo->gsync_slaves, "slave-num", -                                  "slave-val", opt_count, volume_prefix); -        if (ret) { -                snprintf (msg, sizeof (msg), "Unable to import gsync sessions " -                          "specified for %s", volinfo->volname); -                goto out; -        } - -out: -        if (msg[0]) -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_VOL_OPTS_IMPORT_FAIL, "%s", msg); -        gf_msg_debug ("glusterd", 0, "Returning with %d", ret); -        return ret; +glusterd_import_friend_volume_opts(dict_t *peer_data, int count, +                                   glusterd_volinfo_t *volinfo, char *prefix) +{ +    char key[512] = ""; +    int keylen; +    int32_t ret = -1; +    int opt_count = 0; +    char msg[2048] = ""; +    char volume_prefix[1024] = ""; + +    GF_ASSERT(peer_data); +    GF_ASSERT(volinfo); + +    keylen = snprintf(key, sizeof(key), "%s%d.opt-count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &opt_count); +    if (ret) { +        snprintf(msg, sizeof(msg), +                 "Volume option count not " +                 "specified for %s", +                 volinfo->volname); +        goto out; +    } + +    snprintf(volume_prefix, sizeof(volume_prefix), "%s%d", prefix, count); +    ret = import_prdict_dict(peer_data, volinfo->dict, "key", "value", +                             opt_count, volume_prefix); +    if (ret) { +        snprintf(msg, sizeof(msg), +                 "Unable to import options dict " +                 "specified for %s", +                 volinfo->volname); +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.gsync-count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &opt_count); +    if (ret) { +        snprintf(msg, sizeof(msg), +                 "Gsync count not " +                 "specified for %s", +                 volinfo->volname); +        goto out; +    } + +    ret = import_prdict_dict(peer_data, volinfo->gsync_slaves, "slave-num", +                             "slave-val", opt_count, volume_prefix); +    if (ret) { +        snprintf(msg, sizeof(msg), +                 "Unable to import gsync sessions " +                 "specified for %s", +                 volinfo->volname); +        goto out; +    } + +out: +    if (msg[0]) +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_VOL_OPTS_IMPORT_FAIL, "%s", +               msg); +    gf_msg_debug("glusterd", 0, "Returning with %d", ret); +    return ret;  }  /* The prefix represents the type of volume to be added. @@ -3731,98 +3693,98 @@ out:   * snap1, snap2, for snapshot volumes   */  int32_t -glusterd_import_new_brick (dict_t *peer_data, int32_t vol_count, -                           int32_t brick_count, -                           glusterd_brickinfo_t **brickinfo, -                           char *prefix) -{ -        char                    key[512] = {0,}; -        int                     keylen; -        int                     ret = -1; -        char                    *hostname = NULL; -        char                    *path = NULL; -        char                    *brick_id = NULL; -        int                     decommissioned = 0; -        glusterd_brickinfo_t    *new_brickinfo = NULL; -        char                    msg[2048] = ""; -        char                    *brick_uuid_str = NULL; - -        GF_ASSERT (peer_data); -        GF_ASSERT (vol_count >= 0); -        GF_ASSERT (brickinfo); -        GF_ASSERT (prefix); - -        keylen = snprintf (key, sizeof (key), "%s%d.brick%d.hostname", -                           prefix, vol_count, brick_count); -        ret = dict_get_strn (peer_data, key, keylen, &hostname); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload", key); -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.brick%d.path", -                           prefix, vol_count, brick_count); -        ret = dict_get_strn (peer_data, key, keylen, &path); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload", key); -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.brick%d.brick_id", -                           prefix, vol_count, brick_count); -        ret = dict_get_strn (peer_data, key, keylen, &brick_id); - -        keylen = snprintf (key, sizeof (key), "%s%d.brick%d.decommissioned", -                           prefix, vol_count, brick_count); -        ret = dict_get_int32n (peer_data, key, keylen, &decommissioned); -        if (ret) { -                /* For backward compatibility */ -                ret = 0; -        } - -        ret = glusterd_brickinfo_new (&new_brickinfo); -        if (ret) -                goto out; - -        ret = snprintf (new_brickinfo->path, sizeof (new_brickinfo->path), -                        "%s", path); -        if (ret < 0 || ret >= sizeof (new_brickinfo->path)) { -                ret = -1; -                goto out; -        } -        ret = snprintf (new_brickinfo->hostname, -                        sizeof (new_brickinfo->hostname), "%s", hostname); -        if (ret < 0 || ret >= sizeof (new_brickinfo->hostname)) { -                ret = -1; -                goto out; -        } -        new_brickinfo->decommissioned = decommissioned; -        if (brick_id) -                strcpy (new_brickinfo->brick_id, brick_id); +glusterd_import_new_brick(dict_t *peer_data, int32_t vol_count, +                          int32_t brick_count, glusterd_brickinfo_t **brickinfo, +                          char *prefix) +{ +    char key[512] = { +        0, +    }; +    int keylen; +    int ret = -1; +    char *hostname = NULL; +    char *path = NULL; +    char *brick_id = NULL; +    int decommissioned = 0; +    glusterd_brickinfo_t *new_brickinfo = NULL; +    char msg[2048] = ""; +    char *brick_uuid_str = NULL; + +    GF_ASSERT(peer_data); +    GF_ASSERT(vol_count >= 0); +    GF_ASSERT(brickinfo); +    GF_ASSERT(prefix); + +    keylen = snprintf(key, sizeof(key), "%s%d.brick%d.hostname", prefix, +                      vol_count, brick_count); +    ret = dict_get_strn(peer_data, key, keylen, &hostname); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload", key); +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.brick%d.path", prefix, vol_count, +                      brick_count); +    ret = dict_get_strn(peer_data, key, keylen, &path); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload", key); +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.brick%d.brick_id", prefix, +                      vol_count, brick_count); +    ret = dict_get_strn(peer_data, key, keylen, &brick_id); + +    keylen = snprintf(key, sizeof(key), "%s%d.brick%d.decommissioned", prefix, +                      vol_count, brick_count); +    ret = dict_get_int32n(peer_data, key, keylen, &decommissioned); +    if (ret) { +        /* For backward compatibility */ +        ret = 0; +    } -        snprintf (key, sizeof (key), "%s%d.brick%d", prefix, vol_count, -                  brick_count); -        ret = gd_import_new_brick_snap_details (peer_data, key, new_brickinfo); -        if (ret) -                goto out; +    ret = glusterd_brickinfo_new(&new_brickinfo); +    if (ret) +        goto out; -        keylen = snprintf (key, sizeof (key), "%s%d.brick%d.uuid", -                           prefix, vol_count, brick_count); -        ret = dict_get_strn (peer_data, key, keylen, &brick_uuid_str); -        if (ret) -                goto out; -        gf_uuid_parse (brick_uuid_str, new_brickinfo->uuid); - -        *brickinfo = new_brickinfo; -out: -        if (msg[0]) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_BRICK_IMPORT_FAIL, "%s", msg); -                gf_event (EVENT_IMPORT_BRICK_FAILED, "peer=%s;brick=%s", -                          new_brickinfo->hostname, new_brickinfo->path); -        } -        gf_msg_debug ("glusterd", 0, "Returning with %d", ret); -        return ret; +    ret = snprintf(new_brickinfo->path, sizeof(new_brickinfo->path), "%s", +                   path); +    if (ret < 0 || ret >= sizeof(new_brickinfo->path)) { +        ret = -1; +        goto out; +    } +    ret = snprintf(new_brickinfo->hostname, sizeof(new_brickinfo->hostname), +                   "%s", hostname); +    if (ret < 0 || ret >= sizeof(new_brickinfo->hostname)) { +        ret = -1; +        goto out; +    } +    new_brickinfo->decommissioned = decommissioned; +    if (brick_id) +        strcpy(new_brickinfo->brick_id, brick_id); + +    snprintf(key, sizeof(key), "%s%d.brick%d", prefix, vol_count, brick_count); +    ret = gd_import_new_brick_snap_details(peer_data, key, new_brickinfo); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s%d.brick%d.uuid", prefix, vol_count, +                      brick_count); +    ret = dict_get_strn(peer_data, key, keylen, &brick_uuid_str); +    if (ret) +        goto out; +    gf_uuid_parse(brick_uuid_str, new_brickinfo->uuid); + +    *brickinfo = new_brickinfo; +out: +    if (msg[0]) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_BRICK_IMPORT_FAIL, "%s", +               msg); +        gf_event(EVENT_IMPORT_BRICK_FAILED, "peer=%s;brick=%s", +                 new_brickinfo->hostname, new_brickinfo->path); +    } +    gf_msg_debug("glusterd", 0, "Returning with %d", ret); +    return ret;  }  /* The prefix represents the type of volume to be added. @@ -3830,39 +3792,35 @@ out:   * snap1, snap2, for snapshot volumes   */  static int32_t -glusterd_import_bricks (dict_t *peer_data, int32_t vol_count, -                        glusterd_volinfo_t *new_volinfo, char *prefix) -{ -        int                     ret = -1; -        int                     brick_count = 1; -        int                     brickid = 0; -        glusterd_brickinfo_t     *new_brickinfo = NULL; - -        GF_ASSERT (peer_data); -        GF_ASSERT (vol_count >= 0); -        GF_ASSERT (new_volinfo); -        GF_ASSERT (prefix); -        while (brick_count <= new_volinfo->brick_count) { - -                ret = glusterd_import_new_brick (peer_data, vol_count, -                                                 brick_count, -                                                 &new_brickinfo, prefix); -                if (ret) -                        goto out; -                if (new_brickinfo->brick_id[0] == '\0') -                        /*We were probed from a peer having op-version -                         less than GD_OP_VER_PERSISTENT_AFR_XATTRS*/ -                        GLUSTERD_ASSIGN_BRICKID_TO_BRICKINFO (new_brickinfo, -                                                              new_volinfo, -                                                              brickid++); -                cds_list_add_tail (&new_brickinfo->brick_list, -                                   &new_volinfo->bricks); -                brick_count++; -        } -        ret = 0; +glusterd_import_bricks(dict_t *peer_data, int32_t vol_count, +                       glusterd_volinfo_t *new_volinfo, char *prefix) +{ +    int ret = -1; +    int brick_count = 1; +    int brickid = 0; +    glusterd_brickinfo_t *new_brickinfo = NULL; + +    GF_ASSERT(peer_data); +    GF_ASSERT(vol_count >= 0); +    GF_ASSERT(new_volinfo); +    GF_ASSERT(prefix); +    while (brick_count <= new_volinfo->brick_count) { +        ret = glusterd_import_new_brick(peer_data, vol_count, brick_count, +                                        &new_brickinfo, prefix); +        if (ret) +            goto out; +        if (new_brickinfo->brick_id[0] == '\0') +            /*We were probed from a peer having op-version +             less than GD_OP_VER_PERSISTENT_AFR_XATTRS*/ +            GLUSTERD_ASSIGN_BRICKID_TO_BRICKINFO(new_brickinfo, new_volinfo, +                                                 brickid++); +        cds_list_add_tail(&new_brickinfo->brick_list, &new_volinfo->bricks); +        brick_count++; +    } +    ret = 0;  out: -        gf_msg_debug ("glusterd", 0, "Returning with %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning with %d", ret); +    return ret;  }  /* The prefix represents the type of volume to be added. @@ -3870,157 +3828,154 @@ out:   * snap1, snap2, for snapshot volumes   */  int -glusterd_import_quota_conf (dict_t *peer_data, int vol_idx, -                            glusterd_volinfo_t *new_volinfo, -                            char *prefix) -{ -        int       gfid_idx         = 0; -        int       gfid_count       = 0; -        int       ret              = -1; -        int       fd               = -1; -        char      key[PATH_MAX]    = ""; -        int       keylen; -        char     *gfid_str         = NULL; -        uuid_t    gfid             = {0,}; -        xlator_t *this             = NULL; -        int8_t    gfid_type        = 0; - -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (peer_data); -        GF_ASSERT (prefix); - -        if (!glusterd_is_volume_quota_enabled (new_volinfo)) { -                (void) glusterd_clean_up_quota_store (new_volinfo); -                return 0; -        } - -        ret = glusterd_store_create_quota_conf_sh_on_absence (new_volinfo); -        if (ret) -                goto out; - -        fd = gf_store_mkstemp (new_volinfo->quota_conf_shandle); -        if (fd < 0) { -                ret = -1; -                goto out; -        } +glusterd_import_quota_conf(dict_t *peer_data, int vol_idx, +                           glusterd_volinfo_t *new_volinfo, char *prefix) +{ +    int gfid_idx = 0; +    int gfid_count = 0; +    int ret = -1; +    int fd = -1; +    char key[PATH_MAX] = ""; +    int keylen; +    char *gfid_str = NULL; +    uuid_t gfid = { +        0, +    }; +    xlator_t *this = NULL; +    int8_t gfid_type = 0; + +    this = THIS; +    GF_ASSERT(this); +    GF_ASSERT(peer_data); +    GF_ASSERT(prefix); + +    if (!glusterd_is_volume_quota_enabled(new_volinfo)) { +        (void)glusterd_clean_up_quota_store(new_volinfo); +        return 0; +    } -        snprintf (key, sizeof (key), "%s%d.quota-cksum", prefix, vol_idx); -        ret = dict_get_uint32 (peer_data, key, &new_volinfo->quota_conf_cksum); -        if (ret) -                gf_msg_debug (this->name, 0, "Failed to get quota cksum"); +    ret = glusterd_store_create_quota_conf_sh_on_absence(new_volinfo); +    if (ret) +        goto out; -        snprintf (key, sizeof (key), "%s%d.quota-version", prefix, vol_idx); -        ret = dict_get_uint32 (peer_data, key, -                               &new_volinfo->quota_conf_version); -        if (ret) -                gf_msg_debug (this->name, 0, "Failed to get quota " -                                                  "version"); - -        keylen = snprintf (key, sizeof (key), "%s%d.gfid-count", prefix, -                           vol_idx); -        ret = dict_get_int32n (peer_data, key, keylen, &gfid_count); +    fd = gf_store_mkstemp(new_volinfo->quota_conf_shandle); +    if (fd < 0) { +        ret = -1; +        goto out; +    } + +    snprintf(key, sizeof(key), "%s%d.quota-cksum", prefix, vol_idx); +    ret = dict_get_uint32(peer_data, key, &new_volinfo->quota_conf_cksum); +    if (ret) +        gf_msg_debug(this->name, 0, "Failed to get quota cksum"); + +    snprintf(key, sizeof(key), "%s%d.quota-version", prefix, vol_idx); +    ret = dict_get_uint32(peer_data, key, &new_volinfo->quota_conf_version); +    if (ret) +        gf_msg_debug(this->name, 0, +                     "Failed to get quota " +                     "version"); + +    keylen = snprintf(key, sizeof(key), "%s%d.gfid-count", prefix, vol_idx); +    ret = dict_get_int32n(peer_data, key, keylen, &gfid_count); +    if (ret) +        goto out; + +    ret = glusterd_quota_conf_write_header(fd); +    if (ret) +        goto out; + +    gfid_idx = 0; +    for (gfid_idx = 0; gfid_idx < gfid_count; gfid_idx++) { +        keylen = snprintf(key, sizeof(key) - 1, "%s%d.gfid%d", prefix, vol_idx, +                          gfid_idx); +        ret = dict_get_strn(peer_data, key, keylen, &gfid_str);          if (ret) -                goto out; +            goto out; -        ret = glusterd_quota_conf_write_header (fd); +        snprintf(key, sizeof(key) - 1, "%s%d.gfid-type%d", prefix, vol_idx, +                 gfid_idx); +        ret = dict_get_int8(peer_data, key, &gfid_type);          if (ret) -                goto out; +            gfid_type = GF_QUOTA_CONF_TYPE_USAGE; -        gfid_idx = 0; -        for (gfid_idx = 0; gfid_idx < gfid_count; gfid_idx++) { - -                keylen = snprintf (key, sizeof (key)-1, "%s%d.gfid%d", -                                   prefix, vol_idx, gfid_idx); -                ret = dict_get_strn (peer_data, key, keylen, &gfid_str); -                if (ret) -                        goto out; - -                snprintf (key, sizeof (key)-1, "%s%d.gfid-type%d", -                          prefix, vol_idx, gfid_idx); -                ret = dict_get_int8 (peer_data, key, &gfid_type); -                if (ret) -                        gfid_type = GF_QUOTA_CONF_TYPE_USAGE; - -                gf_uuid_parse (gfid_str, gfid); -                ret = glusterd_quota_conf_write_gfid (fd, gfid, -                                                      (char)gfid_type); -                if (ret < 0) { -                        gf_msg (this->name, GF_LOG_CRITICAL, errno, -                                GD_MSG_QUOTA_CONF_WRITE_FAIL, "Unable to write " -                                "gfid %s into quota.conf for %s", gfid_str, -                                new_volinfo->volname); -                        ret = -1; -                        goto out; -                } +        gf_uuid_parse(gfid_str, gfid); +        ret = glusterd_quota_conf_write_gfid(fd, gfid, (char)gfid_type); +        if (ret < 0) { +            gf_msg(this->name, GF_LOG_CRITICAL, errno, +                   GD_MSG_QUOTA_CONF_WRITE_FAIL, +                   "Unable to write " +                   "gfid %s into quota.conf for %s", +                   gfid_str, new_volinfo->volname); +            ret = -1; +            goto out;          } +    } -        ret = gf_store_rename_tmppath (new_volinfo->quota_conf_shandle); +    ret = gf_store_rename_tmppath(new_volinfo->quota_conf_shandle); -        ret = 0; +    ret = 0;  out: -        if (!ret) { -                ret = glusterd_compute_cksum (new_volinfo, _gf_true); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_CKSUM_COMPUTE_FAIL, -                                "Failed to compute checksum"); -                        goto clear_quota_conf; -                } - -                ret = glusterd_store_save_quota_version_and_cksum (new_volinfo); -                if (ret) -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_QUOTA_CKSUM_VER_STORE_FAIL, -                                "Failed to save quota version and checksum"); +    if (!ret) { +        ret = glusterd_compute_cksum(new_volinfo, _gf_true); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_CKSUM_COMPUTE_FAIL, +                   "Failed to compute checksum"); +            goto clear_quota_conf;          } +        ret = glusterd_store_save_quota_version_and_cksum(new_volinfo); +        if (ret) +            gf_msg(this->name, GF_LOG_ERROR, 0, +                   GD_MSG_QUOTA_CKSUM_VER_STORE_FAIL, +                   "Failed to save quota version and checksum"); +    } +  clear_quota_conf: -        if (ret && (fd > 0)) { -                gf_store_unlink_tmppath (new_volinfo->quota_conf_shandle); -                (void) gf_store_handle_destroy -                                              (new_volinfo->quota_conf_shandle); -                new_volinfo->quota_conf_shandle = NULL; -        } +    if (ret && (fd > 0)) { +        gf_store_unlink_tmppath(new_volinfo->quota_conf_shandle); +        (void)gf_store_handle_destroy(new_volinfo->quota_conf_shandle); +        new_volinfo->quota_conf_shandle = NULL; +    } -        return ret; +    return ret;  }  int -gd_import_friend_volume_rebal_dict (dict_t *dict, int count, -                                    glusterd_volinfo_t *volinfo) +gd_import_friend_volume_rebal_dict(dict_t *dict, int count, +                                   glusterd_volinfo_t *volinfo)  { -        int  ret        = -1; -        char key[64]   = ""; -        int  dict_count  = 0; -        char prefix[64] = ""; +    int ret = -1; +    char key[64] = ""; +    int dict_count = 0; +    char prefix[64] = ""; -        GF_ASSERT (dict); -        GF_ASSERT (volinfo); +    GF_ASSERT(dict); +    GF_ASSERT(volinfo); -        ret = snprintf (key, sizeof (key), "volume%d.rebal-dict-count", count); -        ret = dict_get_int32n (dict, key, ret, &dict_count); -        if (ret) { -                /* Older peers will not have this dict */ -                ret = 0; -                goto out; -        } +    ret = snprintf(key, sizeof(key), "volume%d.rebal-dict-count", count); +    ret = dict_get_int32n(dict, key, ret, &dict_count); +    if (ret) { +        /* Older peers will not have this dict */ +        ret = 0; +        goto out; +    } -        volinfo->rebal.dict = dict_new (); -        if(!volinfo->rebal.dict) { -                ret = -1; -                goto out; -        } +    volinfo->rebal.dict = dict_new(); +    if (!volinfo->rebal.dict) { +        ret = -1; +        goto out; +    } -        snprintf (prefix, sizeof (prefix), "volume%d", count); -        ret = import_prdict_dict (dict, volinfo->rebal.dict, "rebal-dict-key", -                                  "rebal-dict-value", dict_count, prefix); +    snprintf(prefix, sizeof(prefix), "volume%d", count); +    ret = import_prdict_dict(dict, volinfo->rebal.dict, "rebal-dict-key", +                             "rebal-dict-value", dict_count, prefix);  out: -        if (ret && volinfo->rebal.dict) -                dict_unref (volinfo->rebal.dict); -        gf_msg_debug (THIS->name, 0, "Returning with %d", ret); -        return ret; +    if (ret && volinfo->rebal.dict) +        dict_unref(volinfo->rebal.dict); +    gf_msg_debug(THIS->name, 0, "Returning with %d", ret); +    return ret;  }  /* The prefix represents the type of volume to be added. @@ -4028,2802 +3983,2693 @@ out:   * snap1, snap2, for snapshot volumes   */  int32_t -glusterd_import_volinfo (dict_t *peer_data, int count, -                         glusterd_volinfo_t **volinfo, -                         char *prefix) -{ -        int                ret               = -1; -        char               key[256]          = ""; -        int                keylen; -        char               *parent_volname   = NULL; -        char               *volname          = NULL; -        glusterd_volinfo_t *new_volinfo      = NULL; -        char               *volume_id_str    = NULL; -        char               msg[2048]         = ""; -        char               *str              = NULL; -        char               *rebalance_id_str = NULL; -        int                op_version        = 0; -        int                client_op_version = 0; -        uint32_t           stage_deleted     = 0; - -        GF_ASSERT (peer_data); -        GF_ASSERT (volinfo); -        GF_ASSERT (prefix); - -        keylen = snprintf (key, sizeof (key), "%s%d.name", prefix, count); -        ret = dict_get_strn (peer_data, key, keylen, &volname); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload", key); -                goto out; -        } - -        snprintf (key, sizeof (key), "%s%d.stage_deleted", prefix, count); -        ret = dict_get_uint32 (peer_data, key, &stage_deleted); -        /* stage_deleted = 1 means the volume is still in the process of -         * deleting a volume, so we shouldn't be trying to create a -         * fresh volume here which would lead to a stale entry -        */ -        if (stage_deleted) { -                ret = 0; -                goto out; -        } - -        ret = glusterd_volinfo_new (&new_volinfo); -        if (ret) -                goto out; -        ret = snprintf (new_volinfo->volname, -                        sizeof (new_volinfo->volname), "%s", volname); -        if (ret < 0 || ret >= sizeof (new_volinfo->volname)) { -                ret = -1; -                goto out; -        } -        keylen = snprintf (key, sizeof (key), "%s%d.type", prefix, count); -        ret = dict_get_int32n (peer_data, key, keylen, &new_volinfo->type); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload for %s", -                          key, volname); -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.parent_volname", prefix, -			   count); -        ret = dict_get_strn (peer_data, key, keylen, &parent_volname); -        if (!ret) { -                ret = snprintf (new_volinfo->parent_volname, -                                sizeof(new_volinfo->parent_volname), "%s", -                                parent_volname); -                if (ret < 0 || ret >= sizeof (new_volinfo->volname)) { -                        ret = -1; -                        goto out; -                } -        } -        keylen = snprintf (key, sizeof (key), "%s%d.brick_count", prefix, -			   count); -        ret = dict_get_int32n (peer_data, key, keylen, -			       &new_volinfo->brick_count); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload for %s", -                          key, volname); -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.version", prefix, count); -        ret = dict_get_int32n (peer_data, key, keylen, &new_volinfo->version); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload for %s", -                          key, volname); -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.status", prefix, count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               (int32_t *)&new_volinfo->status); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload for %s", -                          key, volname); -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.sub_count", prefix, count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->sub_count); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload for %s", -                          key, volname); -                goto out; +glusterd_import_volinfo(dict_t *peer_data, int count, +                        glusterd_volinfo_t **volinfo, char *prefix) +{ +    int ret = -1; +    char key[256] = ""; +    int keylen; +    char *parent_volname = NULL; +    char *volname = NULL; +    glusterd_volinfo_t *new_volinfo = NULL; +    char *volume_id_str = NULL; +    char msg[2048] = ""; +    char *str = NULL; +    char *rebalance_id_str = NULL; +    int op_version = 0; +    int client_op_version = 0; +    uint32_t stage_deleted = 0; + +    GF_ASSERT(peer_data); +    GF_ASSERT(volinfo); +    GF_ASSERT(prefix); + +    keylen = snprintf(key, sizeof(key), "%s%d.name", prefix, count); +    ret = dict_get_strn(peer_data, key, keylen, &volname); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload", key); +        goto out; +    } + +    snprintf(key, sizeof(key), "%s%d.stage_deleted", prefix, count); +    ret = dict_get_uint32(peer_data, key, &stage_deleted); +    /* stage_deleted = 1 means the volume is still in the process of +     * deleting a volume, so we shouldn't be trying to create a +     * fresh volume here which would lead to a stale entry +     */ +    if (stage_deleted) { +        ret = 0; +        goto out; +    } + +    ret = glusterd_volinfo_new(&new_volinfo); +    if (ret) +        goto out; +    ret = snprintf(new_volinfo->volname, sizeof(new_volinfo->volname), "%s", +                   volname); +    if (ret < 0 || ret >= sizeof(new_volinfo->volname)) { +        ret = -1; +        goto out; +    } +    keylen = snprintf(key, sizeof(key), "%s%d.type", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &new_volinfo->type); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload for %s", key, +                 volname); +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.parent_volname", prefix, count); +    ret = dict_get_strn(peer_data, key, keylen, &parent_volname); +    if (!ret) { +        ret = snprintf(new_volinfo->parent_volname, +                       sizeof(new_volinfo->parent_volname), "%s", +                       parent_volname); +        if (ret < 0 || ret >= sizeof(new_volinfo->volname)) { +            ret = -1; +            goto out;          } - -        /* not having a 'stripe_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.stripe_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->stripe_count); -        if (ret) -                gf_msg (THIS->name, GF_LOG_INFO, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "peer is possibly old version"); - -        /* not having a 'replica_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.replica_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->replica_count); -        if (ret) -                gf_msg (THIS->name, GF_LOG_INFO, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "peer is possibly old version"); - -        /* not having a 'arbiter_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.arbiter_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->arbiter_count); -        if (ret) -                gf_msg (THIS->name, GF_LOG_INFO, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "peer is possibly old version"); - -        /* not having a 'disperse_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.disperse_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->disperse_count); -        if (ret) -                gf_msg (THIS->name, GF_LOG_INFO, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "peer is possibly old version"); - -        /* not having a 'redundancy_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.redundancy_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->redundancy_count); -        if (ret) -                gf_msg (THIS->name, GF_LOG_INFO, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "peer is possibly old version"); - -        /* not having a 'dist_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.dist_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->dist_leaf_count); -        if (ret) -                gf_msg (THIS->name, GF_LOG_INFO, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "peer is possibly old version"); - -        /* not having a 'hot_brick_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.hot_brick_count", prefix, count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->tier_info.hot_brick_count); -        if (ret) -                gf_msg_debug (THIS->name, 0, -                        "peer is possibly old version"); - -        /* not having a 'hot_type' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.hot_type", prefix, count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->tier_info.hot_type); -        if (ret) -                gf_msg_debug (THIS->name, 0, -                        "peer is possibly old version"); - -        /* not having a 'hot_replica_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.hot_replica_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->tier_info.hot_replica_count); -        if (ret) -                gf_msg_debug (THIS->name, 0, -                        "peer is possibly old version"); - -        /* not having a 'cold_brick_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.cold_brick_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->tier_info.cold_brick_count); -        if (ret) -                gf_msg_debug (THIS->name, 0, -                        "peer is possibly old version"); - -        /* not having a 'cold_type' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.cold_type", prefix, count); -        ret = dict_get_int32n  (peer_data, key, keylen, -                               &new_volinfo->tier_info.cold_type); -        if (ret) -                gf_msg_debug (THIS->name, 0, -                        "peer is possibly old version"); - -        /* not having a 'cold_replica_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.cold_replica_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                              &new_volinfo->tier_info.cold_replica_count); -        if (ret) -                gf_msg_debug (THIS->name, 0, -                        "peer is possibly old version"); - -        /* not having a 'cold_disperse_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.cold_disperse_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->tier_info.cold_disperse_count); -        if (ret) -                gf_msg_debug (THIS->name, 0, -                        "peer is possibly old version"); - -        /* not having a 'cold_redundancy_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.cold_redundancy_count", -                               prefix, count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->tier_info.cold_redundancy_count); -        if (ret) -                gf_msg_debug (THIS->name, 0, -                        "peer is possibly old version"); - -        /* not having a 'cold_dist_count' key is not a error -           (as peer may be of old version) */ -        keylen = snprintf (key, sizeof (key), "%s%d.cold_dist_count", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->tier_info.cold_dist_leaf_count); +    } +    keylen = snprintf(key, sizeof(key), "%s%d.brick_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &new_volinfo->brick_count); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload for %s", key, +                 volname); +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.version", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &new_volinfo->version); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload for %s", key, +                 volname); +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.status", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          (int32_t *)&new_volinfo->status); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload for %s", key, +                 volname); +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.sub_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &new_volinfo->sub_count); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload for %s", key, +                 volname); +        goto out; +    } + +    /* not having a 'stripe_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.stripe_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &new_volinfo->stripe_count); +    if (ret) +        gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +               "peer is possibly old version"); + +    /* not having a 'replica_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.replica_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &new_volinfo->replica_count); +    if (ret) +        gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +               "peer is possibly old version"); + +    /* not having a 'arbiter_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.arbiter_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &new_volinfo->arbiter_count); +    if (ret) +        gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +               "peer is possibly old version"); + +    /* not having a 'disperse_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.disperse_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &new_volinfo->disperse_count); +    if (ret) +        gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +               "peer is possibly old version"); + +    /* not having a 'redundancy_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.redundancy_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->redundancy_count); +    if (ret) +        gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +               "peer is possibly old version"); + +    /* not having a 'dist_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.dist_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->dist_leaf_count); +    if (ret) +        gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +               "peer is possibly old version"); + +    /* not having a 'hot_brick_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.hot_brick_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->tier_info.hot_brick_count); +    if (ret) +        gf_msg_debug(THIS->name, 0, "peer is possibly old version"); + +    /* not having a 'hot_type' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.hot_type", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->tier_info.hot_type); +    if (ret) +        gf_msg_debug(THIS->name, 0, "peer is possibly old version"); + +    /* not having a 'hot_replica_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.hot_replica_count", prefix, +                      count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->tier_info.hot_replica_count); +    if (ret) +        gf_msg_debug(THIS->name, 0, "peer is possibly old version"); + +    /* not having a 'cold_brick_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.cold_brick_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->tier_info.cold_brick_count); +    if (ret) +        gf_msg_debug(THIS->name, 0, "peer is possibly old version"); + +    /* not having a 'cold_type' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.cold_type", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->tier_info.cold_type); +    if (ret) +        gf_msg_debug(THIS->name, 0, "peer is possibly old version"); + +    /* not having a 'cold_replica_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.cold_replica_count", prefix, +                      count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->tier_info.cold_replica_count); +    if (ret) +        gf_msg_debug(THIS->name, 0, "peer is possibly old version"); + +    /* not having a 'cold_disperse_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.cold_disperse_count", prefix, +                      count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->tier_info.cold_disperse_count); +    if (ret) +        gf_msg_debug(THIS->name, 0, "peer is possibly old version"); + +    /* not having a 'cold_redundancy_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.cold_redundancy_count", prefix, +                      count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->tier_info.cold_redundancy_count); +    if (ret) +        gf_msg_debug(THIS->name, 0, "peer is possibly old version"); + +    /* not having a 'cold_dist_count' key is not a error +       (as peer may be of old version) */ +    keylen = snprintf(key, sizeof(key), "%s%d.cold_dist_count", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->tier_info.cold_dist_leaf_count); +    if (ret) +        gf_msg_debug(THIS->name, 0, "peer is possibly old version"); + +    new_volinfo->subvol_count = new_volinfo->brick_count / +                                glusterd_get_dist_leaf_count(new_volinfo); +    snprintf(key, sizeof(key), "%s%d.ckusm", prefix, count); +    ret = dict_get_uint32(peer_data, key, &new_volinfo->cksum); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload for %s", key, +                 volname); +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.volume_id", prefix, count); +    ret = dict_get_strn(peer_data, key, keylen, &volume_id_str); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload for %s", key, +                 volname); +        goto out; +    } + +    gf_uuid_parse(volume_id_str, new_volinfo->volume_id); + +    keylen = snprintf(key, sizeof(key), "%s%d.username", prefix, count); +    ret = dict_get_strn(peer_data, key, keylen, &str); +    if (!ret) { +        ret = glusterd_auth_set_username(new_volinfo, str);          if (ret) -                gf_msg_debug (THIS->name, 0, -                        "peer is possibly old version"); - -        new_volinfo->subvol_count = new_volinfo->brick_count/ -                                    glusterd_get_dist_leaf_count (new_volinfo); -        snprintf (key, sizeof (key), "%s%d.ckusm", prefix, count); -        ret = dict_get_uint32 (peer_data, key, &new_volinfo->cksum); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload for %s", -                          key, volname); -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.volume_id", prefix, count); -        ret = dict_get_strn (peer_data, key, keylen, &volume_id_str); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload for %s", -                          key, volname); -                goto out; -        } - -        gf_uuid_parse (volume_id_str, new_volinfo->volume_id); - -        keylen = snprintf (key, sizeof (key), "%s%d.username", prefix, count); -        ret = dict_get_strn (peer_data, key, keylen, &str); -        if (!ret) { -                ret = glusterd_auth_set_username (new_volinfo, str); -                if (ret) -                        goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.password", prefix, count); -        ret = dict_get_strn (peer_data, key, keylen, &str); -        if (!ret) { -                ret = glusterd_auth_set_password (new_volinfo, str); -                if (ret) -                        goto out; -        } - -        snprintf (key, sizeof (key), "%s%d.transport_type", prefix, count); -        ret = dict_get_uint32 (peer_data, key, &new_volinfo->transport_type); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload for %s", -                          key, volname); -                goto out; -        } - -        snprintf (key, sizeof (key), "%s%d.rebalance", prefix, count); -        ret = dict_get_uint32 (peer_data, key, &new_volinfo->rebal.defrag_cmd); -        if (ret) { -                snprintf (msg, sizeof (msg), "%s missing in payload for %s", -                          key, volname); -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.rebalance-id", prefix, -                           count); -        ret = dict_get_strn (peer_data, key, keylen, &rebalance_id_str); -        if (ret) { -                /* This is not present in older glusterfs versions, -                 * so don't error out -                 */ -                ret = 0; -        } else { -                gf_uuid_parse (rebalance_id_str, -                               new_volinfo->rebal.rebalance_id); -        } - -        snprintf (key, sizeof (key), "%s%d.rebalance-op", prefix, count); -        ret = dict_get_uint32 (peer_data, key, -                               (uint32_t *) &new_volinfo->rebal.op); -        if (ret) { -                /* This is not present in older glusterfs versions, -                 * so don't error out -                 */ -                ret = 0; -        } -        ret = gd_import_friend_volume_rebal_dict (peer_data, count, -                                                  new_volinfo); -        if (ret) { -                snprintf (msg, sizeof (msg), "Failed to import rebalance dict " -                          "for volume."); -                goto out; -        } - -        snprintf (key, sizeof (key), "%s%d", prefix, count); -        ret = gd_import_volume_snap_details (peer_data, new_volinfo, key, -                                             volname); -        if (ret) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_SNAP_DETAILS_IMPORT_FAIL, -                        "Failed to import snapshot " -                        "details for volume %s", volname); -                goto out; -        } +            goto out; +    } -        ret = glusterd_import_friend_volume_opts (peer_data, count, -                                                  new_volinfo, prefix); +    keylen = snprintf(key, sizeof(key), "%s%d.password", prefix, count); +    ret = dict_get_strn(peer_data, key, keylen, &str); +    if (!ret) { +        ret = glusterd_auth_set_password(new_volinfo, str);          if (ret) -                goto out; - -        /* Import the volume's op-versions if available else set it to 1. -         * Not having op-versions implies this informtation was obtained from a -         * op-version 1 friend (gluster-3.3), ergo the cluster is at op-version -         * 1 and all volumes are at op-versions 1. -         * -         * Either both the volume op-versions should be absent or both should be -         * present. Only one being present is a failure +            goto out; +    } + +    snprintf(key, sizeof(key), "%s%d.transport_type", prefix, count); +    ret = dict_get_uint32(peer_data, key, &new_volinfo->transport_type); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload for %s", key, +                 volname); +        goto out; +    } + +    snprintf(key, sizeof(key), "%s%d.rebalance", prefix, count); +    ret = dict_get_uint32(peer_data, key, &new_volinfo->rebal.defrag_cmd); +    if (ret) { +        snprintf(msg, sizeof(msg), "%s missing in payload for %s", key, +                 volname); +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.rebalance-id", prefix, count); +    ret = dict_get_strn(peer_data, key, keylen, &rebalance_id_str); +    if (ret) { +        /* This is not present in older glusterfs versions, +         * so don't error out           */ -        keylen = snprintf (key, sizeof (key), "%s%d.op-version", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, &op_version); -        if (ret) -                ret = 0; -        keylen = snprintf (key, sizeof (key), "%s%d.client-op-version", prefix, -                           count); -        ret = dict_get_int32n (peer_data, key, keylen, &client_op_version); -        if (ret) -                ret = 0; - -        if (op_version && client_op_version) { -                new_volinfo->op_version = op_version; -                new_volinfo->client_op_version = client_op_version; -        } else if (((op_version == 0) && (client_op_version != 0)) || -                   ((op_version != 0) && (client_op_version == 0))) { -                ret = -1; -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Only one volume op-version found"); -                goto out; -        } else { -                new_volinfo->op_version = 1; -                new_volinfo->client_op_version = 1; -        } - -        keylen = snprintf (key, sizeof (key), "%s%d.caps", prefix, count); -        /*This is not present in older glusterfs versions, so ignore ret value*/ -        ret = dict_get_int32n (peer_data, key, keylen, &new_volinfo->caps); - -        keylen = snprintf (key, sizeof (key), "%s%d.quota-xattr-version", -                           prefix, count); -        /*This is not present in older glusterfs versions, so ignore ret value*/ -        ret = dict_get_int32n (peer_data, key, keylen, -                               &new_volinfo->quota_xattr_version); - -        ret = glusterd_import_bricks (peer_data, count, new_volinfo, prefix); -        if (ret) -                goto out; +        ret = 0; +    } else { +        gf_uuid_parse(rebalance_id_str, new_volinfo->rebal.rebalance_id); +    } + +    snprintf(key, sizeof(key), "%s%d.rebalance-op", prefix, count); +    ret = dict_get_uint32(peer_data, key, (uint32_t *)&new_volinfo->rebal.op); +    if (ret) { +        /* This is not present in older glusterfs versions, +         * so don't error out +         */ +        ret = 0; +    } +    ret = gd_import_friend_volume_rebal_dict(peer_data, count, new_volinfo); +    if (ret) { +        snprintf(msg, sizeof(msg), +                 "Failed to import rebalance dict " +                 "for volume."); +        goto out; +    } + +    snprintf(key, sizeof(key), "%s%d", prefix, count); +    ret = gd_import_volume_snap_details(peer_data, new_volinfo, key, volname); +    if (ret) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_SNAP_DETAILS_IMPORT_FAIL, +               "Failed to import snapshot " +               "details for volume %s", +               volname); +        goto out; +    } + +    ret = glusterd_import_friend_volume_opts(peer_data, count, new_volinfo, +                                             prefix); +    if (ret) +        goto out; + +    /* Import the volume's op-versions if available else set it to 1. +     * Not having op-versions implies this informtation was obtained from a +     * op-version 1 friend (gluster-3.3), ergo the cluster is at op-version +     * 1 and all volumes are at op-versions 1. +     * +     * Either both the volume op-versions should be absent or both should be +     * present. Only one being present is a failure +     */ +    keylen = snprintf(key, sizeof(key), "%s%d.op-version", prefix, count); +    ret = dict_get_int32n(peer_data, key, keylen, &op_version); +    if (ret) +        ret = 0; +    keylen = snprintf(key, sizeof(key), "%s%d.client-op-version", prefix, +                      count); +    ret = dict_get_int32n(peer_data, key, keylen, &client_op_version); +    if (ret) +        ret = 0; -        *volinfo = new_volinfo; -out: -        if (msg[0]) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_VOLINFO_IMPORT_FAIL, "%s", msg); -                gf_event (EVENT_IMPORT_VOLUME_FAILED, "volume=%s", -                          new_volinfo->volname); -        } -        gf_msg_debug ("glusterd", 0, "Returning with %d", ret); -        return ret; +    if (op_version && client_op_version) { +        new_volinfo->op_version = op_version; +        new_volinfo->client_op_version = client_op_version; +    } else if (((op_version == 0) && (client_op_version != 0)) || +               ((op_version != 0) && (client_op_version == 0))) { +        ret = -1; +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Only one volume op-version found"); +        goto out; +    } else { +        new_volinfo->op_version = 1; +        new_volinfo->client_op_version = 1; +    } + +    keylen = snprintf(key, sizeof(key), "%s%d.caps", prefix, count); +    /*This is not present in older glusterfs versions, so ignore ret value*/ +    ret = dict_get_int32n(peer_data, key, keylen, &new_volinfo->caps); + +    keylen = snprintf(key, sizeof(key), "%s%d.quota-xattr-version", prefix, +                      count); +    /*This is not present in older glusterfs versions, so ignore ret value*/ +    ret = dict_get_int32n(peer_data, key, keylen, +                          &new_volinfo->quota_xattr_version); + +    ret = glusterd_import_bricks(peer_data, count, new_volinfo, prefix); +    if (ret) +        goto out; + +    *volinfo = new_volinfo; +out: +    if (msg[0]) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_VOLINFO_IMPORT_FAIL, "%s", +               msg); +        gf_event(EVENT_IMPORT_VOLUME_FAILED, "volume=%s", new_volinfo->volname); +    } +    gf_msg_debug("glusterd", 0, "Returning with %d", ret); +    return ret;  }  int32_t -glusterd_volume_disconnect_all_bricks (glusterd_volinfo_t *volinfo) -{ -        int                      ret        = 0; -        glusterd_brickinfo_t    *brickinfo  = NULL; -        glusterd_brick_proc_t   *brick_proc = NULL; -        int                      brick_count = 0; - -        GF_ASSERT (volinfo); - -        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                if (glusterd_is_brick_started (brickinfo)) { -                        /* If brick multiplexing is enabled then we can't -                         * blindly set brickinfo->rpc to NULL as it might impact -                         * the other attached bricks. -                         */ -                        ret = glusterd_brick_proc_for_port (brickinfo->port, -                                                            &brick_proc); -                        if (!ret) { -                                brick_count = brick_proc->brick_count; -                        } -                        if (!is_brick_mx_enabled () || brick_count == 0) { -                                ret = glusterd_brick_disconnect (brickinfo); -                                if (ret) { -                                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                                GD_MSD_BRICK_DISCONNECT_FAIL, -                                                "Failed to " -                                                "disconnect %s:%s", -                                                brickinfo->hostname, -                                                brickinfo->path); -                                        break; -                                } -                        } +glusterd_volume_disconnect_all_bricks(glusterd_volinfo_t *volinfo) +{ +    int ret = 0; +    glusterd_brickinfo_t *brickinfo = NULL; +    glusterd_brick_proc_t *brick_proc = NULL; +    int brick_count = 0; + +    GF_ASSERT(volinfo); + +    cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        if (glusterd_is_brick_started(brickinfo)) { +            /* If brick multiplexing is enabled then we can't +             * blindly set brickinfo->rpc to NULL as it might impact +             * the other attached bricks. +             */ +            ret = glusterd_brick_proc_for_port(brickinfo->port, &brick_proc); +            if (!ret) { +                brick_count = brick_proc->brick_count; +            } +            if (!is_brick_mx_enabled() || brick_count == 0) { +                ret = glusterd_brick_disconnect(brickinfo); +                if (ret) { +                    gf_msg("glusterd", GF_LOG_ERROR, 0, +                           GD_MSD_BRICK_DISCONNECT_FAIL, +                           "Failed to " +                           "disconnect %s:%s", +                           brickinfo->hostname, brickinfo->path); +                    break;                  } +            }          } +    } -        return ret; +    return ret;  }  int32_t -glusterd_volinfo_copy_brickinfo (glusterd_volinfo_t *old_volinfo, -                                 glusterd_volinfo_t *new_volinfo) -{ -        glusterd_brickinfo_t   *new_brickinfo       = NULL; -        glusterd_brickinfo_t   *old_brickinfo       = NULL; -        glusterd_conf_t        *priv                = NULL; -        int                     ret                 = 0; -        xlator_t               *this                = NULL; -        char                    abspath[PATH_MAX]   = ""; - -        GF_ASSERT (new_volinfo); -        GF_ASSERT (old_volinfo); -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); - -        cds_list_for_each_entry (new_brickinfo, &new_volinfo->bricks, -                                 brick_list) { -                ret = glusterd_volume_brickinfo_get (new_brickinfo->uuid, -                                                     new_brickinfo->hostname, -                                                     new_brickinfo->path, -                                                     old_volinfo, -                                                     &old_brickinfo); -                if (ret == 0) { -                        new_brickinfo->port = old_brickinfo->port; - -                            if (old_brickinfo->real_path[0] == '\0') { -                                if (!realpath (new_brickinfo->path, abspath)) { -                                        /* Here an ENOENT should also be a -                                         * failure as the brick is expected to -                                         * be in existence -                                         */ -                                        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)); -                        } else { -                                strncpy (new_brickinfo->real_path, -                                         old_brickinfo->real_path, -                                         strlen (old_brickinfo->real_path)); -                        } +glusterd_volinfo_copy_brickinfo(glusterd_volinfo_t *old_volinfo, +                                glusterd_volinfo_t *new_volinfo) +{ +    glusterd_brickinfo_t *new_brickinfo = NULL; +    glusterd_brickinfo_t *old_brickinfo = NULL; +    glusterd_conf_t *priv = NULL; +    int ret = 0; +    xlator_t *this = NULL; +    char abspath[PATH_MAX] = ""; + +    GF_ASSERT(new_volinfo); +    GF_ASSERT(old_volinfo); +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); + +    cds_list_for_each_entry(new_brickinfo, &new_volinfo->bricks, brick_list) +    { +        ret = glusterd_volume_brickinfo_get( +            new_brickinfo->uuid, new_brickinfo->hostname, new_brickinfo->path, +            old_volinfo, &old_brickinfo); +        if (ret == 0) { +            new_brickinfo->port = old_brickinfo->port; + +            if (old_brickinfo->real_path[0] == '\0') { +                if (!realpath(new_brickinfo->path, abspath)) { +                    /* Here an ENOENT should also be a +                     * failure as the brick is expected to +                     * be in existence +                     */ +                    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)); +            } else { +                strncpy(new_brickinfo->real_path, old_brickinfo->real_path, +                        strlen(old_brickinfo->real_path)); +            }          } -        ret = 0; +    } +    ret = 0;  out: -        return ret; +    return ret;  }  int32_t -glusterd_volinfo_stop_stale_bricks (glusterd_volinfo_t *new_volinfo, -                                    glusterd_volinfo_t *old_volinfo) -{ -        glusterd_brickinfo_t *new_brickinfo = NULL; -        glusterd_brickinfo_t *old_brickinfo = NULL; - -        int             ret = 0; -        GF_ASSERT (new_volinfo); -        GF_ASSERT (old_volinfo); -        if (_gf_false == glusterd_is_volume_started (old_volinfo)) -                goto out; -        cds_list_for_each_entry (old_brickinfo, &old_volinfo->bricks, -                                 brick_list) { -                ret = glusterd_volume_brickinfo_get (old_brickinfo->uuid, -                                                     old_brickinfo->hostname, -                                                     old_brickinfo->path, -                                                     new_volinfo, -                                                     &new_brickinfo); -                /* If the brick is stale, i.e it's not a part of the new volume -                 * or if it's part of the new volume and is pending a snap, -                 * then stop the brick process -                 */ -                if (ret || (new_brickinfo->snap_status == -1)) { -                        /*TODO: may need to switch to 'atomic' flavour of -                         * brick_stop, once we make peer rpc program also -                         * synctask enabled*/ -                        ret = glusterd_brick_stop (old_volinfo, old_brickinfo, -                                                   _gf_false); -                        if (ret) -                                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                        GD_MSG_BRICK_STOP_FAIL, "Failed to stop" -                                        " brick %s:%s", old_brickinfo->hostname, -                                        old_brickinfo->path); -                } +glusterd_volinfo_stop_stale_bricks(glusterd_volinfo_t *new_volinfo, +                                   glusterd_volinfo_t *old_volinfo) +{ +    glusterd_brickinfo_t *new_brickinfo = NULL; +    glusterd_brickinfo_t *old_brickinfo = NULL; + +    int ret = 0; +    GF_ASSERT(new_volinfo); +    GF_ASSERT(old_volinfo); +    if (_gf_false == glusterd_is_volume_started(old_volinfo)) +        goto out; +    cds_list_for_each_entry(old_brickinfo, &old_volinfo->bricks, brick_list) +    { +        ret = glusterd_volume_brickinfo_get( +            old_brickinfo->uuid, old_brickinfo->hostname, old_brickinfo->path, +            new_volinfo, &new_brickinfo); +        /* If the brick is stale, i.e it's not a part of the new volume +         * or if it's part of the new volume and is pending a snap, +         * then stop the brick process +         */ +        if (ret || (new_brickinfo->snap_status == -1)) { +            /*TODO: may need to switch to 'atomic' flavour of +             * brick_stop, once we make peer rpc program also +             * synctask enabled*/ +            ret = glusterd_brick_stop(old_volinfo, old_brickinfo, _gf_false); +            if (ret) +                gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_BRICK_STOP_FAIL, +                       "Failed to stop" +                       " brick %s:%s", +                       old_brickinfo->hostname, old_brickinfo->path);          } -        ret = 0; +    } +    ret = 0;  out: -        gf_msg_debug ("glusterd", 0, "Returning with %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning with %d", ret); +    return ret;  }  int32_t -glusterd_delete_stale_volume (glusterd_volinfo_t *stale_volinfo, -                              glusterd_volinfo_t *valid_volinfo) -{ -        int32_t                  ret            = -1; -        glusterd_volinfo_t      *temp_volinfo   = NULL; -        glusterd_volinfo_t      *voliter        = NULL; -        xlator_t                *this           = NULL; -        glusterd_svc_t          *svc            = NULL; - -        GF_ASSERT (stale_volinfo); -        GF_ASSERT (valid_volinfo); -        this = THIS; -        GF_ASSERT (this); - -        /* Copy snap_volumes list from stale_volinfo to valid_volinfo */ -        valid_volinfo->snap_count = 0; -        cds_list_for_each_entry_safe (voliter, temp_volinfo, -                                      &stale_volinfo->snap_volumes, -                                      snapvol_list) { -                cds_list_add_tail (&voliter->snapvol_list, -                                   &valid_volinfo->snap_volumes); -                valid_volinfo->snap_count++; -        } - -        if ((!gf_uuid_is_null (stale_volinfo->restored_from_snap)) && -            (gf_uuid_compare (stale_volinfo->restored_from_snap, -                           valid_volinfo->restored_from_snap))) { -                ret = glusterd_lvm_snapshot_remove (NULL, stale_volinfo); -                if (ret) { -                        gf_msg(this->name, GF_LOG_WARNING, 0, -                                GD_MSG_SNAP_REMOVE_FAIL, -                               "Failed to remove lvm snapshot for " -                               "restored volume %s", stale_volinfo->volname); -                } -        } - -        /* If stale volume is in started state, stop the stale bricks if the new -         * volume is started else, stop all bricks. -         * We don't want brick_rpc_notify to access already deleted brickinfo, -         * so disconnect all bricks from stale_volinfo (unconditionally), since -         * they are being deleted subsequently. -         */ -        if (glusterd_is_volume_started (stale_volinfo)) { -                if (glusterd_is_volume_started (valid_volinfo)) { -                        (void) glusterd_volinfo_stop_stale_bricks (valid_volinfo, -                                                                   stale_volinfo); +glusterd_delete_stale_volume(glusterd_volinfo_t *stale_volinfo, +                             glusterd_volinfo_t *valid_volinfo) +{ +    int32_t ret = -1; +    glusterd_volinfo_t *temp_volinfo = NULL; +    glusterd_volinfo_t *voliter = NULL; +    xlator_t *this = NULL; +    glusterd_svc_t *svc = NULL; + +    GF_ASSERT(stale_volinfo); +    GF_ASSERT(valid_volinfo); +    this = THIS; +    GF_ASSERT(this); + +    /* Copy snap_volumes list from stale_volinfo to valid_volinfo */ +    valid_volinfo->snap_count = 0; +    cds_list_for_each_entry_safe(voliter, temp_volinfo, +                                 &stale_volinfo->snap_volumes, snapvol_list) +    { +        cds_list_add_tail(&voliter->snapvol_list, &valid_volinfo->snap_volumes); +        valid_volinfo->snap_count++; +    } + +    if ((!gf_uuid_is_null(stale_volinfo->restored_from_snap)) && +        (gf_uuid_compare(stale_volinfo->restored_from_snap, +                         valid_volinfo->restored_from_snap))) { +        ret = glusterd_lvm_snapshot_remove(NULL, stale_volinfo); +        if (ret) { +            gf_msg(this->name, GF_LOG_WARNING, 0, GD_MSG_SNAP_REMOVE_FAIL, +                   "Failed to remove lvm snapshot for " +                   "restored volume %s", +                   stale_volinfo->volname); +        } +    } + +    /* If stale volume is in started state, stop the stale bricks if the new +     * volume is started else, stop all bricks. +     * We don't want brick_rpc_notify to access already deleted brickinfo, +     * so disconnect all bricks from stale_volinfo (unconditionally), since +     * they are being deleted subsequently. +     */ +    if (glusterd_is_volume_started(stale_volinfo)) { +        if (glusterd_is_volume_started(valid_volinfo)) { +            (void)glusterd_volinfo_stop_stale_bricks(valid_volinfo, +                                                     stale_volinfo); -                } else { -                        (void) glusterd_stop_bricks (stale_volinfo); -                } - -                (void) glusterd_volume_disconnect_all_bricks (stale_volinfo); -        } -        /* Delete all the bricks and stores and vol files. They will be created -         * again by the valid_volinfo. Volume store delete should not be -         * performed because some of the bricks could still be running, -         * keeping pid files under run directory -         */ -        (void) glusterd_delete_all_bricks (stale_volinfo); -        if (stale_volinfo->shandle) { -                sys_unlink (stale_volinfo->shandle->path); -                (void) gf_store_handle_destroy (stale_volinfo->shandle); -                stale_volinfo->shandle = NULL; +        } else { +            (void)glusterd_stop_bricks(stale_volinfo);          } -        /* Marking volume as stopped, so that svc manager stops snapd -         * and we are deleting the volume. -         */ -        stale_volinfo->status = GLUSTERD_STATUS_STOPPED; +        (void)glusterd_volume_disconnect_all_bricks(stale_volinfo); +    } +    /* Delete all the bricks and stores and vol files. They will be created +     * again by the valid_volinfo. Volume store delete should not be +     * performed because some of the bricks could still be running, +     * keeping pid files under run directory +     */ +    (void)glusterd_delete_all_bricks(stale_volinfo); +    if (stale_volinfo->shandle) { +        sys_unlink(stale_volinfo->shandle->path); +        (void)gf_store_handle_destroy(stale_volinfo->shandle); +        stale_volinfo->shandle = NULL; +    } -        if (!stale_volinfo->is_snap_volume) { -                svc = &(stale_volinfo->snapd.svc); -                (void) svc->manager (svc, stale_volinfo, PROC_START_NO_WAIT); -        } -        (void) glusterd_volinfo_remove (stale_volinfo); +    /* Marking volume as stopped, so that svc manager stops snapd +     * and we are deleting the volume. +     */ +    stale_volinfo->status = GLUSTERD_STATUS_STOPPED; -        return 0; +    if (!stale_volinfo->is_snap_volume) { +        svc = &(stale_volinfo->snapd.svc); +        (void)svc->manager(svc, stale_volinfo, PROC_START_NO_WAIT); +    } +    (void)glusterd_volinfo_remove(stale_volinfo); + +    return 0;  }  /* This function updates the rebalance information of the new volinfo using the   * information from the old volinfo.   */  int -gd_check_and_update_rebalance_info (glusterd_volinfo_t *old_volinfo, -                                    glusterd_volinfo_t *new_volinfo) +gd_check_and_update_rebalance_info(glusterd_volinfo_t *old_volinfo, +                                   glusterd_volinfo_t *new_volinfo)  { -        int                  ret  = -1; -        glusterd_rebalance_t *old = NULL; -        glusterd_rebalance_t *new = NULL; +    int ret = -1; +    glusterd_rebalance_t *old = NULL; +    glusterd_rebalance_t *new = NULL; -        GF_ASSERT (old_volinfo); -        GF_ASSERT (new_volinfo); +    GF_ASSERT(old_volinfo); +    GF_ASSERT(new_volinfo); -        old = &(old_volinfo->rebal); -        new = &(new_volinfo->rebal); +    old = &(old_volinfo->rebal); +    new = &(new_volinfo->rebal); -        //Disconnect from rebalance process -        if (glusterd_defrag_rpc_get (old->defrag)) { -                rpc_transport_disconnect (old->defrag->rpc->conn.trans, -                                          _gf_false); -                glusterd_defrag_rpc_put (old->defrag); -        } +    // Disconnect from rebalance process +    if (glusterd_defrag_rpc_get(old->defrag)) { +        rpc_transport_disconnect(old->defrag->rpc->conn.trans, _gf_false); +        glusterd_defrag_rpc_put(old->defrag); +    } -        if (!gf_uuid_is_null (old->rebalance_id) && -            gf_uuid_compare (old->rebalance_id, new->rebalance_id)) { -                (void)gd_stop_rebalance_process (old_volinfo); -                goto out; -        } +    if (!gf_uuid_is_null(old->rebalance_id) && +        gf_uuid_compare(old->rebalance_id, new->rebalance_id)) { +        (void)gd_stop_rebalance_process(old_volinfo); +        goto out; +    } -        /* If the tasks match, copy the status and other information of the -         * rebalance process from old_volinfo to new_volinfo -         */ -        new->defrag_status      = old->defrag_status; -        new->rebalance_files    = old->rebalance_files; -        new->rebalance_data     = old->rebalance_data; -        new->lookedup_files     = old->lookedup_files; -        new->skipped_files      = old->skipped_files; -        new->rebalance_failures = old->rebalance_failures; -        new->rebalance_time     = old->rebalance_time; - -        /* glusterd_rebalance_t.{op, id, defrag_cmd} are copied during volume -         * import -         * a new defrag object should come to life with rebalance being restarted -         */ +    /* If the tasks match, copy the status and other information of the +     * rebalance process from old_volinfo to new_volinfo +     */ +    new->defrag_status = old->defrag_status; +    new->rebalance_files = old->rebalance_files; +    new->rebalance_data = old->rebalance_data; +    new->lookedup_files = old->lookedup_files; +    new->skipped_files = old->skipped_files; +    new->rebalance_failures = old->rebalance_failures; +    new->rebalance_time = old->rebalance_time; + +    /* glusterd_rebalance_t.{op, id, defrag_cmd} are copied during volume +     * import +     * a new defrag object should come to life with rebalance being restarted +     */  out: -        return ret; +    return ret;  }  int32_t -glusterd_import_friend_volume (dict_t *peer_data, int count) -{ - -        int32_t                 ret = -1; -        glusterd_conf_t         *priv = NULL; -        xlator_t                *this = NULL; -        glusterd_volinfo_t      *old_volinfo = NULL; -        glusterd_volinfo_t      *new_volinfo = NULL; -        glusterd_svc_t          *svc         = NULL; -        int32_t                  update      = 0; -        char                     key[64]    = ""; - -        GF_ASSERT (peer_data); - -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); - -        ret = snprintf (key, sizeof (key), "volume%d.update", count); -        ret = dict_get_int32n (peer_data, key, ret, &update); -        if (ret || !update) { -                /* if update is 0 that means the volume is not imported */ -                goto out; +glusterd_import_friend_volume(dict_t *peer_data, int count) +{ +    int32_t ret = -1; +    glusterd_conf_t *priv = NULL; +    xlator_t *this = NULL; +    glusterd_volinfo_t *old_volinfo = NULL; +    glusterd_volinfo_t *new_volinfo = NULL; +    glusterd_svc_t *svc = NULL; +    int32_t update = 0; +    char key[64] = ""; + +    GF_ASSERT(peer_data); + +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); + +    ret = snprintf(key, sizeof(key), "volume%d.update", count); +    ret = dict_get_int32n(peer_data, key, ret, &update); +    if (ret || !update) { +        /* if update is 0 that means the volume is not imported */ +        goto out; +    } + +    ret = glusterd_import_volinfo(peer_data, count, &new_volinfo, "volume"); +    if (ret) +        goto out; + +    if (!new_volinfo) { +        gf_msg_debug(this->name, 0, "Not importing snap volume"); +        goto out; +    } + +    ret = glusterd_volinfo_find(new_volinfo->volname, &old_volinfo); +    if (0 == ret) { +        if (new_volinfo->version <= old_volinfo->version) { +            /* When this condition is true, it already means that +             * the other synctask thread of import volume has +             * already up to date volume, so just ignore this volume +             * now +             */ +            goto out;          } +        /* Ref count the old_volinfo such that deleting it doesn't crash +         * if its been already in use by other thread +         */ +        glusterd_volinfo_ref(old_volinfo); +        (void)gd_check_and_update_rebalance_info(old_volinfo, new_volinfo); -        ret = glusterd_import_volinfo (peer_data, count, -                                       &new_volinfo, "volume"); -        if (ret) -                goto out; - -        if (!new_volinfo) { -                gf_msg_debug (this->name, 0, -                        "Not importing snap volume"); -                goto out; -        } +        /* Copy brick ports & real_path from the old volinfo always. +         * The old_volinfo will be cleaned up and this information +         * could be lost +         */ +        (void)glusterd_volinfo_copy_brickinfo(old_volinfo, new_volinfo); -        ret = glusterd_volinfo_find (new_volinfo->volname, &old_volinfo); -        if (0 == ret) { -                if (new_volinfo->version <= old_volinfo->version) { -                        /* When this condition is true, it already means that -                         * the other synctask thread of import volume has -                         * already up to date volume, so just ignore this volume -                         * now -                         */ -                        goto out; -                } -                /* Ref count the old_volinfo such that deleting it doesn't crash -                 * if its been already in use by other thread -                 */ -                glusterd_volinfo_ref (old_volinfo); -                (void) gd_check_and_update_rebalance_info (old_volinfo, -                                                           new_volinfo); +        (void)glusterd_delete_stale_volume(old_volinfo, new_volinfo); +        glusterd_volinfo_unref(old_volinfo); +    } -                /* Copy brick ports & real_path from the old volinfo always. -                 * The old_volinfo will be cleaned up and this information -                 * could be lost -                 */ -                (void) glusterd_volinfo_copy_brickinfo (old_volinfo, -                                                        new_volinfo); - -                (void) glusterd_delete_stale_volume (old_volinfo, new_volinfo); -                glusterd_volinfo_unref (old_volinfo); -        } - -        if (glusterd_is_volume_started (new_volinfo)) { -                (void) glusterd_start_bricks (new_volinfo); -                if (glusterd_is_snapd_enabled (new_volinfo)) { -                        svc = &(new_volinfo->snapd.svc); -                        if (svc->manager (svc, new_volinfo, -                                          PROC_START_NO_WAIT)){ -                                gf_event (EVENT_SVC_MANAGER_FAILED, -                                          "svc_name=%s", svc->name); -                        } -                } +    if (glusterd_is_volume_started(new_volinfo)) { +        (void)glusterd_start_bricks(new_volinfo); +        if (glusterd_is_snapd_enabled(new_volinfo)) { +            svc = &(new_volinfo->snapd.svc); +            if (svc->manager(svc, new_volinfo, PROC_START_NO_WAIT)) { +                gf_event(EVENT_SVC_MANAGER_FAILED, "svc_name=%s", svc->name); +            }          } +    } -        ret = glusterd_store_volinfo (new_volinfo, -                                      GLUSTERD_VOLINFO_VER_AC_NONE); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_VOLINFO_STORE_FAIL, "Failed to store " -                        "volinfo for volume %s", new_volinfo->volname); -                goto out; -        } +    ret = glusterd_store_volinfo(new_volinfo, GLUSTERD_VOLINFO_VER_AC_NONE); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_STORE_FAIL, +               "Failed to store " +               "volinfo for volume %s", +               new_volinfo->volname); +        goto out; +    } -        ret = glusterd_create_volfiles_and_notify_services (new_volinfo); -        if (ret) -                goto out; +    ret = glusterd_create_volfiles_and_notify_services(new_volinfo); +    if (ret) +        goto out; -        ret = glusterd_import_quota_conf (peer_data, count, -                                          new_volinfo, "volume"); -        if (ret) { -                gf_event (EVENT_IMPORT_QUOTA_CONF_FAILED, "volume=%s", -                          new_volinfo->volname); -                goto out; -        } -        glusterd_list_add_order (&new_volinfo->vol_list, &priv->volumes, -                                 glusterd_compare_volume_name); +    ret = glusterd_import_quota_conf(peer_data, count, new_volinfo, "volume"); +    if (ret) { +        gf_event(EVENT_IMPORT_QUOTA_CONF_FAILED, "volume=%s", +                 new_volinfo->volname); +        goto out; +    } +    glusterd_list_add_order(&new_volinfo->vol_list, &priv->volumes, +                            glusterd_compare_volume_name);  out: -        gf_msg_debug ("glusterd", 0, "Returning with ret: %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning with ret: %d", ret); +    return ret;  }  int32_t -glusterd_import_friend_volumes_synctask (void *opaque) +glusterd_import_friend_volumes_synctask(void *opaque)  { -        int32_t                 ret = -1; -        int32_t                 count = 0; -        int                     i = 1; -        xlator_t                *this = NULL; -        glusterd_conf_t         *conf = NULL; -        dict_t *peer_data         = NULL; +    int32_t ret = -1; +    int32_t count = 0; +    int i = 1; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    dict_t *peer_data = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        conf = this->private; -        GF_ASSERT (conf); +    conf = this->private; +    GF_ASSERT(conf); -        peer_data = (dict_t *)opaque; -        GF_ASSERT (peer_data); +    peer_data = (dict_t *)opaque; +    GF_ASSERT(peer_data); -        ret = dict_get_int32n (peer_data, "count", SLEN ("count"), &count); -        if (ret) -                goto out; +    ret = dict_get_int32n(peer_data, "count", SLEN("count"), &count); +    if (ret) +        goto out; -        synclock_lock (&conf->big_lock); +    synclock_lock(&conf->big_lock); -        /* We need to ensure that importing a volume shouldn't race with an -         * other thread where as part of restarting glusterd, bricks are -         * restarted (refer glusterd_restart_bricks ()) -         */ -        while (conf->restart_bricks) { -                synclock_unlock (&conf->big_lock); -                sleep (2); -                synclock_lock (&conf->big_lock); -        } -        conf->restart_bricks = _gf_true; +    /* We need to ensure that importing a volume shouldn't race with an +     * other thread where as part of restarting glusterd, bricks are +     * restarted (refer glusterd_restart_bricks ()) +     */ +    while (conf->restart_bricks) { +        synclock_unlock(&conf->big_lock); +        sleep(2); +        synclock_lock(&conf->big_lock); +    } +    conf->restart_bricks = _gf_true; -        while (i <= count) { -                ret = glusterd_import_friend_volume (peer_data, i); -                if (ret) { -                        conf->restart_bricks = _gf_false; -                        goto out; -                } -                i++; +    while (i <= count) { +        ret = glusterd_import_friend_volume(peer_data, i); +        if (ret) { +            conf->restart_bricks = _gf_false; +            goto out;          } -        glusterd_svcs_manager (NULL); -        conf->restart_bricks = _gf_false; +        i++; +    } +    glusterd_svcs_manager(NULL); +    conf->restart_bricks = _gf_false;  out: -        if (peer_data) -                dict_unref (peer_data); +    if (peer_data) +        dict_unref(peer_data); -        gf_msg_debug ("glusterd", 0, "Returning with %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning with %d", ret); +    return ret;  }  int32_t -glusterd_import_friend_volumes (dict_t *peer_data) +glusterd_import_friend_volumes(dict_t *peer_data)  { -        int32_t                 ret = -1; -        int32_t                 count = 0; -        int                     i = 1; +    int32_t ret = -1; +    int32_t count = 0; +    int i = 1; -        GF_ASSERT (peer_data); +    GF_ASSERT(peer_data); -        ret = dict_get_int32n (peer_data, "count", SLEN ("count"), &count); -        if (ret) -                goto out; +    ret = dict_get_int32n(peer_data, "count", SLEN("count"), &count); +    if (ret) +        goto out; -        while (i <= count) { -                ret = glusterd_import_friend_volume (peer_data, i); -                if (ret) -                        goto out; -                i++; -        } +    while (i <= count) { +        ret = glusterd_import_friend_volume(peer_data, i); +        if (ret) +            goto out; +        i++; +    }  out: -        gf_msg_debug ("glusterd", 0, "Returning with %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning with %d", ret); +    return ret;  }  int -glusterd_get_global_server_quorum_ratio (dict_t *opts, double *quorum) +glusterd_get_global_server_quorum_ratio(dict_t *opts, double *quorum)  { -        int      ret        = -1; -        char    *quorum_str = NULL; +    int ret = -1; +    char *quorum_str = NULL; -        ret = dict_get_strn (opts, GLUSTERD_QUORUM_RATIO_KEY, -                             SLEN (GLUSTERD_QUORUM_RATIO_KEY), &quorum_str); -        if (ret) -                goto out; +    ret = dict_get_strn(opts, GLUSTERD_QUORUM_RATIO_KEY, +                        SLEN(GLUSTERD_QUORUM_RATIO_KEY), &quorum_str); +    if (ret) +        goto out; -        ret = gf_string2percent (quorum_str, quorum); -        if (ret) -                goto out; -        ret = 0; +    ret = gf_string2percent(quorum_str, quorum); +    if (ret) +        goto out; +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_get_global_opt_version (dict_t *opts, uint32_t *version) +glusterd_get_global_opt_version(dict_t *opts, uint32_t *version)  { -        int     ret = -1; -        char    *version_str = NULL; +    int ret = -1; +    char *version_str = NULL; -        ret = dict_get_strn (opts, GLUSTERD_GLOBAL_OPT_VERSION, -                             SLEN (GLUSTERD_GLOBAL_OPT_VERSION), &version_str); -        if (ret) -                goto out; +    ret = dict_get_strn(opts, GLUSTERD_GLOBAL_OPT_VERSION, +                        SLEN(GLUSTERD_GLOBAL_OPT_VERSION), &version_str); +    if (ret) +        goto out; -        ret = gf_string2uint (version_str, version); -        if (ret) -                goto out; -        ret = 0; +    ret = gf_string2uint(version_str, version); +    if (ret) +        goto out; +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_get_next_global_opt_version_str (dict_t *opts, char **version_str) +glusterd_get_next_global_opt_version_str(dict_t *opts, char **version_str)  { -        int             ret = -1; -        char            version_string[64] = ""; -        uint32_t        version = 0; +    int ret = -1; +    char version_string[64] = ""; +    uint32_t version = 0; -        ret = glusterd_get_global_opt_version (opts, &version); -        if (ret) -                goto out; -        version++; -        snprintf (version_string, sizeof (version_string), "%"PRIu32, version); -        *version_str = gf_strdup (version_string); -        if (*version_str) -                ret = 0; +    ret = glusterd_get_global_opt_version(opts, &version); +    if (ret) +        goto out; +    version++; +    snprintf(version_string, sizeof(version_string), "%" PRIu32, version); +    *version_str = gf_strdup(version_string); +    if (*version_str) +        ret = 0;  out: -        return ret; +    return ret;  }  int32_t -glusterd_import_global_opts (dict_t *friend_data) -{ -        xlator_t        *this = NULL; -        glusterd_conf_t *conf = NULL; -        int             ret = -1; -        dict_t          *import_options = NULL; -        int             count = 0; -        uint32_t        local_version = 0; -        uint32_t        remote_version = 0; -        double          old_quorum = 0.0; -        double          new_quorum = 0.0; - -        this = THIS; -        conf = this->private; - -        ret = dict_get_int32n (friend_data, "global-opt-count", -                               SLEN ("global-opt-count"), &count); -        if (ret) { -                //old version peer -                ret = 0; -                goto out; -        } - -        import_options = dict_new (); -        if (!import_options) -                goto out; -        ret = import_prdict_dict (friend_data, import_options, "key", "val", -                                  count, "global"); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_GLOBAL_OPT_IMPORT_FAIL, "Failed to import" -                        " global options"); -                goto out; -        } - -        /* Not handling ret since server-quorum-ratio might not yet be set */ -        ret = glusterd_get_global_server_quorum_ratio (conf->opts, -                                                       &old_quorum); -        ret = glusterd_get_global_server_quorum_ratio (import_options, -                                                       &new_quorum); - -        ret = glusterd_get_global_opt_version (conf->opts, &local_version); -        if (ret) -                goto out; -        ret = glusterd_get_global_opt_version (import_options, &remote_version); +glusterd_import_global_opts(dict_t *friend_data) +{ +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    int ret = -1; +    dict_t *import_options = NULL; +    int count = 0; +    uint32_t local_version = 0; +    uint32_t remote_version = 0; +    double old_quorum = 0.0; +    double new_quorum = 0.0; + +    this = THIS; +    conf = this->private; + +    ret = dict_get_int32n(friend_data, "global-opt-count", +                          SLEN("global-opt-count"), &count); +    if (ret) { +        // old version peer +        ret = 0; +        goto out; +    } + +    import_options = dict_new(); +    if (!import_options) +        goto out; +    ret = import_prdict_dict(friend_data, import_options, "key", "val", count, +                             "global"); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_GLOBAL_OPT_IMPORT_FAIL, +               "Failed to import" +               " global options"); +        goto out; +    } + +    /* Not handling ret since server-quorum-ratio might not yet be set */ +    ret = glusterd_get_global_server_quorum_ratio(conf->opts, &old_quorum); +    ret = glusterd_get_global_server_quorum_ratio(import_options, &new_quorum); + +    ret = glusterd_get_global_opt_version(conf->opts, &local_version); +    if (ret) +        goto out; +    ret = glusterd_get_global_opt_version(import_options, &remote_version); +    if (ret) +        goto out; + +    if (remote_version > local_version) { +        ret = glusterd_store_options(this, import_options);          if (ret) -                goto out; - -        if (remote_version > local_version) { -                ret = glusterd_store_options (this, import_options); -                if (ret) -                        goto out; -                dict_unref (conf->opts); -                conf->opts = dict_ref (import_options); +            goto out; +        dict_unref(conf->opts); +        conf->opts = dict_ref(import_options); -                /* If server quorum ratio has changed, restart bricks to -                 * recompute if quorum is met. If quorum is not met bricks are -                 * not started and those already running are stopped -                 */ -                if (old_quorum != new_quorum) { -                        glusterd_launch_synctask (glusterd_restart_bricks, -                                                  NULL); -                } +        /* If server quorum ratio has changed, restart bricks to +         * recompute if quorum is met. If quorum is not met bricks are +         * not started and those already running are stopped +         */ +        if (old_quorum != new_quorum) { +            glusterd_launch_synctask(glusterd_restart_bricks, NULL);          } +    } -        ret = 0; +    ret = 0;  out: -        if (import_options) -                dict_unref (import_options); -        return ret; +    if (import_options) +        dict_unref(import_options); +    return ret;  }  int32_t -glusterd_compare_friend_data (dict_t *peer_data, int32_t *status, -                              char *hostname) -{ -        int32_t          ret       = -1; -        int32_t          count     = 0; -        int              i         = 1; -        gf_boolean_t     update    = _gf_false; -        xlator_t        *this      = NULL; -        glusterd_conf_t *priv      = NULL; -        dict_t          *peer_data_copy = NULL; - -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (peer_data); -        GF_ASSERT (status); - -        priv = this->private; -        GF_ASSERT (priv); -        ret = glusterd_import_global_opts (peer_data); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_GLOBAL_OPT_IMPORT_FAIL, "Importing global " -                        "options failed"); -                goto out; -        } - -        ret = dict_get_int32n (peer_data, "count", SLEN ("count"), &count); +glusterd_compare_friend_data(dict_t *peer_data, int32_t *status, char *hostname) +{ +    int32_t ret = -1; +    int32_t count = 0; +    int i = 1; +    gf_boolean_t update = _gf_false; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    dict_t *peer_data_copy = NULL; + +    this = THIS; +    GF_ASSERT(this); +    GF_ASSERT(peer_data); +    GF_ASSERT(status); + +    priv = this->private; +    GF_ASSERT(priv); +    ret = glusterd_import_global_opts(peer_data); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_GLOBAL_OPT_IMPORT_FAIL, +               "Importing global " +               "options failed"); +        goto out; +    } + +    ret = dict_get_int32n(peer_data, "count", SLEN("count"), &count); +    if (ret) +        goto out; + +    while (i <= count) { +        ret = glusterd_compare_friend_volume(peer_data, i, status, hostname);          if (ret) -                goto out; - -        while (i <= count) { -                ret = glusterd_compare_friend_volume (peer_data, i, status, -                                                      hostname); -                if (ret) -                        goto out; +            goto out; -                if (GLUSTERD_VOL_COMP_RJT == *status) { -                        ret = 0; -                        goto out; -                } -                if (GLUSTERD_VOL_COMP_UPDATE_REQ == *status) { -                        update = _gf_true; -                } -                i++; +        if (GLUSTERD_VOL_COMP_RJT == *status) { +            ret = 0; +            goto out;          } - -        if (update) { -                /* Launch the import friend volume as a separate synctask as it -                 * has to trigger start bricks where we may need to wait for the -                 * first brick to come up before attaching the subsequent bricks -                 * in case brick multiplexing is enabled -                 */ -                peer_data_copy = dict_copy_with_ref (peer_data, NULL); -                glusterd_launch_synctask -                        (glusterd_import_friend_volumes_synctask, -                         peer_data_copy); +        if (GLUSTERD_VOL_COMP_UPDATE_REQ == *status) { +            update = _gf_true;          } +        i++; +    } + +    if (update) { +        /* Launch the import friend volume as a separate synctask as it +         * has to trigger start bricks where we may need to wait for the +         * first brick to come up before attaching the subsequent bricks +         * in case brick multiplexing is enabled +         */ +        peer_data_copy = dict_copy_with_ref(peer_data, NULL); +        glusterd_launch_synctask(glusterd_import_friend_volumes_synctask, +                                 peer_data_copy); +    }  out: -        gf_msg_debug (this->name, 0, -                "Returning with ret: %d, status: %d", ret, *status); -        return ret; +    gf_msg_debug(this->name, 0, "Returning with ret: %d, status: %d", ret, +                 *status); +    return ret;  } -struct rpc_clnt* -glusterd_defrag_rpc_get (glusterd_defrag_info_t *defrag) +struct rpc_clnt * +glusterd_defrag_rpc_get(glusterd_defrag_info_t *defrag)  { -        struct rpc_clnt *rpc = NULL; +    struct rpc_clnt *rpc = NULL; -        if (!defrag) -                return NULL; +    if (!defrag) +        return NULL; -        LOCK (&defrag->lock); -        { -                rpc = rpc_clnt_ref (defrag->rpc); -        } -        UNLOCK (&defrag->lock); -        return rpc; +    LOCK(&defrag->lock); +    { +        rpc = rpc_clnt_ref(defrag->rpc); +    } +    UNLOCK(&defrag->lock); +    return rpc;  } -struct rpc_clnt* -glusterd_defrag_rpc_put (glusterd_defrag_info_t *defrag) +struct rpc_clnt * +glusterd_defrag_rpc_put(glusterd_defrag_info_t *defrag)  { -        struct rpc_clnt *rpc = NULL; +    struct rpc_clnt *rpc = NULL; -        if (!defrag) -                return NULL; +    if (!defrag) +        return NULL; -        LOCK (&defrag->lock); -        { -                rpc = rpc_clnt_unref (defrag->rpc); -                defrag->rpc = rpc; -        } -        UNLOCK (&defrag->lock); -        return rpc; -} - -struct rpc_clnt* -glusterd_pending_node_get_rpc (glusterd_pending_node_t *pending_node) -{ -        struct rpc_clnt *rpc = NULL; -        glusterd_brickinfo_t    *brickinfo = NULL; -        glusterd_volinfo_t      *volinfo   = NULL; -        glusterd_svc_t          *svc       = NULL; - -        GF_VALIDATE_OR_GOTO (THIS->name, pending_node, out); -        GF_VALIDATE_OR_GOTO (THIS->name, pending_node->node, out); - -        if (pending_node->type == GD_NODE_BRICK) { -                brickinfo = pending_node->node; -                rpc       = brickinfo->rpc; - -        } else if (pending_node->type == GD_NODE_SHD || -                   pending_node->type == GD_NODE_NFS || -                   pending_node->type == GD_NODE_QUOTAD || -                   pending_node->type == GD_NODE_SCRUB) { -                svc = pending_node->node; -                rpc = svc->conn.rpc; -        } else if (pending_node->type == GD_NODE_REBALANCE) { -                volinfo = pending_node->node; -                rpc = glusterd_defrag_rpc_get (volinfo->rebal.defrag); - -        } else if (pending_node->type == GD_NODE_SNAPD) { -                volinfo = pending_node->node; -                rpc = volinfo->snapd.svc.conn.rpc; -        } else if (pending_node->type == GD_NODE_TIERD) { -                volinfo = pending_node->node; -                rpc = volinfo->tierd.svc.conn.rpc; -        } else { -                GF_ASSERT (0); -        } +    LOCK(&defrag->lock); +    { +        rpc = rpc_clnt_unref(defrag->rpc); +        defrag->rpc = rpc; +    } +    UNLOCK(&defrag->lock); +    return rpc; +} + +struct rpc_clnt * +glusterd_pending_node_get_rpc(glusterd_pending_node_t *pending_node) +{ +    struct rpc_clnt *rpc = NULL; +    glusterd_brickinfo_t *brickinfo = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    glusterd_svc_t *svc = NULL; + +    GF_VALIDATE_OR_GOTO(THIS->name, pending_node, out); +    GF_VALIDATE_OR_GOTO(THIS->name, pending_node->node, out); + +    if (pending_node->type == GD_NODE_BRICK) { +        brickinfo = pending_node->node; +        rpc = brickinfo->rpc; + +    } else if (pending_node->type == GD_NODE_SHD || +               pending_node->type == GD_NODE_NFS || +               pending_node->type == GD_NODE_QUOTAD || +               pending_node->type == GD_NODE_SCRUB) { +        svc = pending_node->node; +        rpc = svc->conn.rpc; +    } else if (pending_node->type == GD_NODE_REBALANCE) { +        volinfo = pending_node->node; +        rpc = glusterd_defrag_rpc_get(volinfo->rebal.defrag); + +    } else if (pending_node->type == GD_NODE_SNAPD) { +        volinfo = pending_node->node; +        rpc = volinfo->snapd.svc.conn.rpc; +    } else if (pending_node->type == GD_NODE_TIERD) { +        volinfo = pending_node->node; +        rpc = volinfo->tierd.svc.conn.rpc; +    } else { +        GF_ASSERT(0); +    }  out: -        return rpc; +    return rpc;  }  void -glusterd_pending_node_put_rpc (glusterd_pending_node_t *pending_node) +glusterd_pending_node_put_rpc(glusterd_pending_node_t *pending_node)  { -        glusterd_volinfo_t      *volinfo = NULL; +    glusterd_volinfo_t *volinfo = NULL; -        switch (pending_node->type) { +    switch (pending_node->type) {          case GD_NODE_REBALANCE: -                volinfo = pending_node->node; -                glusterd_defrag_rpc_put (volinfo->rebal.defrag); -                break; +            volinfo = pending_node->node; +            glusterd_defrag_rpc_put(volinfo->rebal.defrag); +            break;          case GD_NODE_TIERD: -                volinfo = pending_node->node; -                glusterd_defrag_rpc_put (volinfo->tier.defrag); -                break; +            volinfo = pending_node->node; +            glusterd_defrag_rpc_put(volinfo->tier.defrag); +            break;          default: -                break; -        } - +            break; +    }  }  int32_t -glusterd_unlink_file (char *sockfpath) +glusterd_unlink_file(char *sockfpath)  { -        int             ret = 0; +    int ret = 0; -        ret = sys_unlink (sockfpath); -        if (ret) { -                if (ENOENT == errno) -                        ret = 0; -                else -                        gf_msg (THIS->name, GF_LOG_ERROR, errno, -                                GD_MSG_FILE_OP_FAILED, "Failed to remove %s" -                                " error: %s", sockfpath, strerror (errno)); -        } +    ret = sys_unlink(sockfpath); +    if (ret) { +        if (ENOENT == errno) +            ret = 0; +        else +            gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +                   "Failed to remove %s" +                   " error: %s", +                   sockfpath, strerror(errno)); +    } -        return ret; +    return ret;  }  void -glusterd_nfs_pmap_deregister () -{ -        if (pmap_unset (MOUNT_PROGRAM, MOUNTV3_VERSION)) -                gf_msg ("glusterd", GF_LOG_INFO, 0, -                        GD_MSG_DEREGISTER_SUCCESS, -                        "De-registered MOUNTV3 successfully"); -        else -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_PMAP_UNSET_FAIL, -                        "De-register MOUNTV3 is unsuccessful"); - -        if (pmap_unset (MOUNT_PROGRAM, MOUNTV1_VERSION)) -                gf_msg ("glusterd", GF_LOG_INFO, 0, -                        GD_MSG_DEREGISTER_SUCCESS, -                        "De-registered MOUNTV1 successfully"); -        else -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_PMAP_UNSET_FAIL, -                        "De-register MOUNTV1 is unsuccessful"); - -        if (pmap_unset (NFS_PROGRAM, NFSV3_VERSION)) -                gf_msg ("glusterd", GF_LOG_INFO, 0, -                        GD_MSG_DEREGISTER_SUCCESS, -                        "De-registered NFSV3 successfully"); -        else -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_PMAP_UNSET_FAIL, -                        "De-register NFSV3 is unsuccessful"); - -        if (pmap_unset (NLM_PROGRAM, NLMV4_VERSION)) -                gf_msg ("glusterd", GF_LOG_INFO, 0, -                        GD_MSG_DEREGISTER_SUCCESS, -                        "De-registered NLM v4 successfully"); -        else -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_PMAP_UNSET_FAIL, -                        "De-registration of NLM v4 failed"); - -        if (pmap_unset (NLM_PROGRAM, NLMV1_VERSION)) -                gf_msg ("glusterd", GF_LOG_INFO, 0, -                        GD_MSG_DEREGISTER_SUCCESS, -                        "De-registered NLM v1 successfully"); -        else -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_PMAP_UNSET_FAIL, -                        "De-registration of NLM v1 failed"); - -        if (pmap_unset (ACL_PROGRAM, ACLV3_VERSION)) -                gf_msg ("glusterd", GF_LOG_INFO, 0, -                        GD_MSG_DEREGISTER_SUCCESS, -                        "De-registered ACL v3 successfully"); -        else -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_PMAP_UNSET_FAIL, -                        "De-registration of ACL v3 failed"); -} - -int -glusterd_add_node_to_dict (char *server, dict_t *dict, int count, -                           dict_t *vol_opts) -{ -        int                     ret               = -1; -        char                    pidfile[PATH_MAX] = ""; -        gf_boolean_t            running           = _gf_false; -        int                     pid               = -1; -        int                     port              = 0; -        glusterd_svc_t         *svc               = NULL; -        char                    key[64]         = ""; -        int                     keylen; -        xlator_t               *this              = NULL; -        glusterd_conf_t        *priv              = NULL; - -        this = THIS; -        GF_ASSERT (this); - -        priv = this->private; -        GF_ASSERT (priv); - -        glusterd_svc_build_pidfile_path (server, priv->rundir, -                                         pidfile, sizeof (pidfile)); - -        if (strcmp(server, priv->shd_svc.name) == 0) -                svc = &(priv->shd_svc); -        else if (strcmp(server, priv->nfs_svc.name) == 0) -                svc = &(priv->nfs_svc); -        else if (strcmp(server, priv->quotad_svc.name) == 0) -                svc = &(priv->quotad_svc); -        else if (strcmp(server, priv->bitd_svc.name) == 0) -                svc = &(priv->bitd_svc); -        else if (strcmp(server, priv->scrub_svc.name) == 0) -                svc = &(priv->scrub_svc); -        else { -                ret = 0; -                goto out; -        } - -        //Consider service to be running only when glusterd sees it Online -        if (svc->online) -                running = gf_is_service_running (pidfile, &pid); - -        /* For nfs-servers/self-heal-daemon setting -         * brick<n>.hostname = "NFS Server" / "Self-heal Daemon" -         * brick<n>.path = uuid -         * brick<n>.port = 0 -         * -         * This might be confusing, but cli displays the name of -         * the brick as hostname+path, so this will make more sense -         * when output. -         */ - -        keylen = snprintf (key, sizeof (key), "brick%d.hostname", count); -        if (!strcmp (server, priv->nfs_svc.name)) -                ret = dict_set_nstrn (dict, key, keylen, -                                      "NFS Server", SLEN ("NFS Server")); -        else if (!strcmp (server, priv->shd_svc.name)) -                ret = dict_set_nstrn (dict, key, keylen, -                                      "Self-heal Daemon", -                                      SLEN ("Self-heal Daemon")); -        else if (!strcmp (server, priv->quotad_svc.name)) -                ret = dict_set_nstrn (dict, key, keylen, -                                      "Quota Daemon", SLEN ("Quota Daemon")); -        else if (!strcmp (server, priv->bitd_svc.name)) -                ret = dict_set_nstrn (dict, key, keylen, "Bitrot Daemon", -                                      SLEN ("Bitrot Daemon")); -        else if (!strcmp (server, priv->scrub_svc.name)) -                ret = dict_set_nstrn (dict, key, keylen, "Scrubber Daemon", -                                      SLEN ("Scrubber Daemon")); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "brick%d.path", count); -        ret = dict_set_dynstrn (dict, key, keylen, -                                gf_strdup (uuid_utoa (MY_UUID))); -        if (ret) -                goto out; - -        /* Port is available only for the NFS server. -         * Self-heal daemon doesn't provide any port for access -         * by entities other than gluster. -         */ -        if (!strcmp (server, priv->nfs_svc.name)) { -                if (dict_getn (vol_opts, "nfs.port", SLEN ("nfs.port"))) { -                        ret = dict_get_int32n (vol_opts, "nfs.port", -                                               SLEN ("nfs.port"), &port); -                        if (ret) -                                goto out; -                } else -                        port = GF_NFS3_PORT; -        } -        keylen = snprintf (key, sizeof (key), "brick%d.port", count); -        ret = dict_set_int32n (dict, key, keylen, port); -        if (ret) +glusterd_nfs_pmap_deregister() +{ +    if (pmap_unset(MOUNT_PROGRAM, MOUNTV3_VERSION)) +        gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_DEREGISTER_SUCCESS, +               "De-registered MOUNTV3 successfully"); +    else +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_PMAP_UNSET_FAIL, +               "De-register MOUNTV3 is unsuccessful"); + +    if (pmap_unset(MOUNT_PROGRAM, MOUNTV1_VERSION)) +        gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_DEREGISTER_SUCCESS, +               "De-registered MOUNTV1 successfully"); +    else +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_PMAP_UNSET_FAIL, +               "De-register MOUNTV1 is unsuccessful"); + +    if (pmap_unset(NFS_PROGRAM, NFSV3_VERSION)) +        gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_DEREGISTER_SUCCESS, +               "De-registered NFSV3 successfully"); +    else +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_PMAP_UNSET_FAIL, +               "De-register NFSV3 is unsuccessful"); + +    if (pmap_unset(NLM_PROGRAM, NLMV4_VERSION)) +        gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_DEREGISTER_SUCCESS, +               "De-registered NLM v4 successfully"); +    else +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_PMAP_UNSET_FAIL, +               "De-registration of NLM v4 failed"); + +    if (pmap_unset(NLM_PROGRAM, NLMV1_VERSION)) +        gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_DEREGISTER_SUCCESS, +               "De-registered NLM v1 successfully"); +    else +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_PMAP_UNSET_FAIL, +               "De-registration of NLM v1 failed"); + +    if (pmap_unset(ACL_PROGRAM, ACLV3_VERSION)) +        gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_DEREGISTER_SUCCESS, +               "De-registered ACL v3 successfully"); +    else +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_PMAP_UNSET_FAIL, +               "De-registration of ACL v3 failed"); +} + +int +glusterd_add_node_to_dict(char *server, dict_t *dict, int count, +                          dict_t *vol_opts) +{ +    int ret = -1; +    char pidfile[PATH_MAX] = ""; +    gf_boolean_t running = _gf_false; +    int pid = -1; +    int port = 0; +    glusterd_svc_t *svc = NULL; +    char key[64] = ""; +    int keylen; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; + +    this = THIS; +    GF_ASSERT(this); + +    priv = this->private; +    GF_ASSERT(priv); + +    glusterd_svc_build_pidfile_path(server, priv->rundir, pidfile, +                                    sizeof(pidfile)); + +    if (strcmp(server, priv->shd_svc.name) == 0) +        svc = &(priv->shd_svc); +    else if (strcmp(server, priv->nfs_svc.name) == 0) +        svc = &(priv->nfs_svc); +    else if (strcmp(server, priv->quotad_svc.name) == 0) +        svc = &(priv->quotad_svc); +    else if (strcmp(server, priv->bitd_svc.name) == 0) +        svc = &(priv->bitd_svc); +    else if (strcmp(server, priv->scrub_svc.name) == 0) +        svc = &(priv->scrub_svc); +    else { +        ret = 0; +        goto out; +    } + +    // Consider service to be running only when glusterd sees it Online +    if (svc->online) +        running = gf_is_service_running(pidfile, &pid); + +    /* For nfs-servers/self-heal-daemon setting +     * brick<n>.hostname = "NFS Server" / "Self-heal Daemon" +     * brick<n>.path = uuid +     * brick<n>.port = 0 +     * +     * This might be confusing, but cli displays the name of +     * the brick as hostname+path, so this will make more sense +     * when output. +     */ + +    keylen = snprintf(key, sizeof(key), "brick%d.hostname", count); +    if (!strcmp(server, priv->nfs_svc.name)) +        ret = dict_set_nstrn(dict, key, keylen, "NFS Server", +                             SLEN("NFS Server")); +    else if (!strcmp(server, priv->shd_svc.name)) +        ret = dict_set_nstrn(dict, key, keylen, "Self-heal Daemon", +                             SLEN("Self-heal Daemon")); +    else if (!strcmp(server, priv->quotad_svc.name)) +        ret = dict_set_nstrn(dict, key, keylen, "Quota Daemon", +                             SLEN("Quota Daemon")); +    else if (!strcmp(server, priv->bitd_svc.name)) +        ret = dict_set_nstrn(dict, key, keylen, "Bitrot Daemon", +                             SLEN("Bitrot Daemon")); +    else if (!strcmp(server, priv->scrub_svc.name)) +        ret = dict_set_nstrn(dict, key, keylen, "Scrubber Daemon", +                             SLEN("Scrubber Daemon")); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "brick%d.path", count); +    ret = dict_set_dynstrn(dict, key, keylen, gf_strdup(uuid_utoa(MY_UUID))); +    if (ret) +        goto out; + +    /* Port is available only for the NFS server. +     * Self-heal daemon doesn't provide any port for access +     * by entities other than gluster. +     */ +    if (!strcmp(server, priv->nfs_svc.name)) { +        if (dict_getn(vol_opts, "nfs.port", SLEN("nfs.port"))) { +            ret = dict_get_int32n(vol_opts, "nfs.port", SLEN("nfs.port"), +                                  &port); +            if (ret)                  goto out; +        } else +            port = GF_NFS3_PORT; +    } +    keylen = snprintf(key, sizeof(key), "brick%d.port", count); +    ret = dict_set_int32n(dict, key, keylen, port); +    if (ret) +        goto out; -        keylen = snprintf (key, sizeof (key), "brick%d.pid", count); -        ret = dict_set_int32n (dict, key, keylen, pid); -        if (ret) -                goto out; +    keylen = snprintf(key, sizeof(key), "brick%d.pid", count); +    ret = dict_set_int32n(dict, key, keylen, pid); +    if (ret) +        goto out; -        keylen = snprintf (key, sizeof (key), "brick%d.status", count); -        ret = dict_set_int32n (dict, key, keylen, running); -        if (ret) -                goto out; +    keylen = snprintf(key, sizeof(key), "brick%d.status", count); +    ret = dict_set_int32n(dict, key, keylen, running); +    if (ret) +        goto out;  out: -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  int -glusterd_remote_hostname_get (rpcsvc_request_t *req, char *remote_host, int len) +glusterd_remote_hostname_get(rpcsvc_request_t *req, char *remote_host, int len)  { -        GF_ASSERT (req); -        GF_ASSERT (remote_host); -        GF_ASSERT (req->trans); +    GF_ASSERT(req); +    GF_ASSERT(remote_host); +    GF_ASSERT(req->trans); -        char *name = NULL; -        char *hostname = NULL; -        char *tmp_host = NULL; -        char *canon = NULL; -        int  ret = 0; +    char *name = NULL; +    char *hostname = NULL; +    char *tmp_host = NULL; +    char *canon = NULL; +    int ret = 0; -        name = req->trans->peerinfo.identifier; -        tmp_host = gf_strdup (name); -        if (tmp_host) -                get_host_name (tmp_host, &hostname); - -        GF_ASSERT (hostname); -        if (!hostname) { -                memset (remote_host, 0, len); -                ret = -1; -                goto out; -        } +    name = req->trans->peerinfo.identifier; +    tmp_host = gf_strdup(name); +    if (tmp_host) +        get_host_name(tmp_host, &hostname); -        if ((gf_get_hostname_from_ip(hostname,&canon) == 0) && canon) { -                GF_FREE(tmp_host); -                tmp_host = hostname = canon; -        } +    GF_ASSERT(hostname); +    if (!hostname) { +        memset(remote_host, 0, len); +        ret = -1; +        goto out; +    } -        strncpy (remote_host, hostname, strlen (hostname)); +    if ((gf_get_hostname_from_ip(hostname, &canon) == 0) && canon) { +        GF_FREE(tmp_host); +        tmp_host = hostname = canon; +    } +    strncpy(remote_host, hostname, strlen(hostname));  out: -        GF_FREE (tmp_host); -        return ret; +    GF_FREE(tmp_host); +    return ret;  }  gf_boolean_t -glusterd_are_all_volumes_stopped () +glusterd_are_all_volumes_stopped()  { -        glusterd_conf_t                         *priv = NULL; -        xlator_t                                *this = NULL; -        glusterd_volinfo_t                      *voliter = NULL; +    glusterd_conf_t *priv = NULL; +    xlator_t *this = NULL; +    glusterd_volinfo_t *voliter = NULL; -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); -        cds_list_for_each_entry (voliter, &priv->volumes, vol_list) { -                if (voliter->status == GLUSTERD_STATUS_STARTED) -                        return _gf_false; -        } - -        return _gf_true; +    cds_list_for_each_entry(voliter, &priv->volumes, vol_list) +    { +        if (voliter->status == GLUSTERD_STATUS_STARTED) +            return _gf_false; +    } +    return _gf_true;  }  gf_boolean_t -glusterd_all_shd_compatible_volumes_stopped () +glusterd_all_shd_compatible_volumes_stopped()  { -        glusterd_conf_t                         *priv = NULL; -        xlator_t                                *this = NULL; -        glusterd_volinfo_t                      *voliter = NULL; +    glusterd_conf_t *priv = NULL; +    xlator_t *this = NULL; +    glusterd_volinfo_t *voliter = NULL; -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); -        cds_list_for_each_entry (voliter, &priv->volumes, vol_list) { -                if (!glusterd_is_shd_compatible_volume (voliter)) -                        continue; -                if (voliter->status == GLUSTERD_STATUS_STARTED) -                        return _gf_false; -        } +    cds_list_for_each_entry(voliter, &priv->volumes, vol_list) +    { +        if (!glusterd_is_shd_compatible_volume(voliter)) +            continue; +        if (voliter->status == GLUSTERD_STATUS_STARTED) +            return _gf_false; +    } -        return _gf_true; +    return _gf_true;  }  gf_boolean_t -glusterd_all_volumes_with_quota_stopped () +glusterd_all_volumes_with_quota_stopped()  { -        glusterd_conf_t                   *priv     = NULL; -        xlator_t                          *this     = NULL; -        glusterd_volinfo_t                *voliter  = NULL; +    glusterd_conf_t *priv = NULL; +    xlator_t *this = NULL; +    glusterd_volinfo_t *voliter = NULL; -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); -        cds_list_for_each_entry (voliter, &priv->volumes, vol_list) { -                if (!glusterd_is_volume_quota_enabled (voliter)) -                        continue; -                if (voliter->status == GLUSTERD_STATUS_STARTED) -                        return _gf_false; -        } +    cds_list_for_each_entry(voliter, &priv->volumes, vol_list) +    { +        if (!glusterd_is_volume_quota_enabled(voliter)) +            continue; +        if (voliter->status == GLUSTERD_STATUS_STARTED) +            return _gf_false; +    } -        return _gf_true; +    return _gf_true;  }  gf_boolean_t -glusterd_have_volumes () +glusterd_have_volumes()  { -        xlator_t        *this = NULL; -        glusterd_conf_t *priv = NULL; -        gf_boolean_t    volumes_exist = _gf_false; - -        this = THIS; -        GF_VALIDATE_OR_GOTO ("glusterd", (this != NULL), out); +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    gf_boolean_t volumes_exist = _gf_false; -        priv = this->private; -        GF_VALIDATE_OR_GOTO (this->name, (priv != NULL), out); +    this = THIS; +    GF_VALIDATE_OR_GOTO("glusterd", (this != NULL), out); +    priv = this->private; +    GF_VALIDATE_OR_GOTO(this->name, (priv != NULL), out); -        volumes_exist = !cds_list_empty (&priv->volumes); +    volumes_exist = !cds_list_empty(&priv->volumes);  out: -        return volumes_exist; +    return volumes_exist;  }  int -glusterd_volume_count_get (void) +glusterd_volume_count_get(void)  { -        glusterd_volinfo_t      *tmp_volinfo = NULL; -        int32_t                 ret = 0; -        xlator_t                *this = NULL; -        glusterd_conf_t         *priv = NULL; +    glusterd_volinfo_t *tmp_volinfo = NULL; +    int32_t ret = 0; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        priv = this->private; +    priv = this->private; -        cds_list_for_each_entry (tmp_volinfo, &priv->volumes, vol_list) { -                ret++; -        } - - -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +    cds_list_for_each_entry(tmp_volinfo, &priv->volumes, vol_list) { ret++; } +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  int -glusterd_brickinfo_get (uuid_t uuid, char *hostname, char *path, -                        glusterd_brickinfo_t **brickinfo) +glusterd_brickinfo_get(uuid_t uuid, char *hostname, char *path, +                       glusterd_brickinfo_t **brickinfo)  { -        glusterd_volinfo_t              *volinfo     = NULL; -        glusterd_conf_t                 *priv = NULL; -        xlator_t                        *this = NULL; -        int                             ret = -1; - -        GF_ASSERT (path); +    glusterd_volinfo_t *volinfo = NULL; +    glusterd_conf_t *priv = NULL; +    xlator_t *this = NULL; +    int ret = -1; -        this = THIS; -        GF_ASSERT (this); +    GF_ASSERT(path); -        priv = this->private; +    this = THIS; +    GF_ASSERT(this); -        cds_list_for_each_entry (volinfo, &priv->volumes, vol_list) { +    priv = this->private; -                ret = glusterd_volume_brickinfo_get (uuid, hostname, path, -                                                     volinfo, brickinfo); -                if (ret == 0) -                        /*Found*/ -                        goto out; -        } +    cds_list_for_each_entry(volinfo, &priv->volumes, vol_list) +    { +        ret = glusterd_volume_brickinfo_get(uuid, hostname, path, volinfo, +                                            brickinfo); +        if (ret == 0) +            /*Found*/ +            goto out; +    }  out: -        return ret; +    return ret;  }  static int32_t -my_callback (struct rpc_req *req, struct iovec *iov, int count, void *v_frame) +my_callback(struct rpc_req *req, struct iovec *iov, int count, void *v_frame)  { -        call_frame_t    *frame  = v_frame; -        glusterd_conf_t *conf   = frame->this->private; +    call_frame_t *frame = v_frame; +    glusterd_conf_t *conf = frame->this->private; -        synclock_lock (&conf->big_lock); -        --(conf->blockers); -        synclock_unlock (&conf->big_lock); +    synclock_lock(&conf->big_lock); +    --(conf->blockers); +    synclock_unlock(&conf->big_lock); -        STACK_DESTROY (frame->root); -        return 0; +    STACK_DESTROY(frame->root); +    return 0;  }  static int32_t -attach_brick_callback (struct rpc_req *req, struct iovec *iov, int count, -                       void *v_frame) -{ -        call_frame_t                     *frame     = v_frame; -        glusterd_conf_t                  *conf      = frame->this->private; -        glusterd_brickinfo_t             *brickinfo = frame->local; -        glusterd_brickinfo_t             *other_brick = frame->cookie; -        glusterd_volinfo_t               *volinfo   =  NULL; -        xlator_t                         *this      = THIS; -        int                               ret       = -1; -        char                              pidfile1[PATH_MAX]      = ""; -        char                              pidfile2[PATH_MAX]      = ""; -        gf_getspec_rsp                    rsp   = {0,}; -        int                               last_brick = -1; - -        frame->local = NULL; -        frame->cookie = NULL; - -        if (!iov) { -              gf_log (frame->this->name, GF_LOG_ERROR, "iov is NULL"); -              ret   = -1; -              goto out; -        } - -        ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_getspec_rsp); -        if (ret < 0) { -                gf_log (frame->this->name, GF_LOG_ERROR, "XDR decoding error"); -                ret   = -1; -                goto out; -        } - -        ret =  glusterd_get_volinfo_from_brick (other_brick->path, -                                                &volinfo); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_VOLINFO_GET_FAIL, "Failed to get volinfo" -                        " from brick(%s) so  pidfile copying/unlink will fail", -                        other_brick->path); -                goto out; -        } -        GLUSTERD_GET_BRICK_PIDFILE (pidfile1, volinfo, other_brick, conf); -        volinfo = NULL; - -        ret =  glusterd_get_volinfo_from_brick (brickinfo->path, -                                                &volinfo); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_VOLINFO_GET_FAIL, "Failed to get volinfo" -                        " from brick(%s) so  pidfile copying/unlink will fail", -                        brickinfo->path); -                goto out; -        } -        GLUSTERD_GET_BRICK_PIDFILE (pidfile2, volinfo, brickinfo, conf); - -        if (rsp.op_ret == 0) { -                brickinfo->port_registered = _gf_true; - -                /* PID file is copied once brick has attached -                   successfully -                */ -                glusterd_copy_file (pidfile1, pidfile2); -                brickinfo->status = GF_BRICK_STARTED; -                brickinfo->rpc = rpc_clnt_ref (other_brick->rpc); -                gf_log (THIS->name, GF_LOG_INFO, "brick %s is attached successfully", -                        brickinfo->path); -        } else { -                gf_log (THIS->name, GF_LOG_INFO, "attach_brick failed pidfile" -                        " is %s for brick_path %s", pidfile2, brickinfo->path); -                brickinfo->port = 0; -                brickinfo->status = GF_BRICK_STOPPED; -                ret = glusterd_brick_process_remove_brick (brickinfo, &last_brick); -                if (ret) -                        gf_msg_debug (this->name, 0, "Couldn't remove brick from" -                                      " brick process"); -                LOCK (&volinfo->lock); -                ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_NONE); -                UNLOCK (&volinfo->lock); -                if (ret) { -                       gf_msg (this->name, GF_LOG_ERROR, 0, -                               GD_MSG_VOLINFO_SET_FAIL, -                               "Failed to store volinfo of " -                               "%s volume", volinfo->volname); -                       goto out; -                } -        } -out: -        synclock_lock (&conf->big_lock); -        --(conf->blockers); -        synclock_unlock (&conf->big_lock); -        STACK_DESTROY (frame->root); -        return 0; -} - -int -send_attach_req (xlator_t *this, struct rpc_clnt *rpc, char *path, -                 glusterd_brickinfo_t *brickinfo, glusterd_brickinfo_t *other_brick, int op) -{ -        int                             ret      = -1; -        struct iobuf                    *iobuf    = NULL; -        struct iobref                   *iobref   = NULL; -        struct iovec                    iov      = {0, }; -        ssize_t                         req_size = 0; -        call_frame_t                    *frame    = NULL; -        gd1_mgmt_brick_op_req           brick_req; -        void                            *req = &brick_req; -        void                            *errlbl   = &&err; -        struct rpc_clnt_connection      *conn; -        glusterd_conf_t                 *conf     = this->private; -        extern struct rpc_clnt_program  gd_brick_prog; -        fop_cbk_fn_t cbkfn = my_callback; - -        if (!rpc) { -                gf_log (this->name, GF_LOG_ERROR, "called with null rpc"); -                return -1; -        } - -        conn = &rpc->conn; -        if (!conn->connected || conn->disconnected) { -                gf_log (this->name, GF_LOG_INFO, "not connected yet"); -                return -1; -        } - -        brick_req.op = op; -        brick_req.name = path; -        brick_req.input.input_val = NULL; -        brick_req.input.input_len = 0; - -        req_size = xdr_sizeof ((xdrproc_t)xdr_gd1_mgmt_brick_op_req, req); -        iobuf = iobuf_get2 (rpc->ctx->iobuf_pool, req_size); -        if (!iobuf) { -                goto *errlbl; -        } -        errlbl = &&maybe_free_iobuf; - -        iov.iov_base = iobuf->ptr; -        iov.iov_len  = iobuf_pagesize (iobuf); - -        iobref = iobref_new (); -        if (!iobref) { -                goto *errlbl; -        } -        errlbl = &&free_iobref; - -        frame = create_frame (this, this->ctx->pool); -        if (!frame) { -                goto *errlbl; -        } - -        iobref_add (iobref, iobuf); -        /* -         * Drop our reference to the iobuf.  The iobref should already have -         * one after iobref_add, so when we unref that we'll free the iobuf as -         * well.  This allows us to pass just the iobref as frame->local. -         */ -        iobuf_unref (iobuf); -        /* Set the pointer to null so we don't free it on a later error. */ -        iobuf = NULL; +attach_brick_callback(struct rpc_req *req, struct iovec *iov, int count, +                      void *v_frame) +{ +    call_frame_t *frame = v_frame; +    glusterd_conf_t *conf = frame->this->private; +    glusterd_brickinfo_t *brickinfo = frame->local; +    glusterd_brickinfo_t *other_brick = frame->cookie; +    glusterd_volinfo_t *volinfo = NULL; +    xlator_t *this = THIS; +    int ret = -1; +    char pidfile1[PATH_MAX] = ""; +    char pidfile2[PATH_MAX] = ""; +    gf_getspec_rsp rsp = { +        0, +    }; +    int last_brick = -1; + +    frame->local = NULL; +    frame->cookie = NULL; + +    if (!iov) { +        gf_log(frame->this->name, GF_LOG_ERROR, "iov is NULL"); +        ret = -1; +        goto out; +    } -        /* Create the xdr payload */ -        ret = xdr_serialize_generic (iov, req, -                                     (xdrproc_t)xdr_gd1_mgmt_brick_op_req); -        if (ret == -1) { -                goto *errlbl; +    ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_getspec_rsp); +    if (ret < 0) { +        gf_log(frame->this->name, GF_LOG_ERROR, "XDR decoding error"); +        ret = -1; +        goto out; +    } + +    ret = glusterd_get_volinfo_from_brick(other_brick->path, &volinfo); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_GET_FAIL, +               "Failed to get volinfo" +               " from brick(%s) so  pidfile copying/unlink will fail", +               other_brick->path); +        goto out; +    } +    GLUSTERD_GET_BRICK_PIDFILE(pidfile1, volinfo, other_brick, conf); +    volinfo = NULL; + +    ret = glusterd_get_volinfo_from_brick(brickinfo->path, &volinfo); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_GET_FAIL, +               "Failed to get volinfo" +               " from brick(%s) so  pidfile copying/unlink will fail", +               brickinfo->path); +        goto out; +    } +    GLUSTERD_GET_BRICK_PIDFILE(pidfile2, volinfo, brickinfo, conf); + +    if (rsp.op_ret == 0) { +        brickinfo->port_registered = _gf_true; + +        /* PID file is copied once brick has attached +           successfully +        */ +        glusterd_copy_file(pidfile1, pidfile2); +        brickinfo->status = GF_BRICK_STARTED; +        brickinfo->rpc = rpc_clnt_ref(other_brick->rpc); +        gf_log(THIS->name, GF_LOG_INFO, "brick %s is attached successfully", +               brickinfo->path); +    } else { +        gf_log(THIS->name, GF_LOG_INFO, +               "attach_brick failed pidfile" +               " is %s for brick_path %s", +               pidfile2, brickinfo->path); +        brickinfo->port = 0; +        brickinfo->status = GF_BRICK_STOPPED; +        ret = glusterd_brick_process_remove_brick(brickinfo, &last_brick); +        if (ret) +            gf_msg_debug(this->name, 0, +                         "Couldn't remove brick from" +                         " brick process"); +        LOCK(&volinfo->lock); +        ret = glusterd_store_volinfo(volinfo, GLUSTERD_VOLINFO_VER_AC_NONE); +        UNLOCK(&volinfo->lock); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_SET_FAIL, +                   "Failed to store volinfo of " +                   "%s volume", +                   volinfo->volname); +            goto out;          } +    } +out: +    synclock_lock(&conf->big_lock); +    --(conf->blockers); +    synclock_unlock(&conf->big_lock); +    STACK_DESTROY(frame->root); +    return 0; +} + +int +send_attach_req(xlator_t *this, struct rpc_clnt *rpc, char *path, +                glusterd_brickinfo_t *brickinfo, +                glusterd_brickinfo_t *other_brick, int op) +{ +    int ret = -1; +    struct iobuf *iobuf = NULL; +    struct iobref *iobref = NULL; +    struct iovec iov = { +        0, +    }; +    ssize_t req_size = 0; +    call_frame_t *frame = NULL; +    gd1_mgmt_brick_op_req brick_req; +    void *req = &brick_req; +    void *errlbl = &&err; +    struct rpc_clnt_connection *conn; +    glusterd_conf_t *conf = this->private; +    extern struct rpc_clnt_program gd_brick_prog; +    fop_cbk_fn_t cbkfn = my_callback; + +    if (!rpc) { +        gf_log(this->name, GF_LOG_ERROR, "called with null rpc"); +        return -1; +    } -        iov.iov_len = ret; - -        if (op == GLUSTERD_BRICK_ATTACH) { -                frame->local = brickinfo; -                frame->cookie = other_brick; -                cbkfn = attach_brick_callback; -        } -        /* Send the msg */ -        ++(conf->blockers); -        ret = rpc_clnt_submit (rpc, &gd_brick_prog, op, -                               cbkfn, &iov, 1, NULL, 0, iobref, -                               frame, NULL, 0, NULL, 0, NULL); -        return ret; +    conn = &rpc->conn; +    if (!conn->connected || conn->disconnected) { +        gf_log(this->name, GF_LOG_INFO, "not connected yet"); +        return -1; +    } + +    brick_req.op = op; +    brick_req.name = path; +    brick_req.input.input_val = NULL; +    brick_req.input.input_len = 0; + +    req_size = xdr_sizeof((xdrproc_t)xdr_gd1_mgmt_brick_op_req, req); +    iobuf = iobuf_get2(rpc->ctx->iobuf_pool, req_size); +    if (!iobuf) { +        goto *errlbl; +    } +    errlbl = &&maybe_free_iobuf; + +    iov.iov_base = iobuf->ptr; +    iov.iov_len = iobuf_pagesize(iobuf); + +    iobref = iobref_new(); +    if (!iobref) { +        goto *errlbl; +    } +    errlbl = &&free_iobref; + +    frame = create_frame(this, this->ctx->pool); +    if (!frame) { +        goto *errlbl; +    } + +    iobref_add(iobref, iobuf); +    /* +     * Drop our reference to the iobuf.  The iobref should already have +     * one after iobref_add, so when we unref that we'll free the iobuf as +     * well.  This allows us to pass just the iobref as frame->local. +     */ +    iobuf_unref(iobuf); +    /* Set the pointer to null so we don't free it on a later error. */ +    iobuf = NULL; + +    /* Create the xdr payload */ +    ret = xdr_serialize_generic(iov, req, (xdrproc_t)xdr_gd1_mgmt_brick_op_req); +    if (ret == -1) { +        goto *errlbl; +    } + +    iov.iov_len = ret; + +    if (op == GLUSTERD_BRICK_ATTACH) { +        frame->local = brickinfo; +        frame->cookie = other_brick; +        cbkfn = attach_brick_callback; +    } +    /* Send the msg */ +    ++(conf->blockers); +    ret = rpc_clnt_submit(rpc, &gd_brick_prog, op, cbkfn, &iov, 1, NULL, 0, +                          iobref, frame, NULL, 0, NULL, 0, NULL); +    return ret;  free_iobref: -        iobref_unref (iobref); +    iobref_unref(iobref);  maybe_free_iobuf: -        if (iobuf) { -                iobuf_unref (iobuf); -        } +    if (iobuf) { +        iobuf_unref(iobuf); +    }  err: -        return -1; +    return -1;  }  extern size_t -build_volfile_path (char *volume_id, char *path, -                    size_t path_len, char *trusted_str); - +build_volfile_path(char *volume_id, char *path, size_t path_len, +                   char *trusted_str);  static int -attach_brick (xlator_t *this, -              glusterd_brickinfo_t *brickinfo, -              glusterd_brickinfo_t *other_brick, -              glusterd_volinfo_t *volinfo, -              glusterd_volinfo_t *other_vol) -{ -        glusterd_conf_t *conf                   = this->private; -        char            pidfile1[PATH_MAX]      = ""; -        char            pidfile2[PATH_MAX]      = ""; -        char            unslashed[PATH_MAX]     = {'\0',}; -        char            full_id[PATH_MAX]       = {'\0',}; -        char            path[PATH_MAX]          = {'\0',}; -        int             ret = -1; -        int             tries; -        rpc_clnt_t      *rpc; -        int32_t         len; - -        gf_log (this->name, GF_LOG_INFO, -                "add brick %s to existing process for %s", -                brickinfo->path, other_brick->path); - -        GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, unslashed); - -        GLUSTERD_GET_BRICK_PIDFILE (pidfile1, other_vol, other_brick, conf); -        GLUSTERD_GET_BRICK_PIDFILE (pidfile2, volinfo, brickinfo, conf); - -        if (volinfo->is_snap_volume) { -                len  = snprintf (full_id, sizeof(full_id), "/%s/%s/%s.%s.%s", -                                 GLUSTERD_VOL_SNAP_DIR_PREFIX, -                                 volinfo->snapshot->snapname, -                                 volinfo->volname, brickinfo->hostname, -                                 unslashed); -        } else { -                len = snprintf (full_id, sizeof(full_id), "%s.%s.%s", -                                volinfo->volname, brickinfo->hostname, -                                unslashed); -        } -        if ((len < 0) || (len >= sizeof(full_id))) { -                goto out; -        } - -        (void) build_volfile_path (full_id, path, sizeof(path), NULL); - - -        for (tries = 15; tries > 0; --tries) { -                rpc = rpc_clnt_ref (other_brick->rpc); -                if (rpc) { -                        ret = send_attach_req (this, rpc, path, brickinfo, -                                               other_brick, -                                               GLUSTERD_BRICK_ATTACH); -                        rpc_clnt_unref (rpc); -                        if (!ret) { -                                ret = pmap_registry_extend (this, other_brick->port, -                                            brickinfo->path); -                                if (ret != 0) { -                                        gf_log (this->name, GF_LOG_ERROR, -                                                "adding brick to process failed"); -                                        goto out; -                                } -                                brickinfo->port = other_brick->port; -                                ret = glusterd_brick_process_add_brick (brickinfo); -                                if (ret) { -                                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                                GD_MSG_BRICKPROC_ADD_BRICK_FAILED, -                                                "Adding brick %s:%s to brick " -                                                "process failed", brickinfo->hostname, -                                                brickinfo->path); -                                        return ret; -                                } -                                return 0; -                        } +attach_brick(xlator_t *this, glusterd_brickinfo_t *brickinfo, +             glusterd_brickinfo_t *other_brick, glusterd_volinfo_t *volinfo, +             glusterd_volinfo_t *other_vol) +{ +    glusterd_conf_t *conf = this->private; +    char pidfile1[PATH_MAX] = ""; +    char pidfile2[PATH_MAX] = ""; +    char unslashed[PATH_MAX] = { +        '\0', +    }; +    char full_id[PATH_MAX] = { +        '\0', +    }; +    char path[PATH_MAX] = { +        '\0', +    }; +    int ret = -1; +    int tries; +    rpc_clnt_t *rpc; +    int32_t len; + +    gf_log(this->name, GF_LOG_INFO, "add brick %s to existing process for %s", +           brickinfo->path, other_brick->path); + +    GLUSTERD_REMOVE_SLASH_FROM_PATH(brickinfo->path, unslashed); + +    GLUSTERD_GET_BRICK_PIDFILE(pidfile1, other_vol, other_brick, conf); +    GLUSTERD_GET_BRICK_PIDFILE(pidfile2, volinfo, brickinfo, conf); + +    if (volinfo->is_snap_volume) { +        len = snprintf(full_id, sizeof(full_id), "/%s/%s/%s.%s.%s", +                       GLUSTERD_VOL_SNAP_DIR_PREFIX, +                       volinfo->snapshot->snapname, volinfo->volname, +                       brickinfo->hostname, unslashed); +    } else { +        len = snprintf(full_id, sizeof(full_id), "%s.%s.%s", volinfo->volname, +                       brickinfo->hostname, unslashed); +    } +    if ((len < 0) || (len >= sizeof(full_id))) { +        goto out; +    } + +    (void)build_volfile_path(full_id, path, sizeof(path), NULL); + +    for (tries = 15; tries > 0; --tries) { +        rpc = rpc_clnt_ref(other_brick->rpc); +        if (rpc) { +            ret = send_attach_req(this, rpc, path, brickinfo, other_brick, +                                  GLUSTERD_BRICK_ATTACH); +            rpc_clnt_unref(rpc); +            if (!ret) { +                ret = pmap_registry_extend(this, other_brick->port, +                                           brickinfo->path); +                if (ret != 0) { +                    gf_log(this->name, GF_LOG_ERROR, +                           "adding brick to process failed"); +                    goto out; +                } +                brickinfo->port = other_brick->port; +                ret = glusterd_brick_process_add_brick(brickinfo); +                if (ret) { +                    gf_msg(this->name, GF_LOG_ERROR, 0, +                           GD_MSG_BRICKPROC_ADD_BRICK_FAILED, +                           "Adding brick %s:%s to brick " +                           "process failed", +                           brickinfo->hostname, brickinfo->path); +                    return ret;                  } -                /* -                 * It might not actually be safe to manipulate the lock -                 * like this, but if we don't then the connection can -                 * never actually complete and retries are useless. -                 * Unfortunately, all of the alternatives (e.g. doing -                 * all of this in a separate thread) are much more -                 * complicated and risky. -                 * TBD: see if there's a better way -                 */ -                synclock_unlock (&conf->big_lock); -                sleep (1); -                synclock_lock (&conf->big_lock); +                return 0; +            }          } +        /* +         * It might not actually be safe to manipulate the lock +         * like this, but if we don't then the connection can +         * never actually complete and retries are useless. +         * Unfortunately, all of the alternatives (e.g. doing +         * all of this in a separate thread) are much more +         * complicated and risky. +         * TBD: see if there's a better way +         */ +        synclock_unlock(&conf->big_lock); +        sleep(1); +        synclock_lock(&conf->big_lock); +    }  out: -        gf_log (this->name, GF_LOG_WARNING, -                "attach failed for %s", brickinfo->path); -        return ret; +    gf_log(this->name, GF_LOG_WARNING, "attach failed for %s", brickinfo->path); +    return ret;  }  /* This name was just getting too long, hence the abbreviations. */  static glusterd_brickinfo_t * -find_compat_brick_in_vol (glusterd_conf_t *conf, -                          glusterd_volinfo_t *srch_vol, /* volume to search */ -                          glusterd_volinfo_t *comp_vol, /* volume to compare */ -                          glusterd_brickinfo_t *brickinfo) -{ -        xlator_t                *this                   = THIS; -        glusterd_brickinfo_t    *other_brick            = NULL; -        glusterd_brick_proc_t   *brick_proc             = NULL; -        char                    pidfile2[PATH_MAX]      = ""; -        int32_t                 pid2                    = -1; -        int16_t                 retries                 = 15; -        int                     mux_limit               = -1; -        int                     ret                     = -1; -        gf_boolean_t            brick_status            = _gf_false; -        gf_boolean_t            is_shared_storage       = _gf_false; - +find_compat_brick_in_vol(glusterd_conf_t *conf, +                         glusterd_volinfo_t *srch_vol, /* volume to search */ +                         glusterd_volinfo_t *comp_vol, /* volume to compare */ +                         glusterd_brickinfo_t *brickinfo) +{ +    xlator_t *this = THIS; +    glusterd_brickinfo_t *other_brick = NULL; +    glusterd_brick_proc_t *brick_proc = NULL; +    char pidfile2[PATH_MAX] = ""; +    int32_t pid2 = -1; +    int16_t retries = 15; +    int mux_limit = -1; +    int ret = -1; +    gf_boolean_t brick_status = _gf_false; +    gf_boolean_t is_shared_storage = _gf_false; + +    /* +     * If comp_vol is provided, we have to check *volume* compatibility +     * before we can check *brick* compatibility. +     */ +    if (comp_vol) {          /* -         * If comp_vol is provided, we have to check *volume* compatibility -         * before we can check *brick* compatibility. +         * We should not attach bricks of a normal volume to bricks +         * of shared storage volume.           */ -        if (comp_vol) { -                /* -                 * We should not attach bricks of a normal volume to bricks -                 * of shared storage volume. -                 */ -                if (!strcmp (srch_vol->volname, GLUSTER_SHARED_STORAGE)) -                        is_shared_storage = _gf_true; - -                if (!strcmp (comp_vol->volname, GLUSTER_SHARED_STORAGE)) { -                        if (!is_shared_storage) -                                return NULL; -                } else if (is_shared_storage) -                        return NULL; - -                /* -                 * It's kind of a shame that we have to do this check in both -                 * directions, but an option might only exist on one of the two -                 * dictionaries and dict_foreach_match will only find that one. -                 */ +        if (!strcmp(srch_vol->volname, GLUSTER_SHARED_STORAGE)) +            is_shared_storage = _gf_true; -                gf_log (THIS->name, GF_LOG_DEBUG, -                        "comparing options for %s and %s", -                         comp_vol->volname, srch_vol->volname); +        if (!strcmp(comp_vol->volname, GLUSTER_SHARED_STORAGE)) { +            if (!is_shared_storage) +                return NULL; +        } else if (is_shared_storage) +            return NULL; -                if (dict_foreach_match (comp_vol->dict, unsafe_option, NULL, -                                        opts_mismatch, srch_vol->dict) < 0) { -                        gf_log (THIS->name, GF_LOG_DEBUG, "failure forward"); -                        return NULL; -                } +        /* +         * It's kind of a shame that we have to do this check in both +         * directions, but an option might only exist on one of the two +         * dictionaries and dict_foreach_match will only find that one. +         */ -                if (dict_foreach_match (srch_vol->dict, unsafe_option, NULL, -                                        opts_mismatch, comp_vol->dict) < 0) { -                        gf_log (THIS->name, GF_LOG_DEBUG, "failure backward"); -                        return NULL; -                } +        gf_log(THIS->name, GF_LOG_DEBUG, "comparing options for %s and %s", +               comp_vol->volname, srch_vol->volname); -                gf_log (THIS->name, GF_LOG_DEBUG, "all options match"); +        if (dict_foreach_match(comp_vol->dict, unsafe_option, NULL, +                               opts_mismatch, srch_vol->dict) < 0) { +            gf_log(THIS->name, GF_LOG_DEBUG, "failure forward"); +            return NULL;          } -        ret = get_mux_limit_per_process (&mux_limit); -        if (ret) { -                gf_msg_debug (THIS->name, 0, "Retrieving brick mux " -                              "limit failed. Returning NULL"); -                return NULL; +        if (dict_foreach_match(srch_vol->dict, unsafe_option, NULL, +                               opts_mismatch, comp_vol->dict) < 0) { +            gf_log(THIS->name, GF_LOG_DEBUG, "failure backward"); +            return NULL;          } -        cds_list_for_each_entry (other_brick, &srch_vol->bricks, -                                 brick_list) { -                if (other_brick == brickinfo) { -                        continue; -                } -                if (gf_uuid_compare (brickinfo->uuid, other_brick->uuid)) { -                        continue; -                } -                if (other_brick->status != GF_BRICK_STARTED && -                    other_brick->status != GF_BRICK_STARTING) { -                        continue; -                } +        gf_log(THIS->name, GF_LOG_DEBUG, "all options match"); +    } -                ret = glusterd_brick_proc_for_port (other_brick->port, -                                                    &brick_proc); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, "Couldn't get brick " -                                      "process corresponding to brick %s:%s", -                                      other_brick->hostname, other_brick->path); -                        continue; -                } +    ret = get_mux_limit_per_process(&mux_limit); +    if (ret) { +        gf_msg_debug(THIS->name, 0, +                     "Retrieving brick mux " +                     "limit failed. Returning NULL"); +        return NULL; +    } -                if (mux_limit != 0) { -                        if (brick_proc->brick_count >= mux_limit) -                                continue; -                } else { -                        /* This means that the "cluster.max-bricks-per-process" -                         * options hasn't yet been explicitly set. Continue -                         * as if there's no limit set -                         */ -                        gf_msg (THIS->name, GF_LOG_WARNING, 0, -                                GD_MSG_NO_MUX_LIMIT, -                                "cluster.max-bricks-per-process options isn't " -                                "set. Continuing with no limit set for " -                                "brick multiplexing."); -                } -                /* The first brick process might take some time to finish its -                 * handshake with glusterd and prepare the graph. We can't -                 * afford to send attach_req for other bricks till that time. -                 * brick process sends PMAP_SIGNIN event after processing the -                 * volfile and hence it's safe to assume that if glusterd has -                 * received a pmap signin request for the same brick, we are -                 * good for subsequent attach requests. -                 */ -                retries = 15; -                while (retries > 0) { -                        if (other_brick->port_registered) { -                                GLUSTERD_GET_BRICK_PIDFILE (pidfile2, srch_vol, -                                                            other_brick, conf); -                                if (sys_access (pidfile2, F_OK) == 0 && -                                    gf_is_service_running (pidfile2, &pid2)) { -                                        gf_msg_debug (this->name, 0, -                                                      "brick %s is running as a pid %d ", -                                                      other_brick->path, pid2); -                                        brick_status = _gf_true; -                                        break; -                                } -                        } - -                        synclock_unlock (&conf->big_lock); -                        gf_msg_debug (this->name, 0, "brick %s is still" -                                      " starting, waiting for 2 seconds ", -                                      other_brick->path); -                        sleep(2); -                        synclock_lock (&conf->big_lock); -                        retries--; -                } +    cds_list_for_each_entry(other_brick, &srch_vol->bricks, brick_list) +    { +        if (other_brick == brickinfo) { +            continue; +        } +        if (gf_uuid_compare(brickinfo->uuid, other_brick->uuid)) { +            continue; +        } +        if (other_brick->status != GF_BRICK_STARTED && +            other_brick->status != GF_BRICK_STARTING) { +            continue; +        } -                if (!brick_status) { -                        gf_log (this->name, GF_LOG_INFO, -                                "brick has not come up so cleaning up dead brick %s:%s", -                                other_brick->hostname, other_brick->path); -                        other_brick->status = GF_BRICK_STOPPED; -                        if (pidfile2[0]) -                                sys_unlink (pidfile2); -                        continue; -                } -                return other_brick; +        ret = glusterd_brick_proc_for_port(other_brick->port, &brick_proc); +        if (ret) { +            gf_msg_debug(THIS->name, 0, +                         "Couldn't get brick " +                         "process corresponding to brick %s:%s", +                         other_brick->hostname, other_brick->path); +            continue;          } -        return NULL; +        if (mux_limit != 0) { +            if (brick_proc->brick_count >= mux_limit) +                continue; +        } else { +            /* This means that the "cluster.max-bricks-per-process" +             * options hasn't yet been explicitly set. Continue +             * as if there's no limit set +             */ +            gf_msg(THIS->name, GF_LOG_WARNING, 0, GD_MSG_NO_MUX_LIMIT, +                   "cluster.max-bricks-per-process options isn't " +                   "set. Continuing with no limit set for " +                   "brick multiplexing."); +        } +        /* The first brick process might take some time to finish its +         * handshake with glusterd and prepare the graph. We can't +         * afford to send attach_req for other bricks till that time. +         * brick process sends PMAP_SIGNIN event after processing the +         * volfile and hence it's safe to assume that if glusterd has +         * received a pmap signin request for the same brick, we are +         * good for subsequent attach requests. +         */ +        retries = 15; +        while (retries > 0) { +            if (other_brick->port_registered) { +                GLUSTERD_GET_BRICK_PIDFILE(pidfile2, srch_vol, other_brick, +                                           conf); +                if (sys_access(pidfile2, F_OK) == 0 && +                    gf_is_service_running(pidfile2, &pid2)) { +                    gf_msg_debug(this->name, 0, +                                 "brick %s is running as a pid %d ", +                                 other_brick->path, pid2); +                    brick_status = _gf_true; +                    break; +                } +            } + +            synclock_unlock(&conf->big_lock); +            gf_msg_debug(this->name, 0, +                         "brick %s is still" +                         " starting, waiting for 2 seconds ", +                         other_brick->path); +            sleep(2); +            synclock_lock(&conf->big_lock); +            retries--; +        } + +        if (!brick_status) { +            gf_log(this->name, GF_LOG_INFO, +                   "brick has not come up so cleaning up dead brick %s:%s", +                   other_brick->hostname, other_brick->path); +            other_brick->status = GF_BRICK_STOPPED; +            if (pidfile2[0]) +                sys_unlink(pidfile2); +            continue; +        } +        return other_brick; +    } + +    return NULL;  }  static glusterd_brickinfo_t * -find_compatible_brick (glusterd_conf_t *conf, -                       glusterd_volinfo_t *volinfo, -                       glusterd_brickinfo_t *brickinfo, -                       glusterd_volinfo_t **other_vol_p) +find_compatible_brick(glusterd_conf_t *conf, glusterd_volinfo_t *volinfo, +                      glusterd_brickinfo_t *brickinfo, +                      glusterd_volinfo_t **other_vol_p)  { -        glusterd_brickinfo_t    *other_brick = NULL; -        glusterd_volinfo_t      *other_vol   = NULL; -        glusterd_snap_t         *snap        = NULL; - -        /* Just return NULL here if multiplexing is disabled. */ -        if (!is_brick_mx_enabled ()) { -                return NULL; -        } +    glusterd_brickinfo_t *other_brick = NULL; +    glusterd_volinfo_t *other_vol = NULL; +    glusterd_snap_t *snap = NULL; -        other_brick = find_compat_brick_in_vol (conf, volinfo, NULL, brickinfo); -        if (other_brick) { -                *other_vol_p = volinfo; +    /* Just return NULL here if multiplexing is disabled. */ +    if (!is_brick_mx_enabled()) { +        return NULL; +    } + +    other_brick = find_compat_brick_in_vol(conf, volinfo, NULL, brickinfo); +    if (other_brick) { +        *other_vol_p = volinfo; +        return other_brick; +    } + +    /* +     * This check is necessary because changes to a volume's +     * transport options aren't propagated to snapshots.  Such a +     * change might break compatibility between the two, but we +     * have no way to "evict" a brick from the process it's +     * currently in.  If we keep it separate from the start, we +     * avoid the problem.  Note that snapshot bricks can still be +     * colocated with one another, even if they're for different +     * volumes, because the only thing likely to differ is their +     * auth options and those are not a factor in determining +     * compatibility. +     * +     * The very same immutability of snapshot bricks' transport +     * options, which can make them incompatible with their parent +     * volumes, ensures that once-compatible snapshot bricks will +     * remain compatible.  However, the same is not true for bricks +     * belonging to two non-snapshot volumes.  In that case, a +     * change to one might break compatibility and require them to +     * be separated, which is not yet done. +     * +     * TBD: address the option-change issue for non-snapshot bricks +     */ +    if (!volinfo->is_snap_volume) { +        cds_list_for_each_entry(other_vol, &conf->volumes, vol_list) +        { +            if (other_vol == volinfo) { +                continue; +            } +            other_brick = find_compat_brick_in_vol(conf, other_vol, volinfo, +                                                   brickinfo); +            if (other_brick) { +                *other_vol_p = other_vol;                  return other_brick; +            }          } - -        /* -         * This check is necessary because changes to a volume's -         * transport options aren't propagated to snapshots.  Such a -         * change might break compatibility between the two, but we -         * have no way to "evict" a brick from the process it's -         * currently in.  If we keep it separate from the start, we -         * avoid the problem.  Note that snapshot bricks can still be -         * colocated with one another, even if they're for different -         * volumes, because the only thing likely to differ is their -         * auth options and those are not a factor in determining -         * compatibility. -         * -         * The very same immutability of snapshot bricks' transport -         * options, which can make them incompatible with their parent -         * volumes, ensures that once-compatible snapshot bricks will -         * remain compatible.  However, the same is not true for bricks -         * belonging to two non-snapshot volumes.  In that case, a -         * change to one might break compatibility and require them to -         * be separated, which is not yet done. -         * -         * TBD: address the option-change issue for non-snapshot bricks -         */ -        if (!volinfo->is_snap_volume) { -                cds_list_for_each_entry (other_vol, &conf->volumes, vol_list) { -                        if (other_vol == volinfo) { -                                continue; -                        } -                        other_brick = find_compat_brick_in_vol (conf, -                                                                other_vol, -                                                                volinfo, -                                                                brickinfo); -                        if (other_brick) { -                                *other_vol_p = other_vol; -                                return other_brick; -                        } +    } else { +        cds_list_for_each_entry(snap, &conf->snapshots, snap_list) +        { +            cds_list_for_each_entry(other_vol, &snap->volumes, vol_list) +            { +                if (other_vol == volinfo) { +                    continue;                  } -        } else { -                cds_list_for_each_entry (snap, &conf->snapshots, snap_list) { -                    cds_list_for_each_entry (other_vol, &snap->volumes, -                                             vol_list) { -                        if (other_vol == volinfo) { -                                continue; -                        } -                        other_brick = find_compat_brick_in_vol (conf, -                                                                other_vol, -                                                                volinfo, -                                                                brickinfo); -                        if (other_brick) { -                                *other_vol_p = other_vol; -                                return other_brick; -                        } -                    } +                other_brick = find_compat_brick_in_vol(conf, other_vol, volinfo, +                                                       brickinfo); +                if (other_brick) { +                    *other_vol_p = other_vol; +                    return other_brick;                  } +            }          } +    } -        return NULL; +    return NULL;  } -  /* Below function is use to populate sockpath based on passed pid     value as a argument after check the value from proc and also     check if passed pid is match with running  glusterfs process  */  int -glusterd_get_sock_from_brick_pid (int pid, char *sockpath, size_t len) -{ -        char fname[128] = ""; -        char buf[1024] = ""; -        char cmdline[2048] = ""; -        xlator_t                *this = NULL; -        int fd         = -1; -        int i = 0, j = 0; -        char   *ptr   = NULL; -        char   *brptr   = NULL; -        char tmpsockpath[PATH_MAX] = ""; -        size_t blen    = 0; -        int    ret     = -1; - -        this = THIS; -        GF_ASSERT (this); - -        snprintf(fname, sizeof(fname), "/proc/%d/cmdline", pid); - -        if (sys_access (fname , R_OK) != 0) { -                gf_log (this->name, GF_LOG_ERROR, -                         "brick process %d is not running", pid); -                return ret; -        } - -        fd = open(fname, O_RDONLY); -        if (fd != -1) { -                blen = (int)sys_read(fd, buf, 1024); +glusterd_get_sock_from_brick_pid(int pid, char *sockpath, size_t len) +{ +    char fname[128] = ""; +    char buf[1024] = ""; +    char cmdline[2048] = ""; +    xlator_t *this = NULL; +    int fd = -1; +    int i = 0, j = 0; +    char *ptr = NULL; +    char *brptr = NULL; +    char tmpsockpath[PATH_MAX] = ""; +    size_t blen = 0; +    int ret = -1; + +    this = THIS; +    GF_ASSERT(this); + +    snprintf(fname, sizeof(fname), "/proc/%d/cmdline", pid); + +    if (sys_access(fname, R_OK) != 0) { +        gf_log(this->name, GF_LOG_ERROR, "brick process %d is not running", +               pid); +        return ret; +    } + +    fd = open(fname, O_RDONLY); +    if (fd != -1) { +        blen = (int)sys_read(fd, buf, 1024); +    } else { +        gf_log(this->name, GF_LOG_ERROR, "open failed %s to open a file %s", +               strerror(errno), fname); +        return ret; +    } + +    /* convert cmdline to single string */ +    for (i = 0, j = 0; i < blen; i++) { +        if (buf[i] == '\0') +            cmdline[j++] = ' '; +        else if (buf[i] < 32 || buf[i] > 126) /* remove control char */ +            continue; +        else if (buf[i] == '"' || buf[i] == '\\') { +            cmdline[j++] = '\\'; +            cmdline[j++] = buf[i];          } else { -                gf_log (this->name, GF_LOG_ERROR, -                         "open failed %s to open a file %s", strerror (errno), -                                                              fname); -                return ret; -        } - -        /* convert cmdline to single string */ -        for (i = 0 , j = 0; i < blen; i++)  { -                if (buf[i] == '\0') -                        cmdline[j++] = ' '; -                else if (buf[i] < 32 || buf[i] > 126) /* remove control char */ -                        continue; -                else if (buf[i] == '"' || buf[i] == '\\') { -                        cmdline[j++] = '\\'; -                        cmdline[j++] = buf[i]; -                } else { -                        cmdline[j++] = buf[i]; -                } -        } -        cmdline[j] = '\0'; -        if (fd) -                sys_close(fd); -        if (!strstr (cmdline, "glusterfs")) -                return ret; - -        ptr = strstr(cmdline, "-S "); -        if (!ptr) -                return ret; -        ptr = strchr(ptr, '/'); -        if (!ptr) -                return ret; -        brptr = strstr(ptr, "--brick-name"); -        if (!brptr) -                return ret; -        i = 0; - -        while (ptr < brptr) { -                if (*ptr != 32) -                        tmpsockpath[i++] = *ptr; -                ptr++; -        } - -        if (tmpsockpath[0]) { -                strncpy (sockpath, tmpsockpath , i); -                ret = 0; +            cmdline[j++] = buf[i];          } - +    } +    cmdline[j] = '\0'; +    if (fd) +        sys_close(fd); +    if (!strstr(cmdline, "glusterfs"))          return ret; -} - - -char * -search_brick_path_from_proc (pid_t brick_pid, char *brickpath) -{ -        struct dirent *dp = NULL; -        DIR *dirp = NULL; -        size_t len = 0; -        int fd = -1; -        char path[PATH_MAX] = ""; -        struct dirent  scratch[2] = {{0,},}; -        char *brick_path = NULL; - -        if (!brickpath) -                goto out; -        len = sprintf(path, "/proc/%d/fd/", brick_pid); -        if (len >= (sizeof(path) - 2)) -                goto out; +    ptr = strstr(cmdline, "-S "); +    if (!ptr) +        return ret; +    ptr = strchr(ptr, '/'); +    if (!ptr) +        return ret; +    brptr = strstr(ptr, "--brick-name"); +    if (!brptr) +        return ret; +    i = 0; -        dirp = sys_opendir (path); -        if (!dirp) -                goto out; +    while (ptr < brptr) { +        if (*ptr != 32) +            tmpsockpath[i++] = *ptr; +        ptr++; +    } -        fd = dirfd (dirp); -        if (fd  < 0) -                goto out; - -        while ((dp = sys_readdir(dirp, scratch))) { -                if (!strcmp(dp->d_name, ".") || -                    !strcmp(dp->d_name, "..")) -                        continue; +    if (tmpsockpath[0]) { +        strncpy(sockpath, tmpsockpath, i); +        ret = 0; +    } -                /* check for non numerical descriptors */ -                if (!strtol(dp->d_name, (char **)NULL, 10)) -                        continue; +    return ret; +} -                len = readlinkat (fd, dp->d_name, path, sizeof(path) - 1); -		/* TODO: handle len == -1 -> error condition in readlinkat */ -                if (len > 1) { -                        path[len] = '\0'; -                        if (!strcmp (path, brickpath)) { -                                brick_path = gf_strdup(path); -                                break; -                        } -                } +char * +search_brick_path_from_proc(pid_t brick_pid, char *brickpath) +{ +    struct dirent *dp = NULL; +    DIR *dirp = NULL; +    size_t len = 0; +    int fd = -1; +    char path[PATH_MAX] = ""; +    struct dirent scratch[2] = { +        { +            0, +        }, +    }; +    char *brick_path = NULL; + +    if (!brickpath) +        goto out; + +    len = sprintf(path, "/proc/%d/fd/", brick_pid); +    if (len >= (sizeof(path) - 2)) +        goto out; + +    dirp = sys_opendir(path); +    if (!dirp) +        goto out; + +    fd = dirfd(dirp); +    if (fd < 0) +        goto out; + +    while ((dp = sys_readdir(dirp, scratch))) { +        if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) +            continue; + +        /* check for non numerical descriptors */ +        if (!strtol(dp->d_name, (char **)NULL, 10)) +            continue; + +        len = readlinkat(fd, dp->d_name, path, sizeof(path) - 1); +        /* TODO: handle len == -1 -> error condition in readlinkat */ +        if (len > 1) { +            path[len] = '\0'; +            if (!strcmp(path, brickpath)) { +                brick_path = gf_strdup(path); +                break; +            }          } +    }  out: -        sys_closedir(dirp); -        return brick_path; +    sys_closedir(dirp); +    return brick_path;  } -  int -glusterd_brick_start (glusterd_volinfo_t *volinfo, -                      glusterd_brickinfo_t *brickinfo, -                      gf_boolean_t wait, -                      gf_boolean_t only_connect) -{ -        int                      ret   = -1; -        xlator_t                *this = NULL; -        glusterd_brickinfo_t    *other_brick; -        glusterd_conf_t         *conf = NULL; -        int32_t                  pid                   = -1; -        char                     pidfile[PATH_MAX]     = ""; -        char                     socketpath[PATH_MAX]  = ""; -        char                    *brickpath             = NULL; -        glusterd_volinfo_t      *other_vol; -        gf_boolean_t             is_service_running = _gf_false; -        uuid_t                   volid                 = {0,}; -        ssize_t                  size                  = -1; - - -        this = THIS; -        GF_ASSERT (this); -        conf = this->private; - -        if ((!brickinfo) || (!volinfo)) -                goto out; - -        if (gf_uuid_is_null (brickinfo->uuid)) { -                ret = glusterd_resolve_brick (brickinfo); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_RESOLVE_BRICK_FAIL, -                                FMTSTR_RESOLVE_BRICK, -                                brickinfo->hostname, brickinfo->path); -                        gf_event (EVENT_BRICKPATH_RESOLVE_FAILED, -                                  "peer=%s;volume=%s;brick=%s", -                                  brickinfo->hostname, volinfo->volname, -                                  brickinfo->path); -                        goto out; -                } -        } - -        if (gf_uuid_compare (brickinfo->uuid, MY_UUID)) { -                ret = 0; -                goto out; -        } - -        /* If a trigger to start the brick is already initiated then no need for -         * a reattempt as it's an overkill. With glusterd_brick_start () -         * function being used in multiple places, when glusterd restarts we see -         * three different triggers for an attempt to start the brick process -         * due to the quorum handling code in glusterd_friend_sm. -         */ -        if (brickinfo->status == GF_BRICK_STARTING || -            brickinfo->start_triggered) { -                gf_msg_debug (this->name, 0, "brick %s is already in starting " -                              "phase", brickinfo->path); -                ret = 0; -                goto out; -        } -        if (!only_connect) -                brickinfo->start_triggered = _gf_true; - -        GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, brickinfo, conf); - -        /* Compare volume-id xattr is helpful to ensure the existence of a brick_root -           path before the start/attach a brick -        */ -        size = sys_lgetxattr (brickinfo->path, GF_XATTR_VOL_ID_KEY, volid, 16); -        if (size != 16) { -                gf_log (this->name, GF_LOG_ERROR, -                        "Missing %s extended attribute on brick root (%s)," -                        " brick is deemed not to be a part of the volume (%s) ", -                        GF_XATTR_VOL_ID_KEY, brickinfo->path, volinfo->volname); -                goto out; -        } +glusterd_brick_start(glusterd_volinfo_t *volinfo, +                     glusterd_brickinfo_t *brickinfo, gf_boolean_t wait, +                     gf_boolean_t only_connect) +{ +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_brickinfo_t *other_brick; +    glusterd_conf_t *conf = NULL; +    int32_t pid = -1; +    char pidfile[PATH_MAX] = ""; +    char socketpath[PATH_MAX] = ""; +    char *brickpath = NULL; +    glusterd_volinfo_t *other_vol; +    gf_boolean_t is_service_running = _gf_false; +    uuid_t volid = { +        0, +    }; +    ssize_t size = -1; -        if (strncmp (uuid_utoa (volinfo->volume_id), uuid_utoa(volid), GF_UUID_BUF_SIZE)) { -                gf_log (this->name, GF_LOG_ERROR, -                        "Mismatching %s extended attribute on brick root (%s)," -                        " brick is deemed not to be a part of the volume (%s)", -                        GF_XATTR_VOL_ID_KEY, brickinfo->path, volinfo->volname); -                goto out; -        } -        is_service_running = gf_is_service_running (pidfile, &pid); -        if (is_service_running) { -                if (is_brick_mx_enabled ()) { -                        brickpath = search_brick_path_from_proc -                                                (pid, brickinfo->path); -                        if (!brickpath) { -                                if (only_connect) -                                        return 0; -                                gf_log (this->name, GF_LOG_INFO, -                                        "Either pid %d is not running or brick" -                                        " path %s is not consumed so cleanup pidfile", -                                        pid, brickinfo->path); -                                /* brick isn't running,so unlink stale pidfile -                                 * if any. -                                 */ -                                if (sys_access (pidfile , R_OK) == 0) { -                                        sys_unlink (pidfile); -                                } -                                goto run; -                        } -                        GF_FREE (brickpath); -                        ret = glusterd_get_sock_from_brick_pid (pid, socketpath, -                                                                sizeof(socketpath)); -                        if (ret) { -                                if (only_connect) -                                        return 0; -                                gf_log (this->name, GF_LOG_INFO, -                                        "Either pid %d is not running or does " -                                        "not match with any running brick " -                                        "processes", pid); -                                /* Fetch unix socket is failed so unlink pidfile */ -                                if (sys_access (pidfile , R_OK) == 0) { -                                        sys_unlink (pidfile); -                                } -                                goto run; -                        } -                } -                if (brickinfo->status != GF_BRICK_STARTING && -                    brickinfo->status != GF_BRICK_STARTED) { -                        gf_log (this->name, GF_LOG_INFO, -                                "discovered already-running brick %s", -                                brickinfo->path); -                        (void) pmap_registry_bind (this, -                                        brickinfo->port, brickinfo->path, -                                        GF_PMAP_PORT_BRICKSERVER, NULL); -                        brickinfo->port_registered = _gf_true; -                        /* -                         * This will unfortunately result in a separate RPC -                         * connection per brick, even though they're all in -                         * the same process.  It works, but it would be nicer -                         * if we could find a pre-existing connection to that -                         * same port (on another brick) and re-use that. -                         * TBD: re-use RPC connection across bricks -                         */ -                        if (!is_brick_mx_enabled ()) { -                                        glusterd_set_brick_socket_filepath -                                                (volinfo, brickinfo, -                                                 socketpath, -                                                 sizeof (socketpath)); -                        } -                        gf_log (this->name, GF_LOG_DEBUG, -                                "Using %s as sockfile for brick %s of volume %s ", -                                socketpath, brickinfo->path, volinfo->volname); - -                        (void) glusterd_brick_connect (volinfo, brickinfo, -                                        socketpath); - -                        ret = glusterd_brick_process_add_brick (brickinfo); -                        if (ret) { -                                gf_msg (this->name, GF_LOG_ERROR, 0, -                                        GD_MSG_BRICKPROC_ADD_BRICK_FAILED, -                                        "Adding brick %s:%s to brick process " -                                        "failed.", brickinfo->hostname, -                                        brickinfo->path); -                                goto out; -                        } -                        /* We need to set the status back to STARTING so that -                         * while the other (re)start brick requests come in for -                         * other bricks, this brick can be considered as -                         * compatible. -                         */ -                        brickinfo->status = GF_BRICK_STARTING; -                } -                return 0; -        } -        if (only_connect) -                return 0; +    this = THIS; +    GF_ASSERT(this); +    conf = this->private; -run: -        ret = _mk_rundir_p (volinfo); -        if (ret) -                goto out; +    if ((!brickinfo) || (!volinfo)) +        goto out; -        other_brick = find_compatible_brick (conf, volinfo, brickinfo, -                                             &other_vol); -        if (other_brick) { -                /* mark the brick to starting as send_attach_req might take few -                 * iterations to successfully attach the brick and we don't want -                 * to get into a state where another needless trigger to start -                 * the brick is processed -                 */ -                brickinfo->status = GF_BRICK_STARTING; -                ret = attach_brick (this, brickinfo, other_brick, -                                    volinfo, other_vol); -                if (ret == 0) { -                        goto out; -                } -                /* Attach_brick is failed so unlink pidfile */ -                if (sys_access (pidfile , R_OK) == 0) { -                        sys_unlink (pidfile); -                } -        } - -        /* -         * This hack is necessary because our brick-process management is a -         * total nightmare.  We expect a brick process's socket and pid files -         * to be ready *immediately* after we start it.  Ditto for it calling -         * back to bind its port.  Unfortunately, none of that is realistic. -         * Any process takes non-zero time to start up.  This has *always* been -         * racy and unsafe; it just became more visible with multiplexing. -         * -         * The right fix would be to do all of this setup *in the parent*, -         * which would include (among other things) getting the PID back from -         * the "runner" code.  That's all prohibitively difficult and risky. -         * To work around the more immediate problems, we create a stub pidfile -         * here to let gf_is_service_running know that we expect the process to -         * be there shortly, and then it gets filled in with a real PID when -         * the process does finish starting up. -         * -         * TBD: pray for GlusterD 2 to be ready soon. -         */ -        gf_log (this->name, GF_LOG_INFO, "starting a fresh brick process for " -                "brick %s", brickinfo->path); -        ret = glusterd_volume_start_glusterfs (volinfo, brickinfo, wait); +    if (gf_uuid_is_null(brickinfo->uuid)) { +        ret = glusterd_resolve_brick(brickinfo);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BRICK_DISCONNECTED, -                        "Unable to start brick %s:%s", -                        brickinfo->hostname, brickinfo->path); -                gf_event (EVENT_BRICK_START_FAILED, -                         "peer=%s;volume=%s;brick=%s", brickinfo->hostname, -                         volinfo->volname, brickinfo->path); -                goto out; +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_RESOLVE_BRICK_FAIL, +                   FMTSTR_RESOLVE_BRICK, brickinfo->hostname, brickinfo->path); +            gf_event(EVENT_BRICKPATH_RESOLVE_FAILED, +                     "peer=%s;volume=%s;brick=%s", brickinfo->hostname, +                     volinfo->volname, brickinfo->path); +            goto out;          } +    } -out: -        if (ret && brickinfo) { -                brickinfo->start_triggered = _gf_false; +    if (gf_uuid_compare(brickinfo->uuid, MY_UUID)) { +        ret = 0; +        goto out; +    } + +    /* If a trigger to start the brick is already initiated then no need for +     * a reattempt as it's an overkill. With glusterd_brick_start () +     * function being used in multiple places, when glusterd restarts we see +     * three different triggers for an attempt to start the brick process +     * due to the quorum handling code in glusterd_friend_sm. +     */ +    if (brickinfo->status == GF_BRICK_STARTING || brickinfo->start_triggered) { +        gf_msg_debug(this->name, 0, +                     "brick %s is already in starting " +                     "phase", +                     brickinfo->path); +        ret = 0; +        goto out; +    } +    if (!only_connect) +        brickinfo->start_triggered = _gf_true; + +    GLUSTERD_GET_BRICK_PIDFILE(pidfile, volinfo, brickinfo, conf); + +    /* Compare volume-id xattr is helpful to ensure the existence of a +       brick_root path before the start/attach a brick +    */ +    size = sys_lgetxattr(brickinfo->path, GF_XATTR_VOL_ID_KEY, volid, 16); +    if (size != 16) { +        gf_log(this->name, GF_LOG_ERROR, +               "Missing %s extended attribute on brick root (%s)," +               " brick is deemed not to be a part of the volume (%s) ", +               GF_XATTR_VOL_ID_KEY, brickinfo->path, volinfo->volname); +        goto out; +    } + +    if (strncmp(uuid_utoa(volinfo->volume_id), uuid_utoa(volid), +                GF_UUID_BUF_SIZE)) { +        gf_log(this->name, GF_LOG_ERROR, +               "Mismatching %s extended attribute on brick root (%s)," +               " brick is deemed not to be a part of the volume (%s)", +               GF_XATTR_VOL_ID_KEY, brickinfo->path, volinfo->volname); +        goto out; +    } +    is_service_running = gf_is_service_running(pidfile, &pid); +    if (is_service_running) { +        if (is_brick_mx_enabled()) { +            brickpath = search_brick_path_from_proc(pid, brickinfo->path); +            if (!brickpath) { +                if (only_connect) +                    return 0; +                gf_log(this->name, GF_LOG_INFO, +                       "Either pid %d is not running or brick" +                       " path %s is not consumed so cleanup pidfile", +                       pid, brickinfo->path); +                /* brick isn't running,so unlink stale pidfile +                 * if any. +                 */ +                if (sys_access(pidfile, R_OK) == 0) { +                    sys_unlink(pidfile); +                } +                goto run; +            } +            GF_FREE(brickpath); +            ret = glusterd_get_sock_from_brick_pid(pid, socketpath, +                                                   sizeof(socketpath)); +            if (ret) { +                if (only_connect) +                    return 0; +                gf_log(this->name, GF_LOG_INFO, +                       "Either pid %d is not running or does " +                       "not match with any running brick " +                       "processes", +                       pid); +                /* Fetch unix socket is failed so unlink pidfile */ +                if (sys_access(pidfile, R_OK) == 0) { +                    sys_unlink(pidfile); +                } +                goto run; +            } +        } +        if (brickinfo->status != GF_BRICK_STARTING && +            brickinfo->status != GF_BRICK_STARTED) { +            gf_log(this->name, GF_LOG_INFO, +                   "discovered already-running brick %s", brickinfo->path); +            (void)pmap_registry_bind(this, brickinfo->port, brickinfo->path, +                                     GF_PMAP_PORT_BRICKSERVER, NULL); +            brickinfo->port_registered = _gf_true; +            /* +             * This will unfortunately result in a separate RPC +             * connection per brick, even though they're all in +             * the same process.  It works, but it would be nicer +             * if we could find a pre-existing connection to that +             * same port (on another brick) and re-use that. +             * TBD: re-use RPC connection across bricks +             */ +            if (!is_brick_mx_enabled()) { +                glusterd_set_brick_socket_filepath( +                    volinfo, brickinfo, socketpath, sizeof(socketpath)); +            } +            gf_log(this->name, GF_LOG_DEBUG, +                   "Using %s as sockfile for brick %s of volume %s ", +                   socketpath, brickinfo->path, volinfo->volname); + +            (void)glusterd_brick_connect(volinfo, brickinfo, socketpath); + +            ret = glusterd_brick_process_add_brick(brickinfo); +            if (ret) { +                gf_msg(this->name, GF_LOG_ERROR, 0, +                       GD_MSG_BRICKPROC_ADD_BRICK_FAILED, +                       "Adding brick %s:%s to brick process " +                       "failed.", +                       brickinfo->hostname, brickinfo->path); +                goto out; +            } +            /* We need to set the status back to STARTING so that +             * while the other (re)start brick requests come in for +             * other bricks, this brick can be considered as +             * compatible. +             */ +            brickinfo->status = GF_BRICK_STARTING;          } -        gf_msg_debug (this->name, 0, "returning %d ", ret); -        return ret; -} - -int -glusterd_restart_bricks (void *opaque) -{ -        int                   ret            = 0; -        glusterd_volinfo_t   *volinfo        = NULL; -        glusterd_brickinfo_t *brickinfo      = NULL; -        glusterd_snap_t      *snap           = NULL; -        gf_boolean_t          start_svcs     = _gf_false; -        xlator_t             *this           = NULL; -        glusterd_conf_t      *conf           = NULL; -        int                   active_count   = 0; -        int                   quorum_count   = 0; -        gf_boolean_t          node_quorum    = _gf_false; - -        this = THIS; -        GF_VALIDATE_OR_GOTO ("glusterd", this, return_block); - -        conf = this->private; -        GF_VALIDATE_OR_GOTO (this->name, conf, return_block); +        return 0; +    } +    if (only_connect) +        return 0; -        /* We need to ensure that restarting the bricks during glusterd restart -         * shouldn't race with the import volume thread (refer -         * glusterd_compare_friend_data ()) +run: +    ret = _mk_rundir_p(volinfo); +    if (ret) +        goto out; + +    other_brick = find_compatible_brick(conf, volinfo, brickinfo, &other_vol); +    if (other_brick) { +        /* mark the brick to starting as send_attach_req might take few +         * iterations to successfully attach the brick and we don't want +         * to get into a state where another needless trigger to start +         * the brick is processed           */ -        while (conf->restart_bricks) { -                synclock_unlock (&conf->big_lock); -                sleep (2); -                synclock_lock (&conf->big_lock); +        brickinfo->status = GF_BRICK_STARTING; +        ret = attach_brick(this, brickinfo, other_brick, volinfo, other_vol); +        if (ret == 0) { +            goto out;          } -        conf->restart_bricks = _gf_true; - -        ++(conf->blockers); -        ret = glusterd_get_quorum_cluster_counts (this, &active_count, -                                                  &quorum_count); -        if (ret) -                goto out; - -        if (does_quorum_meet (active_count, quorum_count)) -                node_quorum = _gf_true; - -        cds_list_for_each_entry (volinfo, &conf->volumes, vol_list) { -                if (volinfo->status != GLUSTERD_STATUS_STARTED) { -                        continue; -                } -                gf_msg_debug (this->name, 0, "starting the volume %s", -                        volinfo->volname); - -                /* Check the quorum, if quorum is not met, don't start the -                   bricks. Stop bricks in case they are running. -                */ -                ret = check_quorum_for_brick_start (volinfo, node_quorum); -                if (ret == 0) { -                        gf_msg (this->name, GF_LOG_INFO, 0, -                                GD_MSG_SERVER_QUORUM_NOT_MET, "Skipping brick " -                                "restart for volume %s as quorum is not met", -                                volinfo->volname); -                        (void) glusterd_stop_bricks (volinfo); -                        continue; -                } else if (ret == 2 && conf->restart_done == _gf_true) { -                        /* If glusterd has been restarted and quorum is not -                         * applicable then do not restart the bricks as this -                         * might start bricks brought down purposely, say for -                         * maintenance -                         */ -                        continue; -                } else { -                        start_svcs = _gf_true; -                        cds_list_for_each_entry (brickinfo, &volinfo->bricks, -                                                 brick_list) { -                                if (!brickinfo->start_triggered) { -                                        pthread_mutex_lock -                                                (&brickinfo->restart_mutex); -                                        { -                                                glusterd_brick_start -                                                         (volinfo, brickinfo, -                                                          _gf_false, _gf_false); -                                        } -                                        pthread_mutex_unlock -                                                (&brickinfo->restart_mutex); -                                } -                        } -                        ret = glusterd_store_volinfo -                                (volinfo, GLUSTERD_VOLINFO_VER_AC_NONE); -                        if (ret) { -                                gf_msg (this->name, GF_LOG_ERROR, 0, -                                        GD_MSG_VOLINFO_STORE_FAIL, "Failed to " -                                        "write volinfo for volume %s", -                                        volinfo->volname); -                                goto out; -                        } +        /* Attach_brick is failed so unlink pidfile */ +        if (sys_access(pidfile, R_OK) == 0) { +            sys_unlink(pidfile); +        } +    } + +    /* +     * This hack is necessary because our brick-process management is a +     * total nightmare.  We expect a brick process's socket and pid files +     * to be ready *immediately* after we start it.  Ditto for it calling +     * back to bind its port.  Unfortunately, none of that is realistic. +     * Any process takes non-zero time to start up.  This has *always* been +     * racy and unsafe; it just became more visible with multiplexing. +     * +     * The right fix would be to do all of this setup *in the parent*, +     * which would include (among other things) getting the PID back from +     * the "runner" code.  That's all prohibitively difficult and risky. +     * To work around the more immediate problems, we create a stub pidfile +     * here to let gf_is_service_running know that we expect the process to +     * be there shortly, and then it gets filled in with a real PID when +     * the process does finish starting up. +     * +     * TBD: pray for GlusterD 2 to be ready soon. +     */ +    gf_log(this->name, GF_LOG_INFO, +           "starting a fresh brick process for " +           "brick %s", +           brickinfo->path); +    ret = glusterd_volume_start_glusterfs(volinfo, brickinfo, wait); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_DISCONNECTED, +               "Unable to start brick %s:%s", brickinfo->hostname, +               brickinfo->path); +        gf_event(EVENT_BRICK_START_FAILED, "peer=%s;volume=%s;brick=%s", +                 brickinfo->hostname, volinfo->volname, brickinfo->path); +        goto out; +    } + +out: +    if (ret && brickinfo) { +        brickinfo->start_triggered = _gf_false; +    } +    gf_msg_debug(this->name, 0, "returning %d ", ret); +    return ret; +} + +int +glusterd_restart_bricks(void *opaque) +{ +    int ret = 0; +    glusterd_volinfo_t *volinfo = NULL; +    glusterd_brickinfo_t *brickinfo = NULL; +    glusterd_snap_t *snap = NULL; +    gf_boolean_t start_svcs = _gf_false; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    int active_count = 0; +    int quorum_count = 0; +    gf_boolean_t node_quorum = _gf_false; + +    this = THIS; +    GF_VALIDATE_OR_GOTO("glusterd", this, return_block); + +    conf = this->private; +    GF_VALIDATE_OR_GOTO(this->name, conf, return_block); + +    /* We need to ensure that restarting the bricks during glusterd restart +     * shouldn't race with the import volume thread (refer +     * glusterd_compare_friend_data ()) +     */ +    while (conf->restart_bricks) { +        synclock_unlock(&conf->big_lock); +        sleep(2); +        synclock_lock(&conf->big_lock); +    } +    conf->restart_bricks = _gf_true; + +    ++(conf->blockers); +    ret = glusterd_get_quorum_cluster_counts(this, &active_count, +                                             &quorum_count); +    if (ret) +        goto out; + +    if (does_quorum_meet(active_count, quorum_count)) +        node_quorum = _gf_true; + +    cds_list_for_each_entry(volinfo, &conf->volumes, vol_list) +    { +        if (volinfo->status != GLUSTERD_STATUS_STARTED) { +            continue; +        } +        gf_msg_debug(this->name, 0, "starting the volume %s", volinfo->volname); + +        /* Check the quorum, if quorum is not met, don't start the +           bricks. Stop bricks in case they are running. +        */ +        ret = check_quorum_for_brick_start(volinfo, node_quorum); +        if (ret == 0) { +            gf_msg(this->name, GF_LOG_INFO, 0, GD_MSG_SERVER_QUORUM_NOT_MET, +                   "Skipping brick " +                   "restart for volume %s as quorum is not met", +                   volinfo->volname); +            (void)glusterd_stop_bricks(volinfo); +            continue; +        } else if (ret == 2 && conf->restart_done == _gf_true) { +            /* If glusterd has been restarted and quorum is not +             * applicable then do not restart the bricks as this +             * might start bricks brought down purposely, say for +             * maintenance +             */ +            continue; +        } else { +            start_svcs = _gf_true; +            cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +            { +                if (!brickinfo->start_triggered) { +                    pthread_mutex_lock(&brickinfo->restart_mutex); +                    { +                        glusterd_brick_start(volinfo, brickinfo, _gf_false, +                                             _gf_false); +                    } +                    pthread_mutex_unlock(&brickinfo->restart_mutex);                  } +            } +            ret = glusterd_store_volinfo(volinfo, GLUSTERD_VOLINFO_VER_AC_NONE); +            if (ret) { +                gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_STORE_FAIL, +                       "Failed to " +                       "write volinfo for volume %s", +                       volinfo->volname); +                goto out; +            }          } +    } -        cds_list_for_each_entry (snap, &conf->snapshots, snap_list) { -                cds_list_for_each_entry (volinfo, &snap->volumes, vol_list) { -                        if (volinfo->status != GLUSTERD_STATUS_STARTED) -                                continue; -                        /* Check the quorum, if quorum is not met, don't start -                         * the bricks -                        */ -                        ret = check_quorum_for_brick_start (volinfo, -                                                            node_quorum); -                        if (ret == 0) { -                                gf_msg (this->name, GF_LOG_INFO, 0, -                                        GD_MSG_SERVER_QUORUM_NOT_MET, "Skipping" -                                        " brick restart for volume %s as " -                                        "quorum is not met", volinfo->volname); -                                continue; -                        } -                        start_svcs = _gf_true; -                        gf_msg_debug (this->name, 0, "starting the snap " -                                "volume %s", volinfo->volname); -                        cds_list_for_each_entry (brickinfo, &volinfo->bricks, -                                                 brick_list) { -                                if (!brickinfo->start_triggered) { -                                        pthread_mutex_lock -                                                (&brickinfo->restart_mutex); -                                        { -                                                glusterd_brick_start -                                                         (volinfo, brickinfo, -                                                          _gf_false, _gf_false); -                                        } -                                        pthread_mutex_unlock -                                                (&brickinfo->restart_mutex); -                                } -                        } -                        ret = glusterd_store_volinfo -                                (volinfo, GLUSTERD_VOLINFO_VER_AC_NONE); -                        if (ret) { -                                gf_msg (this->name, GF_LOG_ERROR, 0, -                                        GD_MSG_VOLINFO_STORE_FAIL, "Failed to " -                                        "write volinfo for volume %s", -                                        volinfo->volname); -                                goto out; -                        } +    cds_list_for_each_entry(snap, &conf->snapshots, snap_list) +    { +        cds_list_for_each_entry(volinfo, &snap->volumes, vol_list) +        { +            if (volinfo->status != GLUSTERD_STATUS_STARTED) +                continue; +            /* Check the quorum, if quorum is not met, don't start +             * the bricks +             */ +            ret = check_quorum_for_brick_start(volinfo, node_quorum); +            if (ret == 0) { +                gf_msg(this->name, GF_LOG_INFO, 0, GD_MSG_SERVER_QUORUM_NOT_MET, +                       "Skipping" +                       " brick restart for volume %s as " +                       "quorum is not met", +                       volinfo->volname); +                continue; +            } +            start_svcs = _gf_true; +            gf_msg_debug(this->name, 0, +                         "starting the snap " +                         "volume %s", +                         volinfo->volname); +            cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +            { +                if (!brickinfo->start_triggered) { +                    pthread_mutex_lock(&brickinfo->restart_mutex); +                    { +                        glusterd_brick_start(volinfo, brickinfo, _gf_false, +                                             _gf_false); +                    } +                    pthread_mutex_unlock(&brickinfo->restart_mutex);                  } +            } +            ret = glusterd_store_volinfo(volinfo, GLUSTERD_VOLINFO_VER_AC_NONE); +            if (ret) { +                gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_STORE_FAIL, +                       "Failed to " +                       "write volinfo for volume %s", +                       volinfo->volname); +                goto out; +            }          } -        if (start_svcs == _gf_true) { -                glusterd_svcs_manager (NULL); -        } +    } +    if (start_svcs == _gf_true) { +        glusterd_svcs_manager(NULL); +    } -        ret = 0; +    ret = 0;  out: -        --(conf->blockers); -        conf->restart_done = _gf_true; -        conf->restart_bricks = _gf_false; +    --(conf->blockers); +    conf->restart_done = _gf_true; +    conf->restart_bricks = _gf_false;  return_block: -        return ret; -} - -int -_local_gsyncd_start (dict_t *this, char *key, data_t *value, void *data) -{ -        char               *path_list                   = NULL; -        char               *slave                       = NULL; -        char               *slave_url                   = NULL; -        char               *slave_vol                   = NULL; -        char               *slave_host                  = NULL; -        char               *statefile                   = NULL; -        char                buf[1024]                   = "faulty"; -        int                 uuid_len                    = 0; -        int                 ret                         = 0; -        int                 op_ret                      = 0; -        int                 ret_status                  = 0; -        char                uuid_str[64]                = ""; -        glusterd_volinfo_t *volinfo                     = NULL; -        char                confpath[PATH_MAX]          = ""; -        char               *op_errstr                   = NULL; -        glusterd_conf_t    *priv                        = NULL; -        gf_boolean_t        is_template_in_use          = _gf_false; -        gf_boolean_t        is_paused                   = _gf_false; -        char                key1[1024]                  = ""; -        xlator_t           *this1                       = NULL; - -        this1 = THIS; -        GF_ASSERT (this1); -        priv = this1->private; -        GF_ASSERT (priv); -        GF_ASSERT (data); - -        volinfo = data; -        slave = strchr(value->data, ':'); -        if (slave) -                slave ++; -        else -                return 0; -        uuid_len = (slave - value->data - 1); - -        strncpy (uuid_str, (char*)value->data, uuid_len); - -        /* Getting Local Brickpaths */ -        ret = glusterd_get_local_brickpaths (volinfo, &path_list); - -        /*Generating the conf file path needed by gsyncd */ -        ret = glusterd_get_slave_info (slave, &slave_url, &slave_host, -                                       &slave_vol, &op_errstr); -        if (ret) { -                gf_msg (this1->name, GF_LOG_ERROR, 0, -                        GD_MSG_SLAVEINFO_FETCH_ERROR, -                        "Unable to fetch slave details."); -                ret = -1; -                goto out; -        } - -        ret = snprintf (confpath, sizeof(confpath) - 1, -                        "%s/"GEOREP"/%s_%s_%s/gsyncd.conf", -                        priv->workdir, volinfo->volname, -                        slave_host, slave_vol); -        confpath[ret] = '\0'; - -        /* Fetching the last status of the node */ -        ret = glusterd_get_statefile_name (volinfo, slave, -                                           confpath, &statefile, -                                           &is_template_in_use); -        if (ret) { -                if (!strstr(slave, "::")) -                        gf_msg (this1->name, GF_LOG_INFO, 0, -                                GD_MSG_SLAVE_URL_INVALID, -                                "%s is not a valid slave url.", slave); -                else -                        gf_msg (this1->name, GF_LOG_INFO, 0, -                                GD_MSG_GET_STATEFILE_NAME_FAILED, -                                "Unable to get" -                                " statefile's name"); -                goto out; -        } - -        /* If state-file entry is missing from the config file, -         * do not start gsyncd on restart */ -        if (is_template_in_use) { -                gf_msg (this1->name, GF_LOG_INFO, 0, -                        GD_MSG_NO_STATEFILE_ENTRY, -                        "state-file entry is missing in config file." -                        "Not Restarting"); -                goto out; -        } +    return ret; +} + +int +_local_gsyncd_start(dict_t *this, char *key, data_t *value, void *data) +{ +    char *path_list = NULL; +    char *slave = NULL; +    char *slave_url = NULL; +    char *slave_vol = NULL; +    char *slave_host = NULL; +    char *statefile = NULL; +    char buf[1024] = "faulty"; +    int uuid_len = 0; +    int ret = 0; +    int op_ret = 0; +    int ret_status = 0; +    char uuid_str[64] = ""; +    glusterd_volinfo_t *volinfo = NULL; +    char confpath[PATH_MAX] = ""; +    char *op_errstr = NULL; +    glusterd_conf_t *priv = NULL; +    gf_boolean_t is_template_in_use = _gf_false; +    gf_boolean_t is_paused = _gf_false; +    char key1[1024] = ""; +    xlator_t *this1 = NULL; + +    this1 = THIS; +    GF_ASSERT(this1); +    priv = this1->private; +    GF_ASSERT(priv); +    GF_ASSERT(data); + +    volinfo = data; +    slave = strchr(value->data, ':'); +    if (slave) +        slave++; +    else +        return 0; +    uuid_len = (slave - value->data - 1); -        is_template_in_use = _gf_false; +    strncpy(uuid_str, (char *)value->data, uuid_len); -        ret = gsync_status (volinfo->volname, slave, confpath, -                            &ret_status, &is_template_in_use); -        if (ret == -1) { -                gf_msg (this1->name, GF_LOG_INFO, 0, -                        GD_MSG_GSYNC_VALIDATION_FAIL, -                        GEOREP" start option validation failed "); -                ret = 0; -                goto out; -        } +    /* Getting Local Brickpaths */ +    ret = glusterd_get_local_brickpaths(volinfo, &path_list); -        if (is_template_in_use == _gf_true) { -                gf_msg (this1->name, GF_LOG_INFO, 0, -                        GD_MSG_PIDFILE_NOT_FOUND, -                        "pid-file entry is missing in config file." -                        "Not Restarting"); -                ret = 0; -                goto out; -        } +    /*Generating the conf file path needed by gsyncd */ +    ret = glusterd_get_slave_info(slave, &slave_url, &slave_host, &slave_vol, +                                  &op_errstr); +    if (ret) { +        gf_msg(this1->name, GF_LOG_ERROR, 0, GD_MSG_SLAVEINFO_FETCH_ERROR, +               "Unable to fetch slave details."); +        ret = -1; +        goto out; +    } + +    ret = snprintf(confpath, sizeof(confpath) - 1, +                   "%s/" GEOREP "/%s_%s_%s/gsyncd.conf", priv->workdir, +                   volinfo->volname, slave_host, slave_vol); +    confpath[ret] = '\0'; + +    /* Fetching the last status of the node */ +    ret = glusterd_get_statefile_name(volinfo, slave, confpath, &statefile, +                                      &is_template_in_use); +    if (ret) { +        if (!strstr(slave, "::")) +            gf_msg(this1->name, GF_LOG_INFO, 0, GD_MSG_SLAVE_URL_INVALID, +                   "%s is not a valid slave url.", slave); +        else +            gf_msg(this1->name, GF_LOG_INFO, 0, +                   GD_MSG_GET_STATEFILE_NAME_FAILED, +                   "Unable to get" +                   " statefile's name"); +        goto out; +    } + +    /* If state-file entry is missing from the config file, +     * do not start gsyncd on restart */ +    if (is_template_in_use) { +        gf_msg(this1->name, GF_LOG_INFO, 0, GD_MSG_NO_STATEFILE_ENTRY, +               "state-file entry is missing in config file." +               "Not Restarting"); +        goto out; +    } + +    is_template_in_use = _gf_false; + +    ret = gsync_status(volinfo->volname, slave, confpath, &ret_status, +                       &is_template_in_use); +    if (ret == -1) { +        gf_msg(this1->name, GF_LOG_INFO, 0, GD_MSG_GSYNC_VALIDATION_FAIL, +               GEOREP " start option validation failed "); +        ret = 0; +        goto out; +    } -        ret = glusterd_gsync_read_frm_status (statefile, buf, sizeof (buf)); -        if (ret <= 0) { -                gf_msg (this1->name, GF_LOG_ERROR, 0, -                        GD_MSG_STAT_FILE_READ_FAILED, -                        "Unable to read the status"); -                goto out; +    if (is_template_in_use == _gf_true) { +        gf_msg(this1->name, GF_LOG_INFO, 0, GD_MSG_PIDFILE_NOT_FOUND, +               "pid-file entry is missing in config file." +               "Not Restarting"); +        ret = 0; +        goto out; +    } + +    ret = glusterd_gsync_read_frm_status(statefile, buf, sizeof(buf)); +    if (ret <= 0) { +        gf_msg(this1->name, GF_LOG_ERROR, 0, GD_MSG_STAT_FILE_READ_FAILED, +               "Unable to read the status"); +        goto out; +    } + +    /* Form key1 which is "<user@><slave_host>::<slavevol>" */ +    snprintf(key1, sizeof(key1), "%s::%s", slave_url, slave_vol); + +    /* Looks for the last status, to find if the session was running +     * when the node went down. If the session was just created or +     * stopped, do not restart the geo-rep session */ +    if ((!strcmp(buf, "Created")) || (!strcmp(buf, "Stopped"))) { +        gf_msg(this1->name, GF_LOG_INFO, 0, GD_MSG_GEO_REP_START_FAILED, +               "Geo-Rep Session was not started between " +               "%s and %s::%s. Not Restarting", +               volinfo->volname, slave_url, slave_vol); +        goto out; +    } else if (strstr(buf, "Paused")) { +        is_paused = _gf_true; +    } else if ((!strcmp(buf, "Config Corrupted"))) { +        gf_msg(this1->name, GF_LOG_INFO, 0, GD_MSG_RECOVERING_CORRUPT_CONF, +               "Recovering from a corrupted config. " +               "Not Restarting. Use start (force) to " +               "start the session between %s and %s::%s.", +               volinfo->volname, slave_url, slave_vol); +        goto out; +    } + +    if (is_paused) { +        glusterd_start_gsync(volinfo, slave, path_list, confpath, uuid_str, +                             NULL, _gf_true); +    } else { +        /* Add slave to the dict indicating geo-rep session is running*/ +        ret = dict_set_dynstr_with_alloc(volinfo->gsync_active_slaves, key1, +                                         "running"); +        if (ret) { +            gf_msg(this1->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Unable to set key:%s" +                   " value:running in the dict", +                   key1); +            goto out;          } +        ret = glusterd_start_gsync(volinfo, slave, path_list, confpath, +                                   uuid_str, NULL, _gf_false); +        if (ret) +            dict_del(volinfo->gsync_active_slaves, key1); +    } -        /* Form key1 which is "<user@><slave_host>::<slavevol>" */ -        snprintf (key1, sizeof (key1), "%s::%s", slave_url, slave_vol); +out: +    if (statefile) +        GF_FREE(statefile); +    if (slave_url) +        GF_FREE(slave_url); -        /* Looks for the last status, to find if the session was running -         * when the node went down. If the session was just created or -         * stopped, do not restart the geo-rep session */ -        if ((!strcmp (buf, "Created")) || -            (!strcmp (buf, "Stopped"))) { -                gf_msg (this1->name, GF_LOG_INFO, 0, -                        GD_MSG_GEO_REP_START_FAILED, -                        "Geo-Rep Session was not started between " -                        "%s and %s::%s. Not Restarting", volinfo->volname, -                        slave_url, slave_vol); -                goto out; -        } else if (strstr(buf, "Paused")) { -                is_paused = _gf_true; -        } else if ((!strcmp (buf, "Config Corrupted"))) { -                gf_msg (this1->name, GF_LOG_INFO, 0, -                        GD_MSG_RECOVERING_CORRUPT_CONF, -                        "Recovering from a corrupted config. " -                        "Not Restarting. Use start (force) to " -                        "start the session between %s and %s::%s.", -                        volinfo->volname, -                        slave_url, slave_vol); -                goto out; +    if (is_template_in_use) { +        op_ret = glusterd_create_status_file( +            volinfo->volname, slave, slave_host, slave_vol, "Config Corrupted"); +        if (op_ret) { +            gf_msg(this1->name, GF_LOG_ERROR, 0, +                   GD_MSG_STATUSFILE_CREATE_FAILED, +                   "Unable to create status file" +                   ". Error : %s", +                   strerror(errno)); +            ret = op_ret;          } +    } -        if (is_paused) { -                glusterd_start_gsync (volinfo, slave, path_list, confpath, -                                      uuid_str, NULL, _gf_true); -        } -        else { -               /* Add slave to the dict indicating geo-rep session is running*/ -               ret = dict_set_dynstr_with_alloc (volinfo->gsync_active_slaves, -                                                 key1, "running"); -               if (ret) { -                       gf_msg (this1->name, GF_LOG_ERROR, 0, -                               GD_MSG_DICT_SET_FAILED, -                               "Unable to set key:%s" -                               " value:running in the dict", key1); -                       goto out; -               } -               ret = glusterd_start_gsync (volinfo, slave, path_list, confpath, -                                      uuid_str, NULL, _gf_false); -               if (ret) -                       dict_del (volinfo->gsync_active_slaves, key1); -        } - -out: -        if (statefile) -                GF_FREE (statefile); -        if (slave_url) -                GF_FREE (slave_url); - -        if (is_template_in_use) { -               op_ret = glusterd_create_status_file (volinfo->volname, slave, -                                                     slave_host, slave_vol, -                                                     "Config Corrupted"); -               if (op_ret) { -                        gf_msg (this1->name, GF_LOG_ERROR, 0, -                                GD_MSG_STATUSFILE_CREATE_FAILED, -                                "Unable to create status file" -                                ". Error : %s", strerror (errno)); -                        ret = op_ret; -               } -        } - -        GF_FREE (path_list); -        GF_FREE (op_errstr); +    GF_FREE(path_list); +    GF_FREE(op_errstr); -        return ret; +    return ret;  }  int -glusterd_volume_restart_gsyncds (glusterd_volinfo_t *volinfo) +glusterd_volume_restart_gsyncds(glusterd_volinfo_t *volinfo)  { -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        dict_foreach (volinfo->gsync_slaves, _local_gsyncd_start, volinfo); -        return 0; +    dict_foreach(volinfo->gsync_slaves, _local_gsyncd_start, volinfo); +    return 0;  }  int -glusterd_restart_gsyncds (glusterd_conf_t *conf) +glusterd_restart_gsyncds(glusterd_conf_t *conf)  { -        glusterd_volinfo_t       *volinfo = NULL; -        int                      ret = 0; +    glusterd_volinfo_t *volinfo = NULL; +    int ret = 0; -        cds_list_for_each_entry (volinfo, &conf->volumes, vol_list) { -                glusterd_volume_restart_gsyncds (volinfo); -        } -        return ret; +    cds_list_for_each_entry(volinfo, &conf->volumes, vol_list) +    { +        glusterd_volume_restart_gsyncds(volinfo); +    } +    return ret;  }  int -glusterd_calc_dist_leaf_count (int rcount, int scount) +glusterd_calc_dist_leaf_count(int rcount, int scount)  { -        return (rcount ? rcount : 1) * (scount ? scount : 1); +    return (rcount ? rcount : 1) * (scount ? scount : 1);  }  int -glusterd_get_dist_leaf_count (glusterd_volinfo_t *volinfo) +glusterd_get_dist_leaf_count(glusterd_volinfo_t *volinfo)  {      int rcount = volinfo->replica_count;      int scount = volinfo->stripe_count; @@ -6831,2018 +6677,1999 @@ glusterd_get_dist_leaf_count (glusterd_volinfo_t *volinfo)      if (volinfo->type == GF_CLUSTER_TYPE_DISPERSE)          return volinfo->disperse_count; -    return glusterd_calc_dist_leaf_count (rcount, scount); +    return glusterd_calc_dist_leaf_count(rcount, scount);  }  int -glusterd_get_brickinfo (xlator_t *this, const char *brickname, int port, -                        glusterd_brickinfo_t **brickinfo) +glusterd_get_brickinfo(xlator_t *this, const char *brickname, int port, +                       glusterd_brickinfo_t **brickinfo)  { -        glusterd_conf_t         *priv = NULL; -        glusterd_volinfo_t      *volinfo = NULL; -        glusterd_brickinfo_t    *tmpbrkinfo = NULL; -        glusterd_snap_t         *snap    = NULL; -        int                     ret = -1; +    glusterd_conf_t *priv = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    glusterd_brickinfo_t *tmpbrkinfo = NULL; +    glusterd_snap_t *snap = NULL; +    int ret = -1; -        GF_ASSERT (brickname); -        GF_ASSERT (this); +    GF_ASSERT(brickname); +    GF_ASSERT(this); -        priv = this->private; -        cds_list_for_each_entry (volinfo, &priv->volumes, vol_list) { -                cds_list_for_each_entry (tmpbrkinfo, &volinfo->bricks, -                                         brick_list) { -                        if (gf_uuid_compare (tmpbrkinfo->uuid, MY_UUID)) -                                continue; -                        if (!strcmp(tmpbrkinfo->path, brickname) && -                            (tmpbrkinfo->port == port)) { -                                *brickinfo = tmpbrkinfo; -                                return 0; -                        } -                } +    priv = this->private; +    cds_list_for_each_entry(volinfo, &priv->volumes, vol_list) +    { +        cds_list_for_each_entry(tmpbrkinfo, &volinfo->bricks, brick_list) +        { +            if (gf_uuid_compare(tmpbrkinfo->uuid, MY_UUID)) +                continue; +            if (!strcmp(tmpbrkinfo->path, brickname) && +                (tmpbrkinfo->port == port)) { +                *brickinfo = tmpbrkinfo; +                return 0; +            }          } -        /* In case normal volume is not found, check for snapshot volumes */ -        cds_list_for_each_entry (snap, &priv->snapshots, snap_list) { -                cds_list_for_each_entry (volinfo, &snap->volumes, vol_list) { -                        cds_list_for_each_entry (tmpbrkinfo, &volinfo->bricks, -                                                 brick_list) { -                                if (gf_uuid_compare (tmpbrkinfo->uuid, MY_UUID)) -                                        continue; -                                if (!strcmp(tmpbrkinfo->path, brickname)) { -                                        *brickinfo = tmpbrkinfo; -                                        return 0; -                                } -                        } +    } +    /* In case normal volume is not found, check for snapshot volumes */ +    cds_list_for_each_entry(snap, &priv->snapshots, snap_list) +    { +        cds_list_for_each_entry(volinfo, &snap->volumes, vol_list) +        { +            cds_list_for_each_entry(tmpbrkinfo, &volinfo->bricks, brick_list) +            { +                if (gf_uuid_compare(tmpbrkinfo->uuid, MY_UUID)) +                    continue; +                if (!strcmp(tmpbrkinfo->path, brickname)) { +                    *brickinfo = tmpbrkinfo; +                    return 0;                  } +            }          } +    } -        return ret; +    return ret;  } -glusterd_brickinfo_t* -glusterd_get_brickinfo_by_position (glusterd_volinfo_t *volinfo, uint32_t pos) +glusterd_brickinfo_t * +glusterd_get_brickinfo_by_position(glusterd_volinfo_t *volinfo, uint32_t pos)  { -        glusterd_brickinfo_t    *tmpbrkinfo = NULL; +    glusterd_brickinfo_t *tmpbrkinfo = NULL; -        cds_list_for_each_entry (tmpbrkinfo, &volinfo->bricks, brick_list) { -                if (pos == 0) -                        return tmpbrkinfo; -                pos--; -        } -        return NULL; +    cds_list_for_each_entry(tmpbrkinfo, &volinfo->bricks, brick_list) +    { +        if (pos == 0) +            return tmpbrkinfo; +        pos--; +    } +    return NULL;  }  void -glusterd_set_brick_status (glusterd_brickinfo_t  *brickinfo, -                           gf_brick_status_t status) -{ -        GF_ASSERT (brickinfo); -        brickinfo->status = status; -        if (GF_BRICK_STARTED == status) { -                gf_msg_debug ("glusterd", 0, "Setting brick %s:%s status " -                        "to started", brickinfo->hostname, brickinfo->path); -        } else { -                gf_msg_debug ("glusterd", 0, "Setting brick %s:%s status " -                        "to stopped", brickinfo->hostname, brickinfo->path); -        } +glusterd_set_brick_status(glusterd_brickinfo_t *brickinfo, +                          gf_brick_status_t status) +{ +    GF_ASSERT(brickinfo); +    brickinfo->status = status; +    if (GF_BRICK_STARTED == status) { +        gf_msg_debug("glusterd", 0, +                     "Setting brick %s:%s status " +                     "to started", +                     brickinfo->hostname, brickinfo->path); +    } else { +        gf_msg_debug("glusterd", 0, +                     "Setting brick %s:%s status " +                     "to stopped", +                     brickinfo->hostname, brickinfo->path); +    }  }  gf_boolean_t -glusterd_is_brick_started (glusterd_brickinfo_t  *brickinfo) +glusterd_is_brick_started(glusterd_brickinfo_t *brickinfo)  { -        GF_ASSERT (brickinfo); -        return (brickinfo->status == GF_BRICK_STARTED); +    GF_ASSERT(brickinfo); +    return (brickinfo->status == GF_BRICK_STARTED);  }  int -glusterd_friend_brick_belongs (glusterd_volinfo_t *volinfo, -                               glusterd_brickinfo_t *brickinfo, void* uuid) +glusterd_friend_brick_belongs(glusterd_volinfo_t *volinfo, +                              glusterd_brickinfo_t *brickinfo, void *uuid)  { -        int             ret = -1; +    int ret = -1; -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); -        GF_ASSERT (uuid); +    GF_ASSERT(volinfo); +    GF_ASSERT(brickinfo); +    GF_ASSERT(uuid); -        if (gf_uuid_is_null (brickinfo->uuid)) { -                ret = glusterd_resolve_brick (brickinfo); -                if (ret) { -                        GF_ASSERT (0); -                        goto out; -                } +    if (gf_uuid_is_null(brickinfo->uuid)) { +        ret = glusterd_resolve_brick(brickinfo); +        if (ret) { +            GF_ASSERT(0); +            goto out;          } -        if (!gf_uuid_compare (brickinfo->uuid, *((uuid_t *)uuid))) -                return 0; +    } +    if (!gf_uuid_compare(brickinfo->uuid, *((uuid_t *)uuid))) +        return 0;  out: -        return -1; +    return -1;  }  int -glusterd_get_brick_root (char *path, char **mount_point) +glusterd_get_brick_root(char *path, char **mount_point)  { -        char           *ptr            = NULL; -        char           *mnt_pt         = NULL; -        struct stat     brickstat      = {0}; -        struct stat     buf            = {0}; - -        if (!path) -                goto err; -        mnt_pt = gf_strdup (path); -        if (!mnt_pt) -                goto err; -        if (sys_stat (mnt_pt, &brickstat)) -                goto err; +    char *ptr = NULL; +    char *mnt_pt = NULL; +    struct stat brickstat = {0}; +    struct stat buf = {0}; -        while ((ptr = strrchr (mnt_pt, '/')) && -               ptr != mnt_pt) { +    if (!path) +        goto err; +    mnt_pt = gf_strdup(path); +    if (!mnt_pt) +        goto err; +    if (sys_stat(mnt_pt, &brickstat)) +        goto err; -                *ptr = '\0'; -                if (sys_stat (mnt_pt, &buf)) { -                        gf_msg (THIS->name, GF_LOG_ERROR, errno, -                                GD_MSG_FILE_OP_FAILED, "error in " -                                "stat: %s", strerror (errno)); -                        goto err; -                } +    while ((ptr = strrchr(mnt_pt, '/')) && ptr != mnt_pt) { +        *ptr = '\0'; +        if (sys_stat(mnt_pt, &buf)) { +            gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +                   "error in " +                   "stat: %s", +                   strerror(errno)); +            goto err; +        } -                if (brickstat.st_dev != buf.st_dev) { -                        *ptr = '/'; -                        break; -                } +        if (brickstat.st_dev != buf.st_dev) { +            *ptr = '/'; +            break;          } +    } -        if (ptr == mnt_pt) { -                if (sys_stat ("/", &buf)) { -                        gf_msg (THIS->name, GF_LOG_ERROR, errno, -                                GD_MSG_FILE_OP_FAILED, "error in " -                                "stat: %s", strerror (errno)); -                        goto err; -                } -                if (brickstat.st_dev == buf.st_dev) -                        strcpy (mnt_pt, "/"); +    if (ptr == mnt_pt) { +        if (sys_stat("/", &buf)) { +            gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +                   "error in " +                   "stat: %s", +                   strerror(errno)); +            goto err;          } +        if (brickstat.st_dev == buf.st_dev) +            strcpy(mnt_pt, "/"); +    } -        *mount_point = mnt_pt; -        return 0; +    *mount_point = mnt_pt; +    return 0; - err: -        GF_FREE (mnt_pt); -        return -1; +err: +    GF_FREE(mnt_pt); +    return -1;  } -static char* -glusterd_parse_inode_size (char *stream, char *pattern) +static char * +glusterd_parse_inode_size(char *stream, char *pattern)  { -        char *needle = NULL; -        char *trail  = NULL; +    char *needle = NULL; +    char *trail = NULL; -        needle = strstr (stream, pattern); -        if (!needle) -                goto out; +    needle = strstr(stream, pattern); +    if (!needle) +        goto out; -        needle = nwstrtail (needle, pattern); +    needle = nwstrtail(needle, pattern); -        trail = needle; -        while (trail && isdigit (*trail)) trail++; -        if (trail) -                *trail = '\0'; +    trail = needle; +    while (trail && isdigit(*trail)) +        trail++; +    if (trail) +        *trail = '\0';  out: -        return needle; +    return needle;  }  static struct fs_info { -        char *fs_type_name; -        char *fs_tool_name; -        char *fs_tool_arg; -        char *fs_tool_pattern; -        char *fs_tool_pkg; -} glusterd_fs[] = { -        { "xfs", "xfs_info", NULL, "isize=", "xfsprogs" }, -        { "ext3", "tune2fs", "-l", "Inode size:", "e2fsprogs" }, -        { "ext4", "tune2fs", "-l", "Inode size:", "e2fsprogs" }, -        { "btrfs", NULL, NULL, NULL, NULL }, -        { "zfs", NULL, NULL, NULL, NULL }, -        { NULL, NULL, NULL, NULL, NULL} -}; +    char *fs_type_name; +    char *fs_tool_name; +    char *fs_tool_arg; +    char *fs_tool_pattern; +    char *fs_tool_pkg; +} glusterd_fs[] = {{"xfs", "xfs_info", NULL, "isize=", "xfsprogs"}, +                   {"ext3", "tune2fs", "-l", "Inode size:", "e2fsprogs"}, +                   {"ext4", "tune2fs", "-l", "Inode size:", "e2fsprogs"}, +                   {"btrfs", NULL, NULL, NULL, NULL}, +                   {"zfs", NULL, NULL, NULL, NULL}, +                   {NULL, NULL, NULL, NULL, NULL}};  static int -glusterd_add_inode_size_to_dict (dict_t *dict, int count) -{ -        int             ret               = -1; -        char            key[1024]         = ""; -        char            buffer[4096]      = ""; -        char           *device            = NULL; -        char           *fs_name           = NULL; -        char           *cur_word          = NULL; -        char           *trail             = NULL; -        runner_t        runner            = {0, }; -        struct fs_info *fs                = NULL; -        static dict_t  *cached_fs         = NULL; - -        ret = snprintf (key, sizeof (key), "brick%d.device", count); -        ret = dict_get_strn (dict, key, ret, &device); -        if (ret) -                goto out; - -        if (cached_fs) { -                if (dict_get_str (cached_fs, device, &cur_word) == 0) { -                        goto cached; -                } -        } else { -                cached_fs = dict_new (); -        } - -        ret = snprintf (key, sizeof (key), "brick%d.fs_name", count); -        ret = dict_get_strn (dict, key, ret, &fs_name); -        if (ret) -                goto out; - -        runinit (&runner); -        runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); - -        for (fs = glusterd_fs ; fs->fs_type_name; fs++) { -                if (strcmp (fs_name, fs->fs_type_name) == 0) { -                        if (!fs->fs_tool_name) { -                                /* dynamic inodes */ -                                gf_msg (THIS->name, GF_LOG_INFO, 0, -                                        GD_MSG_INODE_SIZE_GET_FAIL, "the " -                                        "brick on %s (%s) uses dynamic inode " -                                        "sizes", device, fs_name); -                                cur_word = "N/A"; -                                goto cached; -                        } -                        runner_add_arg (&runner, fs->fs_tool_name); -                        break; -                } -        } - -        if (runner.argv[0]) { -                if (fs->fs_tool_arg) -                        runner_add_arg (&runner, fs->fs_tool_arg); -                runner_add_arg (&runner, device); -        } else { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_INODE_SIZE_GET_FAIL, -                        "could not find %s to get" -                        "inode size for %s (%s): %s package missing?", -                        fs->fs_tool_name, device, fs_name, fs->fs_tool_pkg); -                goto out; -        } - -        ret = runner_start (&runner); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_CMD_EXEC_FAIL, "failed to execute " -                        "\"%s\"", fs->fs_tool_name); -                /* -                 * Runner_start might return an error after the child has -                 * been forked, e.g. if the program isn't there.  In that -                 * case, we still need to call runner_end to reap the -                 * child and free resources.  Fortunately, that seems to -                 * be harmless for other kinds of failures. -                 */ -                (void) runner_end (&runner); -                goto out; -        } +glusterd_add_inode_size_to_dict(dict_t *dict, int count) +{ +    int ret = -1; +    char key[1024] = ""; +    char buffer[4096] = ""; +    char *device = NULL; +    char *fs_name = NULL; +    char *cur_word = NULL; +    char *trail = NULL; +    runner_t runner = { +        0, +    }; +    struct fs_info *fs = NULL; +    static dict_t *cached_fs = NULL; + +    ret = snprintf(key, sizeof(key), "brick%d.device", count); +    ret = dict_get_strn(dict, key, ret, &device); +    if (ret) +        goto out; + +    if (cached_fs) { +        if (dict_get_str(cached_fs, device, &cur_word) == 0) { +            goto cached; +        } +    } else { +        cached_fs = dict_new(); +    } + +    ret = snprintf(key, sizeof(key), "brick%d.fs_name", count); +    ret = dict_get_strn(dict, key, ret, &fs_name); +    if (ret) +        goto out; + +    runinit(&runner); +    runner_redir(&runner, STDOUT_FILENO, RUN_PIPE); + +    for (fs = glusterd_fs; fs->fs_type_name; fs++) { +        if (strcmp(fs_name, fs->fs_type_name) == 0) { +            if (!fs->fs_tool_name) { +                /* dynamic inodes */ +                gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_INODE_SIZE_GET_FAIL, +                       "the " +                       "brick on %s (%s) uses dynamic inode " +                       "sizes", +                       device, fs_name); +                cur_word = "N/A"; +                goto cached; +            } +            runner_add_arg(&runner, fs->fs_tool_name); +            break; +        } +    } + +    if (runner.argv[0]) { +        if (fs->fs_tool_arg) +            runner_add_arg(&runner, fs->fs_tool_arg); +        runner_add_arg(&runner, device); +    } else { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_INODE_SIZE_GET_FAIL, +               "could not find %s to get" +               "inode size for %s (%s): %s package missing?", +               fs->fs_tool_name, device, fs_name, fs->fs_tool_pkg); +        goto out; +    } + +    ret = runner_start(&runner); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_CMD_EXEC_FAIL, +               "failed to execute " +               "\"%s\"", +               fs->fs_tool_name); +        /* +         * Runner_start might return an error after the child has +         * been forked, e.g. if the program isn't there.  In that +         * case, we still need to call runner_end to reap the +         * child and free resources.  Fortunately, that seems to +         * be harmless for other kinds of failures. +         */ +        (void)runner_end(&runner); +        goto out; +    } + +    for (;;) { +        if (fgets(buffer, sizeof(buffer), +                  runner_chio(&runner, STDOUT_FILENO)) == NULL) +            break; +        trail = strrchr(buffer, '\n'); +        if (trail) +            *trail = '\0'; -        for (;;) { -                if (fgets (buffer, sizeof (buffer), -                    runner_chio (&runner, STDOUT_FILENO)) == NULL) -                        break; -                trail = strrchr (buffer, '\n'); -                if (trail) -                        *trail = '\0'; +        cur_word = glusterd_parse_inode_size(buffer, fs->fs_tool_pattern); -                cur_word = -                        glusterd_parse_inode_size (buffer, fs->fs_tool_pattern); +        if (cur_word) +            break; +    } -                if (cur_word) -                        break; -        } +    ret = runner_end(&runner); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_CMD_EXEC_FAIL, +               "%s exited with non-zero exit status", fs->fs_tool_name); -        ret = runner_end (&runner); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_CMD_EXEC_FAIL, -                        "%s exited with non-zero exit status", -                        fs->fs_tool_name); - -                goto out; -        } -        if (!cur_word) { -                ret = -1; -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_INODE_SIZE_GET_FAIL, -                        "Unable to retrieve inode size using %s", -                        fs->fs_tool_name); -                goto out; -        } +        goto out; +    } +    if (!cur_word) { +        ret = -1; +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_INODE_SIZE_GET_FAIL, +               "Unable to retrieve inode size using %s", fs->fs_tool_name); +        goto out; +    } -        if (dict_set_dynstr_with_alloc (cached_fs, device, cur_word)) { -                /* not fatal if not entered into the cache */ -                gf_msg_debug (THIS->name, 0, -                        "failed to cache fs inode size for %s", device); -        } +    if (dict_set_dynstr_with_alloc(cached_fs, device, cur_word)) { +        /* not fatal if not entered into the cache */ +        gf_msg_debug(THIS->name, 0, "failed to cache fs inode size for %s", +                     device); +    }  cached: -        snprintf (key, sizeof (key), "brick%d.inode_size", count); +    snprintf(key, sizeof(key), "brick%d.inode_size", count); -        ret = dict_set_dynstr_with_alloc (dict, key, cur_word); +    ret = dict_set_dynstr_with_alloc(dict, key, cur_word);  out: -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_INODE_SIZE_GET_FAIL, "failed to get inode size"); -        return ret; +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_INODE_SIZE_GET_FAIL, +               "failed to get inode size"); +    return ret;  }  struct mntent * -glusterd_get_mnt_entry_info (char *mnt_pt, char *buff, int buflen, -                             struct mntent *entry_ptr) +glusterd_get_mnt_entry_info(char *mnt_pt, char *buff, int buflen, +                            struct mntent *entry_ptr)  { -        struct mntent  *entry   = NULL; -        FILE           *mtab    = NULL; -        char abspath[PATH_MAX] = ""; +    struct mntent *entry = NULL; +    FILE *mtab = NULL; +    char abspath[PATH_MAX] = ""; -        GF_ASSERT (mnt_pt); -        GF_ASSERT (buff); -        GF_ASSERT (entry_ptr); +    GF_ASSERT(mnt_pt); +    GF_ASSERT(buff); +    GF_ASSERT(entry_ptr); -        mtab = setmntent (_PATH_MOUNTED, "r"); -        if (!mtab) -                goto out; +    mtab = setmntent(_PATH_MOUNTED, "r"); +    if (!mtab) +        goto out; -        if (!realpath (mnt_pt, abspath)) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_MNTENTRY_GET_FAIL, -                        "realpath () failed for path %s", mnt_pt); -                goto out; -        } +    if (!realpath(mnt_pt, abspath)) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_MNTENTRY_GET_FAIL, +               "realpath () failed for path %s", mnt_pt); +        goto out; +    } -        entry = getmntent_r (mtab, entry_ptr, buff, buflen); +    entry = getmntent_r(mtab, entry_ptr, buff, buflen); -        while (1) { -                if (!entry) -                        goto out; +    while (1) { +        if (!entry) +            goto out; -                if (!strcmp (entry->mnt_dir, abspath) && -                    strcmp (entry->mnt_type, "rootfs")) -                        break; -                entry = getmntent_r (mtab, entry_ptr, buff, buflen); -        } +        if (!strcmp(entry->mnt_dir, abspath) && +            strcmp(entry->mnt_type, "rootfs")) +            break; +        entry = getmntent_r(mtab, entry_ptr, buff, buflen); +    }  out: -        if (NULL != mtab) { -                endmntent (mtab); -        } -        return entry; +    if (NULL != mtab) { +        endmntent(mtab); +    } +    return entry;  }  static int -glusterd_add_brick_mount_details (glusterd_brickinfo_t *brickinfo, -                                  dict_t *dict, int count) -{ -        int             ret                  = -1; -        char            key[1024]            = ""; -        char            buff[PATH_MAX]       = ""; -        char            base_key[32]         = ""; -        struct mntent   save_entry           = {0}; -        char           *mnt_pt               = NULL; -        struct mntent  *entry                = NULL; - -        snprintf (base_key, sizeof (base_key), "brick%d", count); - -        ret = glusterd_get_brick_root (brickinfo->path, &mnt_pt); -        if (ret) -                goto out; - -        entry = glusterd_get_mnt_entry_info (mnt_pt, buff, sizeof (buff), -                                             &save_entry); -        if (!entry) { -                ret = -1; -                goto out; -        } - -        /* get device file */ -        snprintf (key, sizeof (key), "%s.device", base_key); - -        ret = dict_set_dynstr_with_alloc (dict, key, entry->mnt_fsname); -        if (ret) -                goto out; - -        /* fs type */ -        snprintf (key, sizeof (key), "%s.fs_name", base_key); - -        ret = dict_set_dynstr_with_alloc (dict, key, entry->mnt_type); -        if (ret) -                goto out; - -        /* mount options */ -        snprintf (key, sizeof (key), "%s.mnt_options", base_key); +glusterd_add_brick_mount_details(glusterd_brickinfo_t *brickinfo, dict_t *dict, +                                 int count) +{ +    int ret = -1; +    char key[1024] = ""; +    char buff[PATH_MAX] = ""; +    char base_key[32] = ""; +    struct mntent save_entry = {0}; +    char *mnt_pt = NULL; +    struct mntent *entry = NULL; + +    snprintf(base_key, sizeof(base_key), "brick%d", count); + +    ret = glusterd_get_brick_root(brickinfo->path, &mnt_pt); +    if (ret) +        goto out; + +    entry = glusterd_get_mnt_entry_info(mnt_pt, buff, sizeof(buff), +                                        &save_entry); +    if (!entry) { +        ret = -1; +        goto out; +    } -        ret = dict_set_dynstr_with_alloc (dict, key, entry->mnt_opts); +    /* get device file */ +    snprintf(key, sizeof(key), "%s.device", base_key); - out: -        if (mnt_pt) -                GF_FREE (mnt_pt); +    ret = dict_set_dynstr_with_alloc(dict, key, entry->mnt_fsname); +    if (ret) +        goto out; -        return ret; -} +    /* fs type */ +    snprintf(key, sizeof(key), "%s.fs_name", base_key); -char* -glusterd_get_brick_mount_device (char *brick_path) -{ -        int             ret                  = -1; -        char           *mnt_pt               = NULL; -        char           *device               = NULL; -        char            buff [PATH_MAX]      = ""; -        struct mntent  *entry                = NULL; -        struct mntent   save_entry           = {0,}; -        xlator_t       *this                 = NULL; +    ret = dict_set_dynstr_with_alloc(dict, key, entry->mnt_type); +    if (ret) +        goto out; -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (brick_path); +    /* mount options */ +    snprintf(key, sizeof(key), "%s.mnt_options", base_key); -        ret = glusterd_get_brick_root (brick_path, &mnt_pt); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BRICKPATH_ROOT_GET_FAIL, -                        "Failed to get mount point " -                        "for %s brick", brick_path); -                goto out; -        } - -        entry = glusterd_get_mnt_entry_info (mnt_pt, buff, sizeof (buff), -                                             &save_entry); -        if (NULL == entry) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_MNTENTRY_GET_FAIL, -                        "Failed to get mnt entry " -                        "for %s mount path", mnt_pt); -                goto out; -        } - -        /* get the fs_name/device */ -        device = gf_strdup (entry->mnt_fsname); +    ret = dict_set_dynstr_with_alloc(dict, key, entry->mnt_opts);  out: -        if (mnt_pt) -                GF_FREE(mnt_pt); +    if (mnt_pt) +        GF_FREE(mnt_pt); -        return device; +    return ret;  } -int -glusterd_add_brick_detail_to_dict (glusterd_volinfo_t *volinfo, -                                   glusterd_brickinfo_t *brickinfo, -                                   dict_t *dict, int count) -{ -        int             ret               = -1; -        uint64_t        memtotal          = 0; -        uint64_t        memfree           = 0; -        uint64_t        inodes_total      = 0; -        uint64_t        inodes_free       = 0; -        uint64_t        block_size        = 0; -        char            key[1024 + 16]    = ""; -        char            base_key[1024]    = ""; -        struct statvfs  brickstat         = {0}; -        xlator_t       *this              = NULL; - -        this = THIS; -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); -        GF_ASSERT (dict); - -        snprintf (base_key, sizeof (base_key), "brick%d", count); - -        ret = sys_statvfs (brickinfo->path, &brickstat); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, "statfs error: %s ", -                        strerror (errno)); -                goto out; -        } - -        /* file system block size */ -        block_size = brickstat.f_bsize; -        snprintf (key, sizeof (key), "%s.block_size", base_key); -        ret = dict_set_uint64 (dict, key, block_size); -        if (ret) -                goto out; - -        /* free space in brick */ -        memfree = brickstat.f_bfree * brickstat.f_bsize; -        snprintf (key, sizeof (key), "%s.free", base_key); -        ret = dict_set_uint64 (dict, key, memfree); +char * +glusterd_get_brick_mount_device(char *brick_path) +{ +    int ret = -1; +    char *mnt_pt = NULL; +    char *device = NULL; +    char buff[PATH_MAX] = ""; +    struct mntent *entry = NULL; +    struct mntent save_entry = { +        0, +    }; +    xlator_t *this = NULL; + +    this = THIS; +    GF_ASSERT(this); +    GF_ASSERT(brick_path); + +    ret = glusterd_get_brick_root(brick_path, &mnt_pt); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICKPATH_ROOT_GET_FAIL, +               "Failed to get mount point " +               "for %s brick", +               brick_path); +        goto out; +    } + +    entry = glusterd_get_mnt_entry_info(mnt_pt, buff, sizeof(buff), +                                        &save_entry); +    if (NULL == entry) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_MNTENTRY_GET_FAIL, +               "Failed to get mnt entry " +               "for %s mount path", +               mnt_pt); +        goto out; +    } + +    /* get the fs_name/device */ +    device = gf_strdup(entry->mnt_fsname); + +out: +    if (mnt_pt) +        GF_FREE(mnt_pt); + +    return device; +} + +int +glusterd_add_brick_detail_to_dict(glusterd_volinfo_t *volinfo, +                                  glusterd_brickinfo_t *brickinfo, dict_t *dict, +                                  int count) +{ +    int ret = -1; +    uint64_t memtotal = 0; +    uint64_t memfree = 0; +    uint64_t inodes_total = 0; +    uint64_t inodes_free = 0; +    uint64_t block_size = 0; +    char key[1024 + 16] = ""; +    char base_key[1024] = ""; +    struct statvfs brickstat = {0}; +    xlator_t *this = NULL; + +    this = THIS; +    GF_ASSERT(volinfo); +    GF_ASSERT(brickinfo); +    GF_ASSERT(dict); + +    snprintf(base_key, sizeof(base_key), "brick%d", count); + +    ret = sys_statvfs(brickinfo->path, &brickstat); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "statfs error: %s ", strerror(errno)); +        goto out; +    } + +    /* file system block size */ +    block_size = brickstat.f_bsize; +    snprintf(key, sizeof(key), "%s.block_size", base_key); +    ret = dict_set_uint64(dict, key, block_size); +    if (ret) +        goto out; + +    /* free space in brick */ +    memfree = brickstat.f_bfree * brickstat.f_bsize; +    snprintf(key, sizeof(key), "%s.free", base_key); +    ret = dict_set_uint64(dict, key, memfree); +    if (ret) +        goto out; + +    /* total space of brick */ +    memtotal = brickstat.f_blocks * brickstat.f_bsize; +    snprintf(key, sizeof(key), "%s.total", base_key); +    ret = dict_set_uint64(dict, key, memtotal); +    if (ret) +        goto out; + +    /* inodes: total and free counts only for ext2/3/4 and xfs */ +    inodes_total = brickstat.f_files; +    if (inodes_total) { +        snprintf(key, sizeof(key), "%s.total_inodes", base_key); +        ret = dict_set_uint64(dict, key, inodes_total);          if (ret) -                goto out; +            goto out; +    } -        /* total space of brick */ -        memtotal = brickstat.f_blocks * brickstat.f_bsize; -        snprintf (key, sizeof (key), "%s.total", base_key); -        ret = dict_set_uint64 (dict, key, memtotal); +    inodes_free = brickstat.f_ffree; +    if (inodes_free) { +        snprintf(key, sizeof(key), "%s.free_inodes", base_key); +        ret = dict_set_uint64(dict, key, inodes_free);          if (ret) -                goto out; - -        /* inodes: total and free counts only for ext2/3/4 and xfs */ -        inodes_total = brickstat.f_files; -        if (inodes_total) { -                snprintf (key, sizeof (key), "%s.total_inodes", base_key); -                ret = dict_set_uint64 (dict, key, inodes_total); -                if (ret) -                        goto out; -        } - -        inodes_free = brickstat.f_ffree; -        if (inodes_free) { -                snprintf (key, sizeof (key), "%s.free_inodes", base_key); -                ret = dict_set_uint64 (dict, key, inodes_free); -                if (ret) -                        goto out; -        } +            goto out; +    } -        ret = glusterd_add_brick_mount_details (brickinfo, dict, count); -        if (ret) -                goto out; +    ret = glusterd_add_brick_mount_details(brickinfo, dict, count); +    if (ret) +        goto out; -        ret = glusterd_add_inode_size_to_dict (dict, count); - out: -        if (ret) -                gf_msg_debug (this->name, 0, "Error adding brick" -                        " detail to dict: %s", strerror (errno)); -        return ret; +    ret = glusterd_add_inode_size_to_dict(dict, count); +out: +    if (ret) +        gf_msg_debug(this->name, 0, +                     "Error adding brick" +                     " detail to dict: %s", +                     strerror(errno)); +    return ret;  }  int32_t -glusterd_add_brick_to_dict (glusterd_volinfo_t *volinfo, -                            glusterd_brickinfo_t *brickinfo, -                            dict_t  *dict, int32_t count) -{ - -        int              ret                  = -1; -        int32_t          pid                  = -1; -        char             key[2048]            = ""; -        int              keylen; -        char             base_key[1024]       = ""; -        char             pidfile[PATH_MAX]    = ""; -        xlator_t        *this                 = NULL; -        glusterd_conf_t *priv                 = NULL; -        gf_boolean_t     brick_online         = _gf_false; -        char            *brickpath            = NULL; - -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); -        GF_ASSERT (dict); - -        this = THIS; -        GF_ASSERT (this); - -        priv = this->private; - -        snprintf (base_key, sizeof (base_key), "brick%d", count); -        keylen = snprintf (key, sizeof (key), "%s.hostname", base_key); - -        ret = dict_set_strn (dict, key, keylen, brickinfo->hostname); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s.path", base_key); -        ret = dict_set_strn (dict, key, keylen, brickinfo->path); -        if (ret) -                goto out; - -        /* add peer uuid */ -        snprintf (key, sizeof (key), "%s.peerid", base_key); -        ret = dict_set_dynstr_with_alloc (dict, key, -                                          uuid_utoa (brickinfo->uuid)); -        if (ret) { -                goto out; -        } - -        keylen = snprintf (key, sizeof (key), "%s.port", base_key); -        ret = dict_set_int32n (dict, key, keylen, (volinfo->transport_type == -                               GF_TRANSPORT_RDMA) ? 0 : brickinfo->port); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "%s.rdma_port", base_key); -        if (volinfo->transport_type == GF_TRANSPORT_RDMA) { -                ret = dict_set_int32n (dict, key, keylen, brickinfo->port); -        } else if (volinfo->transport_type == GF_TRANSPORT_BOTH_TCP_RDMA) { -                ret = dict_set_int32n (dict, key, keylen, -                                       brickinfo->rdma_port); -        } else -                ret = dict_set_int32n (dict, key, keylen, 0); - -        if (ret) -                goto out; - -        GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, brickinfo, priv); - -        if (glusterd_is_brick_started (brickinfo)) { -                if (gf_is_service_running (pidfile, &pid) && -                    brickinfo->port_registered) { -                        if (!is_brick_mx_enabled ()) { -                                brick_online = _gf_true; -                        } else { -                                brickpath = search_brick_path_from_proc (pid, brickinfo->path); -                                if (!brickpath) { -                                        gf_log (this->name, GF_LOG_INFO, -                                                "brick path %s is not consumed", -                                                brickinfo->path); -                                        brick_online = _gf_false; -                                } else { -                                        brick_online = _gf_true; -                                        GF_FREE (brickpath); -                                } -                        } +glusterd_add_brick_to_dict(glusterd_volinfo_t *volinfo, +                           glusterd_brickinfo_t *brickinfo, dict_t *dict, +                           int32_t count) +{ +    int ret = -1; +    int32_t pid = -1; +    char key[2048] = ""; +    int keylen; +    char base_key[1024] = ""; +    char pidfile[PATH_MAX] = ""; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    gf_boolean_t brick_online = _gf_false; +    char *brickpath = NULL; + +    GF_ASSERT(volinfo); +    GF_ASSERT(brickinfo); +    GF_ASSERT(dict); + +    this = THIS; +    GF_ASSERT(this); + +    priv = this->private; + +    snprintf(base_key, sizeof(base_key), "brick%d", count); +    keylen = snprintf(key, sizeof(key), "%s.hostname", base_key); + +    ret = dict_set_strn(dict, key, keylen, brickinfo->hostname); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s.path", base_key); +    ret = dict_set_strn(dict, key, keylen, brickinfo->path); +    if (ret) +        goto out; + +    /* add peer uuid */ +    snprintf(key, sizeof(key), "%s.peerid", base_key); +    ret = dict_set_dynstr_with_alloc(dict, key, uuid_utoa(brickinfo->uuid)); +    if (ret) { +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "%s.port", base_key); +    ret = dict_set_int32n( +        dict, key, keylen, +        (volinfo->transport_type == GF_TRANSPORT_RDMA) ? 0 : brickinfo->port); +    if (ret) +        goto out; + +    keylen = snprintf(key, sizeof(key), "%s.rdma_port", base_key); +    if (volinfo->transport_type == GF_TRANSPORT_RDMA) { +        ret = dict_set_int32n(dict, key, keylen, brickinfo->port); +    } else if (volinfo->transport_type == GF_TRANSPORT_BOTH_TCP_RDMA) { +        ret = dict_set_int32n(dict, key, keylen, brickinfo->rdma_port); +    } else +        ret = dict_set_int32n(dict, key, keylen, 0); + +    if (ret) +        goto out; + +    GLUSTERD_GET_BRICK_PIDFILE(pidfile, volinfo, brickinfo, priv); + +    if (glusterd_is_brick_started(brickinfo)) { +        if (gf_is_service_running(pidfile, &pid) && +            brickinfo->port_registered) { +            if (!is_brick_mx_enabled()) { +                brick_online = _gf_true; +            } else { +                brickpath = search_brick_path_from_proc(pid, brickinfo->path); +                if (!brickpath) { +                    gf_log(this->name, GF_LOG_INFO, +                           "brick path %s is not consumed", brickinfo->path); +                    brick_online = _gf_false;                  } else { -                        pid = -1; +                    brick_online = _gf_true; +                    GF_FREE(brickpath);                  } +            } +        } else { +            pid = -1;          } +    } -        keylen = snprintf (key, sizeof (key), "%s.pid", base_key); -        ret = dict_set_int32n (dict, key, keylen, pid); -        if (ret) -                goto out; +    keylen = snprintf(key, sizeof(key), "%s.pid", base_key); +    ret = dict_set_int32n(dict, key, keylen, pid); +    if (ret) +        goto out; -        keylen = snprintf (key, sizeof (key), "%s.status", base_key); -        ret = dict_set_int32n (dict, key, keylen, brick_online); +    keylen = snprintf(key, sizeof(key), "%s.status", base_key); +    ret = dict_set_int32n(dict, key, keylen, brick_online);  out: -        if (ret) -                gf_msg_debug (this->name, 0, "Returning %d", ret); +    if (ret) +        gf_msg_debug(this->name, 0, "Returning %d", ret); -        return ret; +    return ret;  }  int32_t -glusterd_get_all_volnames (dict_t *dict) +glusterd_get_all_volnames(dict_t *dict)  { -        int                    ret        = -1; -        int32_t                vol_count  = 0; -        char                   key[64]   = ""; -        int                    keylen; -        glusterd_volinfo_t    *entry      = NULL; -        glusterd_conf_t       *priv       = NULL; +    int ret = -1; +    int32_t vol_count = 0; +    char key[64] = ""; +    int keylen; +    glusterd_volinfo_t *entry = NULL; +    glusterd_conf_t *priv = NULL; -        priv = THIS->private; -        GF_ASSERT (priv); +    priv = THIS->private; +    GF_ASSERT(priv); -        cds_list_for_each_entry (entry, &priv->volumes, vol_list) { -                keylen = snprintf (key, sizeof (key), "vol%d", vol_count); -                ret = dict_set_strn (dict, key, keylen, entry->volname); -                if (ret) -                        goto out; +    cds_list_for_each_entry(entry, &priv->volumes, vol_list) +    { +        keylen = snprintf(key, sizeof(key), "vol%d", vol_count); +        ret = dict_set_strn(dict, key, keylen, entry->volname); +        if (ret) +            goto out; -                vol_count++; -        } +        vol_count++; +    } -        ret = dict_set_int32n (dict, "vol_count", SLEN ("vol_count"), -                               vol_count); +    ret = dict_set_int32n(dict, "vol_count", SLEN("vol_count"), vol_count); - out: -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, "failed to get all " -                        "volume names for status"); -        return ret; +out: +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to get all " +               "volume names for status"); +    return ret;  }  int -glusterd_all_volume_cond_check (glusterd_condition_func func, int status, -                                void *ctx) +glusterd_all_volume_cond_check(glusterd_condition_func func, int status, +                               void *ctx)  { -        glusterd_conf_t         *priv = NULL; -        glusterd_volinfo_t      *volinfo = NULL; -        glusterd_brickinfo_t    *brickinfo = NULL; -        int                     ret = -1; -        xlator_t                *this = NULL; +    glusterd_conf_t *priv = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    glusterd_brickinfo_t *brickinfo = NULL; +    int ret = -1; +    xlator_t *this = NULL; -        this = THIS; -        priv = this->private; +    this = THIS; +    priv = this->private; -        cds_list_for_each_entry (volinfo, &priv->volumes, vol_list) { -                cds_list_for_each_entry (brickinfo, &volinfo->bricks, -                                         brick_list) { -                        ret = func (volinfo, brickinfo, ctx); -                        if (ret != status) { -                                ret = -1; -                                goto out; -                        } -                } +    cds_list_for_each_entry(volinfo, &priv->volumes, vol_list) +    { +        cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +        { +            ret = func(volinfo, brickinfo, ctx); +            if (ret != status) { +                ret = -1; +                goto out; +            }          } -        ret = 0; +    } +    ret = 0;  out: -        gf_msg_debug ("glusterd", 0, "returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "returning %d", ret); +    return ret;  } -  int -glusterd_brick_stop (glusterd_volinfo_t *volinfo, -                     glusterd_brickinfo_t *brickinfo, -                     gf_boolean_t del_brick) +glusterd_brick_stop(glusterd_volinfo_t *volinfo, +                    glusterd_brickinfo_t *brickinfo, gf_boolean_t del_brick)  { -        int                                     ret   = -1; -        xlator_t                                *this = NULL; -        glusterd_conf_t                         *conf = NULL; +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; -        this = THIS; -        GF_ASSERT (this); -        conf = this->private; -        GF_ASSERT (conf); +    this = THIS; +    GF_ASSERT(this); +    conf = this->private; +    GF_ASSERT(conf); -        if ((!brickinfo) || (!volinfo)) -                goto out; +    if ((!brickinfo) || (!volinfo)) +        goto out; -        if (gf_uuid_is_null (brickinfo->uuid)) { -                ret = glusterd_resolve_brick (brickinfo); -                if (ret) { -                        gf_event (EVENT_BRICKPATH_RESOLVE_FAILED, -                                  "peer=%s;volume=%s;brick=%s", -                                  brickinfo->hostname, volinfo->volname, -                                  brickinfo->path); -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_RESOLVE_BRICK_FAIL, FMTSTR_RESOLVE_BRICK, -                                brickinfo->hostname, brickinfo->path); -                        goto out; -                } +    if (gf_uuid_is_null(brickinfo->uuid)) { +        ret = glusterd_resolve_brick(brickinfo); +        if (ret) { +            gf_event(EVENT_BRICKPATH_RESOLVE_FAILED, +                     "peer=%s;volume=%s;brick=%s", brickinfo->hostname, +                     volinfo->volname, brickinfo->path); +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_RESOLVE_BRICK_FAIL, +                   FMTSTR_RESOLVE_BRICK, brickinfo->hostname, brickinfo->path); +            goto out;          } +    } -        if (gf_uuid_compare (brickinfo->uuid, MY_UUID)) { -                ret = 0; -                if (del_brick) -                        glusterd_delete_brick (volinfo, brickinfo); -                goto out; -        } +    if (gf_uuid_compare(brickinfo->uuid, MY_UUID)) { +        ret = 0; +        if (del_brick) +            glusterd_delete_brick(volinfo, brickinfo); +        goto out; +    } -        ret = glusterd_volume_stop_glusterfs (volinfo, brickinfo, del_brick); -        if (ret) { -                gf_msg (this->name, GF_LOG_CRITICAL, 0, -                        GD_MSG_BRICK_STOP_FAIL, "Unable to stop" -                        " brick: %s:%s", brickinfo->hostname, -                        brickinfo->path); -                goto out; -        } +    ret = glusterd_volume_stop_glusterfs(volinfo, brickinfo, del_brick); +    if (ret) { +        gf_msg(this->name, GF_LOG_CRITICAL, 0, GD_MSG_BRICK_STOP_FAIL, +               "Unable to stop" +               " brick: %s:%s", +               brickinfo->hostname, brickinfo->path); +        goto out; +    }  out: -        gf_msg_debug (this->name, 0, "returning %d ", ret); -        return ret; +    gf_msg_debug(this->name, 0, "returning %d ", ret); +    return ret;  }  gf_boolean_t -glusterd_is_tier_daemon_running (glusterd_volinfo_t *volinfo) +glusterd_is_tier_daemon_running(glusterd_volinfo_t *volinfo)  { -        if (volinfo->type != GF_CLUSTER_TYPE_TIER) -                return _gf_false; - -        if (volinfo->rebal.defrag && -            volinfo->rebal.defrag_cmd == GF_DEFRAG_CMD_START_TIER) { -                return _gf_true; -        } - +    if (volinfo->type != GF_CLUSTER_TYPE_TIER)          return _gf_false; -} +    if (volinfo->rebal.defrag && +        volinfo->rebal.defrag_cmd == GF_DEFRAG_CMD_START_TIER) { +        return _gf_true; +    } +    return _gf_false; +}  int -glusterd_is_defrag_on (glusterd_volinfo_t *volinfo) +glusterd_is_defrag_on(glusterd_volinfo_t *volinfo)  { -        /* -         * Do not need to consider tier daemon as a rebalance -         * daemon and with current design rebalance is not supported -         * on a tiered volume. -         */ +    /* +     * Do not need to consider tier daemon as a rebalance +     * daemon and with current design rebalance is not supported +     * on a tiered volume. +     */ -        if (glusterd_is_tier_daemon_running (volinfo)) -                return 0; +    if (glusterd_is_tier_daemon_running(volinfo)) +        return 0; -        return (volinfo->rebal.defrag != NULL); +    return (volinfo->rebal.defrag != NULL);  }  int -glusterd_new_brick_validate (char *brick, glusterd_brickinfo_t *brickinfo, -                             char *op_errstr, size_t len, char *op) +glusterd_new_brick_validate(char *brick, glusterd_brickinfo_t *brickinfo, +                            char *op_errstr, size_t len, char *op)  { -        glusterd_brickinfo_t    *newbrickinfo = NULL; -        int                     ret = -1; -        gf_boolean_t            is_allocated = _gf_false; -        glusterd_peerinfo_t     *peerinfo = NULL; -        glusterd_conf_t         *priv = NULL; -        xlator_t                *this = NULL; +    glusterd_brickinfo_t *newbrickinfo = NULL; +    int ret = -1; +    gf_boolean_t is_allocated = _gf_false; +    glusterd_peerinfo_t *peerinfo = NULL; +    glusterd_conf_t *priv = NULL; +    xlator_t *this = NULL; -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); +    GF_ASSERT(brick); +    GF_ASSERT(op_errstr); -        GF_ASSERT (brick); -        GF_ASSERT (op_errstr); - -        if (!brickinfo) { -                ret = glusterd_brickinfo_new_from_brick (brick, &newbrickinfo, -                                                         _gf_true, NULL); -                if (ret) -                        goto out; -                is_allocated = _gf_true; -        } else { -                newbrickinfo = brickinfo; +    if (!brickinfo) { +        ret = glusterd_brickinfo_new_from_brick(brick, &newbrickinfo, _gf_true, +                                                NULL); +        if (ret) +            goto out; +        is_allocated = _gf_true; +    } else { +        newbrickinfo = brickinfo; +    } + +    ret = glusterd_resolve_brick(newbrickinfo); +    if (ret) { +        snprintf(op_errstr, len, +                 "Host %s is not in \'Peer " +                 "in Cluster\' state", +                 newbrickinfo->hostname); +        goto out; +    } + +    if (!gf_uuid_compare(MY_UUID, newbrickinfo->uuid)) { +        /* brick is local */ +        if (!glusterd_is_brickpath_available(newbrickinfo->uuid, +                                             newbrickinfo->path)) { +            snprintf(op_errstr, len, +                     "Brick: %s not available." +                     " Brick may be containing or be contained " +                     "by an existing brick.", +                     brick); +            if (op && (!strcmp(op, "GF_RESET_OP_COMMIT") || +                       !strcmp(op, "GF_RESET_OP_COMMIT_FORCE"))) +                ret = 1; +            else +                ret = -1; +            goto out;          } -        ret = glusterd_resolve_brick (newbrickinfo); -        if (ret) { -                snprintf(op_errstr, len, "Host %s is not in \'Peer " -                         "in Cluster\' state", newbrickinfo->hostname); -                goto out; +    } else { +        peerinfo = glusterd_peerinfo_find_by_uuid(newbrickinfo->uuid); +        if (peerinfo == NULL) { +            ret = -1; +            snprintf(op_errstr, len, "Failed to find host %s", +                     newbrickinfo->hostname); +            goto out;          } -        if (!gf_uuid_compare (MY_UUID, newbrickinfo->uuid)) { -                /* brick is local */ -                if (!glusterd_is_brickpath_available (newbrickinfo->uuid, -                                                      newbrickinfo->path)) { -                        snprintf(op_errstr, len, "Brick: %s not available." -                                 " Brick may be containing or be contained " -                                 "by an existing brick.", brick); -                        if (op && (!strcmp (op, "GF_RESET_OP_COMMIT") || -                            !strcmp (op, "GF_RESET_OP_COMMIT_FORCE"))) -                                ret = 1; -                        else -                                ret = -1; -                        goto out; -                } - -        } else { -                peerinfo = glusterd_peerinfo_find_by_uuid (newbrickinfo->uuid); -                if (peerinfo == NULL) { -                        ret = -1; -                        snprintf (op_errstr, len, "Failed to find host %s", -                                  newbrickinfo->hostname); -                        goto out; -                } - -                if ((!peerinfo->connected)) { -                        snprintf(op_errstr, len, "Host %s not connected", -                                 newbrickinfo->hostname); -                        ret = -1; -                        goto out; -                } +        if ((!peerinfo->connected)) { +            snprintf(op_errstr, len, "Host %s not connected", +                     newbrickinfo->hostname); +            ret = -1; +            goto out; +        } -                if (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED) { -                        snprintf(op_errstr, len, "Host %s is not in \'Peer " -                                 "in Cluster\' state", -                                 newbrickinfo->hostname); -                        ret = -1; -                        goto out; -                } +        if (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED) { +            snprintf(op_errstr, len, +                     "Host %s is not in \'Peer " +                     "in Cluster\' state", +                     newbrickinfo->hostname); +            ret = -1; +            goto out;          } +    } -        ret = 0; +    ret = 0;  out: -        if (is_allocated) -                glusterd_brickinfo_delete (newbrickinfo); -        if (op_errstr[0] != '\0') -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BRICK_VALIDATE_FAIL, "%s", op_errstr); -        gf_msg_debug (this->name, 0, "returning %d ", ret); -        return ret; +    if (is_allocated) +        glusterd_brickinfo_delete(newbrickinfo); +    if (op_errstr[0] != '\0') +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_VALIDATE_FAIL, "%s", +               op_errstr); +    gf_msg_debug(this->name, 0, "returning %d ", ret); +    return ret;  }  int -glusterd_rb_check_bricks (glusterd_volinfo_t *volinfo, -                          glusterd_brickinfo_t *src, glusterd_brickinfo_t *dst) +glusterd_rb_check_bricks(glusterd_volinfo_t *volinfo, glusterd_brickinfo_t *src, +                         glusterd_brickinfo_t *dst)  { -        glusterd_replace_brick_t        *rb = NULL; +    glusterd_replace_brick_t *rb = NULL; -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        rb = &volinfo->rep_brick; +    rb = &volinfo->rep_brick; -        if (!rb->src_brick || !rb->dst_brick) -                return -1; +    if (!rb->src_brick || !rb->dst_brick) +        return -1; -        if (strcmp (rb->src_brick->hostname, src->hostname) || -            strcmp (rb->src_brick->path, src->path)) { -                gf_msg("glusterd", GF_LOG_ERROR, 0, -                       GD_MSG_RB_SRC_BRICKS_MISMATCH, -                       "Replace brick src bricks differ"); -                return -1; -        } +    if (strcmp(rb->src_brick->hostname, src->hostname) || +        strcmp(rb->src_brick->path, src->path)) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_RB_SRC_BRICKS_MISMATCH, +               "Replace brick src bricks differ"); +        return -1; +    } -        if (strcmp (rb->dst_brick->hostname, dst->hostname) || -            strcmp (rb->dst_brick->path, dst->path)) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_RB_DST_BRICKS_MISMATCH, -                        "Replace brick dst bricks differ"); -                return -1; -        } +    if (strcmp(rb->dst_brick->hostname, dst->hostname) || +        strcmp(rb->dst_brick->path, dst->path)) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_RB_DST_BRICKS_MISMATCH, +               "Replace brick dst bricks differ"); +        return -1; +    } -        return 0; +    return 0;  }  /*path needs to be absolute; works only on gfid, volume-id*/  static int -glusterd_is_uuid_present (char *path, char *xattr, gf_boolean_t *present) +glusterd_is_uuid_present(char *path, char *xattr, gf_boolean_t *present)  { -        GF_ASSERT (path); -        GF_ASSERT (xattr); -        GF_ASSERT (present); +    GF_ASSERT(path); +    GF_ASSERT(xattr); +    GF_ASSERT(present); -        int     ret      = -1; -        uuid_t  uid     = {0,}; +    int ret = -1; +    uuid_t uid = { +        0, +    }; -        if (!path || !xattr || !present) -                goto out; +    if (!path || !xattr || !present) +        goto out; -        ret = sys_lgetxattr (path, xattr, &uid, 16); +    ret = sys_lgetxattr(path, xattr, &uid, 16); -        if (ret >= 0) { -                *present = _gf_true; -                ret = 0; -                goto out; -        } +    if (ret >= 0) { +        *present = _gf_true; +        ret = 0; +        goto out; +    } -        switch (errno) { +    switch (errno) {  #if defined(ENODATA) -                case ENODATA: /* FALLTHROUGH */ +        case ENODATA: /* FALLTHROUGH */  #endif  #if defined(ENOATTR) && (ENOATTR != ENODATA) -                case ENOATTR: /* FALLTHROUGH */ +        case ENOATTR: /* FALLTHROUGH */  #endif -                case ENOTSUP: -                        *present = _gf_false; -                        ret = 0; -                        break; -                default: -                        break; -        } +        case ENOTSUP: +            *present = _gf_false; +            ret = 0; +            break; +        default: +            break; +    }  out: -        return ret; +    return ret;  }  /*path needs to be absolute*/  static int -glusterd_is_path_in_use (char *path, gf_boolean_t *in_use, char **op_errstr) -{ -        int             i               = 0; -        int             ret             = -1; -        gf_boolean_t    used            = _gf_false; -        char            dir[PATH_MAX]   = ""; -        char            *curdir         = NULL; -        char            msg[2048]       = ""; -        char            *keys[3]         = {GFID_XATTR_KEY, -                                            GF_XATTR_VOL_ID_KEY, -                                            NULL}; - -        GF_ASSERT (path); -        if (!path) -                goto out; +glusterd_is_path_in_use(char *path, gf_boolean_t *in_use, char **op_errstr) +{ +    int i = 0; +    int ret = -1; +    gf_boolean_t used = _gf_false; +    char dir[PATH_MAX] = ""; +    char *curdir = NULL; +    char msg[2048] = ""; +    char *keys[3] = {GFID_XATTR_KEY, GF_XATTR_VOL_ID_KEY, NULL}; -        if (snprintf (dir, PATH_MAX, "%s", path) >= PATH_MAX) -                goto out; +    GF_ASSERT(path); +    if (!path) +        goto out; -        curdir = dir; -        do { -                for (i = 0; !used && keys[i]; i++) { -                        ret = glusterd_is_uuid_present (curdir, keys[i], &used); -                        if (ret) -                                goto out; -                } +    if (snprintf(dir, PATH_MAX, "%s", path) >= PATH_MAX) +        goto out; -                if (used) -                        break; +    curdir = dir; +    do { +        for (i = 0; !used && keys[i]; i++) { +            ret = glusterd_is_uuid_present(curdir, keys[i], &used); +            if (ret) +                goto out; +        } -                curdir = dirname (curdir); -                if (!strcmp (curdir, ".")) -                        goto out; +        if (used) +            break; +        curdir = dirname(curdir); +        if (!strcmp(curdir, ".")) +            goto out; -        } while (strcmp (curdir, "/")); +    } while (strcmp(curdir, "/")); -        if (!strcmp (curdir, "/")) { -                for (i = 0; !used && keys[i]; i++) { -                        ret = glusterd_is_uuid_present (curdir, keys[i], &used); -                        if (ret) -                                goto out; -                } +    if (!strcmp(curdir, "/")) { +        for (i = 0; !used && keys[i]; i++) { +            ret = glusterd_is_uuid_present(curdir, keys[i], &used); +            if (ret) +                goto out;          } +    } -        ret = 0; -        *in_use = used; +    ret = 0; +    *in_use = used;  out: -        if (ret) { -                snprintf (msg, sizeof (msg), "Failed to get extended " -                          "attribute %s, reason: %s", keys[i], -                          strerror (errno)); -        } +    if (ret) { +        snprintf(msg, sizeof(msg), +                 "Failed to get extended " +                 "attribute %s, reason: %s", +                 keys[i], strerror(errno)); +    } -        if (*in_use) { -                if (path && curdir && !strcmp (path, curdir)) { -                        snprintf (msg, sizeof (msg), "%s is already part of a " -                          "volume", path); -                } else { -                        snprintf (msg, sizeof (msg), "parent directory %s is " -                          "already part of a volume", curdir); -                } +    if (*in_use) { +        if (path && curdir && !strcmp(path, curdir)) { +            snprintf(msg, sizeof(msg), +                     "%s is already part of a " +                     "volume", +                     path); +        } else { +            snprintf(msg, sizeof(msg), +                     "parent directory %s is " +                     "already part of a volume", +                     curdir);          } +    } -        if (strlen (msg)) { -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_PATH_ALREADY_PART_OF_VOL, "%s", msg); -                *op_errstr = gf_strdup (msg); -        } +    if (strlen(msg)) { +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_PATH_ALREADY_PART_OF_VOL, +               "%s", msg); +        *op_errstr = gf_strdup(msg); +    } -        return ret; +    return ret;  }  int -glusterd_check_and_set_brick_xattr (char *host, char *path, uuid_t uuid, -                                    char **op_errstr, gf_boolean_t is_force) +glusterd_check_and_set_brick_xattr(char *host, char *path, uuid_t uuid, +                                   char **op_errstr, gf_boolean_t is_force)  { -        int             ret             = -1; -        char            msg[2048]       = ""; -        gf_boolean_t    in_use          = _gf_false; -        int             flags           = 0; +    int ret = -1; +    char msg[2048] = ""; +    gf_boolean_t in_use = _gf_false; +    int flags = 0; -        /* Check for xattr support in backend fs */ -        ret = sys_lsetxattr (path, "trusted.glusterfs.test", -                             "working", 8, 0); -        if (ret == -1) { -                snprintf (msg, sizeof (msg), "Glusterfs is not" -                          " supported on brick: %s:%s.\nSetting" -                          " extended attributes failed, reason:" -                          " %s.", host, path, strerror(errno)); -                goto out; +    /* Check for xattr support in backend fs */ +    ret = sys_lsetxattr(path, "trusted.glusterfs.test", "working", 8, 0); +    if (ret == -1) { +        snprintf(msg, sizeof(msg), +                 "Glusterfs is not" +                 " supported on brick: %s:%s.\nSetting" +                 " extended attributes failed, reason:" +                 " %s.", +                 host, path, strerror(errno)); +        goto out; -        } else { -                ret = sys_lremovexattr (path, "trusted.glusterfs.test"); -                if (ret) { -                        snprintf (msg, sizeof (msg), "Removing test extended" -                                  " attribute failed, reason: %s", -                                  strerror(errno)); -                        goto out; -                } +    } else { +        ret = sys_lremovexattr(path, "trusted.glusterfs.test"); +        if (ret) { +            snprintf(msg, sizeof(msg), +                     "Removing test extended" +                     " attribute failed, reason: %s", +                     strerror(errno)); +            goto out;          } +    } -        ret = glusterd_is_path_in_use (path, &in_use, op_errstr); -        if (ret) -                goto out; - -        if (in_use && !is_force) { -                ret = -1; -                goto out; -        } +    ret = glusterd_is_path_in_use(path, &in_use, op_errstr); +    if (ret) +        goto out; +    if (in_use && !is_force) { +        ret = -1; +        goto out; +    } -        if (!is_force) -                flags = XATTR_CREATE; +    if (!is_force) +        flags = XATTR_CREATE; -        ret = sys_lsetxattr (path, GF_XATTR_VOL_ID_KEY, uuid, 16, -                             flags); -        if (ret == -1) { -                snprintf (msg, sizeof (msg), "Failed to set extended " -                          "attributes %s, reason: %s", -                          GF_XATTR_VOL_ID_KEY, strerror (errno)); -                goto out; -        } +    ret = sys_lsetxattr(path, GF_XATTR_VOL_ID_KEY, uuid, 16, flags); +    if (ret == -1) { +        snprintf(msg, sizeof(msg), +                 "Failed to set extended " +                 "attributes %s, reason: %s", +                 GF_XATTR_VOL_ID_KEY, strerror(errno)); +        goto out; +    } -        ret = 0; +    ret = 0;  out: -        if (strlen (msg)) -                *op_errstr = gf_strdup (msg); +    if (strlen(msg)) +        *op_errstr = gf_strdup(msg); -        return ret; +    return ret;  }  int -glusterd_sm_tr_log_transition_add_to_dict (dict_t *dict, -                                           glusterd_sm_tr_log_t *log, int i, -                                           int count) +glusterd_sm_tr_log_transition_add_to_dict(dict_t *dict, +                                          glusterd_sm_tr_log_t *log, int i, +                                          int count)  { -        int     ret = -1; -        char    key[64] = ""; -        int     keylen; -        char    timestr[64] = ""; -        char    *str = NULL; +    int ret = -1; +    char key[64] = ""; +    int keylen; +    char timestr[64] = ""; +    char *str = NULL; -        GF_ASSERT (dict); -        GF_ASSERT (log); +    GF_ASSERT(dict); +    GF_ASSERT(log); -        keylen = snprintf (key, sizeof (key), "log%d-old-state", count); -        str = log->state_name_get (log->transitions[i].old_state); -        ret = dict_set_strn (dict, key, keylen, str); -        if (ret) -                goto out; +    keylen = snprintf(key, sizeof(key), "log%d-old-state", count); +    str = log->state_name_get(log->transitions[i].old_state); +    ret = dict_set_strn(dict, key, keylen, str); +    if (ret) +        goto out; -        keylen = snprintf (key, sizeof (key), "log%d-event", count); -        str = log->event_name_get (log->transitions[i].event); -        ret = dict_set_strn (dict, key, keylen, str); -        if (ret) -                goto out; - -        keylen = snprintf (key, sizeof (key), "log%d-new-state", count); -        str = log->state_name_get (log->transitions[i].new_state); -        ret = dict_set_strn (dict, key, keylen, str); -        if (ret) -                goto out; +    keylen = snprintf(key, sizeof(key), "log%d-event", count); +    str = log->event_name_get(log->transitions[i].event); +    ret = dict_set_strn(dict, key, keylen, str); +    if (ret) +        goto out; +    keylen = snprintf(key, sizeof(key), "log%d-new-state", count); +    str = log->state_name_get(log->transitions[i].new_state); +    ret = dict_set_strn(dict, key, keylen, str); +    if (ret) +        goto out; -        snprintf (key, sizeof (key), "log%d-time", count); -        gf_time_fmt (timestr, sizeof timestr, log->transitions[i].time, -                     gf_timefmt_FT); -        ret = dict_set_dynstr_with_alloc (dict, key, timestr); -        if (ret) -                goto out; +    snprintf(key, sizeof(key), "log%d-time", count); +    gf_time_fmt(timestr, sizeof timestr, log->transitions[i].time, +                gf_timefmt_FT); +    ret = dict_set_dynstr_with_alloc(dict, key, timestr); +    if (ret) +        goto out;  out: -        gf_msg_debug ("glusterd", 0, "returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "returning %d", ret); +    return ret;  }  int -glusterd_sm_tr_log_add_to_dict (dict_t *dict, -                                glusterd_sm_tr_log_t *circular_log) +glusterd_sm_tr_log_add_to_dict(dict_t *dict, glusterd_sm_tr_log_t *circular_log)  { -        int     ret = -1; -        int     i = 0; -        int     start = 0; -        int     end     = 0; -        int     index = 0; -        char    key[16] = {0}; -        glusterd_sm_tr_log_t *log = NULL; -        int     count = 0; +    int ret = -1; +    int i = 0; +    int start = 0; +    int end = 0; +    int index = 0; +    char key[16] = {0}; +    glusterd_sm_tr_log_t *log = NULL; +    int count = 0; -        GF_ASSERT (dict); -        GF_ASSERT (circular_log); +    GF_ASSERT(dict); +    GF_ASSERT(circular_log); -        log = circular_log; -        if (!log->count) -                return 0; +    log = circular_log; +    if (!log->count) +        return 0; -        if (log->count == log->size) -                start = log->current + 1; +    if (log->count == log->size) +        start = log->current + 1; -        end = start + log->count; -        for (i = start; i < end; i++, count++) { -                index = i % log->count; -                ret = glusterd_sm_tr_log_transition_add_to_dict (dict, log, index, -                                                                 count); -                if (ret) -                        goto out; -        } +    end = start + log->count; +    for (i = start; i < end; i++, count++) { +        index = i % log->count; +        ret = glusterd_sm_tr_log_transition_add_to_dict(dict, log, index, +                                                        count); +        if (ret) +            goto out; +    } -        ret = snprintf (key, sizeof (key), "count"); -        ret = dict_set_int32n (dict, key, ret, log->count); +    ret = snprintf(key, sizeof(key), "count"); +    ret = dict_set_int32n(dict, key, ret, log->count);  out: -        gf_msg_debug ("glusterd", 0, "returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "returning %d", ret); +    return ret;  }  int -glusterd_sm_tr_log_init (glusterd_sm_tr_log_t *log, -                         char * (*state_name_get) (int), -                         char * (*event_name_get) (int), -                         size_t  size) +glusterd_sm_tr_log_init(glusterd_sm_tr_log_t *log, char *(*state_name_get)(int), +                        char *(*event_name_get)(int), size_t size)  { -        glusterd_sm_transition_t *transitions = NULL; -        int                      ret = -1; +    glusterd_sm_transition_t *transitions = NULL; +    int ret = -1; -        GF_ASSERT (size > 0); -        GF_ASSERT (log && state_name_get && event_name_get); +    GF_ASSERT(size > 0); +    GF_ASSERT(log && state_name_get && event_name_get); -        if (!log || !state_name_get || !event_name_get || (size <= 0)) -                goto out; +    if (!log || !state_name_get || !event_name_get || (size <= 0)) +        goto out; -        transitions = GF_CALLOC (size, sizeof (*transitions), -                                 gf_gld_mt_sm_tr_log_t); -        if (!transitions) -                goto out; +    transitions = GF_CALLOC(size, sizeof(*transitions), gf_gld_mt_sm_tr_log_t); +    if (!transitions) +        goto out; -        log->transitions = transitions; -        log->size        = size; -        log->state_name_get = state_name_get; -        log->event_name_get = event_name_get; -        ret = 0; +    log->transitions = transitions; +    log->size = size; +    log->state_name_get = state_name_get; +    log->event_name_get = event_name_get; +    ret = 0;  out: -        gf_msg_debug ("glusterd", 0, "returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "returning %d", ret); +    return ret;  }  void -glusterd_sm_tr_log_delete (glusterd_sm_tr_log_t *log) +glusterd_sm_tr_log_delete(glusterd_sm_tr_log_t *log)  { -        if (!log) -                return; -        GF_FREE (log->transitions); +    if (!log)          return; +    GF_FREE(log->transitions); +    return;  }  int -glusterd_sm_tr_log_transition_add (glusterd_sm_tr_log_t *log, -                                   int old_state, int new_state, -                                   int event) +glusterd_sm_tr_log_transition_add(glusterd_sm_tr_log_t *log, int old_state, +                                  int new_state, int event)  { -        glusterd_sm_transition_t *transitions = NULL; -        int                      ret = -1; -        int                      next = 0; -        xlator_t                 *this = NULL; +    glusterd_sm_transition_t *transitions = NULL; +    int ret = -1; +    int next = 0; +    xlator_t *this = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        GF_ASSERT (log); -        if (!log) -                goto out; +    GF_ASSERT(log); +    if (!log) +        goto out; -        transitions = log->transitions; -        if (!transitions) -                goto out; +    transitions = log->transitions; +    if (!transitions) +        goto out; -        if (log->count) -                next = (log->current + 1) % log->size; -        else -                next = 0; - -        transitions[next].old_state = old_state; -        transitions[next].new_state = new_state; -        transitions[next].event     = event; -        time (&transitions[next].time); -        log->current = next; -        if (log->count < log->size) -                log->count++; -        ret = 0; -        gf_msg_debug (this->name, 0, "Transitioning from '%s' to '%s' " -                "due to event '%s'", log->state_name_get (old_state), -                log->state_name_get (new_state), log->event_name_get (event)); +    if (log->count) +        next = (log->current + 1) % log->size; +    else +        next = 0; + +    transitions[next].old_state = old_state; +    transitions[next].new_state = new_state; +    transitions[next].event = event; +    time(&transitions[next].time); +    log->current = next; +    if (log->count < log->size) +        log->count++; +    ret = 0; +    gf_msg_debug(this->name, 0, +                 "Transitioning from '%s' to '%s' " +                 "due to event '%s'", +                 log->state_name_get(old_state), log->state_name_get(new_state), +                 log->event_name_get(event));  out: -        gf_msg_debug (this->name, 0, "returning %d", ret); -        return ret; +    gf_msg_debug(this->name, 0, "returning %d", ret); +    return ret;  }  int -glusterd_remove_pending_entry (struct cds_list_head *list, void *elem) +glusterd_remove_pending_entry(struct cds_list_head *list, void *elem)  { -        glusterd_pending_node_t *pending_node = NULL; -        glusterd_pending_node_t *tmp = NULL; -        int                     ret = 0; +    glusterd_pending_node_t *pending_node = NULL; +    glusterd_pending_node_t *tmp = NULL; +    int ret = 0; -        cds_list_for_each_entry_safe (pending_node, tmp, list, list) { -                if (elem == pending_node->node) { -                        cds_list_del_init (&pending_node->list); -                        GF_FREE (pending_node); -                        ret = 0; -                        goto out; -                } +    cds_list_for_each_entry_safe(pending_node, tmp, list, list) +    { +        if (elem == pending_node->node) { +            cds_list_del_init(&pending_node->list); +            GF_FREE(pending_node); +            ret = 0; +            goto out;          } +    }  out: -        gf_msg_debug (THIS->name, 0, "returning %d", ret); -        return ret; - +    gf_msg_debug(THIS->name, 0, "returning %d", ret); +    return ret;  }  int -glusterd_clear_pending_nodes (struct cds_list_head *list) +glusterd_clear_pending_nodes(struct cds_list_head *list)  { -        glusterd_pending_node_t *pending_node = NULL; -        glusterd_pending_node_t *tmp = NULL; +    glusterd_pending_node_t *pending_node = NULL; +    glusterd_pending_node_t *tmp = NULL; -        cds_list_for_each_entry_safe (pending_node, tmp, list, list) { -                cds_list_del_init (&pending_node->list); -                GF_FREE (pending_node); -        } +    cds_list_for_each_entry_safe(pending_node, tmp, list, list) +    { +        cds_list_del_init(&pending_node->list); +        GF_FREE(pending_node); +    } -        return 0; +    return 0;  }  int32_t -glusterd_delete_volume (glusterd_volinfo_t *volinfo) +glusterd_delete_volume(glusterd_volinfo_t *volinfo)  { -        int             ret = -1; -        GF_ASSERT (volinfo); +    int ret = -1; +    GF_ASSERT(volinfo); -        ret = glusterd_store_delete_volume (volinfo); +    ret = glusterd_store_delete_volume(volinfo); -        if (ret) -                goto out; +    if (ret) +        goto out; -        glusterd_volinfo_remove (volinfo); +    glusterd_volinfo_remove(volinfo);  out: -        gf_msg_debug (THIS->name, 0, "returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "returning %d", ret); +    return ret;  }  int32_t -glusterd_delete_brick (glusterd_volinfo_t* volinfo, -                       glusterd_brickinfo_t *brickinfo) +glusterd_delete_brick(glusterd_volinfo_t *volinfo, +                      glusterd_brickinfo_t *brickinfo)  { -        int             ret = 0; -        char      voldir[PATH_MAX] = ""; -        glusterd_conf_t *priv = THIS->private; -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); +    int ret = 0; +    char voldir[PATH_MAX] = ""; +    glusterd_conf_t *priv = THIS->private; +    GF_ASSERT(volinfo); +    GF_ASSERT(brickinfo); -        GLUSTERD_GET_VOLUME_DIR(voldir, volinfo, priv); +    GLUSTERD_GET_VOLUME_DIR(voldir, volinfo, priv); -        glusterd_delete_volfile (volinfo, brickinfo); -        glusterd_store_delete_brick (brickinfo, voldir); -        glusterd_brickinfo_delete (brickinfo); -        volinfo->brick_count--; -        return ret; +    glusterd_delete_volfile(volinfo, brickinfo); +    glusterd_store_delete_brick(brickinfo, voldir); +    glusterd_brickinfo_delete(brickinfo); +    volinfo->brick_count--; +    return ret;  }  int32_t -glusterd_delete_all_bricks (glusterd_volinfo_t* volinfo) +glusterd_delete_all_bricks(glusterd_volinfo_t *volinfo)  { -        int             ret = 0; -        glusterd_brickinfo_t *brickinfo = NULL; -        glusterd_brickinfo_t *tmp = NULL; +    int ret = 0; +    glusterd_brickinfo_t *brickinfo = NULL; +    glusterd_brickinfo_t *tmp = NULL; -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        cds_list_for_each_entry_safe (brickinfo, tmp, &volinfo->bricks, -                                      brick_list) { -                ret = glusterd_delete_brick (volinfo, brickinfo); -        } -        return ret; +    cds_list_for_each_entry_safe(brickinfo, tmp, &volinfo->bricks, brick_list) +    { +        ret = glusterd_delete_brick(volinfo, brickinfo); +    } +    return ret;  }  int -glusterd_get_local_brickpaths (glusterd_volinfo_t *volinfo, char **pathlist) +glusterd_get_local_brickpaths(glusterd_volinfo_t *volinfo, char **pathlist)  { -        char                 **path_tokens  = NULL; -        char                  *tmp_path_list = NULL; -        char                   path[PATH_MAX] = ""; -        int32_t                count          = 0; -        int32_t                pathlen        = 0; -        int32_t                total_len      = 0; -        int32_t                ret            = 0; -        int                    i              = 0; -        glusterd_brickinfo_t  *brickinfo      = NULL; +    char **path_tokens = NULL; +    char *tmp_path_list = NULL; +    char path[PATH_MAX] = ""; +    int32_t count = 0; +    int32_t pathlen = 0; +    int32_t total_len = 0; +    int32_t ret = 0; +    int i = 0; +    glusterd_brickinfo_t *brickinfo = NULL; -        if ((!volinfo) || (!pathlist)) -            goto out; +    if ((!volinfo) || (!pathlist)) +        goto out; -        path_tokens = GF_CALLOC (sizeof(char*), volinfo->brick_count, -                                 gf_gld_mt_charptr); -        if (!path_tokens) { -                gf_msg ("glusterd", GF_LOG_ERROR, ENOMEM, GD_MSG_NO_MEMORY, -                        "Could not allocate memory."); -                ret = -1; -                goto out; -        } +    path_tokens = GF_CALLOC(sizeof(char *), volinfo->brick_count, +                            gf_gld_mt_charptr); +    if (!path_tokens) { +        gf_msg("glusterd", GF_LOG_ERROR, ENOMEM, GD_MSG_NO_MEMORY, +               "Could not allocate memory."); +        ret = -1; +        goto out; +    } -        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                if (gf_uuid_compare (brickinfo->uuid, MY_UUID)) -                        continue; +    cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        if (gf_uuid_compare(brickinfo->uuid, MY_UUID)) +            continue; -                 pathlen = snprintf (path, sizeof(path), -                                     "--path=%s ", brickinfo->path); -                 if (pathlen < sizeof(path)) -                        path[pathlen] = '\0'; -                 else -                        path[sizeof(path)-1] = '\0'; -                 path_tokens[count] = gf_strdup (path); -                 if (!path_tokens[count]) { -                        gf_msg ("glusterd", GF_LOG_ERROR, ENOMEM, -                                GD_MSG_NO_MEMORY, "Could not allocate memory."); -                        ret = -1; -                        goto out; -                 } -                 count++; -                 total_len += pathlen; +        pathlen = snprintf(path, sizeof(path), "--path=%s ", brickinfo->path); +        if (pathlen < sizeof(path)) +            path[pathlen] = '\0'; +        else +            path[sizeof(path) - 1] = '\0'; +        path_tokens[count] = gf_strdup(path); +        if (!path_tokens[count]) { +            gf_msg("glusterd", GF_LOG_ERROR, ENOMEM, GD_MSG_NO_MEMORY, +                   "Could not allocate memory."); +            ret = -1; +            goto out;          } +        count++; +        total_len += pathlen; +    } -        tmp_path_list = GF_CALLOC (sizeof(char), total_len + 1, -                                   gf_gld_mt_char); -        if (!tmp_path_list) { -                gf_msg ("glusterd", GF_LOG_ERROR, ENOMEM, GD_MSG_NO_MEMORY, -                        "Could not allocate memory."); -                ret = -1; -                goto out; -        } +    tmp_path_list = GF_CALLOC(sizeof(char), total_len + 1, gf_gld_mt_char); +    if (!tmp_path_list) { +        gf_msg("glusterd", GF_LOG_ERROR, ENOMEM, GD_MSG_NO_MEMORY, +               "Could not allocate memory."); +        ret = -1; +        goto out; +    } -        for (i = 0; i < count; i++) -                strcat (tmp_path_list, path_tokens[i]); +    for (i = 0; i < count; i++) +        strcat(tmp_path_list, path_tokens[i]); -        if (count) -                *pathlist = tmp_path_list; +    if (count) +        *pathlist = tmp_path_list; -        ret = count; +    ret = count;  out: -        if (path_tokens) { -                for (i = 0; i < count; i++) { -                        GF_FREE (path_tokens[i]); -                } +    if (path_tokens) { +        for (i = 0; i < count; i++) { +            GF_FREE(path_tokens[i]);          } +    } -        GF_FREE (path_tokens); -        path_tokens = NULL; +    GF_FREE(path_tokens); +    path_tokens = NULL; -        if (ret == 0) { -                gf_msg_debug ("glusterd", 0, "No Local Bricks Present."); -                GF_FREE (tmp_path_list); -                tmp_path_list = NULL; -        } +    if (ret == 0) { +        gf_msg_debug("glusterd", 0, "No Local Bricks Present."); +        GF_FREE(tmp_path_list); +        tmp_path_list = NULL; +    } -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  int -glusterd_start_gsync (glusterd_volinfo_t *master_vol, char *slave, -                      char *path_list, char *conf_path, -                      char *glusterd_uuid_str, -                      char **op_errstr, gf_boolean_t is_pause) +glusterd_start_gsync(glusterd_volinfo_t *master_vol, char *slave, +                     char *path_list, char *conf_path, char *glusterd_uuid_str, +                     char **op_errstr, gf_boolean_t is_pause)  { -        int32_t         ret     = 0; -        int32_t         status  = 0; -        char            uuid_str[64] = ""; -        runner_t        runner = {0,}; -        xlator_t        *this = NULL; -        glusterd_conf_t *priv = NULL; -        int             errcode = 0; -        gf_boolean_t    is_template_in_use = _gf_false; - -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); +    int32_t ret = 0; +    int32_t status = 0; +    char uuid_str[64] = ""; +    runner_t runner = { +        0, +    }; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    int errcode = 0; +    gf_boolean_t is_template_in_use = _gf_false; -        uuid_utoa_r (MY_UUID, uuid_str); +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); -        if (!path_list) { -                ret = 0; -                gf_msg_debug ("glusterd", 0, "No Bricks in this node." -                        " Not starting gsyncd."); -                goto out; -        } - -        ret = gsync_status (master_vol->volname, slave, conf_path, -                            &status, &is_template_in_use); -        if (status == 0) -                goto out; - -        if (is_template_in_use == _gf_true) { -                gf_asprintf (op_errstr, GEOREP" start failed for %s %s : " -                             "pid-file entry missing in config file", -                             master_vol->volname, slave); -                ret = -1; -                goto out; -        } - -        uuid_utoa_r (master_vol->volume_id, uuid_str); -        runinit (&runner); -        runner_add_args  (&runner, GSYNCD_PREFIX"/gsyncd", -                          path_list, "-c", NULL); -        runner_argprintf (&runner, "%s", conf_path); -        runner_argprintf (&runner, ":%s", master_vol->volname); -        runner_add_args  (&runner, slave, "--config-set", "session-owner", -                          uuid_str, NULL); -        synclock_unlock (&priv->big_lock); -        ret = runner_run (&runner); -        synclock_lock (&priv->big_lock); -        if (ret == -1) { -                errcode = -1; -                goto out; -        } - -        runinit (&runner); -        runner_add_args  (&runner, GSYNCD_PREFIX"/gsyncd", -                          path_list, "--monitor", "-c", NULL); -        runner_argprintf (&runner, "%s", conf_path); -        runner_argprintf (&runner, "--iprefix=%s", DATADIR); -        runner_argprintf (&runner, ":%s", master_vol->volname); -        runner_argprintf (&runner, "--glusterd-uuid=%s", -                          uuid_utoa (priv->uuid)); -        runner_add_arg   (&runner, slave); -        if (is_pause) -                runner_add_arg   (&runner, "--pause-on-start"); -        synclock_unlock (&priv->big_lock); -        ret = runner_run (&runner); -        synclock_lock (&priv->big_lock); -        if (ret == -1) { -                gf_asprintf (op_errstr, GEOREP" start failed for %s %s", -                             master_vol->volname, slave); -                goto out; -        } +    uuid_utoa_r(MY_UUID, uuid_str); +    if (!path_list) {          ret = 0; - -out: -        if ((ret != 0) && errcode == -1) { -                if (op_errstr) -                        *op_errstr = gf_strdup ("internal error, cannot start " -                                                "the " GEOREP " session"); -        } - -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +        gf_msg_debug("glusterd", 0, +                     "No Bricks in this node." +                     " Not starting gsyncd."); +        goto out; +    } + +    ret = gsync_status(master_vol->volname, slave, conf_path, &status, +                       &is_template_in_use); +    if (status == 0) +        goto out; + +    if (is_template_in_use == _gf_true) { +        gf_asprintf(op_errstr, +                    GEOREP +                    " start failed for %s %s : " +                    "pid-file entry missing in config file", +                    master_vol->volname, slave); +        ret = -1; +        goto out; +    } + +    uuid_utoa_r(master_vol->volume_id, uuid_str); +    runinit(&runner); +    runner_add_args(&runner, GSYNCD_PREFIX "/gsyncd", path_list, "-c", NULL); +    runner_argprintf(&runner, "%s", conf_path); +    runner_argprintf(&runner, ":%s", master_vol->volname); +    runner_add_args(&runner, slave, "--config-set", "session-owner", uuid_str, +                    NULL); +    synclock_unlock(&priv->big_lock); +    ret = runner_run(&runner); +    synclock_lock(&priv->big_lock); +    if (ret == -1) { +        errcode = -1; +        goto out; +    } + +    runinit(&runner); +    runner_add_args(&runner, GSYNCD_PREFIX "/gsyncd", path_list, "--monitor", +                    "-c", NULL); +    runner_argprintf(&runner, "%s", conf_path); +    runner_argprintf(&runner, "--iprefix=%s", DATADIR); +    runner_argprintf(&runner, ":%s", master_vol->volname); +    runner_argprintf(&runner, "--glusterd-uuid=%s", uuid_utoa(priv->uuid)); +    runner_add_arg(&runner, slave); +    if (is_pause) +        runner_add_arg(&runner, "--pause-on-start"); +    synclock_unlock(&priv->big_lock); +    ret = runner_run(&runner); +    synclock_lock(&priv->big_lock); +    if (ret == -1) { +        gf_asprintf(op_errstr, GEOREP " start failed for %s %s", +                    master_vol->volname, slave); +        goto out; +    } + +    ret = 0; + +out: +    if ((ret != 0) && errcode == -1) { +        if (op_errstr) +            *op_errstr = gf_strdup( +                "internal error, cannot start " +                "the " GEOREP " session"); +    } + +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_recreate_volfiles (glusterd_conf_t *conf) +glusterd_recreate_volfiles(glusterd_conf_t *conf)  { +    glusterd_volinfo_t *volinfo = NULL; +    int ret = 0; +    int op_ret = 0; -        glusterd_volinfo_t      *volinfo = NULL; -        int                      ret = 0; -        int                      op_ret = 0; +    GF_ASSERT(conf); -        GF_ASSERT (conf); - -        cds_list_for_each_entry (volinfo, &conf->volumes, vol_list) { -                ret = generate_brick_volfiles (volinfo); -                if (ret) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_VOLFILE_CREATE_FAIL, "Failed to " -                                "regenerate brick volfiles for %s", -                                volinfo->volname); -                        op_ret = ret; -                } -                ret = generate_client_volfiles (volinfo, GF_CLIENT_TRUSTED); -                if (ret) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_VOLFILE_CREATE_FAIL, "Failed to " -                                "regenerate trusted client volfiles for %s", -                                volinfo->volname); -                        op_ret = ret; -                } -                ret = generate_client_volfiles (volinfo, GF_CLIENT_OTHER); -                if (ret) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_VOLFILE_CREATE_FAIL, "Failed to " -                                "regenerate client volfiles for %s", -                                volinfo->volname); -                        op_ret = ret; -                } +    cds_list_for_each_entry(volinfo, &conf->volumes, vol_list) +    { +        ret = generate_brick_volfiles(volinfo); +        if (ret) { +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_VOLFILE_CREATE_FAIL, +                   "Failed to " +                   "regenerate brick volfiles for %s", +                   volinfo->volname); +            op_ret = ret;          } -        return op_ret; +        ret = generate_client_volfiles(volinfo, GF_CLIENT_TRUSTED); +        if (ret) { +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_VOLFILE_CREATE_FAIL, +                   "Failed to " +                   "regenerate trusted client volfiles for %s", +                   volinfo->volname); +            op_ret = ret; +        } +        ret = generate_client_volfiles(volinfo, GF_CLIENT_OTHER); +        if (ret) { +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_VOLFILE_CREATE_FAIL, +                   "Failed to " +                   "regenerate client volfiles for %s", +                   volinfo->volname); +            op_ret = ret; +        } +    } +    return op_ret;  }  int32_t -glusterd_handle_upgrade_downgrade (dict_t *options, glusterd_conf_t *conf, -                                   gf_boolean_t upgrade, gf_boolean_t downgrade) +glusterd_handle_upgrade_downgrade(dict_t *options, glusterd_conf_t *conf, +                                  gf_boolean_t upgrade, gf_boolean_t downgrade)  { -        int              ret                            = 0; -        gf_boolean_t     regenerate_volfiles            = _gf_false; -        gf_boolean_t     terminate                      = _gf_false; +    int ret = 0; +    gf_boolean_t regenerate_volfiles = _gf_false; +    gf_boolean_t terminate = _gf_false; -        if (_gf_true == upgrade) -                regenerate_volfiles = _gf_true; +    if (_gf_true == upgrade) +        regenerate_volfiles = _gf_true; -        if (upgrade && downgrade) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_WRONG_OPTS_SETTING, "Both upgrade and downgrade" -                        " options are set. Only one should be on"); -                ret = -1; -                goto out; -        } +    if (upgrade && downgrade) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_WRONG_OPTS_SETTING, +               "Both upgrade and downgrade" +               " options are set. Only one should be on"); +        ret = -1; +        goto out; +    } -        if (!upgrade && !downgrade) -                ret = 0; -        else -                terminate = _gf_true; -        if (regenerate_volfiles) { -                ret = glusterd_recreate_volfiles (conf); -        } +    if (!upgrade && !downgrade) +        ret = 0; +    else +        terminate = _gf_true; +    if (regenerate_volfiles) { +        ret = glusterd_recreate_volfiles(conf); +    }  out: -        if (terminate && (ret == 0)) -                kill (getpid(), SIGTERM); -        return ret; +    if (terminate && (ret == 0)) +        kill(getpid(), SIGTERM); +    return ret;  }  static inline int -glusterd_is_replica_volume (int type) +glusterd_is_replica_volume(int type)  { -        if (type == GF_CLUSTER_TYPE_REPLICATE || -            type == GF_CLUSTER_TYPE_STRIPE_REPLICATE) -                return 1; -        return 0; +    if (type == GF_CLUSTER_TYPE_REPLICATE || +        type == GF_CLUSTER_TYPE_STRIPE_REPLICATE) +        return 1; +    return 0;  }  gf_boolean_t -glusterd_is_volume_replicate (glusterd_volinfo_t *volinfo) +glusterd_is_volume_replicate(glusterd_volinfo_t *volinfo)  { -        gf_boolean_t    replicates = _gf_false; -        if (volinfo->type == GF_CLUSTER_TYPE_TIER) { -                replicates = glusterd_is_replica_volume -                                            (volinfo->tier_info.cold_type) | -                             glusterd_is_replica_volume -                                            (volinfo->tier_info.hot_type); -                return replicates; -       } -       return glusterd_is_replica_volume ((volinfo->type)); +    gf_boolean_t replicates = _gf_false; +    if (volinfo->type == GF_CLUSTER_TYPE_TIER) { +        replicates = glusterd_is_replica_volume(volinfo->tier_info.cold_type) | +                     glusterd_is_replica_volume(volinfo->tier_info.hot_type); +        return replicates; +    } +    return glusterd_is_replica_volume((volinfo->type));  }  gf_boolean_t -glusterd_is_shd_compatible_type (int type) +glusterd_is_shd_compatible_type(int type)  { -        switch (type) { +    switch (type) {          case GF_CLUSTER_TYPE_REPLICATE:          case GF_CLUSTER_TYPE_STRIPE_REPLICATE:          case GF_CLUSTER_TYPE_DISPERSE: -                return _gf_true; - -        } -        return _gf_false; +            return _gf_true; +    } +    return _gf_false;  }  gf_boolean_t -glusterd_is_shd_compatible_volume (glusterd_volinfo_t *volinfo) +glusterd_is_shd_compatible_volume(glusterd_volinfo_t *volinfo)  { +    int ret = 0; -        int     ret     = 0; - -        if (volinfo->type == GF_CLUSTER_TYPE_TIER) { -                ret = glusterd_is_shd_compatible_type -                                         (volinfo->tier_info.cold_type) | -                      glusterd_is_shd_compatible_type -                                         (volinfo->tier_info.hot_type); -                return ret; -        } -        return glusterd_is_shd_compatible_type (volinfo->type); +    if (volinfo->type == GF_CLUSTER_TYPE_TIER) { +        ret = glusterd_is_shd_compatible_type(volinfo->tier_info.cold_type) | +              glusterd_is_shd_compatible_type(volinfo->tier_info.hot_type); +        return ret; +    } +    return glusterd_is_shd_compatible_type(volinfo->type);  }  int -glusterd_set_dump_options (char *dumpoptions_path, char *options, -                           int option_cnt) +glusterd_set_dump_options(char *dumpoptions_path, char *options, int option_cnt)  { -        int              ret         = 0; -        char            *dup_options = NULL; -        char            *option      = NULL; -        char            *tmpptr      = NULL; -        FILE            *fp          = NULL; -        int              nfs_cnt     = 0; -        xlator_t        *this        = NULL; -        glusterd_conf_t *priv        = NULL; +    int ret = 0; +    char *dup_options = NULL; +    char *option = NULL; +    char *tmpptr = NULL; +    FILE *fp = NULL; +    int nfs_cnt = 0; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        priv = this->private; -        GF_ASSERT (priv); +    priv = this->private; +    GF_ASSERT(priv); -        if (0 == option_cnt || -            (option_cnt == 1 && (!strcmp (options, "nfs ")))) { -                ret = 0; -                goto out; -        } +    if (0 == option_cnt || (option_cnt == 1 && (!strcmp(options, "nfs ")))) { +        ret = 0; +        goto out; +    } -        fp = fopen (dumpoptions_path, "w"); -        if (!fp) { -                ret = -1; +    fp = fopen(dumpoptions_path, "w"); +    if (!fp) { +        ret = -1; +        goto out; +    } +    dup_options = gf_strdup(options); +    gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_STATEDUMP_OPTS_RCVD, +           "Received following statedump options: %s", dup_options); +    option = strtok_r(dup_options, " ", &tmpptr); +    while (option) { +        if (!strcmp(option, priv->nfs_svc.name)) { +            if (nfs_cnt > 0) { +                sys_unlink(dumpoptions_path); +                ret = 0;                  goto out; +            } +            nfs_cnt++; +            option = strtok_r(NULL, " ", &tmpptr); +            continue;          } -        dup_options = gf_strdup (options); -        gf_msg ("glusterd", GF_LOG_INFO, 0, -                GD_MSG_STATEDUMP_OPTS_RCVD, -                "Received following statedump options: %s", -                dup_options); -        option = strtok_r (dup_options, " ", &tmpptr); -        while (option) { -                if (!strcmp (option, priv->nfs_svc.name)) { -                        if (nfs_cnt > 0) { -                                sys_unlink (dumpoptions_path); -                                ret = 0; -                                goto out; -                        } -                        nfs_cnt++; -                        option = strtok_r (NULL, " ", &tmpptr); -                        continue; -                } -                fprintf (fp, "%s=yes\n", option); -                option = strtok_r (NULL, " ", &tmpptr); -        } +        fprintf(fp, "%s=yes\n", option); +        option = strtok_r(NULL, " ", &tmpptr); +    }  out: -        if (fp) -                fclose (fp); -        GF_FREE (dup_options); -        return ret; +    if (fp) +        fclose(fp); +    GF_FREE(dup_options); +    return ret;  } -  static int -glusterd_brick_signal (glusterd_volinfo_t *volinfo, -                       glusterd_brickinfo_t *brickinfo, -                       char *options, int option_cnt, char **op_errstr, -                       int sig) -{ -        int                     ret = -1; -        xlator_t                *this = NULL; -        glusterd_conf_t         *conf = NULL; -        char                    pidfile_path[PATH_MAX] = ""; -        char                    dumpoptions_path[PATH_MAX] = ""; -        FILE                    *pidfile = NULL; -        pid_t                   pid = -1; - -        this = THIS; -        GF_ASSERT (this); -        conf = this->private; -        GF_ASSERT (conf); - -        if (gf_uuid_is_null (brickinfo->uuid)) { -                ret = glusterd_resolve_brick (brickinfo); -                if (ret) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_RESOLVE_BRICK_FAIL, -                                "Cannot resolve brick %s:%s", -                                brickinfo->hostname, brickinfo->path); -                        goto out; -                } -        } - -        if (gf_uuid_compare (brickinfo->uuid, MY_UUID)) { -                ret = 0; -                goto out; +glusterd_brick_signal(glusterd_volinfo_t *volinfo, +                      glusterd_brickinfo_t *brickinfo, char *options, +                      int option_cnt, char **op_errstr, int sig) +{ +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    char pidfile_path[PATH_MAX] = ""; +    char dumpoptions_path[PATH_MAX] = ""; +    FILE *pidfile = NULL; +    pid_t pid = -1; + +    this = THIS; +    GF_ASSERT(this); +    conf = this->private; +    GF_ASSERT(conf); + +    if (gf_uuid_is_null(brickinfo->uuid)) { +        ret = glusterd_resolve_brick(brickinfo); +        if (ret) { +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_RESOLVE_BRICK_FAIL, +                   "Cannot resolve brick %s:%s", brickinfo->hostname, +                   brickinfo->path); +            goto out;          } +    } -        GLUSTERD_GET_BRICK_PIDFILE (pidfile_path, volinfo, brickinfo, conf); - -        /* TBD: use gf_is_service_running instead of almost-identical code? */ -        pidfile = fopen (pidfile_path, "r"); -        if (!pidfile) { -                gf_msg ("glusterd", GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, "Unable to open pidfile: %s", -                        pidfile_path); -                ret = -1; -                goto out; -        } +    if (gf_uuid_compare(brickinfo->uuid, MY_UUID)) { +        ret = 0; +        goto out; +    } -        ret = fscanf (pidfile, "%d", &pid); -        if (ret <= 0) { -                gf_msg ("glusterd", GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, -                        "Unable to get pid of brick process"); -                ret = -1; -                goto out; -        } +    GLUSTERD_GET_BRICK_PIDFILE(pidfile_path, volinfo, brickinfo, conf); -        if (pid == 0) { -                gf_msg ("glusterd", GF_LOG_WARNING, 0, -                        GD_MSG_NO_SIG_TO_PID_ZERO, -                        "refusing to send signal %d to pid zero", sig); -                goto out; -        } +    /* TBD: use gf_is_service_running instead of almost-identical code? */ +    pidfile = fopen(pidfile_path, "r"); +    if (!pidfile) { +        gf_msg("glusterd", GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "Unable to open pidfile: %s", pidfile_path); +        ret = -1; +        goto out; +    } -        if (sig == SIGUSR1) { -                snprintf (dumpoptions_path, sizeof (dumpoptions_path), -                          DEFAULT_VAR_RUN_DIRECTORY"/glusterdump.%d.options", -                          pid); -                ret = glusterd_set_dump_options (dumpoptions_path, options, -                                                 option_cnt); -                if (ret < 0) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                               GD_MSG_BRK_STATEDUMP_FAIL, -                               "error while parsing the statedump " -                                "options"); -                        ret = -1; -                        goto out; -                } +    ret = fscanf(pidfile, "%d", &pid); +    if (ret <= 0) { +        gf_msg("glusterd", GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "Unable to get pid of brick process"); +        ret = -1; +        goto out; +    } + +    if (pid == 0) { +        gf_msg("glusterd", GF_LOG_WARNING, 0, GD_MSG_NO_SIG_TO_PID_ZERO, +               "refusing to send signal %d to pid zero", sig); +        goto out; +    } + +    if (sig == SIGUSR1) { +        snprintf(dumpoptions_path, sizeof(dumpoptions_path), +                 DEFAULT_VAR_RUN_DIRECTORY "/glusterdump.%d.options", pid); +        ret = glusterd_set_dump_options(dumpoptions_path, options, option_cnt); +        if (ret < 0) { +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_BRK_STATEDUMP_FAIL, +                   "error while parsing the statedump " +                   "options"); +            ret = -1; +            goto out;          } +    } -        gf_msg ("glusterd", GF_LOG_INFO, 0, -                GD_MSG_STATEDUMP_INFO, -                "sending signal %d to brick with pid %d", -                sig, pid); +    gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_STATEDUMP_INFO, +           "sending signal %d to brick with pid %d", sig, pid); -        kill (pid, sig); +    kill(pid, sig); -        sleep (1); -        ret = 0; +    sleep(1); +    ret = 0;  out: -        sys_unlink (dumpoptions_path); -        if (pidfile) -                fclose (pidfile); -        return ret; +    sys_unlink(dumpoptions_path); +    if (pidfile) +        fclose(pidfile); +    return ret;  }  int -glusterd_brick_statedump (glusterd_volinfo_t *volinfo, -                          glusterd_brickinfo_t *brickinfo, -                          char *options, int option_cnt, char **op_errstr) +glusterd_brick_statedump(glusterd_volinfo_t *volinfo, +                         glusterd_brickinfo_t *brickinfo, char *options, +                         int option_cnt, char **op_errstr)  { -        return glusterd_brick_signal (volinfo, brickinfo, -                                      options, option_cnt, op_errstr, -                                      SIGUSR1); +    return glusterd_brick_signal(volinfo, brickinfo, options, option_cnt, +                                 op_errstr, SIGUSR1);  }  int -glusterd_brick_terminate (glusterd_volinfo_t *volinfo, -                          glusterd_brickinfo_t *brickinfo, -                          char *options, int option_cnt, char **op_errstr) +glusterd_brick_terminate(glusterd_volinfo_t *volinfo, +                         glusterd_brickinfo_t *brickinfo, char *options, +                         int option_cnt, char **op_errstr)  { -        return glusterd_brick_signal (volinfo, brickinfo, -                                      options, option_cnt, op_errstr, -                                      SIGTERM); +    return glusterd_brick_signal(volinfo, brickinfo, options, option_cnt, +                                 op_errstr, SIGTERM);  }  int -glusterd_nfs_statedump (char *options, int option_cnt, char **op_errstr) +glusterd_nfs_statedump(char *options, int option_cnt, char **op_errstr)  { -        int                     ret = -1; -        xlator_t                *this = NULL; -        glusterd_conf_t         *conf = NULL; -        char                    pidfile_path[PATH_MAX] = ""; -        char                    path[PATH_MAX] = ""; -        FILE                    *pidfile = NULL; -        pid_t                   pid = -1; -        char                    dumpoptions_path[PATH_MAX] = ""; -        char                    *option = NULL; -        char                    *tmpptr = NULL; -        char                    *dup_options = NULL; -        char                    msg[256] = ""; +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    char pidfile_path[PATH_MAX] = ""; +    char path[PATH_MAX] = ""; +    FILE *pidfile = NULL; +    pid_t pid = -1; +    char dumpoptions_path[PATH_MAX] = ""; +    char *option = NULL; +    char *tmpptr = NULL; +    char *dup_options = NULL; +    char msg[256] = ""; -        this = THIS; -        GF_ASSERT (this); -        conf = this->private; -        GF_ASSERT (conf); +    this = THIS; +    GF_ASSERT(this); +    conf = this->private; +    GF_ASSERT(conf); -        dup_options = gf_strdup (options); -        option = strtok_r (dup_options, " ", &tmpptr); -        if (strcmp (option, conf->nfs_svc.name)) { -                snprintf (msg, sizeof (msg), "for nfs statedump, options should" -                          " be after the key nfs"); -                *op_errstr = gf_strdup (msg); -                ret = -1; -                goto out; -        } - -        GLUSTERD_GET_NFS_DIR (path, conf); -        GLUSTERD_GET_NFS_PIDFILE (pidfile_path, path, conf); +    dup_options = gf_strdup(options); +    option = strtok_r(dup_options, " ", &tmpptr); +    if (strcmp(option, conf->nfs_svc.name)) { +        snprintf(msg, sizeof(msg), +                 "for nfs statedump, options should" +                 " be after the key nfs"); +        *op_errstr = gf_strdup(msg); +        ret = -1; +        goto out; +    } -        pidfile = fopen (pidfile_path, "r"); -        if (!pidfile) { -                gf_msg ("glusterd", GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, "Unable to open pidfile: %s", -                        pidfile_path); -                ret = -1; -                goto out; -        } +    GLUSTERD_GET_NFS_DIR(path, conf); +    GLUSTERD_GET_NFS_PIDFILE(pidfile_path, path, conf); -        ret = fscanf (pidfile, "%d", &pid); -        if (ret <= 0) { -                gf_msg ("glusterd", GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, -                        "Unable to get pid of brick process"); -                ret = -1; -                goto out; -        } +    pidfile = fopen(pidfile_path, "r"); +    if (!pidfile) { +        gf_msg("glusterd", GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "Unable to open pidfile: %s", pidfile_path); +        ret = -1; +        goto out; +    } -        snprintf (dumpoptions_path, sizeof (dumpoptions_path), -                  DEFAULT_VAR_RUN_DIRECTORY"/glusterdump.%d.options", pid); -        ret = glusterd_set_dump_options (dumpoptions_path, options, option_cnt); -        if (ret < 0) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_BRK_STATEDUMP_FAIL, -                        "error while parsing the statedump " -                        "options"); -                ret = -1; -                goto out; -        } +    ret = fscanf(pidfile, "%d", &pid); +    if (ret <= 0) { +        gf_msg("glusterd", GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "Unable to get pid of brick process"); +        ret = -1; +        goto out; +    } + +    snprintf(dumpoptions_path, sizeof(dumpoptions_path), +             DEFAULT_VAR_RUN_DIRECTORY "/glusterdump.%d.options", pid); +    ret = glusterd_set_dump_options(dumpoptions_path, options, option_cnt); +    if (ret < 0) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_BRK_STATEDUMP_FAIL, +               "error while parsing the statedump " +               "options"); +        ret = -1; +        goto out; +    } -        gf_msg ("glusterd", GF_LOG_INFO, 0, -                GD_MSG_STATEDUMP_INFO, -                "Performing statedump on nfs server with " -                "pid %d", pid); +    gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_STATEDUMP_INFO, +           "Performing statedump on nfs server with " +           "pid %d", +           pid); -        kill (pid, SIGUSR1); +    kill(pid, SIGUSR1); -        sleep (1); +    sleep(1); -        ret = 0; +    ret = 0;  out: -        if (pidfile) -                fclose (pidfile); -        sys_unlink (dumpoptions_path); -        GF_FREE (dup_options); -        return ret; +    if (pidfile) +        fclose(pidfile); +    sys_unlink(dumpoptions_path); +    GF_FREE(dup_options); +    return ret;  }  int -glusterd_client_statedump (char *volname, char *options, int option_cnt, -                           char **op_errstr) +glusterd_client_statedump(char *volname, char *options, int option_cnt, +                          char **op_errstr)  { -        int                      ret                = 0; -        char                    *dup_options        = NULL; -        char                    *option             = NULL; -        char                    *tmpptr             = NULL; -        char                     msg[256]           = ""; -        char                    *target_ip          = NULL; -        char                    *pid                = NULL; +    int ret = 0; +    char *dup_options = NULL; +    char *option = NULL; +    char *tmpptr = NULL; +    char msg[256] = ""; +    char *target_ip = NULL; +    char *pid = NULL; -        dup_options = gf_strdup (options); -        option = strtok_r (dup_options, " ", &tmpptr); -        if (strcmp (option, "client")) { -                snprintf (msg, sizeof (msg), "for gluster client statedump, options " -                          "should be after the key 'client'"); -                *op_errstr = gf_strdup (msg); -                ret = -1; -                goto out; -        } -        target_ip = strtok_r (NULL, " ", &tmpptr); -        if (target_ip == NULL) { -                snprintf (msg, sizeof (msg), "ip address not specified"); -                *op_errstr = gf_strdup (msg); -                ret = -1; -                goto out; -        } - -        pid = strtok_r (NULL, " ", &tmpptr); -        if (pid == NULL) { -                snprintf (msg, sizeof (msg), "pid not specified"); -                *op_errstr = gf_strdup (msg); -                ret = -1; -                goto out; -        } - -        ret = glusterd_client_statedump_submit_req (volname, target_ip, pid); -out: -        GF_FREE (dup_options); -        return ret; -} - -int -glusterd_quotad_statedump (char *options, int option_cnt, char **op_errstr) -{ -        int                     ret = -1; -        xlator_t                *this = NULL; -        glusterd_conf_t         *conf = NULL; -        char                    pidfile_path[PATH_MAX] = ""; -        char                    path[PATH_MAX] = ""; -        FILE                    *pidfile = NULL; -        pid_t                   pid = -1; -        char                    dumpoptions_path[PATH_MAX] = ""; -        char                    *option = NULL; -        char                    *tmpptr = NULL; -        char                    *dup_options = NULL; -        char                    msg[256] = ""; - -        this = THIS; -        GF_ASSERT (this); -        conf = this->private; -        GF_ASSERT (conf); - -        dup_options = gf_strdup (options); -        option = strtok_r (dup_options, " ", &tmpptr); -        if (strcmp (option, conf->quotad_svc.name)) { -                snprintf (msg, sizeof (msg), "for quotad statedump, options " -                          "should be after the key 'quotad'"); -                *op_errstr = gf_strdup (msg); -                ret = -1; -                goto out; -        } - -        GLUSTERD_GET_QUOTAD_DIR (path, conf); -        GLUSTERD_GET_QUOTAD_PIDFILE (pidfile_path, path, conf); +    dup_options = gf_strdup(options); +    option = strtok_r(dup_options, " ", &tmpptr); +    if (strcmp(option, "client")) { +        snprintf(msg, sizeof(msg), +                 "for gluster client statedump, options " +                 "should be after the key 'client'"); +        *op_errstr = gf_strdup(msg); +        ret = -1; +        goto out; +    } +    target_ip = strtok_r(NULL, " ", &tmpptr); +    if (target_ip == NULL) { +        snprintf(msg, sizeof(msg), "ip address not specified"); +        *op_errstr = gf_strdup(msg); +        ret = -1; +        goto out; +    } -        pidfile = fopen (pidfile_path, "r"); -        if (!pidfile) { -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, "Unable to open pidfile: %s", -                        pidfile_path); -                ret = -1; -                goto out; -        } +    pid = strtok_r(NULL, " ", &tmpptr); +    if (pid == NULL) { +        snprintf(msg, sizeof(msg), "pid not specified"); +        *op_errstr = gf_strdup(msg); +        ret = -1; +        goto out; +    } + +    ret = glusterd_client_statedump_submit_req(volname, target_ip, pid); +out: +    GF_FREE(dup_options); +    return ret; +} + +int +glusterd_quotad_statedump(char *options, int option_cnt, char **op_errstr) +{ +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    char pidfile_path[PATH_MAX] = ""; +    char path[PATH_MAX] = ""; +    FILE *pidfile = NULL; +    pid_t pid = -1; +    char dumpoptions_path[PATH_MAX] = ""; +    char *option = NULL; +    char *tmpptr = NULL; +    char *dup_options = NULL; +    char msg[256] = ""; + +    this = THIS; +    GF_ASSERT(this); +    conf = this->private; +    GF_ASSERT(conf); + +    dup_options = gf_strdup(options); +    option = strtok_r(dup_options, " ", &tmpptr); +    if (strcmp(option, conf->quotad_svc.name)) { +        snprintf(msg, sizeof(msg), +                 "for quotad statedump, options " +                 "should be after the key 'quotad'"); +        *op_errstr = gf_strdup(msg); +        ret = -1; +        goto out; +    } -        ret = fscanf (pidfile, "%d", &pid); -        if (ret <= 0) { -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, "Unable to get pid of quotad " -                        "process"); -                ret = -1; -                goto out; -        } +    GLUSTERD_GET_QUOTAD_DIR(path, conf); +    GLUSTERD_GET_QUOTAD_PIDFILE(pidfile_path, path, conf); -        snprintf (dumpoptions_path, sizeof (dumpoptions_path), -                  DEFAULT_VAR_RUN_DIRECTORY"/glusterdump.%d.options", pid); -        ret = glusterd_set_dump_options (dumpoptions_path, options, option_cnt); -        if (ret < 0) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BRK_STATEDUMP_FAIL, "error while parsing " -                        "statedump options"); -                ret = -1; -                goto out; -        } +    pidfile = fopen(pidfile_path, "r"); +    if (!pidfile) { +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "Unable to open pidfile: %s", pidfile_path); +        ret = -1; +        goto out; +    } + +    ret = fscanf(pidfile, "%d", &pid); +    if (ret <= 0) { +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "Unable to get pid of quotad " +               "process"); +        ret = -1; +        goto out; +    } + +    snprintf(dumpoptions_path, sizeof(dumpoptions_path), +             DEFAULT_VAR_RUN_DIRECTORY "/glusterdump.%d.options", pid); +    ret = glusterd_set_dump_options(dumpoptions_path, options, option_cnt); +    if (ret < 0) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRK_STATEDUMP_FAIL, +               "error while parsing " +               "statedump options"); +        ret = -1; +        goto out; +    } -        gf_msg (this->name, GF_LOG_INFO, 0, -                GD_MSG_STATEDUMP_INFO, -                "Performing statedump on quotad with " -                "pid %d", pid); +    gf_msg(this->name, GF_LOG_INFO, 0, GD_MSG_STATEDUMP_INFO, +           "Performing statedump on quotad with " +           "pid %d", +           pid); -        kill (pid, SIGUSR1); +    kill(pid, SIGUSR1); -        sleep (1); +    sleep(1); -        ret = 0; +    ret = 0;  out: -        if (pidfile) -                fclose (pidfile); -        sys_unlink (dumpoptions_path); -        GF_FREE (dup_options); -        return ret; +    if (pidfile) +        fclose(pidfile); +    sys_unlink(dumpoptions_path); +    GF_FREE(dup_options); +    return ret;  }  /* Checks if the given peer contains bricks belonging to the given volume. @@ -8852,29 +8679,30 @@ out:   *   0 - if peer contains no bricks   */  int -glusterd_friend_contains_vol_bricks (glusterd_volinfo_t *volinfo, -                                     uuid_t friend_uuid) +glusterd_friend_contains_vol_bricks(glusterd_volinfo_t *volinfo, +                                    uuid_t friend_uuid)  { -        int                     ret = 0; -        glusterd_brickinfo_t    *brickinfo = NULL; -        int                     count = 0; +    int ret = 0; +    glusterd_brickinfo_t *brickinfo = NULL; +    int count = 0; -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                if (!gf_uuid_compare (brickinfo->uuid, friend_uuid)) { -                        count++; -                } +    cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        if (!gf_uuid_compare(brickinfo->uuid, friend_uuid)) { +            count++;          } +    } -        if (count) { -                if (count == volinfo->brick_count) -                        ret = 2; -                else -                        ret = 1; -        } -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    if (count) { +        if (count == volinfo->brick_count) +            ret = 2; +        else +            ret = 1; +    } +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  /* Checks if the given peer contains bricks belonging to the given volume. @@ -8884,33 +8712,34 @@ glusterd_friend_contains_vol_bricks (glusterd_volinfo_t *volinfo,   *   0 - if peer contains no bricks   */  int -glusterd_friend_contains_snap_bricks (glusterd_snap_t *snapinfo, +glusterd_friend_contains_snap_bricks(glusterd_snap_t *snapinfo,                                       uuid_t friend_uuid)  { -        int                                ret = -1; -        glusterd_volinfo_t            *volinfo = NULL; -        glusterd_brickinfo_t        *brickinfo = NULL; -        int                              count = 0; +    int ret = -1; +    glusterd_volinfo_t *volinfo = NULL; +    glusterd_brickinfo_t *brickinfo = NULL; +    int count = 0; -        GF_VALIDATE_OR_GOTO ("glusterd", snapinfo, out); +    GF_VALIDATE_OR_GOTO("glusterd", snapinfo, out); -        cds_list_for_each_entry (volinfo, &snapinfo->volumes, vol_list) { -                cds_list_for_each_entry (brickinfo, &volinfo->bricks, -                                                          brick_list) { -                        if (!gf_uuid_compare (brickinfo->uuid, friend_uuid)) { -                                count++; -                        } -                } +    cds_list_for_each_entry(volinfo, &snapinfo->volumes, vol_list) +    { +        cds_list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +        { +            if (!gf_uuid_compare(brickinfo->uuid, friend_uuid)) { +                count++; +            }          } +    } -        if (count > 0) -                ret = 1; -        else -                ret = 0; +    if (count > 0) +        ret = 1; +    else +        ret = 0;  out: -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  /* Cleanup the stale volumes left behind in the cluster. The volumes which are @@ -8918,581 +8747,557 @@ out:   * cluster.   */  int -glusterd_friend_remove_cleanup_vols (uuid_t uuid) -{ -        int                     ret           = -1; -        glusterd_conf_t         *priv         = NULL; -        glusterd_svc_t          *svc          = NULL; -        glusterd_volinfo_t      *volinfo      = NULL; -        glusterd_volinfo_t      *tmp_volinfo  = NULL; - -        priv = THIS->private; -        GF_ASSERT (priv); - -        cds_list_for_each_entry_safe (volinfo, tmp_volinfo, &priv->volumes, -                                      vol_list) { -                if (!glusterd_friend_contains_vol_bricks (volinfo, -                                                          MY_UUID)) { -                        /*Stop snapd daemon service if snapd daemon is running*/ -                        if (!volinfo->is_snap_volume) { -                                svc = &(volinfo->snapd.svc); -                                ret = svc->stop (svc, SIGTERM); -                                if (ret) { -                                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                                GD_MSG_SVC_STOP_FAIL, "Failed " -                                                "to stop snapd daemon service"); -                                } -                        } -                        if (volinfo->type == GF_CLUSTER_TYPE_TIER) { -                                svc = &(volinfo->tierd.svc); -                                ret = svc->stop (svc, SIGTERM); -                                if (ret) { -                                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                                GD_MSG_SVC_STOP_FAIL, "Failed " -                                                "to stop tierd daemon service"); -                                } -                        } -                } +glusterd_friend_remove_cleanup_vols(uuid_t uuid) +{ +    int ret = -1; +    glusterd_conf_t *priv = NULL; +    glusterd_svc_t *svc = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    glusterd_volinfo_t *tmp_volinfo = NULL; -                if (glusterd_friend_contains_vol_bricks (volinfo, uuid) == 2) { -                        gf_msg (THIS->name, GF_LOG_INFO, 0, -                                GD_MSG_STALE_VOL_DELETE_INFO, -                                "Deleting stale volume %s", volinfo->volname); -                        ret = glusterd_delete_volume (volinfo); -                        if (ret) { -                                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                        GD_MSG_STALE_VOL_REMOVE_FAIL, -                                        "Error deleting stale volume"); -                                goto out; -                        } -                } +    priv = THIS->private; +    GF_ASSERT(priv); +    cds_list_for_each_entry_safe(volinfo, tmp_volinfo, &priv->volumes, vol_list) +    { +        if (!glusterd_friend_contains_vol_bricks(volinfo, MY_UUID)) { +            /*Stop snapd daemon service if snapd daemon is running*/ +            if (!volinfo->is_snap_volume) { +                svc = &(volinfo->snapd.svc); +                ret = svc->stop(svc, SIGTERM); +                if (ret) { +                    gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_SVC_STOP_FAIL, +                           "Failed " +                           "to stop snapd daemon service"); +                } +            } +            if (volinfo->type == GF_CLUSTER_TYPE_TIER) { +                svc = &(volinfo->tierd.svc); +                ret = svc->stop(svc, SIGTERM); +                if (ret) { +                    gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_SVC_STOP_FAIL, +                           "Failed " +                           "to stop tierd daemon service"); +                } +            }          } -        /* Reconfigure all daemon services upon peer detach */ -        ret = glusterd_svcs_reconfigure (); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_SVC_STOP_FAIL, -                        "Failed to reconfigure all daemon services."); +        if (glusterd_friend_contains_vol_bricks(volinfo, uuid) == 2) { +            gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_STALE_VOL_DELETE_INFO, +                   "Deleting stale volume %s", volinfo->volname); +            ret = glusterd_delete_volume(volinfo); +            if (ret) { +                gf_msg(THIS->name, GF_LOG_ERROR, 0, +                       GD_MSG_STALE_VOL_REMOVE_FAIL, +                       "Error deleting stale volume"); +                goto out; +            }          } -        ret = 0; +    } + +    /* Reconfigure all daemon services upon peer detach */ +    ret = glusterd_svcs_reconfigure(); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_SVC_STOP_FAIL, +               "Failed to reconfigure all daemon services."); +    } +    ret = 0;  out: -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  int -glusterd_get_bitd_filepath (char *filepath, glusterd_volinfo_t *volinfo) +glusterd_get_bitd_filepath(char *filepath, glusterd_volinfo_t *volinfo)  { -        int   ret             = 0; -        char  path[PATH_MAX]  = ""; -        glusterd_conf_t *priv = NULL; -        int32_t len           = 0; +    int ret = 0; +    char path[PATH_MAX] = ""; +    glusterd_conf_t *priv = NULL; +    int32_t len = 0; -        priv = THIS->private; +    priv = THIS->private; -        GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv); +    GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv); -        len = snprintf (filepath, PATH_MAX, -                        "%s/%s-bitd.vol", path, volinfo->volname); -        if ((len < 0) || (len >= PATH_MAX)) { -                ret = -1; -        } +    len = snprintf(filepath, PATH_MAX, "%s/%s-bitd.vol", path, +                   volinfo->volname); +    if ((len < 0) || (len >= PATH_MAX)) { +        ret = -1; +    } -        return ret; +    return ret;  }  int -glusterd_get_client_filepath (char *filepath, glusterd_volinfo_t *volinfo, -                              gf_transport_type type) +glusterd_get_client_filepath(char *filepath, glusterd_volinfo_t *volinfo, +                             gf_transport_type type)  { -        int   ret             = 0; -        char  path[PATH_MAX]  = ""; -        glusterd_conf_t *priv = NULL; -        int32_t len           = 0; +    int ret = 0; +    char path[PATH_MAX] = ""; +    glusterd_conf_t *priv = NULL; +    int32_t len = 0; -        priv = THIS->private; +    priv = THIS->private; -        GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv); +    GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv); -        switch (type) { +    switch (type) {          case GF_TRANSPORT_TCP: -                len = snprintf (filepath, PATH_MAX, -                                "%s/%s.tcp-fuse.vol", path, volinfo->volname); -                break; +            len = snprintf(filepath, PATH_MAX, "%s/%s.tcp-fuse.vol", path, +                           volinfo->volname); +            break;          case GF_TRANSPORT_RDMA: -                len = snprintf (filepath, PATH_MAX, -                                "%s/%s.rdma-fuse.vol", path, volinfo->volname); -                break; +            len = snprintf(filepath, PATH_MAX, "%s/%s.rdma-fuse.vol", path, +                           volinfo->volname); +            break;          default: -                ret = -1; -                break; -        } -        if ((len < 0) || (len >= PATH_MAX)) { -                ret = -1; -        } +            ret = -1; +            break; +    } +    if ((len < 0) || (len >= PATH_MAX)) { +        ret = -1; +    } -        return ret; +    return ret;  }  int -glusterd_get_trusted_client_filepath (char *filepath, -                                      glusterd_volinfo_t *volinfo, -                                      gf_transport_type type) +glusterd_get_trusted_client_filepath(char *filepath, +                                     glusterd_volinfo_t *volinfo, +                                     gf_transport_type type)  { -        int   ret             = 0; -        char  path[PATH_MAX]  = ""; -        glusterd_conf_t *priv = NULL; -        int32_t len           = 0; +    int ret = 0; +    char path[PATH_MAX] = ""; +    glusterd_conf_t *priv = NULL; +    int32_t len = 0; -        priv = THIS->private; +    priv = THIS->private; -        GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv); +    GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv); -        switch (type) { +    switch (type) {          case GF_TRANSPORT_TCP: -                len = snprintf (filepath, PATH_MAX, -                                "%s/trusted-%s.tcp-fuse.vol", path, -                                volinfo->volname); -                break; +            len = snprintf(filepath, PATH_MAX, "%s/trusted-%s.tcp-fuse.vol", +                           path, volinfo->volname); +            break;          case GF_TRANSPORT_RDMA: -                len = snprintf (filepath, PATH_MAX, -                                "%s/trusted-%s.rdma-fuse.vol", path, -                                volinfo->volname); -                break; +            len = snprintf(filepath, PATH_MAX, "%s/trusted-%s.rdma-fuse.vol", +                           path, volinfo->volname); +            break;          default: -                ret = -1; -                break; -        } -        if ((len < 0) || (len >= PATH_MAX)) { -                ret = -1; -        } +            ret = -1; +            break; +    } +    if ((len < 0) || (len >= PATH_MAX)) { +        ret = -1; +    } -        return ret; +    return ret;  } -void glusterd_update_tier_status (glusterd_volinfo_t *volinfo) { +void +glusterd_update_tier_status(glusterd_volinfo_t *volinfo) +{ +    glusterd_rebalance_t *rebal = NULL; -        glusterd_rebalance_t    *rebal       = NULL; +    rebal = &volinfo->rebal; -        rebal = &volinfo->rebal; +    if (volinfo->type != GF_CLUSTER_TYPE_TIER) +        return; -        if (volinfo->type != GF_CLUSTER_TYPE_TIER) -                return; +    /* +     * If tier process status is stopped or failed, then +     * manually changing the status. +     */ -        /* -         * If tier process status is stopped or failed, then -         * manually changing the status. -         */ - -        switch (rebal->defrag_status) { +    switch (rebal->defrag_status) {          case GF_DEFRAG_STATUS_FAILED:          case GF_DEFRAG_STATUS_STOPPED: -                rebal->defrag_status = GF_DEFRAG_STATUS_STARTED; -                break; +            rebal->defrag_status = GF_DEFRAG_STATUS_STARTED; +            break;          default: -                break; -        } -        return; +            break; +    } +    return;  }  int -glusterd_get_dummy_client_filepath (char *filepath, -                                    glusterd_volinfo_t *volinfo, -                                    gf_transport_type type) +glusterd_get_dummy_client_filepath(char *filepath, glusterd_volinfo_t *volinfo, +                                   gf_transport_type type)  { -        int   ret             = 0; +    int ret = 0; -        switch (type) { +    switch (type) {          case GF_TRANSPORT_TCP:          case GF_TRANSPORT_BOTH_TCP_RDMA: -                snprintf (filepath, PATH_MAX, -                          "/tmp/%s.tcp-fuse.vol", volinfo->volname); -                break; +            snprintf(filepath, PATH_MAX, "/tmp/%s.tcp-fuse.vol", +                     volinfo->volname); +            break;          case GF_TRANSPORT_RDMA: -                snprintf (filepath, PATH_MAX, -                          "/tmp/%s.rdma-fuse.vol", volinfo->volname); -                break; +            snprintf(filepath, PATH_MAX, "/tmp/%s.rdma-fuse.vol", +                     volinfo->volname); +            break;          default: -                ret = -1; -                break; -        } +            ret = -1; +            break; +    } -        return ret; +    return ret;  }  int -glusterd_volume_defrag_restart (glusterd_volinfo_t *volinfo, char *op_errstr, -                              size_t len, int cmd, defrag_cbk_fn_t cbk) +glusterd_volume_defrag_restart(glusterd_volinfo_t *volinfo, char *op_errstr, +                               size_t len, int cmd, defrag_cbk_fn_t cbk)  { -        xlator_t        *this             = NULL; -        glusterd_conf_t *priv             = NULL; -        char            pidfile[PATH_MAX] = ""; -        int             ret               = -1; -        pid_t           pid               = 0; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    char pidfile[PATH_MAX] = ""; +    int ret = -1; +    pid_t pid = 0; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        priv = this->private; -        if (!priv) -                return ret; +    priv = this->private; +    if (!priv) +        return ret; -        /* Don't start the rebalance process if the stautus is already -         * completed, stopped or failed. If the status is started, check if -         * there is an existing process already and connect to it. If not, then -         * start the rebalance process -         */ +    /* Don't start the rebalance process if the stautus is already +     * completed, stopped or failed. If the status is started, check if +     * there is an existing process already and connect to it. If not, then +     * start the rebalance process +     */ -        /* -         * Changing the status of tier process to start the daemon -         * forcefully. -         */ -        glusterd_update_tier_status (volinfo); +    /* +     * Changing the status of tier process to start the daemon +     * forcefully. +     */ +    glusterd_update_tier_status(volinfo); -        switch (volinfo->rebal.defrag_status) { +    switch (volinfo->rebal.defrag_status) {          case GF_DEFRAG_STATUS_COMPLETE:          case GF_DEFRAG_STATUS_STOPPED:          case GF_DEFRAG_STATUS_FAILED: -                break; +            break;          case GF_DEFRAG_STATUS_STARTED: -                GLUSTERD_GET_DEFRAG_PID_FILE(pidfile, volinfo, priv); -                if (gf_is_service_running (pidfile, &pid)) { -                        ret = glusterd_rebalance_defrag_init (volinfo, cbk); -                        if (ret) { -                                gf_msg (this->name, GF_LOG_ERROR, 0, -                                        GD_MSG_REBALANCE_START_FAIL, -                                        "Failed to initialize  defrag." -                                        "Not starting rebalance process for " -                                        "%s.", volinfo->volname); -                                gf_event (EVENT_REBALANCE_START_FAILED, -                                          "volume=%s", volinfo->volname); -                                goto out; -                        } -                        ret = glusterd_rebalance_rpc_create (volinfo); -                        break; -                } -        case GF_DEFRAG_STATUS_NOT_STARTED: -                ret = glusterd_handle_defrag_start (volinfo, op_errstr, len, -                                cmd, cbk, volinfo->rebal.op); +            GLUSTERD_GET_DEFRAG_PID_FILE(pidfile, volinfo, priv); +            if (gf_is_service_running(pidfile, &pid)) { +                ret = glusterd_rebalance_defrag_init(volinfo, cbk);                  if (ret) { -                        volinfo->rebal.defrag_status = GF_DEFRAG_STATUS_FAILED; -                        gf_event (EVENT_REBALANCE_START_FAILED, -                                  "volume=%s", volinfo->volname); +                    gf_msg(this->name, GF_LOG_ERROR, 0, +                           GD_MSG_REBALANCE_START_FAIL, +                           "Failed to initialize  defrag." +                           "Not starting rebalance process for " +                           "%s.", +                           volinfo->volname); +                    gf_event(EVENT_REBALANCE_START_FAILED, "volume=%s", +                             volinfo->volname); +                    goto out;                  } +                ret = glusterd_rebalance_rpc_create(volinfo);                  break; +            } +        case GF_DEFRAG_STATUS_NOT_STARTED: +            ret = glusterd_handle_defrag_start(volinfo, op_errstr, len, cmd, +                                               cbk, volinfo->rebal.op); +            if (ret) { +                volinfo->rebal.defrag_status = GF_DEFRAG_STATUS_FAILED; +                gf_event(EVENT_REBALANCE_START_FAILED, "volume=%s", +                         volinfo->volname); +            } +            break;          default: -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_REBALANCE_START_FAIL, -                        "Unknown defrag status (%d)." -                        "Not starting rebalance process for %s.", -                        volinfo->rebal.defrag_status, volinfo->volname); -                break; -        } +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_REBALANCE_START_FAIL, +                   "Unknown defrag status (%d)." +                   "Not starting rebalance process for %s.", +                   volinfo->rebal.defrag_status, volinfo->volname); +            break; +    }  out: -        return ret; - +    return ret;  }  void -glusterd_defrag_info_set (glusterd_volinfo_t *volinfo, dict_t *dict, int cmd, -                          int status, int op) +glusterd_defrag_info_set(glusterd_volinfo_t *volinfo, dict_t *dict, int cmd, +                         int status, int op)  { +    xlator_t *this = NULL; +    int ret = -1; +    char *task_id_str = NULL; +    glusterd_rebalance_t *rebal = NULL; -        xlator_t                *this        = NULL; -        int                      ret         = -1; -        char                    *task_id_str = NULL; -        glusterd_rebalance_t    *rebal       = NULL; - -        this = THIS; -        rebal = &volinfo->rebal; - -        rebal->defrag_cmd = cmd; -        rebal->defrag_status = status; -        rebal->op = op; +    this = THIS; +    rebal = &volinfo->rebal; -        if (gf_uuid_is_null (rebal->rebalance_id)) -                return; +    rebal->defrag_cmd = cmd; +    rebal->defrag_status = status; +    rebal->op = op; -        if (is_origin_glusterd (dict)) { +    if (gf_uuid_is_null(rebal->rebalance_id)) +        return; -                ret = glusterd_generate_and_set_task_id(dict, -                                                        GF_REBALANCE_TID_KEY, -                                                        SLEN (GF_REBALANCE_TID_KEY)); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_TASKID_GEN_FAIL, -                                "Failed to generate task-id"); -                        goto out; -                } -        } -        ret = dict_get_strn (dict, GF_REBALANCE_TID_KEY, -                             SLEN (GF_REBALANCE_TID_KEY), -                             &task_id_str); +    if (is_origin_glusterd(dict)) { +        ret = glusterd_generate_and_set_task_id(dict, GF_REBALANCE_TID_KEY, +                                                SLEN(GF_REBALANCE_TID_KEY));          if (ret) { -                gf_msg (this->name, GF_LOG_WARNING, 0, -                        GD_MSG_REBALANCE_ID_MISSING, "Missing rebalance-id"); -                ret = 0; -                goto out; +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_TASKID_GEN_FAIL, +                   "Failed to generate task-id"); +            goto out;          } +    } +    ret = dict_get_strn(dict, GF_REBALANCE_TID_KEY, SLEN(GF_REBALANCE_TID_KEY), +                        &task_id_str); +    if (ret) { +        gf_msg(this->name, GF_LOG_WARNING, 0, GD_MSG_REBALANCE_ID_MISSING, +               "Missing rebalance-id"); +        ret = 0; +        goto out; +    } -        gf_uuid_parse (task_id_str, rebal->rebalance_id); +    gf_uuid_parse(task_id_str, rebal->rebalance_id);  out: -        if (ret) { -                gf_msg_debug (this->name, 0, -                                "Rebalance start validate failed"); -        } -        return; - +    if (ret) { +        gf_msg_debug(this->name, 0, "Rebalance start validate failed"); +    } +    return;  } -  int -glusterd_restart_rebalance_for_volume (glusterd_volinfo_t *volinfo) +glusterd_restart_rebalance_for_volume(glusterd_volinfo_t *volinfo)  { -        int             ret = -1; -        char          op_errstr[PATH_MAX] = ""; +    int ret = -1; +    char op_errstr[PATH_MAX] = ""; -        if (!gd_should_i_start_rebalance (volinfo)) { - -                /* Store the rebalance-id and rebalance command even if -                 * the peer isn't starting a rebalance process. On peers -                 * where a rebalance process is started, -                 * glusterd_handle_defrag_start performs the storing. -                 * -                 * Storing this is needed for having 'volume status' -                 * work correctly. -                 */ -                volinfo->rebal.defrag_status = GF_DEFRAG_STATUS_NOT_STARTED; -                if (volinfo->type == GF_CLUSTER_TYPE_TIER) -                        glusterd_store_perform_node_state_store (volinfo); - -                return 0; -        } -        if (!volinfo->rebal.defrag_cmd) { -                volinfo->rebal.defrag_status = GF_DEFRAG_STATUS_FAILED; -                return -1; -        } +    if (!gd_should_i_start_rebalance(volinfo)) { +        /* Store the rebalance-id and rebalance command even if +         * the peer isn't starting a rebalance process. On peers +         * where a rebalance process is started, +         * glusterd_handle_defrag_start performs the storing. +         * +         * Storing this is needed for having 'volume status' +         * work correctly. +         */ +        volinfo->rebal.defrag_status = GF_DEFRAG_STATUS_NOT_STARTED; +        if (volinfo->type == GF_CLUSTER_TYPE_TIER) +            glusterd_store_perform_node_state_store(volinfo); -        ret = glusterd_volume_defrag_restart (volinfo, op_errstr, PATH_MAX, -                                volinfo->rebal.defrag_cmd, -                                volinfo->rebal.op == GD_OP_REMOVE_BRICK ? -                                glusterd_remove_brick_migrate_cbk : NULL); -        if (!ret) { -                /* If remove brick is started then ensure that on a glusterd -                 * restart decommission_is_in_progress is set to avoid remove -                 * brick commit to happen when rebalance is not completed. -                 */ -                if (volinfo->rebal.op == GD_OP_REMOVE_BRICK && -                    volinfo->rebal.defrag_status == GF_DEFRAG_STATUS_STARTED) { -                        volinfo->decommission_in_progress = 1; -                } +        return 0; +    } +    if (!volinfo->rebal.defrag_cmd) { +        volinfo->rebal.defrag_status = GF_DEFRAG_STATUS_FAILED; +        return -1; +    } + +    ret = glusterd_volume_defrag_restart(volinfo, op_errstr, PATH_MAX, +                                         volinfo->rebal.defrag_cmd, +                                         volinfo->rebal.op == GD_OP_REMOVE_BRICK +                                             ? glusterd_remove_brick_migrate_cbk +                                             : NULL); +    if (!ret) { +        /* If remove brick is started then ensure that on a glusterd +         * restart decommission_is_in_progress is set to avoid remove +         * brick commit to happen when rebalance is not completed. +         */ +        if (volinfo->rebal.op == GD_OP_REMOVE_BRICK && +            volinfo->rebal.defrag_status == GF_DEFRAG_STATUS_STARTED) { +            volinfo->decommission_in_progress = 1;          } -        return ret; +    } +    return ret;  }  int -glusterd_restart_rebalance (glusterd_conf_t *conf) +glusterd_restart_rebalance(glusterd_conf_t *conf)  { -        glusterd_volinfo_t       *volinfo = NULL; -        int                      ret = 0; +    glusterd_volinfo_t *volinfo = NULL; +    int ret = 0; -        cds_list_for_each_entry (volinfo, &conf->volumes, vol_list) { -                glusterd_restart_rebalance_for_volume (volinfo); -        } -        return ret; +    cds_list_for_each_entry(volinfo, &conf->volumes, vol_list) +    { +        glusterd_restart_rebalance_for_volume(volinfo); +    } +    return ret;  }  void -glusterd_volinfo_reset_defrag_stats (glusterd_volinfo_t *volinfo) +glusterd_volinfo_reset_defrag_stats(glusterd_volinfo_t *volinfo)  { -        glusterd_rebalance_t *rebal = NULL; -        GF_ASSERT (volinfo); - -        rebal = &volinfo->rebal; -        rebal->rebalance_files = 0; -        rebal->rebalance_data = 0; -        rebal->lookedup_files = 0; -        rebal->rebalance_failures = 0; -        rebal->rebalance_time = 0; -        rebal->skipped_files = 0; +    glusterd_rebalance_t *rebal = NULL; +    GF_ASSERT(volinfo); +    rebal = &volinfo->rebal; +    rebal->rebalance_files = 0; +    rebal->rebalance_data = 0; +    rebal->lookedup_files = 0; +    rebal->rebalance_failures = 0; +    rebal->rebalance_time = 0; +    rebal->skipped_files = 0;  }  gf_boolean_t -glusterd_is_local_brick (xlator_t *this, glusterd_volinfo_t *volinfo, -                         glusterd_brickinfo_t *brickinfo) -{ -        gf_boolean_t    local = _gf_false; -        int             ret = 0; - -        if (gf_uuid_is_null (brickinfo->uuid)) { -                ret = glusterd_resolve_brick (brickinfo); -                if (ret) -                        goto out; -        } -        local = !gf_uuid_compare (brickinfo->uuid, MY_UUID); -out: -        return local; -} -int -glusterd_validate_volume_id (dict_t *op_dict, glusterd_volinfo_t *volinfo) -{ -        int     ret             = -1; -        char    *volid_str      = NULL; -        uuid_t  vol_uid         = {0, }; -        xlator_t *this          = NULL; - -        this = THIS; -        GF_ASSERT (this); - -        ret = dict_get_strn (op_dict, "vol-id", SLEN ("vol-id"), &volid_str); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get volume id for " -                        "volume %s", volinfo->volname); -                goto out; -        } -        ret = gf_uuid_parse (volid_str, vol_uid); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_UUID_PARSE_FAIL, -                        "Failed to parse volume id " -                        "for volume %s", volinfo->volname); -                goto out; -        } - -        if (gf_uuid_compare (vol_uid, volinfo->volume_id)) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_VOL_ID_MISMATCH, "Volume ids of volume %s - %s" -                        " and %s - are different. Possibly a split brain among " -                        "peers.", volinfo->volname, volid_str, -                        uuid_utoa (volinfo->volume_id)); -                ret = -1; -                goto out; -        } - -out: -        return ret; -} - -int -glusterd_defrag_volume_status_update (glusterd_volinfo_t *volinfo, -                                      dict_t *rsp_dict, int32_t cmd) +glusterd_is_local_brick(xlator_t *this, glusterd_volinfo_t *volinfo, +                        glusterd_brickinfo_t *brickinfo)  { -        int                             ret = 0; -        int                             ret2 = 0; -        uint64_t                        files = 0; -        uint64_t                        size = 0; -        uint64_t                        lookup = 0; -        gf_defrag_status_t              status = GF_DEFRAG_STATUS_NOT_STARTED; -        uint64_t                        failures = 0; -        uint64_t                        skipped = 0; -        xlator_t                       *this = NULL; -        double                          run_time = 0; -        uint64_t                        promoted = 0; -        uint64_t                        demoted = 0; -        uint64_t                        time_left = 0; - -        this = THIS; - -        ret = dict_get_uint64 (rsp_dict, "files", &files); -        if (ret) -                gf_msg_trace (this->name, 0, -                        "failed to get file count"); - -        ret = dict_get_uint64 (rsp_dict, "size", &size); -        if (ret) -                gf_msg_trace (this->name, 0, -                        "failed to get size of xfer"); - -        ret = dict_get_uint64 (rsp_dict, "lookups", &lookup); -        if (ret) -                gf_msg_trace (this->name, 0, -                        "failed to get lookedup file count"); - -        ret = dict_get_int32n (rsp_dict, "status", SLEN ("status"), -                               (int32_t *)&status); -        if (ret) -                gf_msg_trace (this->name, 0, -                        "failed to get status"); - -        ret = dict_get_uint64 (rsp_dict, "failures", &failures); -        if (ret) -                gf_msg_trace (this->name, 0, -                        "failed to get failure count"); - -        ret = dict_get_uint64 (rsp_dict, "skipped", &skipped); -        if (ret) -                gf_msg_trace (this->name, 0, -                        "failed to get skipped count"); - -        ret = dict_get_uint64 (rsp_dict, "promoted", &promoted); -        if (ret) -                gf_msg_trace (this->name, 0, -                        "failed to get promoted count"); - -        ret = dict_get_uint64 (rsp_dict, "demoted", &demoted); -        if (ret) -                gf_msg_trace (this->name, 0, -                        "failed to get demoted count"); +    gf_boolean_t local = _gf_false; +    int ret = 0; -        ret = dict_get_double (rsp_dict, "run-time", &run_time); +    if (gf_uuid_is_null(brickinfo->uuid)) { +        ret = glusterd_resolve_brick(brickinfo);          if (ret) -                gf_msg_trace (this->name, 0, -                        "failed to get run-time"); - -        ret2 = dict_get_uint64 (rsp_dict, "time-left", &time_left); -        if (ret2) -                gf_msg_trace (this->name, 0, -                        "failed to get time left"); - -        if (cmd == GF_DEFRAG_CMD_STATUS_TIER) { -                if (files) -                        volinfo->tier.rebalance_files = files; -                if (size) -                        volinfo->tier.rebalance_data = size; -                if (lookup) -                        volinfo->tier.lookedup_files = lookup; -                if (status) -                        volinfo->tier.defrag_status = status; -                if (failures) -                        volinfo->tier.rebalance_failures = failures; -                if (skipped) -                        volinfo->tier.skipped_files = skipped; -                if (run_time) -                        volinfo->tier.rebalance_time = run_time; -        } else { -                if (files) -                        volinfo->rebal.rebalance_files = files; -                if (size) -                        volinfo->rebal.rebalance_data = size; -                if (lookup) -                        volinfo->rebal.lookedup_files = lookup; -                if (status) -                        volinfo->rebal.defrag_status = status; -                if (failures) -                        volinfo->rebal.rebalance_failures = failures; -                if (skipped) -                        volinfo->rebal.skipped_files = skipped; -                if (run_time) -                        volinfo->rebal.rebalance_time = run_time; -                if (!ret2) -                        volinfo->rebal.time_left = time_left; -        } - -        if (promoted) -                volinfo->tier_info.promoted = promoted; -        if (demoted) -                volinfo->tier_info.demoted = demoted; - - -        return ret; +            goto out; +    } +    local = !gf_uuid_compare(brickinfo->uuid, MY_UUID); +out: +    return local; +} +int +glusterd_validate_volume_id(dict_t *op_dict, glusterd_volinfo_t *volinfo) +{ +    int ret = -1; +    char *volid_str = NULL; +    uuid_t vol_uid = { +        0, +    }; +    xlator_t *this = NULL; + +    this = THIS; +    GF_ASSERT(this); + +    ret = dict_get_strn(op_dict, "vol-id", SLEN("vol-id"), &volid_str); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get volume id for " +               "volume %s", +               volinfo->volname); +        goto out; +    } +    ret = gf_uuid_parse(volid_str, vol_uid); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_UUID_PARSE_FAIL, +               "Failed to parse volume id " +               "for volume %s", +               volinfo->volname); +        goto out; +    } + +    if (gf_uuid_compare(vol_uid, volinfo->volume_id)) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_VOL_ID_MISMATCH, +               "Volume ids of volume %s - %s" +               " and %s - are different. Possibly a split brain among " +               "peers.", +               volinfo->volname, volid_str, uuid_utoa(volinfo->volume_id)); +        ret = -1; +        goto out; +    } + +out: +    return ret; +} + +int +glusterd_defrag_volume_status_update(glusterd_volinfo_t *volinfo, +                                     dict_t *rsp_dict, int32_t cmd) +{ +    int ret = 0; +    int ret2 = 0; +    uint64_t files = 0; +    uint64_t size = 0; +    uint64_t lookup = 0; +    gf_defrag_status_t status = GF_DEFRAG_STATUS_NOT_STARTED; +    uint64_t failures = 0; +    uint64_t skipped = 0; +    xlator_t *this = NULL; +    double run_time = 0; +    uint64_t promoted = 0; +    uint64_t demoted = 0; +    uint64_t time_left = 0; + +    this = THIS; + +    ret = dict_get_uint64(rsp_dict, "files", &files); +    if (ret) +        gf_msg_trace(this->name, 0, "failed to get file count"); + +    ret = dict_get_uint64(rsp_dict, "size", &size); +    if (ret) +        gf_msg_trace(this->name, 0, "failed to get size of xfer"); + +    ret = dict_get_uint64(rsp_dict, "lookups", &lookup); +    if (ret) +        gf_msg_trace(this->name, 0, "failed to get lookedup file count"); + +    ret = dict_get_int32n(rsp_dict, "status", SLEN("status"), +                          (int32_t *)&status); +    if (ret) +        gf_msg_trace(this->name, 0, "failed to get status"); + +    ret = dict_get_uint64(rsp_dict, "failures", &failures); +    if (ret) +        gf_msg_trace(this->name, 0, "failed to get failure count"); + +    ret = dict_get_uint64(rsp_dict, "skipped", &skipped); +    if (ret) +        gf_msg_trace(this->name, 0, "failed to get skipped count"); + +    ret = dict_get_uint64(rsp_dict, "promoted", &promoted); +    if (ret) +        gf_msg_trace(this->name, 0, "failed to get promoted count"); + +    ret = dict_get_uint64(rsp_dict, "demoted", &demoted); +    if (ret) +        gf_msg_trace(this->name, 0, "failed to get demoted count"); + +    ret = dict_get_double(rsp_dict, "run-time", &run_time); +    if (ret) +        gf_msg_trace(this->name, 0, "failed to get run-time"); + +    ret2 = dict_get_uint64(rsp_dict, "time-left", &time_left); +    if (ret2) +        gf_msg_trace(this->name, 0, "failed to get time left"); + +    if (cmd == GF_DEFRAG_CMD_STATUS_TIER) { +        if (files) +            volinfo->tier.rebalance_files = files; +        if (size) +            volinfo->tier.rebalance_data = size; +        if (lookup) +            volinfo->tier.lookedup_files = lookup; +        if (status) +            volinfo->tier.defrag_status = status; +        if (failures) +            volinfo->tier.rebalance_failures = failures; +        if (skipped) +            volinfo->tier.skipped_files = skipped; +        if (run_time) +            volinfo->tier.rebalance_time = run_time; +    } else { +        if (files) +            volinfo->rebal.rebalance_files = files; +        if (size) +            volinfo->rebal.rebalance_data = size; +        if (lookup) +            volinfo->rebal.lookedup_files = lookup; +        if (status) +            volinfo->rebal.defrag_status = status; +        if (failures) +            volinfo->rebal.rebalance_failures = failures; +        if (skipped) +            volinfo->rebal.skipped_files = skipped; +        if (run_time) +            volinfo->rebal.rebalance_time = run_time; +        if (!ret2) +            volinfo->rebal.time_left = time_left; +    } + +    if (promoted) +        volinfo->tier_info.promoted = promoted; +    if (demoted) +        volinfo->tier_info.demoted = demoted; + +    return ret;  }  /*     The function is required to take dict ref for every xlator at graph. @@ -9504,3187 +9309,3015 @@ glusterd_defrag_volume_status_update (glusterd_volinfo_t *volinfo,  */  void -glusterd_graph_take_reference (xlator_t *tree) -{        xlator_t *trav = tree; -         xlator_t *prev = tree; - -        if (!tree) { -                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_TREE_NOT_FOUND, -                        "Translator tree not found"); -                return; -        } - -        while (prev) { -                trav = prev->next; -                if (prev->options) -                        dict_ref (prev->options); -                prev = trav; -        } -        return; -} - - - -int -glusterd_check_topology_identical (const char   *filename1, -                                   const char   *filename2, -                                   gf_boolean_t *identical) -{ -        int                     ret    = -1; /* FAILURE */ -        xlator_t                *this  = THIS; -        FILE                    *fp1   = NULL; -        FILE                    *fp2   = NULL; -        glusterfs_graph_t       *grph1 = NULL; -        glusterfs_graph_t       *grph2 = NULL; - -        /* Invalid xlator, Nothing to do */ -        if (!this) -                return (-1); - -        /* Sanitize the inputs */ -        GF_VALIDATE_OR_GOTO (this->name, filename1, out); -        GF_VALIDATE_OR_GOTO (this->name, filename2, out); -        GF_VALIDATE_OR_GOTO (this->name, identical, out); - -        /* fopen() the volfile1 to create the graph */ -        fp1 = fopen (filename1, "r"); -        if (fp1 == NULL) { -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, -                        "fopen() on file: %s failed " -                        "(%s)", filename1, strerror (errno)); -                goto out; -        } - -        /* fopen() the volfile2 to create the graph */ -        fp2 = fopen (filename2, "r"); -        if (fp2 == NULL) { -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, -                        "fopen() on file: %s failed " -                        "(%s)", filename2, strerror (errno)); -                goto out; -        } - -        /* create the graph for filename1 */ -        grph1 = glusterfs_graph_construct(fp1); -        if (grph1 == NULL) -                goto out; - -        glusterd_graph_take_reference (grph1->first); - -        /* create the graph for filename2 */ -        grph2 = glusterfs_graph_construct(fp2); -        if (grph2 == NULL) -                goto out; - -        glusterd_graph_take_reference (grph2->first); - -        /* compare the graph topology */ -        *identical = is_graph_topology_equal(grph1, grph2); -        ret = 0; /* SUCCESS */ -out: -        if (fp1) -                fclose(fp1); -        if (fp2) -                fclose(fp2); -        if (grph1) -                glusterfs_graph_destroy(grph1); -        if (grph2) -                glusterfs_graph_destroy(grph2); - -        gf_msg_debug (this->name, 0, "Returning with %d", ret); -        return ret; -} - -int -glusterd_check_files_identical (char *filename1, char *filename2, -                                gf_boolean_t *identical) +glusterd_graph_take_reference(xlator_t *tree)  { -        int                     ret = -1; -        struct stat             buf1 = {0,}; -        struct stat             buf2 = {0,}; -        uint32_t                cksum1 = 0; -        uint32_t                cksum2 = 0; -        xlator_t                *this = NULL; - -        GF_ASSERT (filename1); -        GF_ASSERT (filename2); -        GF_ASSERT (identical); - -        this = THIS; - -        ret = sys_stat (filename1, &buf1); - -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, -                        "stat on file: %s failed " -                        "(%s)", filename1, strerror (errno)); -                goto out; -        } - -        ret = sys_stat (filename2, &buf2); - -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_FILE_OP_FAILED, -                        "stat on file: %s failed " -                        "(%s)", filename2, strerror (errno)); -                goto out; -        } - -        if (buf1.st_size != buf2.st_size) { -                *identical = _gf_false; -                goto out; -        } +    xlator_t *trav = tree; +    xlator_t *prev = tree; -        ret = get_checksum_for_path (filename1, &cksum1); -        if (ret) -                goto out; - - -        ret = get_checksum_for_path (filename2, &cksum2); -        if (ret) -                goto out; - -        if (cksum1 != cksum2) -                *identical = _gf_false; -        else -                *identical = _gf_true; +    if (!tree) { +        gf_msg("parser", GF_LOG_ERROR, 0, LG_MSG_TREE_NOT_FOUND, +               "Translator tree not found"); +        return; +    } + +    while (prev) { +        trav = prev->next; +        if (prev->options) +            dict_ref(prev->options); +        prev = trav; +    } +    return; +} + +int +glusterd_check_topology_identical(const char *filename1, const char *filename2, +                                  gf_boolean_t *identical) +{ +    int ret = -1; /* FAILURE */ +    xlator_t *this = THIS; +    FILE *fp1 = NULL; +    FILE *fp2 = NULL; +    glusterfs_graph_t *grph1 = NULL; +    glusterfs_graph_t *grph2 = NULL; + +    /* Invalid xlator, Nothing to do */ +    if (!this) +        return (-1); + +    /* Sanitize the inputs */ +    GF_VALIDATE_OR_GOTO(this->name, filename1, out); +    GF_VALIDATE_OR_GOTO(this->name, filename2, out); +    GF_VALIDATE_OR_GOTO(this->name, identical, out); + +    /* fopen() the volfile1 to create the graph */ +    fp1 = fopen(filename1, "r"); +    if (fp1 == NULL) { +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "fopen() on file: %s failed " +               "(%s)", +               filename1, strerror(errno)); +        goto out; +    } + +    /* fopen() the volfile2 to create the graph */ +    fp2 = fopen(filename2, "r"); +    if (fp2 == NULL) { +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "fopen() on file: %s failed " +               "(%s)", +               filename2, strerror(errno)); +        goto out; +    } + +    /* create the graph for filename1 */ +    grph1 = glusterfs_graph_construct(fp1); +    if (grph1 == NULL) +        goto out; + +    glusterd_graph_take_reference(grph1->first); + +    /* create the graph for filename2 */ +    grph2 = glusterfs_graph_construct(fp2); +    if (grph2 == NULL) +        goto out; + +    glusterd_graph_take_reference(grph2->first); + +    /* compare the graph topology */ +    *identical = is_graph_topology_equal(grph1, grph2); +    ret = 0; /* SUCCESS */ +out: +    if (fp1) +        fclose(fp1); +    if (fp2) +        fclose(fp2); +    if (grph1) +        glusterfs_graph_destroy(grph1); +    if (grph2) +        glusterfs_graph_destroy(grph2); + +    gf_msg_debug(this->name, 0, "Returning with %d", ret); +    return ret; +} + +int +glusterd_check_files_identical(char *filename1, char *filename2, +                               gf_boolean_t *identical) +{ +    int ret = -1; +    struct stat buf1 = { +        0, +    }; +    struct stat buf2 = { +        0, +    }; +    uint32_t cksum1 = 0; +    uint32_t cksum2 = 0; +    xlator_t *this = NULL; + +    GF_ASSERT(filename1); +    GF_ASSERT(filename2); +    GF_ASSERT(identical); + +    this = THIS; + +    ret = sys_stat(filename1, &buf1); + +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "stat on file: %s failed " +               "(%s)", +               filename1, strerror(errno)); +        goto out; +    } + +    ret = sys_stat(filename2, &buf2); + +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_FILE_OP_FAILED, +               "stat on file: %s failed " +               "(%s)", +               filename2, strerror(errno)); +        goto out; +    } + +    if (buf1.st_size != buf2.st_size) { +        *identical = _gf_false; +        goto out; +    } + +    ret = get_checksum_for_path(filename1, &cksum1); +    if (ret) +        goto out; + +    ret = get_checksum_for_path(filename2, &cksum2); +    if (ret) +        goto out; + +    if (cksum1 != cksum2) +        *identical = _gf_false; +    else +        *identical = _gf_true;  out: -        gf_msg_debug (this->name, 0, "Returning with %d", ret); -        return ret; +    gf_msg_debug(this->name, 0, "Returning with %d", ret); +    return ret;  }  int -glusterd_volset_help (dict_t *dict, char **op_errstr) +glusterd_volset_help(dict_t *dict, char **op_errstr)  { -        int                     ret = -1; -        gf_boolean_t            xml_out = _gf_false; +    int ret = -1; +    gf_boolean_t xml_out = _gf_false;  #if (!HAVE_LIB_XML) -        xlator_t               *this = NULL; +    xlator_t *this = NULL; -        this = THIS; +    this = THIS;  #endif -        if (!dict) { -                if (!(dict = glusterd_op_get_ctx ())) { -                        ret = 0; -                        goto out; -                } +    if (!dict) { +        if (!(dict = glusterd_op_get_ctx())) { +            ret = 0; +            goto out;          } +    } -        if (dict_getn (dict, "help", SLEN ("help") )) { -                xml_out = _gf_false; +    if (dict_getn(dict, "help", SLEN("help"))) { +        xml_out = _gf_false; -        } else if (dict_getn (dict, "help-xml", SLEN("help-xml") )) { -                xml_out = _gf_true; +    } else if (dict_getn(dict, "help-xml", SLEN("help-xml"))) { +        xml_out = _gf_true;  #if (HAVE_LIB_XML) -                ret = 0; +        ret = 0;  #else -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_MODULE_NOT_INSTALLED, -                        "libxml not present in the system"); -                if (op_errstr) -                        *op_errstr = gf_strdup ("Error: xml libraries not " -                                                "present to produce " -                                                "xml-output"); -                goto out; +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_MODULE_NOT_INSTALLED, +               "libxml not present in the system"); +        if (op_errstr) +            *op_errstr = gf_strdup( +                "Error: xml libraries not " +                "present to produce " +                "xml-output"); +        goto out;  #endif -        } else { -                goto out; -        } +    } else { +        goto out; +    } -        ret = glusterd_get_volopt_content (dict, xml_out); -        if (ret && op_errstr) -                *op_errstr = gf_strdup ("Failed to get volume options help"); - out: +    ret = glusterd_get_volopt_content(dict, xml_out); +    if (ret && op_errstr) +        *op_errstr = gf_strdup("Failed to get volume options help"); +out: -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  int -glusterd_to_cli (rpcsvc_request_t *req, gf_cli_rsp *arg, struct iovec *payload, -                 int payloadcount, struct iobref *iobref, xdrproc_t xdrproc, -                 dict_t *dict) +glusterd_to_cli(rpcsvc_request_t *req, gf_cli_rsp *arg, struct iovec *payload, +                int payloadcount, struct iobref *iobref, xdrproc_t xdrproc, +                dict_t *dict)  { -        int                ret = -1; -        char               *cmd = NULL; -        int                op_ret = 0; -        char               *op_errstr = NULL; -        xlator_t           *this = NULL; +    int ret = -1; +    char *cmd = NULL; +    int op_ret = 0; +    char *op_errstr = NULL; +    xlator_t *this = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        op_ret = arg->op_ret; -        op_errstr = arg->op_errstr; +    op_ret = arg->op_ret; +    op_errstr = arg->op_errstr; -        ret = dict_get_strn (dict, "cmd-str", SLEN ("cmd-str"), &cmd); -        if (ret) -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get command " -                        "string"); +    ret = dict_get_strn(dict, "cmd-str", SLEN("cmd-str"), &cmd); +    if (ret) +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get command " +               "string"); -        if (cmd) { -                if (op_ret) -                        gf_cmd_log ("", "%s : FAILED %s %s", cmd, -                                       (op_errstr)? ":" : " ", -                                       (op_errstr)? op_errstr : " "); -                else -                        gf_cmd_log ("", "%s : SUCCESS", cmd); -        } +    if (cmd) { +        if (op_ret) +            gf_cmd_log("", "%s : FAILED %s %s", cmd, (op_errstr) ? ":" : " ", +                       (op_errstr) ? op_errstr : " "); +        else +            gf_cmd_log("", "%s : SUCCESS", cmd); +    } -        glusterd_submit_reply (req, arg, payload, payloadcount, iobref, -                               (xdrproc_t) xdrproc); +    glusterd_submit_reply(req, arg, payload, payloadcount, iobref, +                          (xdrproc_t)xdrproc); -        if (dict) { -                dict_unref (dict); -        } -        return ret; +    if (dict) { +        dict_unref(dict); +    } +    return ret;  }  static int32_t -glusterd_append_gsync_status (dict_t *dst, dict_t *src) +glusterd_append_gsync_status(dict_t *dst, dict_t *src)  { -        int                ret = 0; -        char               *stop_msg = NULL; - -        ret = dict_get_strn (src, "gsync-status", SLEN ("gsync-status"), -                             &stop_msg); -        if (ret) { -                ret = 0; -                goto out; -        } - -        ret = dict_set_dynstr_with_alloc (dst, "gsync-status", stop_msg); -        if (ret) { -                gf_msg ("glusterd", GF_LOG_WARNING, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Unable to set the stop" -                        "message in the ctx dictionary"); -                goto out; -        } +    int ret = 0; +    char *stop_msg = NULL; +    ret = dict_get_strn(src, "gsync-status", SLEN("gsync-status"), &stop_msg); +    if (ret) {          ret = 0; - out: -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +        goto out; +    } + +    ret = dict_set_dynstr_with_alloc(dst, "gsync-status", stop_msg); +    if (ret) { +        gf_msg("glusterd", GF_LOG_WARNING, 0, GD_MSG_DICT_SET_FAILED, +               "Unable to set the stop" +               "message in the ctx dictionary"); +        goto out; +    } +    ret = 0; +out: +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_append_status_dicts (dict_t *dst, dict_t *src) +glusterd_append_status_dicts(dict_t *dst, dict_t *src)  { -        char                sts_val_name[PATH_MAX] = ""; -        int                 dst_count              = 0; -        int                 src_count              = 0; -        int                 i                      = 0; -        int                 ret                    = 0; -        gf_gsync_status_t  *sts_val                = NULL; -        gf_gsync_status_t  *dst_sts_val            = NULL; +    char sts_val_name[PATH_MAX] = ""; +    int dst_count = 0; +    int src_count = 0; +    int i = 0; +    int ret = 0; +    gf_gsync_status_t *sts_val = NULL; +    gf_gsync_status_t *dst_sts_val = NULL; -        GF_ASSERT (dst); +    GF_ASSERT(dst); -        if (src == NULL) -                goto out; +    if (src == NULL) +        goto out; -        ret = dict_get_int32n (dst, "gsync-count", SLEN ("gsync-count"), -                               &dst_count); -        if (ret) -                dst_count = 0; +    ret = dict_get_int32n(dst, "gsync-count", SLEN("gsync-count"), &dst_count); +    if (ret) +        dst_count = 0; -        ret = dict_get_int32n (src, "gsync-count", SLEN ("gsync-count"), -                               &src_count); -        if (ret || !src_count) { -                gf_msg_debug ("glusterd", 0, "Source brick empty"); -                ret = 0; -                goto out; -        } +    ret = dict_get_int32n(src, "gsync-count", SLEN("gsync-count"), &src_count); +    if (ret || !src_count) { +        gf_msg_debug("glusterd", 0, "Source brick empty"); +        ret = 0; +        goto out; +    } -        for (i = 0; i < src_count; i++) { -                snprintf (sts_val_name, sizeof(sts_val_name), "status_value%d", i); +    for (i = 0; i < src_count; i++) { +        snprintf(sts_val_name, sizeof(sts_val_name), "status_value%d", i); -                ret = dict_get_bin (src, sts_val_name, (void **) &sts_val); -                if (ret) -                        goto out; +        ret = dict_get_bin(src, sts_val_name, (void **)&sts_val); +        if (ret) +            goto out; -                dst_sts_val = GF_MALLOC (sizeof(gf_gsync_status_t), -                                         gf_common_mt_gsync_status_t); -                if (!dst_sts_val) { -                        gf_msg ("glusterd", GF_LOG_ERROR, ENOMEM, -                                GD_MSG_NO_MEMORY, "Out Of Memory"); -                        goto out; -                } +        dst_sts_val = GF_MALLOC(sizeof(gf_gsync_status_t), +                                gf_common_mt_gsync_status_t); +        if (!dst_sts_val) { +            gf_msg("glusterd", GF_LOG_ERROR, ENOMEM, GD_MSG_NO_MEMORY, +                   "Out Of Memory"); +            goto out; +        } -                memcpy (dst_sts_val, sts_val, sizeof(gf_gsync_status_t)); +        memcpy(dst_sts_val, sts_val, sizeof(gf_gsync_status_t)); -                snprintf (sts_val_name, sizeof(sts_val_name), "status_value%d", i + dst_count); +        snprintf(sts_val_name, sizeof(sts_val_name), "status_value%d", +                 i + dst_count); -                ret = dict_set_bin (dst, sts_val_name, dst_sts_val, sizeof(gf_gsync_status_t)); -                if (ret) { -                        GF_FREE (dst_sts_val); -                        goto out; -                } +        ret = dict_set_bin(dst, sts_val_name, dst_sts_val, +                           sizeof(gf_gsync_status_t)); +        if (ret) { +            GF_FREE(dst_sts_val); +            goto out;          } +    } -        ret = dict_set_int32n (dst, "gsync-count", SLEN ("gsync-count"), -                               dst_count+src_count); - - out: -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +    ret = dict_set_int32n(dst, "gsync-count", SLEN("gsync-count"), +                          dst_count + src_count); +out: +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_aggr_brick_mount_dirs (dict_t *aggr, dict_t *rsp_dict) -{ -        char                   key[64]   = ""; -        int                    keylen; -        char                  *brick_mount_dir = NULL; -        int32_t                brick_count     = -1; -        int32_t                ret             = -1; -        int32_t                i               = -1; -        xlator_t              *this            = NULL; - -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (aggr); -        GF_ASSERT (rsp_dict); - -        ret = dict_get_int32n (rsp_dict, "brick_count", SLEN ("brick_count"), -                               &brick_count); +glusterd_aggr_brick_mount_dirs(dict_t *aggr, dict_t *rsp_dict) +{ +    char key[64] = ""; +    int keylen; +    char *brick_mount_dir = NULL; +    int32_t brick_count = -1; +    int32_t ret = -1; +    int32_t i = -1; +    xlator_t *this = NULL; + +    this = THIS; +    GF_ASSERT(this); +    GF_ASSERT(aggr); +    GF_ASSERT(rsp_dict); + +    ret = dict_get_int32n(rsp_dict, "brick_count", SLEN("brick_count"), +                          &brick_count); +    if (ret) { +        gf_msg_debug(this->name, 0, "No brick_count present"); +        ret = 0; +        goto out; +    } + +    for (i = 1; i <= brick_count; i++) { +        brick_mount_dir = NULL; +        keylen = snprintf(key, sizeof(key), "brick%d.mount_dir", i); +        ret = dict_get_strn(rsp_dict, key, keylen, &brick_mount_dir);          if (ret) { -                gf_msg_debug (this->name, 0, "No brick_count present"); -                ret = 0; -                goto out; +            /* Coz the info will come from a different node */ +            gf_msg_debug(this->name, 0, "%s not present", key); +            continue;          } -        for (i = 1; i <= brick_count; i++) { -                brick_mount_dir = NULL; -                keylen = snprintf (key, sizeof(key), "brick%d.mount_dir", i); -                ret = dict_get_strn (rsp_dict, key, keylen, &brick_mount_dir); -                if (ret) { -                        /* Coz the info will come from a different node */ -                        gf_msg_debug (this->name, 0, -                                "%s not present", key); -                        continue; -                } - -                ret = dict_set_dynstr_with_alloc (aggr, key, -                                                  brick_mount_dir); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Failed to set %s", key); -                        goto out; -                } +        ret = dict_set_dynstr_with_alloc(aggr, key, brick_mount_dir); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Failed to set %s", key); +            goto out;          } +    } -        ret = 0; +    ret = 0;  out: -        gf_msg_trace (this->name, 0, "Returning %d ", ret); -        return ret; +    gf_msg_trace(this->name, 0, "Returning %d ", ret); +    return ret;  }  int32_t -glusterd_gsync_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict, char *op_errstr) +glusterd_gsync_use_rsp_dict(dict_t *aggr, dict_t *rsp_dict, char *op_errstr)  { -        dict_t             *ctx = NULL; -        int                ret = 0; -        char               *conf_path = NULL; +    dict_t *ctx = NULL; +    int ret = 0; +    char *conf_path = NULL; -        if (aggr) { -                ctx = aggr; +    if (aggr) { +        ctx = aggr; -        } else { -                ctx = glusterd_op_get_ctx (); -                if (!ctx) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_OPCTX_GET_FAIL, -                                "Operation Context is not present"); -                        GF_ASSERT (0); -                } +    } else { +        ctx = glusterd_op_get_ctx(); +        if (!ctx) { +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_OPCTX_GET_FAIL, +                   "Operation Context is not present"); +            GF_ASSERT(0);          } +    } -        if (rsp_dict) { -                ret = glusterd_append_status_dicts (ctx, rsp_dict); -                if (ret) -                        goto out; +    if (rsp_dict) { +        ret = glusterd_append_status_dicts(ctx, rsp_dict); +        if (ret) +            goto out; -                ret = glusterd_append_gsync_status (ctx, rsp_dict); -                if (ret) -                        goto out; +        ret = glusterd_append_gsync_status(ctx, rsp_dict); +        if (ret) +            goto out; -                ret = dict_get_strn (rsp_dict, "conf_path", SLEN ("conf_path"), -                                     &conf_path); -                if (!ret && conf_path) { -                        ret = dict_set_dynstr_with_alloc (ctx, "conf_path", -                                                          conf_path); -                        if (ret) { -                                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                        GD_MSG_DICT_SET_FAILED, -                                        "Unable to store conf path."); -                                goto out; -                        } -                } -        } -        if ((op_errstr) && (strcmp ("", op_errstr))) { -                ret = dict_set_dynstr_with_alloc (ctx, "errstr", -                                                  op_errstr); -                if (ret) -                        goto out; +        ret = dict_get_strn(rsp_dict, "conf_path", SLEN("conf_path"), +                            &conf_path); +        if (!ret && conf_path) { +            ret = dict_set_dynstr_with_alloc(ctx, "conf_path", conf_path); +            if (ret) { +                gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                       "Unable to store conf path."); +                goto out; +            }          } +    } +    if ((op_errstr) && (strcmp("", op_errstr))) { +        ret = dict_set_dynstr_with_alloc(ctx, "errstr", op_errstr); +        if (ret) +            goto out; +    } -        ret = 0; - out: -        gf_msg_debug ("glusterd", 0, "Returning %d ", ret); -        return ret; +    ret = 0; +out: +    gf_msg_debug("glusterd", 0, "Returning %d ", ret); +    return ret;  }  int32_t -glusterd_rb_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict) +glusterd_rb_use_rsp_dict(dict_t *aggr, dict_t *rsp_dict)  { -        int32_t  src_port = 0; -        int32_t  dst_port = 0; -        int      ret      = 0; -        dict_t  *ctx      = NULL; -        xlator_t *this    = NULL; +    int32_t src_port = 0; +    int32_t dst_port = 0; +    int ret = 0; +    dict_t *ctx = NULL; +    xlator_t *this = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        if (aggr) { -                ctx = aggr; +    if (aggr) { +        ctx = aggr; -        } else { -                ctx = glusterd_op_get_ctx (); -                if (!ctx) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_OPCTX_GET_FAIL, -                                "Operation Context is not present"); -                        GF_ASSERT (0); -                } +    } else { +        ctx = glusterd_op_get_ctx(); +        if (!ctx) { +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_OPCTX_GET_FAIL, +                   "Operation Context is not present"); +            GF_ASSERT(0);          } +    } -        if (rsp_dict) { -                ret = dict_get_int32n (rsp_dict, "src-brick-port", -                                       SLEN ("src-brick-port"), &src_port); -                if (ret == 0) { -                        gf_msg_debug ("glusterd", 0, -                                "src-brick-port=%d found", src_port); -                } - -                ret = dict_get_int32n (rsp_dict, "dst-brick-port", -                                       SLEN ("dst-brick-port"), &dst_port); -                if (ret == 0) { -                        gf_msg_debug ("glusterd", 0, -                                "dst-brick-port=%d found", dst_port); -                } +    if (rsp_dict) { +        ret = dict_get_int32n(rsp_dict, "src-brick-port", +                              SLEN("src-brick-port"), &src_port); +        if (ret == 0) { +            gf_msg_debug("glusterd", 0, "src-brick-port=%d found", src_port); +        } -                ret = glusterd_aggr_brick_mount_dirs (ctx, rsp_dict); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_BRICK_MOUNDIRS_AGGR_FAIL, -                                "Failed to " -                                "aggregate brick mount dirs"); -                        goto out; -                } +        ret = dict_get_int32n(rsp_dict, "dst-brick-port", +                              SLEN("dst-brick-port"), &dst_port); +        if (ret == 0) { +            gf_msg_debug("glusterd", 0, "dst-brick-port=%d found", dst_port);          } -        if (src_port) { -                ret = dict_set_int32n (ctx, "src-brick-port", -                                       SLEN ("src-brick-port"), -                                       src_port); -                if (ret) { -                        gf_msg_debug ("glusterd", 0, -                                "Could not set src-brick"); -                        goto out; -                } +        ret = glusterd_aggr_brick_mount_dirs(ctx, rsp_dict); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_MOUNDIRS_AGGR_FAIL, +                   "Failed to " +                   "aggregate brick mount dirs"); +            goto out;          } +    } -        if (dst_port) { -                ret = dict_set_int32n (ctx, "dst-brick-port", -                                       SLEN ("dst-brick-port"), -                                       dst_port); -                if (ret) { -                        gf_msg_debug ("glusterd", 0, -                                "Could not set dst-brick"); -                        goto out; -                } +    if (src_port) { +        ret = dict_set_int32n(ctx, "src-brick-port", SLEN("src-brick-port"), +                              src_port); +        if (ret) { +            gf_msg_debug("glusterd", 0, "Could not set src-brick"); +            goto out; +        } +    } +    if (dst_port) { +        ret = dict_set_int32n(ctx, "dst-brick-port", SLEN("dst-brick-port"), +                              dst_port); +        if (ret) { +            gf_msg_debug("glusterd", 0, "Could not set dst-brick"); +            goto out;          } +    }  out: -        return ret; - +    return ret;  }  int32_t -glusterd_sync_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict) +glusterd_sync_use_rsp_dict(dict_t *aggr, dict_t *rsp_dict)  { -        int      ret      = 0; +    int ret = 0; -        GF_ASSERT (rsp_dict); +    GF_ASSERT(rsp_dict); -        if (!rsp_dict) { -                goto out; -        } +    if (!rsp_dict) { +        goto out; +    } -        ret = glusterd_import_friend_volumes (rsp_dict); +    ret = glusterd_import_friend_volumes(rsp_dict);  out: -        return ret; - +    return ret;  }  static int -_profile_volume_add_friend_rsp (dict_t *this, char *key, data_t *value, +_profile_volume_add_friend_rsp(dict_t *this, char *key, data_t *value,                                 void *data)  { -        char    new_key[264] = ""; -        int     new_key_len; -        glusterd_pr_brick_rsp_conv_t *rsp_ctx = NULL; -        data_t  *new_value = NULL; -        int     brick_count = 0; -        char    brick_key[256] = ""; +    char new_key[264] = ""; +    int new_key_len; +    glusterd_pr_brick_rsp_conv_t *rsp_ctx = NULL; +    data_t *new_value = NULL; +    int brick_count = 0; +    char brick_key[256] = ""; -        if (strcmp (key, "count") == 0) -                return 0; -        sscanf (key, "%d%s", &brick_count, brick_key); -        rsp_ctx = data; -        new_value = data_copy (value); -        GF_ASSERT (new_value); -        new_key_len = snprintf (new_key, sizeof (new_key), "%d%s", -                                rsp_ctx->count + brick_count, brick_key); -        dict_setn (rsp_ctx->dict, new_key, new_key_len, new_value); +    if (strcmp(key, "count") == 0)          return 0; -} - -int -glusterd_profile_volume_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict) -{ -        int     ret = 0; -        glusterd_pr_brick_rsp_conv_t rsp_ctx = {0}; -        int32_t brick_count = 0; -        int32_t count = 0; -        dict_t  *ctx_dict = NULL; -        xlator_t *this    = NULL; - -        GF_ASSERT (rsp_dict); -        this = THIS; -        GF_ASSERT (this); - -        ret = dict_get_int32n (rsp_dict, "count", SLEN ("count"), -                               &brick_count); -        if (ret) { -                ret = 0; //no bricks in the rsp -                goto out; -        } -        if (aggr) { -                ctx_dict = aggr; - -        } else { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_OPCTX_GET_FAIL, -                        "Operation Context is not present"); -                ret = -1; -                goto out; -        } +    sscanf(key, "%d%s", &brick_count, brick_key); +    rsp_ctx = data; +    new_value = data_copy(value); +    GF_ASSERT(new_value); +    new_key_len = snprintf(new_key, sizeof(new_key), "%d%s", +                           rsp_ctx->count + brick_count, brick_key); +    dict_setn(rsp_ctx->dict, new_key, new_key_len, new_value); +    return 0; +} + +int +glusterd_profile_volume_use_rsp_dict(dict_t *aggr, dict_t *rsp_dict) +{ +    int ret = 0; +    glusterd_pr_brick_rsp_conv_t rsp_ctx = {0}; +    int32_t brick_count = 0; +    int32_t count = 0; +    dict_t *ctx_dict = NULL; +    xlator_t *this = NULL; + +    GF_ASSERT(rsp_dict); +    this = THIS; +    GF_ASSERT(this); + +    ret = dict_get_int32n(rsp_dict, "count", SLEN("count"), &brick_count); +    if (ret) { +        ret = 0;  // no bricks in the rsp +        goto out; +    } +    if (aggr) { +        ctx_dict = aggr; + +    } else { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_OPCTX_GET_FAIL, +               "Operation Context is not present"); +        ret = -1; +        goto out; +    } -        ret = dict_get_int32n (ctx_dict, "count", SLEN ("count"), &count); -        rsp_ctx.count = count; -        rsp_ctx.dict = ctx_dict; -        dict_foreach (rsp_dict, _profile_volume_add_friend_rsp, &rsp_ctx); -        ret = dict_set_int32n (ctx_dict, "count", SLEN ("count"), -                               count + brick_count); +    ret = dict_get_int32n(ctx_dict, "count", SLEN("count"), &count); +    rsp_ctx.count = count; +    rsp_ctx.dict = ctx_dict; +    dict_foreach(rsp_dict, _profile_volume_add_friend_rsp, &rsp_ctx); +    ret = dict_set_int32n(ctx_dict, "count", SLEN("count"), +                          count + brick_count);  out: -        return ret; +    return ret;  }  static int -glusterd_volume_status_add_peer_rsp (dict_t *this, char *key, data_t *value, -                                     void *data) -{ -        glusterd_status_rsp_conv_t      *rsp_ctx = NULL; -        data_t                          *new_value = NULL; -        char                            brick_key[1024] = ""; -        char                            new_key[1024] = ""; -        int32_t                         index = 0; -        int32_t                         ret = -1; -        int32_t                         len = 0; - -        /* Skip the following keys, they are already present in the ctx_dict */ -        /* Also, skip all the task related pairs. They will be added to the -         * ctx_dict later -         */ -        if (!strcmp (key, "count") || !strcmp (key, "cmd") || -            !strcmp (key, "brick-index-max") || !strcmp (key, "other-count") || -            !strncmp (key, "task", 4)) -                return 0; +glusterd_volume_status_add_peer_rsp(dict_t *this, char *key, data_t *value, +                                    void *data) +{ +    glusterd_status_rsp_conv_t *rsp_ctx = NULL; +    data_t *new_value = NULL; +    char brick_key[1024] = ""; +    char new_key[1024] = ""; +    int32_t index = 0; +    int32_t ret = -1; +    int32_t len = 0; + +    /* Skip the following keys, they are already present in the ctx_dict */ +    /* Also, skip all the task related pairs. They will be added to the +     * ctx_dict later +     */ +    if (!strcmp(key, "count") || !strcmp(key, "cmd") || +        !strcmp(key, "brick-index-max") || !strcmp(key, "other-count") || +        !strncmp(key, "task", 4)) +        return 0; -        rsp_ctx = data; -        new_value = data_copy (value); -        GF_ASSERT (new_value); +    rsp_ctx = data; +    new_value = data_copy(value); +    GF_ASSERT(new_value); -        sscanf (key, "brick%d.%s", &index, brick_key); +    sscanf(key, "brick%d.%s", &index, brick_key); -        if (index > rsp_ctx->brick_index_max) { -                len = snprintf (new_key, sizeof (new_key), "brick%d.%s", -                                index + rsp_ctx->other_count, brick_key); -        } else { -                len = snprintf (new_key, sizeof (new_key), "%s", key); -        } -        if (len < 0 || len >= sizeof(new_key)) -                goto out; +    if (index > rsp_ctx->brick_index_max) { +        len = snprintf(new_key, sizeof(new_key), "brick%d.%s", +                       index + rsp_ctx->other_count, brick_key); +    } else { +        len = snprintf(new_key, sizeof(new_key), "%s", key); +    } +    if (len < 0 || len >= sizeof(new_key)) +        goto out; -        ret = dict_set (rsp_ctx->dict, new_key, new_value); +    ret = dict_set(rsp_ctx->dict, new_key, new_value);  out: -        if (ret) { -                data_unref(new_value); -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Unable to set key: %s in dict", -                        key); -        } +    if (ret) { +        data_unref(new_value); +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Unable to set key: %s in dict", key); +    } -        return 0; +    return 0;  }  static int -glusterd_volume_status_copy_tasks_to_ctx_dict (dict_t *this, char *key, -                                               data_t *value, void *data) +glusterd_volume_status_copy_tasks_to_ctx_dict(dict_t *this, char *key, +                                              data_t *value, void *data)  { -        int     ret = 0; -        dict_t  *ctx_dict = NULL; -        data_t  *new_value = NULL; - -        if (strncmp (key, "task", 4)) -                return 0; - -        ctx_dict = data; -        GF_ASSERT (ctx_dict); +    int ret = 0; +    dict_t *ctx_dict = NULL; +    data_t *new_value = NULL; -        new_value = data_copy (value); -        GF_ASSERT (new_value); - -        ret = dict_set (ctx_dict, key, new_value); - -        return ret; -} - -int -glusterd_volume_status_aggregate_tasks_status (dict_t *ctx_dict, -                                               dict_t *rsp_dict) -{ -        int             ret             = -1; -        xlator_t        *this           = NULL; -        int             local_count     = 0; -        int             remote_count    = 0; -        int             i               = 0; -        int             j               = 0; -        char            key[128]        = ""; -        int             keylen; -        char            *task_type      = NULL; -        int             local_status    = 0; -        int             remote_status   = 0; -        char            *local_task_id  = NULL; -        char            *remote_task_id = NULL; +    if (strncmp(key, "task", 4)) +        return 0; -        GF_ASSERT (ctx_dict); -        GF_ASSERT (rsp_dict); +    ctx_dict = data; +    GF_ASSERT(ctx_dict); + +    new_value = data_copy(value); +    GF_ASSERT(new_value); + +    ret = dict_set(ctx_dict, key, new_value); + +    return ret; +} + +int +glusterd_volume_status_aggregate_tasks_status(dict_t *ctx_dict, +                                              dict_t *rsp_dict) +{ +    int ret = -1; +    xlator_t *this = NULL; +    int local_count = 0; +    int remote_count = 0; +    int i = 0; +    int j = 0; +    char key[128] = ""; +    int keylen; +    char *task_type = NULL; +    int local_status = 0; +    int remote_status = 0; +    char *local_task_id = NULL; +    char *remote_task_id = NULL; + +    GF_ASSERT(ctx_dict); +    GF_ASSERT(rsp_dict); + +    this = THIS; +    GF_ASSERT(this); + +    ret = dict_get_int32n(rsp_dict, "tasks", SLEN("tasks"), &remote_count); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get remote task count"); +        goto out; +    } +    /* Local count will not be present when this is called for the first +     * time with the origins rsp_dict +     */ +    ret = dict_get_int32n(ctx_dict, "tasks", SLEN("tasks"), &local_count); +    if (ret) { +        ret = dict_foreach( +            rsp_dict, glusterd_volume_status_copy_tasks_to_ctx_dict, ctx_dict); +        if (ret) +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Failed to copy tasks" +                   "to ctx_dict."); +        goto out; +    } + +    if (local_count != remote_count) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_TASKS_COUNT_MISMATCH, +               "Local tasks count (%d) and " +               "remote tasks count (%d) do not match. Not aggregating " +               "tasks status.", +               local_count, remote_count); +        ret = -1; +        goto out; +    } + +    /* Update the tasks statuses. For every remote tasks, search for the +     * local task, and update the local task status based on the remote +     * status. +     */ +    for (i = 0; i < remote_count; i++) { +        keylen = snprintf(key, sizeof(key), "task%d.type", i); +        ret = dict_get_strn(rsp_dict, key, keylen, &task_type); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                   "Failed to get task typpe from rsp dict"); +            goto out; +        } -        this = THIS; -        GF_ASSERT (this); +        /* Skip replace-brick status as it is going to be the same on +         * all peers. rb_status is set by the replace brick commit +         * function on all peers based on the replace brick command. +         * We return the value of rb_status as the status for a +         * replace-brick task in a 'volume status' command. +         */ +        if (!strcmp(task_type, "Replace brick")) +            continue; -        ret = dict_get_int32n (rsp_dict, "tasks", SLEN ("tasks"), -                               &remote_count); +        keylen = snprintf(key, sizeof(key), "task%d.status", i); +        ret = dict_get_int32n(rsp_dict, key, keylen, &remote_status);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get remote task count"); -                goto out; +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                   "Failed to get task status from rsp dict"); +            goto out;          } -        /* Local count will not be present when this is called for the first -         * time with the origins rsp_dict -         */ -        ret = dict_get_int32n (ctx_dict, "tasks", SLEN ("tasks"), -                               &local_count); +        keylen = snprintf(key, sizeof(key), "task%d.id", i); +        ret = dict_get_strn(rsp_dict, key, keylen, &remote_task_id);          if (ret) { -                ret = dict_foreach (rsp_dict, -                                glusterd_volume_status_copy_tasks_to_ctx_dict, -                                ctx_dict); -                if (ret) -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, "Failed to copy tasks" -                                "to ctx_dict."); -                goto out; -        } - -        if (local_count != remote_count) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_TASKS_COUNT_MISMATCH, -                        "Local tasks count (%d) and " -                        "remote tasks count (%d) do not match. Not aggregating " -                        "tasks status.", local_count, remote_count); -                ret = -1; -                goto out; -        } - -        /* Update the tasks statuses. For every remote tasks, search for the -         * local task, and update the local task status based on the remote -         * status. -         */ -        for (i = 0; i < remote_count; i++) { - -                keylen = snprintf (key, sizeof (key), "task%d.type", i); -                ret = dict_get_strn (rsp_dict, key, keylen, &task_type); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_GET_FAILED, -                                "Failed to get task typpe from rsp dict"); -                        goto out; -                } - -                /* Skip replace-brick status as it is going to be the same on -                 * all peers. rb_status is set by the replace brick commit -                 * function on all peers based on the replace brick command. -                 * We return the value of rb_status as the status for a -                 * replace-brick task in a 'volume status' command. -                 */ -                if (!strcmp (task_type, "Replace brick")) -                        continue; - -                keylen = snprintf (key, sizeof (key), "task%d.status", i); -                ret = dict_get_int32n (rsp_dict, key, keylen, &remote_status); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_GET_FAILED, -                                "Failed to get task status from rsp dict"); -                        goto out; -                } -                keylen = snprintf (key, sizeof (key), "task%d.id", i); -                ret = dict_get_strn (rsp_dict, key, keylen, &remote_task_id); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_GET_FAILED, -                                "Failed to get task id from rsp dict"); -                        goto out; -                } -                for (j = 0; j < local_count; j++) { -                        keylen = snprintf (key, sizeof (key), "task%d.id", j); -                        ret = dict_get_strn (ctx_dict, key, keylen, -                                             &local_task_id); -                        if (ret) { -                                gf_msg (this->name, GF_LOG_ERROR, 0, -                                        GD_MSG_DICT_GET_FAILED, -                                        "Failed to get local task-id"); -                                goto out; -                        } - -                        if (strncmp (remote_task_id, local_task_id, -                                     strlen (remote_task_id))) { -                                /* Quit if a matching local task is not found */ -                                if (j == (local_count - 1)) { -                                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                                GD_MSG_TASKS_COUNT_MISMATCH, -                                                "Could not find matching local " -                                                "task for task %s", -                                                remote_task_id); -                                        goto out; -                                } -                                continue; -                        } - -                        keylen = snprintf (key, sizeof (key), -                                           "task%d.status", j); -                        ret = dict_get_int32n (ctx_dict, key, keylen, -                                               &local_status); -                        if (ret) { -                                gf_msg (this->name, GF_LOG_ERROR, 0, -                                        GD_MSG_DICT_GET_FAILED, -                                        "Failed to get local task status"); -                                goto out; -                        } - -                        /* Rebalance has 5 states, -                         * NOT_STARTED, STARTED, STOPPED, COMPLETE, FAILED -                         * The precedence used to determine the aggregate status -                         * is as below, -                         * STARTED > FAILED > STOPPED > COMPLETE > NOT_STARTED -                         */ -                        /* TODO: Move this to a common place utilities that both -                         * CLI and glusterd need. -                         * Till then if the below algorithm is changed, change -                         * it in cli_xml_output_vol_rebalance_status in -                         * cli-xml-output.c -                         */ -                        ret = 0; -                        int rank[] = { -                                [GF_DEFRAG_STATUS_STARTED] = 1, -                                [GF_DEFRAG_STATUS_FAILED] = 2, -                                [GF_DEFRAG_STATUS_STOPPED] = 3, -                                [GF_DEFRAG_STATUS_COMPLETE] = 4, -                                [GF_DEFRAG_STATUS_NOT_STARTED] = 5 -                        }; -                        if (rank[remote_status] <= rank[local_status]) -                                        ret = dict_set_int32n (ctx_dict, key, -                                                               keylen, -                                                               remote_status); -                        if (ret) { -                                gf_msg (this->name, GF_LOG_ERROR, 0, -                                        GD_MSG_TASK_STATUS_UPDATE_FAIL, -                                        "Failed to " -                                        "update task status"); -                                goto out; -                        } -                        break; -                } +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                   "Failed to get task id from rsp dict"); +            goto out;          } - -out: -        return ret; +        for (j = 0; j < local_count; j++) { +            keylen = snprintf(key, sizeof(key), "task%d.id", j); +            ret = dict_get_strn(ctx_dict, key, keylen, &local_task_id); +            if (ret) { +                gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                       "Failed to get local task-id"); +                goto out; +            } + +            if (strncmp(remote_task_id, local_task_id, +                        strlen(remote_task_id))) { +                /* Quit if a matching local task is not found */ +                if (j == (local_count - 1)) { +                    gf_msg(this->name, GF_LOG_ERROR, 0, +                           GD_MSG_TASKS_COUNT_MISMATCH, +                           "Could not find matching local " +                           "task for task %s", +                           remote_task_id); +                    goto out; +                } +                continue; +            } + +            keylen = snprintf(key, sizeof(key), "task%d.status", j); +            ret = dict_get_int32n(ctx_dict, key, keylen, &local_status); +            if (ret) { +                gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                       "Failed to get local task status"); +                goto out; +            } + +            /* Rebalance has 5 states, +             * NOT_STARTED, STARTED, STOPPED, COMPLETE, FAILED +             * The precedence used to determine the aggregate status +             * is as below, +             * STARTED > FAILED > STOPPED > COMPLETE > NOT_STARTED +             */ +            /* TODO: Move this to a common place utilities that both +             * CLI and glusterd need. +             * Till then if the below algorithm is changed, change +             * it in cli_xml_output_vol_rebalance_status in +             * cli-xml-output.c +             */ +            ret = 0; +            int rank[] = {[GF_DEFRAG_STATUS_STARTED] = 1, +                          [GF_DEFRAG_STATUS_FAILED] = 2, +                          [GF_DEFRAG_STATUS_STOPPED] = 3, +                          [GF_DEFRAG_STATUS_COMPLETE] = 4, +                          [GF_DEFRAG_STATUS_NOT_STARTED] = 5}; +            if (rank[remote_status] <= rank[local_status]) +                ret = dict_set_int32n(ctx_dict, key, keylen, remote_status); +            if (ret) { +                gf_msg(this->name, GF_LOG_ERROR, 0, +                       GD_MSG_TASK_STATUS_UPDATE_FAIL, +                       "Failed to " +                       "update task status"); +                goto out; +            } +            break; +        } +    } + +out: +    return ret;  }  gf_boolean_t -glusterd_status_has_tasks (int cmd) { -        if (((cmd & GF_CLI_STATUS_MASK) == GF_CLI_STATUS_NONE) && -             (cmd & GF_CLI_STATUS_VOL)) -                return _gf_true; -        return _gf_false; -} - -int -glusterd_volume_status_copy_to_op_ctx_dict (dict_t *aggr, dict_t *rsp_dict) +glusterd_status_has_tasks(int cmd)  { -        int                             ret = 0; -        glusterd_status_rsp_conv_t      rsp_ctx = {0}; -        int32_t                         cmd = GF_CLI_STATUS_NONE; -        int32_t                         node_count = 0; -        int32_t                         other_count = 0; -        int32_t                         brick_index_max = -1; -        int32_t                         hot_brick_count = -1; -        int32_t                         type = -1; -        int32_t                         rsp_node_count = 0; -        int32_t                         rsp_other_count = 0; -        int                             vol_count = -1; -        int                             i = 0; -        dict_t                          *ctx_dict = NULL; -        char                            key[64] = ""; -        int                             keylen; -        char                            *volname = NULL; -        glusterd_volinfo_t              *volinfo       = NULL; - - -        GF_ASSERT (rsp_dict); +    if (((cmd & GF_CLI_STATUS_MASK) == GF_CLI_STATUS_NONE) && +        (cmd & GF_CLI_STATUS_VOL)) +        return _gf_true; +    return _gf_false; +} + +int +glusterd_volume_status_copy_to_op_ctx_dict(dict_t *aggr, dict_t *rsp_dict) +{ +    int ret = 0; +    glusterd_status_rsp_conv_t rsp_ctx = {0}; +    int32_t cmd = GF_CLI_STATUS_NONE; +    int32_t node_count = 0; +    int32_t other_count = 0; +    int32_t brick_index_max = -1; +    int32_t hot_brick_count = -1; +    int32_t type = -1; +    int32_t rsp_node_count = 0; +    int32_t rsp_other_count = 0; +    int vol_count = -1; +    int i = 0; +    dict_t *ctx_dict = NULL; +    char key[64] = ""; +    int keylen; +    char *volname = NULL; +    glusterd_volinfo_t *volinfo = NULL; + +    GF_ASSERT(rsp_dict); + +    if (aggr) { +        ctx_dict = aggr; + +    } else { +        ctx_dict = glusterd_op_get_ctx(GD_OP_STATUS_VOLUME); +    } + +    ret = dict_get_int32n(ctx_dict, "cmd", SLEN("cmd"), &cmd); +    if (ret) +        goto out; + +    if (cmd & GF_CLI_STATUS_ALL && is_origin_glusterd(ctx_dict)) { +        ret = dict_get_int32n(rsp_dict, "vol_count", SLEN("vol_count"), +                              &vol_count); +        if (ret == 0) { +            ret = dict_set_int32n(ctx_dict, "vol_count", SLEN("vol_count"), +                                  vol_count); +            if (ret) +                goto out; -        if (aggr) { -                ctx_dict = aggr; +            for (i = 0; i < vol_count; i++) { +                keylen = snprintf(key, sizeof(key), "vol%d", i); +                ret = dict_get_strn(rsp_dict, key, keylen, &volname); +                if (ret) +                    goto out; +                ret = dict_set_strn(ctx_dict, key, keylen, volname); +                if (ret) +                    goto out; +            }          } else { -                ctx_dict = glusterd_op_get_ctx (GD_OP_STATUS_VOLUME); - -        } - -        ret = dict_get_int32n (ctx_dict, "cmd", SLEN ("cmd"), &cmd); +            /* Ignore the error as still the aggregation applies in +             * case its a task sub command */ +            ret = 0; +        } +    } + +    if ((cmd & GF_CLI_STATUS_TASKS) != 0) +        goto aggregate_tasks; + +    ret = dict_get_int32n(rsp_dict, "count", SLEN("count"), &rsp_node_count); +    if (ret) { +        ret = 0;  // no bricks in the rsp +        goto out; +    } + +    ret = dict_get_int32n(rsp_dict, "other-count", SLEN("other-count"), +                          &rsp_other_count); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get other count from rsp_dict"); +        goto out; +    } + +    ret = dict_get_int32n(ctx_dict, "count", SLEN("count"), &node_count); +    ret = dict_get_int32n(ctx_dict, "other-count", SLEN("other-count"), +                          &other_count); +    if (!dict_getn(ctx_dict, "brick-index-max", SLEN("brick-index-max"))) { +        ret = dict_get_int32n(rsp_dict, "brick-index-max", +                              SLEN("brick-index-max"), &brick_index_max);          if (ret) -                goto out; - -        if (cmd & GF_CLI_STATUS_ALL && is_origin_glusterd (ctx_dict)) { -                ret = dict_get_int32n (rsp_dict, "vol_count", -                                       SLEN ("vol_count"), &vol_count); -                if (ret == 0) { -                        ret = dict_set_int32n (ctx_dict, "vol_count", -                                               SLEN ("vol_count"), vol_count); -                        if (ret) -                                goto out; - -                        for (i = 0; i < vol_count; i++) { -                                keylen = snprintf (key, sizeof (key), -                                                   "vol%d", i); -                                ret = dict_get_strn (rsp_dict, key, keylen, -                                                     &volname); -                                if (ret) -                                        goto out; - -                                ret = dict_set_strn (ctx_dict, key, keylen, -                                                     volname); -                                if (ret) -                                        goto out; -                        } -                } else { -                        /* Ignore the error as still the aggregation applies in -                         * case its a task sub command */ -                        ret = 0; -                } -        } - -        if ((cmd & GF_CLI_STATUS_TASKS) != 0) -                goto aggregate_tasks; +            goto out; +        ret = dict_set_int32n(ctx_dict, "brick-index-max", +                              SLEN("brick-index-max"), brick_index_max); +        if (ret) +            goto out; -        ret = dict_get_int32n (rsp_dict, "count", SLEN ("count"), -                               &rsp_node_count); -        if (ret) { -                ret = 0; //no bricks in the rsp -                goto out; +    } else { +        ret = dict_get_int32n(ctx_dict, "brick-index-max", +                              SLEN("brick-index-max"), &brick_index_max); +        if (ret) +            goto out; +    } + +    rsp_ctx.count = node_count; +    rsp_ctx.brick_index_max = brick_index_max; +    rsp_ctx.other_count = other_count; +    rsp_ctx.dict = ctx_dict; + +    dict_foreach(rsp_dict, glusterd_volume_status_add_peer_rsp, &rsp_ctx); + +    ret = dict_set_int32n(ctx_dict, "count", SLEN("count"), +                          node_count + rsp_node_count); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to update node count"); +        goto out; +    } + +    ret = dict_set_int32n(ctx_dict, "other-count", SLEN("other-count"), +                          (other_count + rsp_other_count)); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to update other-count"); +        goto out; +    } + +    ret = dict_get_strn(ctx_dict, "volname", SLEN("volname"), &volname); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to get volname"); +        goto out; +    } + +    ret = glusterd_volinfo_find(volname, &volinfo); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_GET_FAIL, +               "Failed to get volinfo for volume: %s", volname); +        goto out; +    } + +    if (volinfo->type == GF_CLUSTER_TYPE_TIER) { +        ret = dict_get_int32n(rsp_dict, "hot_brick_count", +                              SLEN("hot_brick_count"), &hot_brick_count); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_DICT_GET_FAILED, +                   "Failed to get hot brick count from rsp_dict"); +            goto out;          } -        ret = dict_get_int32n (rsp_dict, "other-count", SLEN ("other-count"), -                               &rsp_other_count); +        ret = dict_get_int32n(rsp_dict, "type", SLEN("type"), &type);          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get other count from rsp_dict"); -                goto out; -        } - -        ret = dict_get_int32n (ctx_dict, "count", SLEN ("count"), -                               &node_count); -        ret = dict_get_int32n (ctx_dict, "other-count",SLEN ("other-count"), -                               &other_count); -        if (!dict_getn (ctx_dict, "brick-index-max", SLEN ("brick-index-max"))) { -                ret = dict_get_int32n (rsp_dict, "brick-index-max", -                                       SLEN ("brick-index-max"), -                                       &brick_index_max); -                if (ret) -                        goto out; -                ret = dict_set_int32n (ctx_dict, "brick-index-max", -                                       SLEN ("brick-index-max"), -                                       brick_index_max); -                if (ret) -                        goto out; - -        } else { -                ret = dict_get_int32n (ctx_dict, "brick-index-max", -                                       SLEN ("brick-index-max"), -                                       &brick_index_max); -                if (ret) -                        goto out; +            gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_DICT_GET_FAILED, +                   "Failed to get type from rsp_dict"); +            goto out;          } +    } -        rsp_ctx.count = node_count; -        rsp_ctx.brick_index_max = brick_index_max; -        rsp_ctx.other_count = other_count; -        rsp_ctx.dict = ctx_dict; +    ret = dict_set_int32n(ctx_dict, "hot_brick_count", SLEN("hot_brick_count"), +                          hot_brick_count); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_DICT_SET_FAILED, +               "Failed to update hot_brick_count"); +        goto out; +    } -        dict_foreach (rsp_dict, glusterd_volume_status_add_peer_rsp, &rsp_ctx); +    ret = dict_set_int32n(ctx_dict, "type", SLEN("type"), type); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_DICT_SET_FAILED, +               "Failed to update type"); +        goto out; +    } -        ret = dict_set_int32n (ctx_dict, "count", SLEN ("count"), -                               node_count + rsp_node_count); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to update node count"); -                goto out; +aggregate_tasks: +    /* Tasks are only present for a normal status command for a volume or +     * for an explicit tasks status command for a volume +     */ +    if (!(cmd & GF_CLI_STATUS_ALL) && +        (((cmd & GF_CLI_STATUS_TASKS) != 0) || glusterd_status_has_tasks(cmd))) +        ret = glusterd_volume_status_aggregate_tasks_status(ctx_dict, rsp_dict); + +out: +    return ret; +} + +int +glusterd_max_opversion_use_rsp_dict(dict_t *dst, dict_t *src) +{ +    int ret = -1; +    int src_max_opversion = -1; +    int max_opversion = -1; + +    GF_VALIDATE_OR_GOTO(THIS->name, dst, out); +    GF_VALIDATE_OR_GOTO(THIS->name, src, out); + +    ret = dict_get_int32n(dst, "max-opversion", SLEN("max-opversion"), +                          &max_opversion); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Maximum supported op-version not set in destination " +               "dictionary"); + +    ret = dict_get_int32n(src, "max-opversion", SLEN("max-opversion"), +                          &src_max_opversion); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get maximum supported op-version from source"); +        goto out; +    } + +    if (max_opversion == -1 || src_max_opversion < max_opversion) +        max_opversion = src_max_opversion; + +    ret = dict_set_int32n(dst, "max-opversion", SLEN("max-opversion"), +                          max_opversion); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set max op-version"); +        goto out; +    } +out: +    return ret; +} + +int +glusterd_volume_bitrot_scrub_use_rsp_dict(dict_t *aggr, dict_t *rsp_dict) +{ +    int ret = -1; +    int j = 0; +    uint64_t value = 0; +    char key[64] = ""; +    int keylen; +    char *last_scrub_time = NULL; +    char *scrub_time = NULL; +    char *volname = NULL; +    char *node_uuid = NULL; +    char *node_uuid_str = NULL; +    char *bitd_log = NULL; +    char *scrub_log = NULL; +    char *scrub_freq = NULL; +    char *scrub_state = NULL; +    char *scrub_impact = NULL; +    char *bad_gfid_str = NULL; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    int src_count = 0; +    int dst_count = 0; +    int8_t scrub_running = 0; + +    this = THIS; +    GF_ASSERT(this); + +    priv = this->private; +    GF_ASSERT(priv); + +    ret = dict_get_strn(aggr, "volname", SLEN("volname"), &volname); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get volume name"); +        goto out; +    } + +    ret = glusterd_volinfo_find(volname, &volinfo); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_VOL_NOT_FOUND, +               "Unable to find volinfo for volume: %s", volname); +        goto out; +    } + +    ret = dict_get_int32n(aggr, "count", SLEN("count"), &dst_count); + +    ret = dict_get_int32n(rsp_dict, "count", SLEN("count"), &src_count); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "failed to get count value"); +        ret = 0; +        goto out; +    } + +    ret = dict_set_int32n(aggr, "count", SLEN("count"), src_count + dst_count); +    if (ret) +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set count in dictonary"); + +    keylen = snprintf(key, sizeof(key), "node-uuid-%d", src_count); +    ret = dict_get_strn(rsp_dict, key, keylen, &node_uuid); +    if (!ret) { +        node_uuid_str = gf_strdup(node_uuid); +        keylen = snprintf(key, sizeof(key), "node-uuid-%d", +                          src_count + dst_count); +        ret = dict_set_dynstrn(aggr, key, keylen, node_uuid_str); +        if (ret) { +            gf_msg_debug(this->name, 0, "failed to set node-uuid"); +        } +    } + +    snprintf(key, sizeof(key), "scrub-running-%d", src_count); +    ret = dict_get_int8(rsp_dict, key, &scrub_running); +    if (!ret) { +        snprintf(key, sizeof(key), "scrub-running-%d", src_count + dst_count); +        ret = dict_set_int8(aggr, key, scrub_running); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub-running value"); +        } +    } + +    snprintf(key, sizeof(key), "scrubbed-files-%d", src_count); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "scrubbed-files-%d", src_count + dst_count); +        ret = dict_set_uint64(aggr, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrubbed-file value"); +        } +    } + +    snprintf(key, sizeof(key), "unsigned-files-%d", src_count); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "unsigned-files-%d", src_count + dst_count); +        ret = dict_set_uint64(aggr, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "unsigned-file value"); +        } +    } + +    keylen = snprintf(key, sizeof(key), "last-scrub-time-%d", src_count); +    ret = dict_get_strn(rsp_dict, key, keylen, &last_scrub_time); +    if (!ret) { +        scrub_time = gf_strdup(last_scrub_time); +        keylen = snprintf(key, sizeof(key), "last-scrub-time-%d", +                          src_count + dst_count); +        ret = dict_set_dynstrn(aggr, key, keylen, scrub_time); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "last scrub time value"); +        } +    } + +    snprintf(key, sizeof(key), "scrub-duration-%d", src_count); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "scrub-duration-%d", src_count + dst_count); +        ret = dict_set_uint64(aggr, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrubbed-duration value"); +        } +    } + +    snprintf(key, sizeof(key), "error-count-%d", src_count); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "error-count-%d", src_count + dst_count); +        ret = dict_set_uint64(aggr, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set error " +                         "count value"); +        } + +        /* Storing all the bad files in the dictionary */ +        for (j = 0; j < value; j++) { +            keylen = snprintf(key, sizeof(key), "quarantine-%d-%d", j, +                              src_count); +            ret = dict_get_strn(rsp_dict, key, keylen, &bad_gfid_str); +            if (!ret) { +                snprintf(key, sizeof(key), "quarantine-%d-%d", j, +                         src_count + dst_count); +                ret = dict_set_dynstr_with_alloc(aggr, key, bad_gfid_str); +                if (ret) { +                    gf_msg_debug(this->name, 0, +                                 "Failed to" +                                 "bad file gfid "); +                } +            }          } +    } -        ret = dict_set_int32n (ctx_dict, "other-count", SLEN ("other-count"), -                               (other_count + rsp_other_count)); +    ret = dict_get_strn(rsp_dict, "bitrot_log_file", SLEN("bitrot_log_file"), +                        &bitd_log); +    if (!ret) { +        ret = dict_set_dynstr_with_alloc(aggr, "bitrot_log_file", bitd_log);          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to update other-count"); -                goto out; +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "bitrot log file location"); +            goto out;          } +    } -        ret = dict_get_strn (ctx_dict, "volname", SLEN ("volname"), &volname); +    ret = dict_get_strn(rsp_dict, "scrub_log_file", SLEN("scrub_log_file"), +                        &scrub_log); +    if (!ret) { +        ret = dict_set_dynstr_with_alloc(aggr, "scrub_log_file", scrub_log);          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to get volname"); -                goto out; +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrubber log file location"); +            goto out;          } +    } -        ret = glusterd_volinfo_find (volname, &volinfo); +    ret = dict_get_strn(rsp_dict, "features.scrub-freq", +                        SLEN("features.scrub-freq"), &scrub_freq); +    if (!ret) { +        ret = dict_set_dynstr_with_alloc(aggr, "features.scrub-freq", +                                         scrub_freq);          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_VOLINFO_GET_FAIL, -                        "Failed to get volinfo for volume: %s", -                        volname); -                goto out; -        } - - -        if (volinfo->type == GF_CLUSTER_TYPE_TIER) { -                ret = dict_get_int32n (rsp_dict, "hot_brick_count", -                                       SLEN ("hot_brick_count"), -                                       &hot_brick_count); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_ERROR, errno, -                                GD_MSG_DICT_GET_FAILED, -                                "Failed to get hot brick count from rsp_dict"); -                        goto out; -                } - - -                ret = dict_get_int32n (rsp_dict, "type", SLEN ("type"), -                                       &type); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_ERROR, errno, -                                GD_MSG_DICT_GET_FAILED, -                                "Failed to get type from rsp_dict"); -                        goto out; -                } - - +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub-frequency value to dictionary"); +            goto out;          } +    } -        ret = dict_set_int32n (ctx_dict, "hot_brick_count", -                               SLEN ("hot_brick_count"), -                               hot_brick_count); +    ret = dict_get_strn(rsp_dict, "features.scrub-throttle", +                        SLEN("features.scrub-throttle"), &scrub_impact); +    if (!ret) { +        ret = dict_set_dynstr_with_alloc(aggr, "features.scrub-throttle", +                                         scrub_impact);          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to update hot_brick_count"); -                goto out; +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub-throttle value to dictionary"); +            goto out;          } +    } -        ret = dict_set_int32n (ctx_dict, "type", SLEN ("type"), type); +    ret = dict_get_strn(rsp_dict, "features.scrub", SLEN("features.scrub"), +                        &scrub_state); +    if (!ret) { +        ret = dict_set_dynstr_with_alloc(aggr, "features.scrub", scrub_state);          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to update type"); -                goto out; +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub state value to dictionary"); +            goto out;          } - -aggregate_tasks: -        /* Tasks are only present for a normal status command for a volume or -         * for an explicit tasks status command for a volume +    } + +    ret = 0; +out: +    return ret; +} + +int +glusterd_bitrot_volume_node_rsp(dict_t *aggr, dict_t *rsp_dict) +{ +    int ret = -1; +    uint64_t value = 0; +    char key[64] = ""; +    int keylen; +    char buf[1024] = ""; +    int32_t i = 0; +    int32_t j = 0; +    char *last_scrub_time = NULL; +    char *scrub_time = NULL; +    char *volname = NULL; +    char *scrub_freq = NULL; +    char *scrub_state = NULL; +    char *scrub_impact = NULL; +    char *bad_gfid_str = NULL; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    int8_t scrub_running = 0; + +    this = THIS; +    GF_ASSERT(this); + +    priv = this->private; +    GF_ASSERT(priv); + +    ret = dict_set_strn(aggr, "bitrot_log_file", SLEN("bitrot_log_file"), +                        priv->bitd_svc.proc.logfile); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set bitrot log file location"); +        goto out; +    } + +    ret = dict_set_strn(aggr, "scrub_log_file", SLEN("scrub_log_file"), +                        priv->scrub_svc.proc.logfile); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set scrubber log file location"); +        goto out; +    } + +    ret = dict_get_strn(aggr, "volname", SLEN("volname"), &volname); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get volume name"); +        goto out; +    } + +    ret = glusterd_volinfo_find(volname, &volinfo); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_VOL_NOT_FOUND, +               "Unable to find volinfo for volume: %s", volname); +        goto out; +    } + +    ret = dict_get_int32n(aggr, "count", SLEN("count"), &i); +    i++; + +    ret = dict_set_int32n(aggr, "count", SLEN("count"), i); +    if (ret) +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set count"); + +    snprintf(buf, sizeof(buf), "%s", uuid_utoa(MY_UUID)); + +    snprintf(key, sizeof(key), "node-uuid-%d", i); +    ret = dict_set_dynstr_with_alloc(aggr, key, buf); +    if (ret) +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to set node-uuid"); + +    ret = dict_get_strn(volinfo->dict, "features.scrub-freq", +                        SLEN("features.scrub-freq"), &scrub_freq); +    if (!ret) { +        ret = dict_set_strn(aggr, "features.scrub-freq", +                            SLEN("features.scrub-freq"), scrub_freq); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub-frequency value to dictionary"); +        } +    } else { +        /* By Default scrub-frequency is bi-weekly. So when user +         * enable bitrot then scrub-frequency value will not be +         * present in volinfo->dict. Setting by-default value of +         * scrub-frequency explicitly for presenting it to scrub +         * status.           */ -        if (!(cmd & GF_CLI_STATUS_ALL) && -            (((cmd & GF_CLI_STATUS_TASKS) != 0) || -             glusterd_status_has_tasks (cmd))) -                ret = glusterd_volume_status_aggregate_tasks_status (ctx_dict, -                                                                     rsp_dict); - -out: -        return ret; -} - -int -glusterd_max_opversion_use_rsp_dict (dict_t *dst, dict_t *src) -{ -        int ret = -1; -        int src_max_opversion = -1; -        int max_opversion = -1; - -        GF_VALIDATE_OR_GOTO (THIS->name, dst, out); -        GF_VALIDATE_OR_GOTO (THIS->name, src, out); - -        ret = dict_get_int32n (dst, "max-opversion", SLEN ("max-opversion"), -                               &max_opversion); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, -                                "Maximum supported op-version not set in destination " -                                "dictionary"); - -        ret = dict_get_int32n (src, "max-opversion", SLEN ("max-opversion"), -                               &src_max_opversion); +        ret = dict_set_dynstr_with_alloc(aggr, "features.scrub-freq", +                                         "biweekly"); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub-frequency value to dictionary"); +        } +    } + +    ret = dict_get_strn(volinfo->dict, "features.scrub-throttle", +                        SLEN("features.scrub-throttle"), &scrub_impact); +    if (!ret) { +        ret = dict_set_strn(aggr, "features.scrub-throttle", +                            SLEN("features.scrub-throttle"), scrub_impact); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub-throttle value to dictionary"); +        } +    } else { +        /* By Default scrub-throttle is lazy. So when user +         * enable bitrot then scrub-throttle value will not be +         * present in volinfo->dict. Setting by-default value of +         * scrub-throttle explicitly for presenting it to +         * scrub status. +         */ +        ret = dict_set_dynstr_with_alloc(aggr, "features.scrub-throttle", +                                         "lazy");          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, -                        "Failed to get maximum supported op-version from source"); -                goto out; +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub-throttle value to dictionary");          } +    } -        if (max_opversion == -1 || src_max_opversion < max_opversion) -                max_opversion = src_max_opversion; - -        ret = dict_set_int32n (dst, "max-opversion", SLEN ("max-opversion"), -                               max_opversion); +    ret = dict_get_strn(volinfo->dict, "features.scrub", SLEN("features.scrub"), +                        &scrub_state); +    if (!ret) { +        ret = dict_set_strn(aggr, "features.scrub", SLEN("features.scrub"), +                            scrub_state);          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, -                                "Failed to set max op-version"); -                goto out; +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub state value to dictionary");          } -out: -        return ret; -} - +    } -int -glusterd_volume_bitrot_scrub_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict) -{ -        int                      ret                = -1; -        int                      j                  = 0; -        uint64_t                 value              = 0; -        char                     key[64]           = ""; -        int                      keylen; -        char                    *last_scrub_time    = NULL; -        char                    *scrub_time         = NULL; -        char                    *volname            = NULL; -        char                    *node_uuid          = NULL; -        char                    *node_uuid_str      = NULL; -        char                    *bitd_log           = NULL; -        char                    *scrub_log          = NULL; -        char                    *scrub_freq         = NULL; -        char                    *scrub_state        = NULL; -        char                    *scrub_impact       = NULL; -        char                    *bad_gfid_str       = NULL; -        xlator_t                *this               = NULL; -        glusterd_conf_t         *priv               = NULL; -        glusterd_volinfo_t      *volinfo            = NULL; -        int                      src_count          = 0; -        int                      dst_count          = 0; -        int8_t                   scrub_running      = 0; - -        this = THIS; -        GF_ASSERT (this); - -        priv = this->private; -        GF_ASSERT (priv); - -        ret = dict_get_strn (aggr, "volname", SLEN ("volname"), &volname); +    ret = dict_get_int8(rsp_dict, "scrub-running", &scrub_running); +    if (!ret) { +        snprintf(key, sizeof(key), "scrub-running-%d", i); +        ret = dict_set_uint64(aggr, key, scrub_running);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, -                        "Unable to get volume name"); -                goto out; +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrub-running value");          } +    } -        ret = glusterd_volinfo_find (volname, &volinfo); +    ret = dict_get_uint64(rsp_dict, "scrubbed-files", &value); +    if (!ret) { +        snprintf(key, sizeof(key), "scrubbed-files-%d", i); +        ret = dict_set_uint64(aggr, key, value);          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_VOL_NOT_FOUND, -                        "Unable to find volinfo for volume: %s", volname); -                goto out; +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrubbed-file value");          } +    } -        ret = dict_get_int32n (aggr, "count", SLEN ("count"), &dst_count); - -        ret = dict_get_int32n (rsp_dict, "count", SLEN ("count"), &src_count); +    ret = dict_get_uint64(rsp_dict, "unsigned-files", &value); +    if (!ret) { +        snprintf(key, sizeof(key), "unsigned-files-%d", i); +        ret = dict_set_uint64(aggr, key, value);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, -                        "failed to get count value"); -                ret = 0; -                goto out; +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "unsigned-file value");          } +    } -        ret = dict_set_int32n (aggr, "count", SLEN ("count"), -                               src_count+dst_count); -        if (ret) -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, -                        "Failed to set count in dictonary"); - -        keylen = snprintf (key, sizeof (key), "node-uuid-%d", src_count); -        ret = dict_get_strn (rsp_dict, key, keylen, &node_uuid); -        if (!ret) { -                node_uuid_str = gf_strdup (node_uuid); -                keylen = snprintf (key, sizeof (key), "node-uuid-%d", -                                   src_count+dst_count); -                ret = dict_set_dynstrn (aggr, key, keylen, node_uuid_str); -                if (ret) { -                        gf_msg_debug (this->name, 0, "failed to set node-uuid"); -                } -        } +    ret = dict_get_strn(rsp_dict, "last-scrub-time", SLEN("last-scrub-time"), +                        &last_scrub_time); +    if (!ret) { +        keylen = snprintf(key, sizeof(key), "last-scrub-time-%d", i); -        snprintf (key, sizeof (key), "scrub-running-%d", src_count); -        ret = dict_get_int8 (rsp_dict, key, &scrub_running); -        if (!ret) { -                snprintf (key, sizeof (key), "scrub-running-%d", src_count+dst_count); -                ret = dict_set_int8 (aggr, key, scrub_running); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrub-running value"); -                } -        } - -        snprintf (key, sizeof (key), "scrubbed-files-%d", src_count); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "scrubbed-files-%d", src_count+dst_count); -                ret = dict_set_uint64 (aggr, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrubbed-file value"); -                } -        } - -        snprintf (key, sizeof (key), "unsigned-files-%d", src_count); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "unsigned-files-%d", src_count+dst_count); -                ret = dict_set_uint64 (aggr, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "unsigned-file value"); -                } -        } - -        keylen = snprintf (key, sizeof (key), "last-scrub-time-%d", -                           src_count); -        ret = dict_get_strn (rsp_dict, key, keylen, &last_scrub_time); -        if (!ret) { -                scrub_time = gf_strdup (last_scrub_time); -                keylen = snprintf (key, sizeof (key), "last-scrub-time-%d", -                                   src_count+dst_count); -                ret = dict_set_dynstrn (aggr, key, keylen, scrub_time); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "last scrub time value"); -                } -        } - -        snprintf (key, sizeof (key), "scrub-duration-%d", src_count); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "scrub-duration-%d", src_count+dst_count); -                ret = dict_set_uint64 (aggr, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrubbed-duration value"); -                } -        } - -        snprintf (key, sizeof (key), "error-count-%d", src_count); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "error-count-%d", src_count+dst_count); -                ret = dict_set_uint64 (aggr, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set error " -                                      "count value"); -                } - -                /* Storing all the bad files in the dictionary */ -                for (j = 0; j < value; j++) { -                        keylen = snprintf (key, sizeof (key), -                                           "quarantine-%d-%d", j, src_count); -                        ret = dict_get_strn (rsp_dict, key, keylen, -                                             &bad_gfid_str); -                        if (!ret) { -                                snprintf (key, sizeof (key), "quarantine-%d-%d", j, -                                          src_count+dst_count); -                                ret = dict_set_dynstr_with_alloc (aggr, key, -                                                                  bad_gfid_str); -                                if (ret) { -                                        gf_msg_debug (this->name, 0, "Failed to" -                                                      "bad file gfid "); -                                } -                        } -                } +        scrub_time = gf_strdup(last_scrub_time); +        ret = dict_set_dynstrn(aggr, key, keylen, scrub_time); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "last scrub time value");          } +    } -        ret = dict_get_strn (rsp_dict, "bitrot_log_file", -                             SLEN ("bitrot_log_file"), &bitd_log); -        if (!ret) { -                ret = dict_set_dynstr_with_alloc (aggr, "bitrot_log_file", -                                                  bitd_log); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "bitrot log file location"); -                        goto out; -                } +    ret = dict_get_uint64(rsp_dict, "scrub-duration", &value); +    if (!ret) { +        snprintf(key, sizeof(key), "scrub-duration-%d", i); +        ret = dict_set_uint64(aggr, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set " +                         "scrubbed-duration value");          } +    } -        ret = dict_get_strn (rsp_dict, "scrub_log_file", -                             SLEN ("scrub_log_file"), &scrub_log); -        if (!ret) { -                ret = dict_set_dynstr_with_alloc (aggr, "scrub_log_file", -                                                  scrub_log); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrubber log file location"); -                        goto out; -                } +    ret = dict_get_uint64(rsp_dict, "total-count", &value); +    if (!ret) { +        snprintf(key, sizeof(key), "error-count-%d", i); +        ret = dict_set_uint64(aggr, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, +                         "Failed to set error " +                         "count value");          } -        ret = dict_get_strn (rsp_dict, "features.scrub-freq", -                             SLEN ("features.scrub-freq"), &scrub_freq); -        if (!ret) { -                ret = dict_set_dynstr_with_alloc (aggr, "features.scrub-freq", -                                                  scrub_freq); +        /* Storing all the bad files in the dictionary */ +        for (j = 0; j < value; j++) { +            keylen = snprintf(key, sizeof(key), "quarantine-%d", j); +            ret = dict_get_strn(rsp_dict, key, keylen, &bad_gfid_str); +            if (!ret) { +                snprintf(key, sizeof(key), "quarantine-%d-%d", j, i); +                ret = dict_set_dynstr_with_alloc(aggr, key, bad_gfid_str);                  if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrub-frequency value to dictionary"); -                        goto out; -                } -        } +                    gf_msg_debug(this->name, 0, +                                 "Failed to" +                                 "bad file gfid "); +                } +            } +        } +    } + +    ret = 0; +out: +    return ret; +} + +int +glusterd_volume_rebalance_use_rsp_dict(dict_t *aggr, dict_t *rsp_dict) +{ +    char key[64] = ""; +    int keylen; +    char *node_uuid = NULL; +    char *node_uuid_str = NULL; +    char *volname = NULL; +    dict_t *ctx_dict = NULL; +    double elapsed_time = 0; +    glusterd_conf_t *conf = NULL; +    glusterd_peerinfo_t *peerinfo = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    int ret = 0; +    int32_t index = 0; +    int32_t count = 0; +    int32_t current_index = 2; +    int32_t value32 = 0; +    uint64_t value = 0; +    char *peer_uuid_str = NULL; +    xlator_t *this = NULL; + +    GF_ASSERT(rsp_dict); +    this = THIS; +    GF_ASSERT(this); +    conf = this->private; + +    if (aggr) { +        ctx_dict = aggr; + +    } else { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_OPCTX_GET_FAIL, +               "Operation Context is not present"); +        goto out; +    } + +    ret = dict_get_strn(ctx_dict, "volname", SLEN("volname"), &volname); +    if (ret) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get volume name"); +        goto out; +    } + +    ret = glusterd_volinfo_find(volname, &volinfo); + +    if (ret) +        goto out; + +    ret = dict_get_int32n(rsp_dict, "count", SLEN("count"), &index); +    if (ret) +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "failed to get index"); + +    keylen = snprintf(key, sizeof(key), "node-uuid-%d", index); +    ret = dict_get_strn(rsp_dict, key, keylen, &node_uuid); +    if (!ret) { +        node_uuid_str = gf_strdup(node_uuid); + +        /* Finding the index of the node-uuid in the peer-list */ +        rcu_read_lock(); +        cds_list_for_each_entry_rcu(peerinfo, &conf->peers, uuid_list) +        { +            peer_uuid_str = gd_peer_uuid_str(peerinfo); +            if (strcmp(peer_uuid_str, node_uuid_str) == 0) +                break; -        ret = dict_get_strn (rsp_dict, "features.scrub-throttle", -                             SLEN ("features.scrub-throttle"), &scrub_impact); -        if (!ret) { -                ret = dict_set_dynstr_with_alloc (aggr, -                                                  "features.scrub-throttle", -                                                  scrub_impact); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrub-throttle value to dictionary"); -                        goto out; -                } +            current_index++;          } +        rcu_read_unlock(); -        ret = dict_get_strn (rsp_dict, "features.scrub", -                             SLEN ("features.scrub"), &scrub_state); -        if (!ret) { -                ret = dict_set_dynstr_with_alloc (aggr, "features.scrub", -                                                  scrub_state); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrub state value to dictionary"); -                        goto out; -                } +        /* Setting the largest index value as the total count. */ +        ret = dict_get_int32n(ctx_dict, "count", SLEN("count"), &count); +        if (count < current_index) { +            ret = dict_set_int32n(ctx_dict, "count", SLEN("count"), +                                  current_index); +            if (ret) +                gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                       "Failed to set count");          } -        ret = 0; -out: -        return ret; -} - -int -glusterd_bitrot_volume_node_rsp (dict_t *aggr, dict_t *rsp_dict) -{ -        int                      ret                = -1; -        uint64_t                 value              = 0; -        char                     key[64]           = ""; -        int                      keylen; -        char                     buf[1024]          = ""; -        int32_t                  i                  = 0; -        int32_t                  j                  = 0; -        char                    *last_scrub_time    = NULL; -        char                    *scrub_time         = NULL; -        char                    *volname            = NULL; -        char                    *scrub_freq         = NULL; -        char                    *scrub_state        = NULL; -        char                    *scrub_impact       = NULL; -        char                    *bad_gfid_str       = NULL; -        xlator_t                *this               = NULL; -        glusterd_conf_t         *priv               = NULL; -        glusterd_volinfo_t      *volinfo            = NULL; -        int8_t                   scrub_running      = 0; - -        this = THIS; -        GF_ASSERT (this); - -        priv = this->private; -        GF_ASSERT (priv); - -        ret = dict_set_strn (aggr, "bitrot_log_file", -                             SLEN ("bitrot_log_file"), -                             priv->bitd_svc.proc.logfile); +        /* Setting the same index for the node, as is in the peerlist.*/ +        keylen = snprintf(key, sizeof(key), "node-uuid-%d", current_index); +        ret = dict_set_dynstrn(ctx_dict, key, keylen, node_uuid_str);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, -                        "Failed to set bitrot log file location"); -                goto out; +            gf_msg_debug(THIS->name, 0, "failed to set node-uuid");          } +    } -        ret = dict_set_strn (aggr, "scrub_log_file", SLEN ("scrub_log_file"), -                             priv->scrub_svc.proc.logfile); +    snprintf(key, sizeof(key), "files-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "files-%d", current_index); +        ret = dict_set_uint64(ctx_dict, key, value);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, -                        "Failed to set scrubber log file location"); -                goto out; +            gf_msg_debug(THIS->name, 0, "failed to set the file count");          } +    } -        ret = dict_get_strn (aggr, "volname", SLEN ("volname"), &volname); +    snprintf(key, sizeof(key), "size-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "size-%d", current_index); +        ret = dict_set_uint64(ctx_dict, key, value);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, -                        "Unable to get volume name"); -                goto out; +            gf_msg_debug(THIS->name, 0, "failed to set the size of migration");          } +    } -        ret = glusterd_volinfo_find (volname, &volinfo); +    snprintf(key, sizeof(key), "lookups-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "lookups-%d", current_index); +        ret = dict_set_uint64(ctx_dict, key, value);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_VOL_NOT_FOUND, -                        "Unable to find volinfo for volume: %s", volname); -                goto out; -        } - -        ret = dict_get_int32n (aggr, "count", SLEN ("count"), &i); -        i++; - -        ret = dict_set_int32n (aggr, "count", SLEN ("count"), i); -        if (ret) -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, -                        "Failed to set count"); - -        snprintf (buf, sizeof (buf), "%s", uuid_utoa (MY_UUID)); - -        snprintf (key, sizeof (key), "node-uuid-%d", i); -        ret = dict_set_dynstr_with_alloc (aggr, key, buf); -        if (ret) -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, -                        "failed to set node-uuid"); - -        ret = dict_get_strn (volinfo->dict, "features.scrub-freq", -                             SLEN ("features.scrub-freq"), &scrub_freq); -        if (!ret) { -                ret = dict_set_strn (aggr, "features.scrub-freq", -                                     SLEN ("features.scrub-freq"), -                                     scrub_freq); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrub-frequency value to dictionary"); -                } -        } else { -                /* By Default scrub-frequency is bi-weekly. So when user -                 * enable bitrot then scrub-frequency value will not be -                 * present in volinfo->dict. Setting by-default value of -                 * scrub-frequency explicitly for presenting it to scrub -                 * status. -                 */ -                 ret = dict_set_dynstr_with_alloc (aggr, "features.scrub-freq", -                                                   "biweekly"); -                 if (ret) { -                         gf_msg_debug (this->name, 0, "Failed to set " -                                       "scrub-frequency value to dictionary"); -                 } -        } - -        ret = dict_get_strn (volinfo->dict, "features.scrub-throttle", -                             SLEN ("features.scrub-throttle"), -                             &scrub_impact); -        if (!ret) { -                ret = dict_set_strn (aggr, "features.scrub-throttle", -                                     SLEN ("features.scrub-throttle"), -                                     scrub_impact); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrub-throttle value to dictionary"); -                } -        } else { -                /* By Default scrub-throttle is lazy. So when user -                 * enable bitrot then scrub-throttle value will not be -                 * present in volinfo->dict. Setting by-default value of -                 * scrub-throttle explicitly for presenting it to -                 * scrub status. -                 */ -                 ret = dict_set_dynstr_with_alloc (aggr, -                                                   "features.scrub-throttle", -                                                   "lazy"); -                 if (ret) { -                         gf_msg_debug (this->name, 0, "Failed to set " -                                       "scrub-throttle value to dictionary"); -                 } -        } - -        ret = dict_get_strn (volinfo->dict, "features.scrub", -                             SLEN ("features.scrub"), &scrub_state); -        if (!ret) { -                ret = dict_set_strn (aggr, "features.scrub", -                                     SLEN ("features.scrub"), scrub_state); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrub state value to dictionary"); -                } -        } - -        ret = dict_get_int8 (rsp_dict, "scrub-running", &scrub_running); -        if (!ret) { -                snprintf (key, sizeof (key), "scrub-running-%d", i); -                ret = dict_set_uint64 (aggr, key, scrub_running); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrub-running value"); -                } -        } - -        ret = dict_get_uint64 (rsp_dict, "scrubbed-files", &value); -        if (!ret) { -                snprintf (key, sizeof (key), "scrubbed-files-%d", i); -                ret = dict_set_uint64 (aggr, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrubbed-file value"); -                } -        } - -        ret = dict_get_uint64 (rsp_dict, "unsigned-files", &value); -        if (!ret) { -                snprintf (key, sizeof (key), "unsigned-files-%d", i); -                ret = dict_set_uint64 (aggr, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "unsigned-file value"); -                } -        } - -        ret = dict_get_strn (rsp_dict, "last-scrub-time", -                             SLEN ("last-scrub-time"), &last_scrub_time); -        if (!ret) { -                keylen = snprintf (key, sizeof (key), -                                   "last-scrub-time-%d", i); - -                scrub_time = gf_strdup (last_scrub_time); -                ret = dict_set_dynstrn (aggr, key, keylen, scrub_time); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "last scrub time value"); -                } -        } - -        ret = dict_get_uint64 (rsp_dict, "scrub-duration", &value); -        if (!ret) { -                snprintf (key, sizeof (key), "scrub-duration-%d", i); -                ret = dict_set_uint64 (aggr, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set " -                                      "scrubbed-duration value"); -                } -        } - -        ret = dict_get_uint64 (rsp_dict, "total-count", &value); -        if (!ret) { -                snprintf (key, sizeof (key), "error-count-%d", i); -                ret = dict_set_uint64 (aggr, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, "Failed to set error " -                                      "count value"); -                } - -                /* Storing all the bad files in the dictionary */ -                for (j = 0; j < value; j++) { -                        keylen = snprintf (key, sizeof (key), "quarantine-%d", -                                           j); -                        ret = dict_get_strn (rsp_dict, key, keylen, -                                             &bad_gfid_str); -                        if (!ret) { -                                snprintf (key, sizeof (key), -                                          "quarantine-%d-%d", j, i); -                                ret = dict_set_dynstr_with_alloc (aggr, key, -                                                                  bad_gfid_str); -                                if (ret) { -                                        gf_msg_debug (this->name, 0, "Failed to" -                                                      "bad file gfid "); -                                } -                        } -                } -        } - -        ret = 0; -out: -        return ret; -} - -int -glusterd_volume_rebalance_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict) -{ -        char                 key[64]      = ""; -        int                  keylen; -        char                *node_uuid     = NULL; -        char                *node_uuid_str = NULL; -        char                *volname       = NULL; -        dict_t              *ctx_dict      = NULL; -        double               elapsed_time  = 0; -        glusterd_conf_t     *conf          = NULL; -        glusterd_peerinfo_t *peerinfo      = NULL; -        glusterd_volinfo_t  *volinfo       = NULL; -        int                  ret           = 0; -        int32_t              index         = 0; -        int32_t              count         = 0; -        int32_t              current_index = 2; -        int32_t              value32       = 0; -        uint64_t             value         = 0; -        char                *peer_uuid_str = NULL; -        xlator_t            *this           = NULL; - -        GF_ASSERT (rsp_dict); -        this = THIS; -        GF_ASSERT (this); -        conf = this->private; - -        if (aggr) { -                ctx_dict = aggr; - -        } else { -                 gf_msg (this->name, GF_LOG_ERROR, 0, -                         GD_MSG_OPCTX_GET_FAIL, -                         "Operation Context is not present"); -                goto out; +            gf_msg_debug(THIS->name, 0, "failed to set looked up file count");          } +    } - -        ret = dict_get_strn (ctx_dict, "volname", SLEN ("volname"), &volname); +    keylen = snprintf(key, sizeof(key), "status-%d", index); +    ret = dict_get_int32n(rsp_dict, key, keylen, &value32); +    if (!ret) { +        keylen = snprintf(key, sizeof(key), "status-%d", current_index); +        ret = dict_set_int32n(ctx_dict, key, keylen, value32);          if (ret) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Unable to get volume name"); -                goto out; -        } - -        ret  = glusterd_volinfo_find (volname, &volinfo); - -        if (ret) -                goto out; - -        ret = dict_get_int32n (rsp_dict, "count", SLEN ("count"), &index); -        if (ret) -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "failed to get index"); - -        keylen = snprintf (key, sizeof (key), "node-uuid-%d", index); -        ret = dict_get_strn (rsp_dict, key, keylen, &node_uuid); -        if (!ret) { -                node_uuid_str = gf_strdup (node_uuid); - -                /* Finding the index of the node-uuid in the peer-list */ -                rcu_read_lock (); -                cds_list_for_each_entry_rcu (peerinfo, &conf->peers, -                                             uuid_list) { -                        peer_uuid_str = gd_peer_uuid_str (peerinfo); -                        if (strcmp (peer_uuid_str, node_uuid_str) == 0) -                                break; - -                        current_index++; -                } -                rcu_read_unlock (); - -                /* Setting the largest index value as the total count. */ -                ret = dict_get_int32n (ctx_dict, "count", SLEN ("count"), -                                       &count); -                if (count < current_index) { -                        ret = dict_set_int32n (ctx_dict, "count", -                                               SLEN ("count"), current_index); -                        if (ret) -                                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                            GD_MSG_DICT_SET_FAILED, -                                            "Failed to set count"); -                } - -                /* Setting the same index for the node, as is in the peerlist.*/ -                keylen = snprintf (key, sizeof (key), "node-uuid-%d", -                                   current_index); -                ret = dict_set_dynstrn (ctx_dict, key, keylen, node_uuid_str); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set node-uuid"); -                } -        } - -        snprintf (key, sizeof (key), "files-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "files-%d", current_index); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set the file count"); -                } -        } - -        snprintf (key, sizeof (key), "size-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "size-%d", current_index); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set the size of migration"); -                } +            gf_msg_debug(THIS->name, 0, "failed to set status");          } +    } -        snprintf (key, sizeof (key), "lookups-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "lookups-%d", current_index); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set looked up file count"); -                } -        } - -        keylen = snprintf (key, sizeof (key), "status-%d", index); -        ret = dict_get_int32n (rsp_dict, key, keylen, &value32); -        if (!ret) { -                keylen  = snprintf (key, sizeof (key), "status-%d", -                                    current_index); -                ret = dict_set_int32n (ctx_dict, key, keylen, value32); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set status"); -                } -        } - -        snprintf (key, sizeof (key), "failures-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "failures-%d", current_index); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set failure count"); -                } +    snprintf(key, sizeof(key), "failures-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "failures-%d", current_index); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(THIS->name, 0, "failed to set failure count");          } +    } -        snprintf (key, sizeof (key), "skipped-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "skipped-%d", current_index); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set skipped count"); -                } +    snprintf(key, sizeof(key), "skipped-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "skipped-%d", current_index); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(THIS->name, 0, "failed to set skipped count");          } -        snprintf (key, sizeof (key), "run-time-%d", index); -        ret = dict_get_double (rsp_dict, key, &elapsed_time); -        if (!ret) { -                snprintf (key, sizeof (key), "run-time-%d", current_index); -                ret = dict_set_double (ctx_dict, key, elapsed_time); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set run-time"); -                } +    } +    snprintf(key, sizeof(key), "run-time-%d", index); +    ret = dict_get_double(rsp_dict, key, &elapsed_time); +    if (!ret) { +        snprintf(key, sizeof(key), "run-time-%d", current_index); +        ret = dict_set_double(ctx_dict, key, elapsed_time); +        if (ret) { +            gf_msg_debug(THIS->name, 0, "failed to set run-time");          } +    } -        snprintf (key, sizeof (key), "time-left-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "time-left-%d", current_index); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set time-left"); -                } +    snprintf(key, sizeof(key), "time-left-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "time-left-%d", current_index); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(THIS->name, 0, "failed to set time-left");          } -        snprintf (key, sizeof (key), "demoted-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "demoted-%d", current_index); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set demoted count"); -                } +    } +    snprintf(key, sizeof(key), "demoted-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "demoted-%d", current_index); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(THIS->name, 0, "failed to set demoted count");          } -        snprintf (key, sizeof (key), "promoted-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "promoted-%d", current_index); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set promoted count"); -                } +    } +    snprintf(key, sizeof(key), "promoted-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "promoted-%d", current_index); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(THIS->name, 0, "failed to set promoted count");          } +    } -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_volume_tier_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict) +glusterd_volume_tier_use_rsp_dict(dict_t *aggr, dict_t *rsp_dict)  { -        char                 key[64]      = ""; -        int                  keylen; -        char                *node_uuid     = NULL; -        char                *node_uuid_str = NULL; -        char                *volname       = NULL; -        dict_t              *ctx_dict      = NULL; -        double               elapsed_time  = 0; -        glusterd_volinfo_t  *volinfo       = NULL; -        int                  ret           = 0; -        int32_t              index         = 0; -        int32_t              count         = 0; -        int32_t              value32       = 0; -        uint64_t             value         = 0; -        xlator_t            *this           = NULL; -        char                *task_id_str   = NULL; +    char key[64] = ""; +    int keylen; +    char *node_uuid = NULL; +    char *node_uuid_str = NULL; +    char *volname = NULL; +    dict_t *ctx_dict = NULL; +    double elapsed_time = 0; +    glusterd_volinfo_t *volinfo = NULL; +    int ret = 0; +    int32_t index = 0; +    int32_t count = 0; +    int32_t value32 = 0; +    uint64_t value = 0; +    xlator_t *this = NULL; +    char *task_id_str = NULL; -        this = THIS; -        GF_VALIDATE_OR_GOTO (this->name, this, out); -        GF_VALIDATE_OR_GOTO (this->name, rsp_dict, out); +    this = THIS; +    GF_VALIDATE_OR_GOTO(this->name, this, out); +    GF_VALIDATE_OR_GOTO(this->name, rsp_dict, out); -        if (aggr) { -                ctx_dict = aggr; +    if (aggr) { +        ctx_dict = aggr; -        } else { -                 gf_msg (this->name, GF_LOG_ERROR, 0, -                         GD_MSG_OPCTX_GET_FAIL, -                         "Operation Context is not present"); -                goto out; -        } +    } else { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_OPCTX_GET_FAIL, +               "Operation Context is not present"); +        goto out; +    } -        ret = dict_get_strn (ctx_dict, "volname", SLEN ("volname"), &volname); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Unable to get volume name"); -                goto out; -        } +    ret = dict_get_strn(ctx_dict, "volname", SLEN("volname"), &volname); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get volume name"); +        goto out; +    } -        ret  = glusterd_volinfo_find (volname, &volinfo); +    ret = glusterd_volinfo_find(volname, &volinfo); -        if (ret) -                goto out; +    if (ret) +        goto out; -        ret = dict_get_int32n (rsp_dict, "count", SLEN ("count"), &index); -        if (ret) -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "failed to get index"); +    ret = dict_get_int32n(rsp_dict, "count", SLEN("count"), &index); +    if (ret) +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "failed to get index"); -        keylen = snprintf (key, sizeof (key), "node-uuid-%d", index); -        ret = dict_get_strn (rsp_dict, key, keylen, &node_uuid); -        if (!ret) { -                node_uuid_str = gf_strdup (node_uuid); +    keylen = snprintf(key, sizeof(key), "node-uuid-%d", index); +    ret = dict_get_strn(rsp_dict, key, keylen, &node_uuid); +    if (!ret) { +        node_uuid_str = gf_strdup(node_uuid); +    } +    ret = dict_get_int32n(ctx_dict, "count", SLEN("count"), &count); +    count++; +    ret = dict_set_int32n(ctx_dict, "count", SLEN("count"), count); +    if (ret) +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set count"); -        } -        ret = dict_get_int32n (ctx_dict, "count", SLEN ("count"), &count); -        count++; -        ret = dict_set_int32n (ctx_dict, "count", SLEN ("count"), count); -        if (ret) -                gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Failed to set count"); +    keylen = snprintf(key, sizeof(key), "node-uuid-%d", count); +    ret = dict_set_dynstrn(ctx_dict, key, keylen, node_uuid_str); +    if (ret) { +        gf_msg_debug(this->name, 0, "failed to set node-uuid"); +    } -        keylen = snprintf (key, sizeof (key), "node-uuid-%d", count); -        ret = dict_set_dynstrn (ctx_dict, key, keylen, node_uuid_str); +    snprintf(key, sizeof(key), "files-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "files-%d", count); +        ret = dict_set_uint64(ctx_dict, key, value);          if (ret) { -                gf_msg_debug (this->name, 0, -                                "failed to set node-uuid"); -        } - -        snprintf (key, sizeof (key), "files-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "files-%d", count); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, -                                "failed to set the file count"); -                } +            gf_msg_debug(this->name, 0, "failed to set the file count");          } +    } -        snprintf (key, sizeof (key), "size-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "size-%d", count); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, -                                "failed to set the size of migration"); -                } -        } - -        snprintf (key, sizeof (key), "lookups-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "lookups-%d", count); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, -                                "failed to set looked up file count"); -                } +    snprintf(key, sizeof(key), "size-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "size-%d", count); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, "failed to set the size of migration");          } +    } -        keylen = snprintf (key, sizeof (key), "status-%d", index); -        ret = dict_get_int32n (rsp_dict, key, keylen, &value32); -        if (!ret) { -                keylen = snprintf (key, sizeof (key), "status-%d", count); -                ret = dict_set_int32n (ctx_dict, key, keylen, value32); -                if (ret) { -                        gf_msg_debug (this->name, 0, -                                "failed to set status"); -                } +    snprintf(key, sizeof(key), "lookups-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "lookups-%d", count); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, "failed to set looked up file count");          } +    } -        snprintf (key, sizeof (key), "failures-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "failures-%d", count); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, -                                "failed to set failure count"); -                } +    keylen = snprintf(key, sizeof(key), "status-%d", index); +    ret = dict_get_int32n(rsp_dict, key, keylen, &value32); +    if (!ret) { +        keylen = snprintf(key, sizeof(key), "status-%d", count); +        ret = dict_set_int32n(ctx_dict, key, keylen, value32); +        if (ret) { +            gf_msg_debug(this->name, 0, "failed to set status"); +        } +    } + +    snprintf(key, sizeof(key), "failures-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "failures-%d", count); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, "failed to set failure count");          } +    } -        snprintf (key, sizeof (key), "skipped-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "skipped-%d", count); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, -                                "failed to set skipped count"); -                } +    snprintf(key, sizeof(key), "skipped-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "skipped-%d", count); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, "failed to set skipped count");          } -        snprintf (key, sizeof (key), "run-time-%d", index); -        ret = dict_get_double (rsp_dict, key, &elapsed_time); -        if (!ret) { -                snprintf (key, sizeof (key), "run-time-%d", count); -                ret = dict_set_double (ctx_dict, key, elapsed_time); -                if (ret) { -                        gf_msg_debug (this->name, 0, -                                "failed to set run-time"); -                } +    } +    snprintf(key, sizeof(key), "run-time-%d", index); +    ret = dict_get_double(rsp_dict, key, &elapsed_time); +    if (!ret) { +        snprintf(key, sizeof(key), "run-time-%d", count); +        ret = dict_set_double(ctx_dict, key, elapsed_time); +        if (ret) { +            gf_msg_debug(this->name, 0, "failed to set run-time");          } +    } -        snprintf (key, sizeof (key), "demoted-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "demoted-%d", count); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, -                                "failed to set demoted count"); -                } -        } -        snprintf (key, sizeof (key), "promoted-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "promoted-%d", count); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (this->name, 0, -                                "failed to set promoted count"); -                } +    snprintf(key, sizeof(key), "demoted-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "demoted-%d", count); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, "failed to set demoted count");          } - -        snprintf (key, sizeof (key), "time-left-%d", index); -        ret = dict_get_uint64 (rsp_dict, key, &value); -        if (!ret) { -                snprintf (key, sizeof (key), "time-left-%d", count); -                ret = dict_set_uint64 (ctx_dict, key, value); -                if (ret) { -                        gf_msg_debug (THIS->name, 0, -                                "failed to set time-left"); -                } +    } +    snprintf(key, sizeof(key), "promoted-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "promoted-%d", count); +        ret = dict_set_uint64(ctx_dict, key, value); +        if (ret) { +            gf_msg_debug(this->name, 0, "failed to set promoted count");          } +    } -        ret = dict_get_strn (rsp_dict, GF_REMOVE_BRICK_TID_KEY, -                             SLEN (GF_REMOVE_BRICK_TID_KEY), -                             &task_id_str); +    snprintf(key, sizeof(key), "time-left-%d", index); +    ret = dict_get_uint64(rsp_dict, key, &value); +    if (!ret) { +        snprintf(key, sizeof(key), "time-left-%d", count); +        ret = dict_set_uint64(ctx_dict, key, value);          if (ret) { -                gf_msg_debug (this->name, errno, -                                "Missing remove-brick-id"); -        } else { -                ret = dict_set_strn (ctx_dict, GF_REMOVE_BRICK_TID_KEY, -                                     SLEN (GF_REMOVE_BRICK_TID_KEY), -                                     task_id_str); -                if (ret) -                        gf_msg_debug (this->name, errno, -                                      "Failed to set remove brick task ID"); +            gf_msg_debug(THIS->name, 0, "failed to set time-left");          } +    } -        ret = 0; +    ret = dict_get_strn(rsp_dict, GF_REMOVE_BRICK_TID_KEY, +                        SLEN(GF_REMOVE_BRICK_TID_KEY), &task_id_str); +    if (ret) { +        gf_msg_debug(this->name, errno, "Missing remove-brick-id"); +    } else { +        ret = dict_set_strn(ctx_dict, GF_REMOVE_BRICK_TID_KEY, +                            SLEN(GF_REMOVE_BRICK_TID_KEY), task_id_str); +        if (ret) +            gf_msg_debug(this->name, errno, +                         "Failed to set remove brick task ID"); +    } + +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_sys_exec_output_rsp_dict (dict_t *dst, dict_t *src) +glusterd_sys_exec_output_rsp_dict(dict_t *dst, dict_t *src)  { -        char           output_name[64] = ""; -        char          *output = NULL; -        int            ret      = 0; -        int            i      = 0; -        int            keylen; -        int            src_output_count      = 0; -        int            dst_output_count      = 0; +    char output_name[64] = ""; +    char *output = NULL; +    int ret = 0; +    int i = 0; +    int keylen; +    int src_output_count = 0; +    int dst_output_count = 0; -        if (!dst || !src) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_EMPTY, -                        "Source or Destination " -                        "dict is empty."); -                goto out; -        } +    if (!dst || !src) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_EMPTY, +               "Source or Destination " +               "dict is empty."); +        goto out; +    } + +    ret = dict_get_int32n(dst, "output_count", SLEN("output_count"), +                          &dst_output_count); -        ret = dict_get_int32n (dst, "output_count", SLEN ("output_count"), -                               &dst_output_count); +    ret = dict_get_int32n(src, "output_count", SLEN("output_count"), +                          &src_output_count); +    if (ret) { +        gf_msg_debug("glusterd", 0, "No output from source"); +        ret = 0; +        goto out; +    } -        ret = dict_get_int32n (src, "output_count", SLEN ("output_count"), -                               &src_output_count); +    for (i = 1; i <= src_output_count; i++) { +        keylen = snprintf(output_name, sizeof(output_name), "output_%d", i); +        if (keylen <= 0 || keylen >= sizeof(output_name)) { +            ret = -1; +            goto out; +        } +        ret = dict_get_strn(src, output_name, keylen, &output);          if (ret) { -                gf_msg_debug ("glusterd", 0, "No output from source"); -                ret = 0; -                goto out; +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                   "Unable to fetch %s", output_name); +            goto out;          } -        for (i = 1; i <= src_output_count; i++) { -                keylen = snprintf (output_name, sizeof(output_name), -                                   "output_%d", i); -                if (keylen <= 0 || keylen >= sizeof (output_name)) { -                        ret = -1; -                        goto out; -                } -                ret = dict_get_strn (src, output_name, keylen, &output); -                if (ret) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_DICT_GET_FAILED, -                                "Unable to fetch %s", -                                output_name); -                        goto out; -                } - -                keylen = snprintf (output_name, sizeof(output_name), -                                   "output_%d", i+dst_output_count); -                if (keylen <= 0 || keylen >= sizeof (output_name)) { -                        ret = -1; -                        goto out; -                } +        keylen = snprintf(output_name, sizeof(output_name), "output_%d", +                          i + dst_output_count); +        if (keylen <= 0 || keylen >= sizeof(output_name)) { +            ret = -1; +            goto out; +        } -                ret = dict_set_dynstrn (dst, output_name, keylen, -                                        gf_strdup (output)); -                if (ret) { -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Unable to set %s", -                                output_name); -                        goto out; -                } +        ret = dict_set_dynstrn(dst, output_name, keylen, gf_strdup(output)); +        if (ret) { +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Unable to set %s", output_name); +            goto out;          } +    } -        ret = dict_set_int32n (dst, "output_count", SLEN ("output_count"), -                              dst_output_count+src_output_count); +    ret = dict_set_int32n(dst, "output_count", SLEN("output_count"), +                          dst_output_count + src_output_count);  out: -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  int -glusterd_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict) +glusterd_use_rsp_dict(dict_t *aggr, dict_t *rsp_dict)  { -        int            ret      = 0; +    int ret = 0; -        GF_ASSERT (aggr); -        GF_ASSERT (rsp_dict); +    GF_ASSERT(aggr); +    GF_ASSERT(rsp_dict); -        if (!aggr) -                goto out; -        dict_copy (rsp_dict, aggr); +    if (!aggr) +        goto out; +    dict_copy(rsp_dict, aggr);  out: -        return ret; +    return ret;  }  int -glusterd_volume_heal_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict) +glusterd_volume_heal_use_rsp_dict(dict_t *aggr, dict_t *rsp_dict)  { -        int                 ret         = 0; -        dict_t             *ctx_dict    = NULL; -        uuid_t             *txn_id      = NULL; -        glusterd_op_info_t  txn_op_info = {{0},}; -        glusterd_op_t       op          = GD_OP_NONE; +    int ret = 0; +    dict_t *ctx_dict = NULL; +    uuid_t *txn_id = NULL; +    glusterd_op_info_t txn_op_info = { +        {0}, +    }; +    glusterd_op_t op = GD_OP_NONE; -        GF_ASSERT (rsp_dict); +    GF_ASSERT(rsp_dict); -        ret = dict_get_bin (aggr, "transaction_id", (void **)&txn_id); -        if (ret) -                goto out; -        gf_msg_debug (THIS->name, 0, "transaction ID = %s", -                uuid_utoa (*txn_id)); +    ret = dict_get_bin(aggr, "transaction_id", (void **)&txn_id); +    if (ret) +        goto out; +    gf_msg_debug(THIS->name, 0, "transaction ID = %s", uuid_utoa(*txn_id)); -        ret = glusterd_get_txn_opinfo (txn_id, &txn_op_info); -        if (ret) { -                gf_msg_callingfn (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_TRANS_OPINFO_GET_FAIL, -                        "Unable to get transaction opinfo " -                        "for transaction ID : %s", -                        uuid_utoa (*txn_id)); -                goto out; -        } +    ret = glusterd_get_txn_opinfo(txn_id, &txn_op_info); +    if (ret) { +        gf_msg_callingfn(THIS->name, GF_LOG_ERROR, 0, +                         GD_MSG_TRANS_OPINFO_GET_FAIL, +                         "Unable to get transaction opinfo " +                         "for transaction ID : %s", +                         uuid_utoa(*txn_id)); +        goto out; +    } -        op = txn_op_info.op; -        GF_ASSERT (GD_OP_HEAL_VOLUME == op); +    op = txn_op_info.op; +    GF_ASSERT(GD_OP_HEAL_VOLUME == op); -        if (aggr) { -                ctx_dict = aggr; +    if (aggr) { +        ctx_dict = aggr; -        } else { -                ctx_dict = txn_op_info.op_ctx; -        } +    } else { +        ctx_dict = txn_op_info.op_ctx; +    } -        if (!ctx_dict) -                goto out; -        dict_copy (rsp_dict, ctx_dict); +    if (!ctx_dict) +        goto out; +    dict_copy(rsp_dict, ctx_dict);  out: -        return ret; +    return ret;  }  int -_profile_volume_add_brick_rsp (dict_t *this, char *key, data_t *value, -                             void *data) -{ -        char    new_key[256] = ""; -        int     keylen; -        glusterd_pr_brick_rsp_conv_t *rsp_ctx = NULL; -        data_t  *new_value = NULL; - -        rsp_ctx = data; -        new_value = data_copy (value); -        GF_ASSERT (new_value); -        keylen = snprintf (new_key, sizeof (new_key), "%d-%s", -                           rsp_ctx->count, key); -        dict_setn (rsp_ctx->dict, new_key, keylen, new_value); -        return 0; -} - -int -glusterd_volume_quota_copy_to_op_ctx_dict (dict_t *dict, dict_t *rsp_dict) +_profile_volume_add_brick_rsp(dict_t *this, char *key, data_t *value, +                              void *data)  { -        int        ret            = -1; -        int        i              = 0; -        int        count          = 0; -        int        rsp_dict_count = 0; -        char      *uuid_str       = NULL; -        char      *uuid_str_dup   = NULL; -        char       key[64]       = ""; -        int        keylen; -        xlator_t  *this           = NULL; -        int        type           = GF_QUOTA_OPTION_TYPE_NONE; - -        this = THIS; -        GF_ASSERT (this); - -        ret = dict_get_int32n (dict, "type", SLEN ("type"), &type); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get quota opcode"); -                goto out; +    char new_key[256] = ""; +    int keylen; +    glusterd_pr_brick_rsp_conv_t *rsp_ctx = NULL; +    data_t *new_value = NULL; + +    rsp_ctx = data; +    new_value = data_copy(value); +    GF_ASSERT(new_value); +    keylen = snprintf(new_key, sizeof(new_key), "%d-%s", rsp_ctx->count, key); +    dict_setn(rsp_ctx->dict, new_key, keylen, new_value); +    return 0; +} + +int +glusterd_volume_quota_copy_to_op_ctx_dict(dict_t *dict, dict_t *rsp_dict) +{ +    int ret = -1; +    int i = 0; +    int count = 0; +    int rsp_dict_count = 0; +    char *uuid_str = NULL; +    char *uuid_str_dup = NULL; +    char key[64] = ""; +    int keylen; +    xlator_t *this = NULL; +    int type = GF_QUOTA_OPTION_TYPE_NONE; + +    this = THIS; +    GF_ASSERT(this); + +    ret = dict_get_int32n(dict, "type", SLEN("type"), &type); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get quota opcode"); +        goto out; +    } + +    if ((type != GF_QUOTA_OPTION_TYPE_LIMIT_USAGE) && +        (type != GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS) && +        (type != GF_QUOTA_OPTION_TYPE_REMOVE) && +        (type != GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS)) { +        dict_copy(rsp_dict, dict); +        ret = 0; +        goto out; +    } + +    ret = dict_get_int32n(rsp_dict, "count", SLEN("count"), &rsp_dict_count); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get the count of " +               "gfids from the rsp dict"); +        goto out; +    } + +    ret = dict_get_int32n(dict, "count", SLEN("count"), &count); +    if (ret) +        /* The key "count" is absent in op_ctx when this function is +         * called after self-staging on the originator. This must not +         * be treated as error. +         */ +        gf_msg_debug(this->name, 0, +                     "Failed to get count of gfids" +                     " from req dict. This could be because count is not yet" +                     " copied from rsp_dict into op_ctx"); + +    for (i = 0; i < rsp_dict_count; i++) { +        keylen = snprintf(key, sizeof(key), "gfid%d", i); +        ret = dict_get_strn(rsp_dict, key, keylen, &uuid_str); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                   "Failed to get gfid " +                   "from rsp dict"); +            goto out;          } -        if ((type != GF_QUOTA_OPTION_TYPE_LIMIT_USAGE) && -            (type != GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS) && -            (type != GF_QUOTA_OPTION_TYPE_REMOVE) && -            (type != GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS)) { -                dict_copy (rsp_dict, dict); -                ret = 0; -                goto out; +        uuid_str_dup = gf_strdup(uuid_str); +        if (!uuid_str_dup) { +            ret = -1; +            goto out;          } -        ret = dict_get_int32n (rsp_dict, "count", SLEN ("count"), -                               &rsp_dict_count); +        keylen = snprintf(key, sizeof(key), "gfid%d", i + count); +        ret = dict_set_dynstrn(dict, key, keylen, uuid_str_dup);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get the count of " -                        "gfids from the rsp dict"); -                goto out; -        } - -        ret = dict_get_int32n (dict, "count", SLEN ("count"), &count); -        if (ret) -                /* The key "count" is absent in op_ctx when this function is -                 * called after self-staging on the originator. This must not -                 * be treated as error. -                 */ -                gf_msg_debug (this->name, 0, "Failed to get count of gfids" -                        " from req dict. This could be because count is not yet" -                        " copied from rsp_dict into op_ctx"); - -        for (i = 0; i < rsp_dict_count; i++) { -                keylen = snprintf (key, sizeof (key), "gfid%d", i); -                ret = dict_get_strn (rsp_dict, key, keylen, &uuid_str); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_GET_FAILED, -                                "Failed to get gfid " -                                "from rsp dict"); -                        goto out; -                } - -                uuid_str_dup = gf_strdup (uuid_str); -                if (!uuid_str_dup) { -                        ret = -1; -                        goto out; -                } - -                keylen = snprintf (key, sizeof (key), "gfid%d", i + count); -                ret = dict_set_dynstrn (dict, key, keylen, uuid_str_dup); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Failed to set gfid " -                                "from rsp dict into req dict"); -                        GF_FREE (uuid_str_dup); -                        goto out; -                } +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Failed to set gfid " +                   "from rsp dict into req dict"); +            GF_FREE(uuid_str_dup); +            goto out;          } +    } -        ret = dict_set_int32n (dict, "count", SLEN ("count"), -                               rsp_dict_count + count); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to set aggregated " -                        "count in req dict"); -                goto out; -        } +    ret = dict_set_int32n(dict, "count", SLEN("count"), rsp_dict_count + count); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set aggregated " +               "count in req dict"); +        goto out; +    }  out: -        return ret; +    return ret;  }  int -glusterd_profile_volume_brick_rsp (void *pending_entry, -                                   dict_t *rsp_dict, dict_t *op_ctx, -                                   char **op_errstr, gd_node_type type) +glusterd_profile_volume_brick_rsp(void *pending_entry, dict_t *rsp_dict, +                                  dict_t *op_ctx, char **op_errstr, +                                  gd_node_type type)  { -        int                             ret = 0; -        glusterd_pr_brick_rsp_conv_t    rsp_ctx = {0}; -        int32_t                         count = 0; -        char                            brick[PATH_MAX+1024] = ""; -        char                            key[64] = ""; -        int                             keylen; -        char                            *full_brick = NULL; -        glusterd_brickinfo_t            *brickinfo = NULL; -        xlator_t                        *this = NULL; -        glusterd_conf_t                 *priv = NULL; - -        GF_ASSERT (rsp_dict); -        GF_ASSERT (op_ctx); -        GF_ASSERT (op_errstr); -        GF_ASSERT (pending_entry); - -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); - -        ret = dict_get_int32n (op_ctx, "count", SLEN ("count"), &count); -        if (ret) { -                count = 1; -        } else { -                count++; -        } -        if (type == GD_NODE_BRICK) { -                brickinfo = pending_entry; -                snprintf (brick, sizeof (brick), "%s:%s", brickinfo->hostname, -                          brickinfo->path); -        } else if (type == GD_NODE_NFS) { -                snprintf (brick, sizeof (brick), "%s", uuid_utoa (MY_UUID)); -        } -        full_brick = gf_strdup (brick); -        GF_ASSERT (full_brick); -        keylen = snprintf (key, sizeof (key), "%d-brick", count); -        ret = dict_set_dynstrn (op_ctx, key, keylen, full_brick); - -        rsp_ctx.count = count; -        rsp_ctx.dict = op_ctx; -        dict_foreach (rsp_dict, _profile_volume_add_brick_rsp, &rsp_ctx); -        ret = dict_set_int32n (op_ctx, "count", SLEN ("count"), count); -        return ret; -} - -//input-key: <replica-id>:<child-id>-* -//output-key: <brick-id>-* -int -_heal_volume_add_shd_rsp (dict_t *this, char *key, data_t *value, void *data) -{ -        char                            new_key[256] = ""; -        char                            int_str[16] = ""; -        data_t                          *new_value = NULL; -        char                            *rxl_end = NULL; -        int                             rxl_end_len; -        char                            *rxl_child_end = NULL; -        glusterd_volinfo_t              *volinfo = NULL; -        int                             rxl_id = 0; -        int                             rxl_child_id = 0; -        int                             brick_id = 0; -        int                             int_len = 0; -        int                             ret = 0; -        glusterd_heal_rsp_conv_t        *rsp_ctx = NULL; -        glusterd_brickinfo_t            *brickinfo = NULL; - -        rsp_ctx = data; -        rxl_end = strchr (key, '-'); -        if (!rxl_end) -                goto out; - -        rxl_child_end = strchr (rxl_end + 1, '-'); -        if (!rxl_child_end) -                goto out; - -        rxl_end_len = strlen (rxl_end); -        int_len = strlen (key) - rxl_end_len; -        strncpy (int_str, key, int_len); -        int_str[int_len] = '\0'; - -        ret = gf_string2int (int_str, &rxl_id); -        if (ret) -                goto out; - -        int_len = rxl_end_len - strlen (rxl_child_end) - 1; -        strncpy (int_str, rxl_end + 1, int_len); -        int_str[int_len] = '\0'; - -        ret = gf_string2int (int_str, &rxl_child_id); -        if (ret) -                goto out; +    int ret = 0; +    glusterd_pr_brick_rsp_conv_t rsp_ctx = {0}; +    int32_t count = 0; +    char brick[PATH_MAX + 1024] = ""; +    char key[64] = ""; +    int keylen; +    char *full_brick = NULL; +    glusterd_brickinfo_t *brickinfo = NULL; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; -        volinfo = rsp_ctx->volinfo; -        brick_id = rxl_id * volinfo->replica_count + rxl_child_id; +    GF_ASSERT(rsp_dict); +    GF_ASSERT(op_ctx); +    GF_ASSERT(op_errstr); +    GF_ASSERT(pending_entry); -        if (!strcmp (rxl_child_end, "-status")) { -                brickinfo = glusterd_get_brickinfo_by_position (volinfo, -                                                                brick_id); -                if (!brickinfo) -                        goto out; -                if (!glusterd_is_local_brick (rsp_ctx->this, volinfo, -                                              brickinfo)) -                        goto out; -        } -        new_value = data_copy (value); -        int_len = snprintf (new_key, sizeof (new_key), "%d%s", brick_id, -                            rxl_child_end); -        dict_setn (rsp_ctx->dict, new_key, int_len, new_value); +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); -out: -        return 0; -} +    ret = dict_get_int32n(op_ctx, "count", SLEN("count"), &count); +    if (ret) { +        count = 1; +    } else { +        count++; +    } +    if (type == GD_NODE_BRICK) { +        brickinfo = pending_entry; +        snprintf(brick, sizeof(brick), "%s:%s", brickinfo->hostname, +                 brickinfo->path); +    } else if (type == GD_NODE_NFS) { +        snprintf(brick, sizeof(brick), "%s", uuid_utoa(MY_UUID)); +    } +    full_brick = gf_strdup(brick); +    GF_ASSERT(full_brick); +    keylen = snprintf(key, sizeof(key), "%d-brick", count); +    ret = dict_set_dynstrn(op_ctx, key, keylen, full_brick); + +    rsp_ctx.count = count; +    rsp_ctx.dict = op_ctx; +    dict_foreach(rsp_dict, _profile_volume_add_brick_rsp, &rsp_ctx); +    ret = dict_set_int32n(op_ctx, "count", SLEN("count"), count); +    return ret; +} + +// input-key: <replica-id>:<child-id>-* +// output-key: <brick-id>-* +int +_heal_volume_add_shd_rsp(dict_t *this, char *key, data_t *value, void *data) +{ +    char new_key[256] = ""; +    char int_str[16] = ""; +    data_t *new_value = NULL; +    char *rxl_end = NULL; +    int rxl_end_len; +    char *rxl_child_end = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    int rxl_id = 0; +    int rxl_child_id = 0; +    int brick_id = 0; +    int int_len = 0; +    int ret = 0; +    glusterd_heal_rsp_conv_t *rsp_ctx = NULL; +    glusterd_brickinfo_t *brickinfo = NULL; + +    rsp_ctx = data; +    rxl_end = strchr(key, '-'); +    if (!rxl_end) +        goto out; + +    rxl_child_end = strchr(rxl_end + 1, '-'); +    if (!rxl_child_end) +        goto out; + +    rxl_end_len = strlen(rxl_end); +    int_len = strlen(key) - rxl_end_len; +    strncpy(int_str, key, int_len); +    int_str[int_len] = '\0'; + +    ret = gf_string2int(int_str, &rxl_id); +    if (ret) +        goto out; + +    int_len = rxl_end_len - strlen(rxl_child_end) - 1; +    strncpy(int_str, rxl_end + 1, int_len); +    int_str[int_len] = '\0'; + +    ret = gf_string2int(int_str, &rxl_child_id); +    if (ret) +        goto out; + +    volinfo = rsp_ctx->volinfo; +    brick_id = rxl_id * volinfo->replica_count + rxl_child_id; + +    if (!strcmp(rxl_child_end, "-status")) { +        brickinfo = glusterd_get_brickinfo_by_position(volinfo, brick_id); +        if (!brickinfo) +            goto out; +        if (!glusterd_is_local_brick(rsp_ctx->this, volinfo, brickinfo)) +            goto out; +    } +    new_value = data_copy(value); +    int_len = snprintf(new_key, sizeof(new_key), "%d%s", brick_id, +                       rxl_child_end); +    dict_setn(rsp_ctx->dict, new_key, int_len, new_value); + +out: +    return 0; +} + +int +_heal_volume_add_shd_rsp_of_statistics(dict_t *this, char *key, data_t *value, +                                       void *data) +{ +    char new_key[256] = ""; +    char int_str[16] = ""; +    char key_begin_string[128] = ""; +    data_t *new_value = NULL; +    char *rxl_end = NULL; +    int rxl_end_len; +    char *rxl_child_end = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    char *key_begin_str = NULL; +    int key_begin_strlen; +    int rxl_id = 0; +    int rxl_child_id = 0; +    int brick_id = 0; +    int int_len = 0; +    int ret = 0; +    glusterd_heal_rsp_conv_t *rsp_ctx = NULL; +    glusterd_brickinfo_t *brickinfo = NULL; -int -_heal_volume_add_shd_rsp_of_statistics (dict_t *this, char *key, data_t -                                             *value, void *data) -{ -        char                            new_key[256] = ""; -        char                            int_str[16] = ""; -        char                            key_begin_string[128] = ""; -        data_t                          *new_value = NULL; -        char                            *rxl_end = NULL; -        int                             rxl_end_len; -        char                            *rxl_child_end = NULL; -        glusterd_volinfo_t              *volinfo = NULL; -        char                            *key_begin_str = NULL; -        int                             key_begin_strlen; -        int                             rxl_id = 0; -        int                             rxl_child_id = 0; -        int                             brick_id = 0; -        int                             int_len = 0; -        int                             ret = 0; -        glusterd_heal_rsp_conv_t        *rsp_ctx = NULL; -        glusterd_brickinfo_t            *brickinfo = NULL; - -        rsp_ctx = data; -        key_begin_str = strchr (key, '-'); -        if (!key_begin_str) -                goto out; +    rsp_ctx = data; +    key_begin_str = strchr(key, '-'); +    if (!key_begin_str) +        goto out; -        rxl_end = strchr (key_begin_str + 1, '-'); -        if (!rxl_end) -                goto out; +    rxl_end = strchr(key_begin_str + 1, '-'); +    if (!rxl_end) +        goto out; -        rxl_child_end = strchr (rxl_end + 1, '-'); -        if (!rxl_child_end) -                goto out; +    rxl_child_end = strchr(rxl_end + 1, '-'); +    if (!rxl_child_end) +        goto out; -        key_begin_strlen = strlen (key_begin_str); -        int_len = strlen (key) - key_begin_strlen; +    key_begin_strlen = strlen(key_begin_str); +    int_len = strlen(key) - key_begin_strlen; -        strncpy (key_begin_string, key, int_len); -        key_begin_string[int_len] = '\0'; +    strncpy(key_begin_string, key, int_len); +    key_begin_string[int_len] = '\0'; -        rxl_end_len = strlen (rxl_end); -        int_len = key_begin_strlen -  rxl_end_len - 1; -        strncpy (int_str, key_begin_str + 1, int_len); -        int_str[int_len] = '\0'; -        ret = gf_string2int (int_str, &rxl_id); -        if (ret) -                goto out; +    rxl_end_len = strlen(rxl_end); +    int_len = key_begin_strlen - rxl_end_len - 1; +    strncpy(int_str, key_begin_str + 1, int_len); +    int_str[int_len] = '\0'; +    ret = gf_string2int(int_str, &rxl_id); +    if (ret) +        goto out; -        int_len = rxl_end_len - strlen (rxl_child_end) - 1; -        strncpy (int_str, rxl_end + 1, int_len); -        int_str[int_len] = '\0'; -        ret = gf_string2int (int_str, &rxl_child_id); -        if (ret) -                goto out; +    int_len = rxl_end_len - strlen(rxl_child_end) - 1; +    strncpy(int_str, rxl_end + 1, int_len); +    int_str[int_len] = '\0'; +    ret = gf_string2int(int_str, &rxl_child_id); +    if (ret) +        goto out; -        volinfo = rsp_ctx->volinfo; -        brick_id = rxl_id * volinfo->replica_count + rxl_child_id; +    volinfo = rsp_ctx->volinfo; +    brick_id = rxl_id * volinfo->replica_count + rxl_child_id; -        brickinfo = glusterd_get_brickinfo_by_position (volinfo, brick_id); -        if (!brickinfo) -                goto out; -        if (!glusterd_is_local_brick (rsp_ctx->this, volinfo, brickinfo)) -                goto out; +    brickinfo = glusterd_get_brickinfo_by_position(volinfo, brick_id); +    if (!brickinfo) +        goto out; +    if (!glusterd_is_local_brick(rsp_ctx->this, volinfo, brickinfo)) +        goto out; -        new_value = data_copy (value); -        int_len = snprintf (new_key, sizeof (new_key), "%s-%d%s", -                            key_begin_string, brick_id, rxl_child_end); -        dict_setn (rsp_ctx->dict, new_key, int_len, new_value); +    new_value = data_copy(value); +    int_len = snprintf(new_key, sizeof(new_key), "%s-%d%s", key_begin_string, +                       brick_id, rxl_child_end); +    dict_setn(rsp_ctx->dict, new_key, int_len, new_value);  out: -        return 0; - +    return 0;  }  int -glusterd_heal_volume_brick_rsp (dict_t *req_dict, dict_t *rsp_dict, -                                dict_t *op_ctx, char **op_errstr) +glusterd_heal_volume_brick_rsp(dict_t *req_dict, dict_t *rsp_dict, +                               dict_t *op_ctx, char **op_errstr)  { -        int                             ret = 0; -        glusterd_heal_rsp_conv_t        rsp_ctx = {0}; -        char                            *volname = NULL; -        glusterd_volinfo_t              *volinfo = NULL; -        int                             heal_op = -1; - -        GF_ASSERT (rsp_dict); -        GF_ASSERT (op_ctx); -        GF_ASSERT (op_errstr); - -        ret = dict_get_strn (req_dict, "volname", SLEN ("volname"), &volname); -        if (ret) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Unable to get volume name"); -                goto out; -        } - -        ret = dict_get_int32n (req_dict, "heal-op", SLEN ("heal-op"), -                               &heal_op); -        if (ret) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Unable to get heal_op"); -                goto out; -        } +    int ret = 0; +    glusterd_heal_rsp_conv_t rsp_ctx = {0}; +    char *volname = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    int heal_op = -1; +    GF_ASSERT(rsp_dict); +    GF_ASSERT(op_ctx); +    GF_ASSERT(op_errstr); -        ret  = glusterd_volinfo_find (volname, &volinfo); +    ret = dict_get_strn(req_dict, "volname", SLEN("volname"), &volname); +    if (ret) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get volume name"); +        goto out; +    } -        if (ret) -                goto out; - -        rsp_ctx.dict = op_ctx; -        rsp_ctx.volinfo = volinfo; -        rsp_ctx.this = THIS; -        if (heal_op == GF_SHD_OP_STATISTICS) -                dict_foreach (rsp_dict, _heal_volume_add_shd_rsp_of_statistics, -                              &rsp_ctx); -        else -                dict_foreach (rsp_dict, _heal_volume_add_shd_rsp, &rsp_ctx); +    ret = dict_get_int32n(req_dict, "heal-op", SLEN("heal-op"), &heal_op); +    if (ret) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get heal_op"); +        goto out; +    } + +    ret = glusterd_volinfo_find(volname, &volinfo); +    if (ret) +        goto out; + +    rsp_ctx.dict = op_ctx; +    rsp_ctx.volinfo = volinfo; +    rsp_ctx.this = THIS; +    if (heal_op == GF_SHD_OP_STATISTICS) +        dict_foreach(rsp_dict, _heal_volume_add_shd_rsp_of_statistics, +                     &rsp_ctx); +    else +        dict_foreach(rsp_dict, _heal_volume_add_shd_rsp, &rsp_ctx);  out: -        return ret; +    return ret;  }  int -_status_volume_add_brick_rsp (dict_t *this, char *key, data_t *value, -                              void *data) +_status_volume_add_brick_rsp(dict_t *this, char *key, data_t *value, void *data)  { -        char                            new_key[256] = ""; -        int                             keylen; -        data_t                          *new_value = 0; -        glusterd_pr_brick_rsp_conv_t    *rsp_ctx = NULL; +    char new_key[256] = ""; +    int keylen; +    data_t *new_value = 0; +    glusterd_pr_brick_rsp_conv_t *rsp_ctx = NULL; -        rsp_ctx = data; -        new_value = data_copy (value); -        keylen = snprintf (new_key, sizeof (new_key), "brick%d.%s", -                           rsp_ctx->count, key); -        dict_setn (rsp_ctx->dict, new_key, keylen, new_value); +    rsp_ctx = data; +    new_value = data_copy(value); +    keylen = snprintf(new_key, sizeof(new_key), "brick%d.%s", rsp_ctx->count, +                      key); +    dict_setn(rsp_ctx->dict, new_key, keylen, new_value); -        return 0; +    return 0;  }  int -glusterd_status_volume_brick_rsp (dict_t *rsp_dict, dict_t *op_ctx, -                                  char **op_errstr) +glusterd_status_volume_brick_rsp(dict_t *rsp_dict, dict_t *op_ctx, +                                 char **op_errstr)  { -        int                             ret = 0; -        glusterd_pr_brick_rsp_conv_t    rsp_ctx = {0}; -        int32_t                         count = 0; -        int                             index = 0; +    int ret = 0; +    glusterd_pr_brick_rsp_conv_t rsp_ctx = {0}; +    int32_t count = 0; +    int index = 0; -        GF_ASSERT (rsp_dict); -        GF_ASSERT (op_ctx); -        GF_ASSERT (op_errstr); +    GF_ASSERT(rsp_dict); +    GF_ASSERT(op_ctx); +    GF_ASSERT(op_errstr); -        ret = dict_get_int32n (op_ctx, "count", SLEN ("count"), &count); -        if (ret) { -                count = 0; -        } else { -                count++; -        } -        ret = dict_get_int32n (rsp_dict, "index", SLEN ("index"), &index); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Couldn't get node index"); -                goto out; -        } -        dict_deln (rsp_dict, "index", SLEN ("index")); +    ret = dict_get_int32n(op_ctx, "count", SLEN("count"), &count); +    if (ret) { +        count = 0; +    } else { +        count++; +    } +    ret = dict_get_int32n(rsp_dict, "index", SLEN("index"), &index); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Couldn't get node index"); +        goto out; +    } +    dict_deln(rsp_dict, "index", SLEN("index")); -        rsp_ctx.count = index; -        rsp_ctx.dict = op_ctx; -        dict_foreach (rsp_dict, _status_volume_add_brick_rsp, &rsp_ctx); -        ret = dict_set_int32n (op_ctx, "count", SLEN ("count"), count); +    rsp_ctx.count = index; +    rsp_ctx.dict = op_ctx; +    dict_foreach(rsp_dict, _status_volume_add_brick_rsp, &rsp_ctx); +    ret = dict_set_int32n(op_ctx, "count", SLEN("count"), count);  out: -        return ret; +    return ret;  }  int -glusterd_status_volume_client_list (dict_t *rsp_dict, dict_t *op_ctx, -                                  char **op_errstr) +glusterd_status_volume_client_list(dict_t *rsp_dict, dict_t *op_ctx, +                                   char **op_errstr)  { -        int                             ret             = 0; -        char                            *process        = 0; -        int32_t                         count           = 0; -        int32_t                         fuse_count      = 0; -        int32_t                         gfapi_count     = 0; -        int32_t                         tierd_count     = 0; -        int32_t                         rebalance_count = 0; -        int32_t                         glustershd_count = 0; -        int32_t                         quotad_count    = 0; -        int32_t                         snapd_count     = 0; -        int32_t                         client_count    = 0; -        int                             i               = 0; -        char                            key[64]        = ""; - -        GF_ASSERT (rsp_dict); -        GF_ASSERT (op_ctx); -        GF_ASSERT (op_errstr); - -        ret = dict_get_int32n (rsp_dict, "clientcount", SLEN ("clientcount"), -                               &client_count); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_INFO, 0, -                                GD_MSG_DICT_GET_FAILED, -                        "Couldn't get node index"); -        } -        ret = dict_set_int32n (op_ctx, "client-count", SLEN ("client-count"), -                               client_count); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_GET_FAILED, -                                "Couldn't get node index"); -                goto out; -        } -        for (i = 0; i < client_count; i++) { -                count = 0; -                ret = snprintf (key, sizeof (key), "client%d.name", i); -                ret = dict_get_strn (rsp_dict, key, ret, &process); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_INFO, 0, -                                GD_MSG_DICT_GET_FAILED, -                                "Couldn't get client name"); -                        goto out; -                } -                ret = dict_add_dynstr_with_alloc (op_ctx, key, process); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_INFO, 0, -                                        GD_MSG_DICT_SET_FAILED, -                                        "Couldn't set client name"); -                } -                if (!strncmp(process, "fuse", 4)) { -                        ret = dict_get_int32n (op_ctx, "fuse-count", -                                               SLEN ("fuse-count"), &count); -                        if (ret) { -                                gf_msg (THIS->name, GF_LOG_INFO, 0, -                                        GD_MSG_DICT_GET_FAILED, -                                        "Couldn't get fuse-count"); -                        } -                        fuse_count++; -                        continue; -                } else if (!strncmp(process, "gfapi", 5)) { -                        ret = dict_get_int32n (op_ctx, "gfapi-count", -                                               SLEN ("gfapi-count"), &count); -                        if (ret) { -                                gf_msg (THIS->name, GF_LOG_INFO, 0, -                                        GD_MSG_DICT_GET_FAILED, -                                        "Couldn't get gfapi-count"); -                        } -                        gfapi_count++; -                        continue; - -                } else if (!strcmp(process, "tierd")) { -                        ret = dict_get_int32n (op_ctx, "tierd-count", -                                               SLEN ("tierd-count"), &count); -                        if (ret) { -                                gf_msg (THIS->name, GF_LOG_INFO, 0, -                                        GD_MSG_DICT_GET_FAILED, -                                        "Couldn't get tierd-count"); -                        } -                        tierd_count++; -                        continue; -                } else if (!strcmp(process, "rebalance")) { -                        ret = dict_get_int32n (op_ctx, "rebalance-count", -                                               SLEN ("rebalance-count"), -                                               &count); -                        if (ret) { -                                gf_msg (THIS->name, GF_LOG_INFO, 0, -                                        GD_MSG_DICT_GET_FAILED, -                                        "Couldn't get rebalance-count"); -                        } -                        rebalance_count++; -                        continue; -                } else if (!strcmp(process, "glustershd")) { -                        ret = dict_get_int32n (op_ctx, "glustershd-count", -                                               SLEN ("glustershd-count"), -                                               &count); -                        if (ret) { -                                gf_msg (THIS->name, GF_LOG_INFO, 0, -                                        GD_MSG_DICT_GET_FAILED, -                                        "Couldn't get glustershd-count"); -                        } -                        glustershd_count++; -                        continue; -                } else if (!strcmp(process, "quotad")) { -                        ret = dict_get_int32n (op_ctx, "quotad-count", -                                               SLEN ("quotad-count"), &count); -                        if (ret) { -                                gf_msg (THIS->name, GF_LOG_INFO, 0, -                                        GD_MSG_DICT_GET_FAILED, -                                        "Couldn't get quotad-count"); -                        } -                        quotad_count++; -                        continue; -                } else if (!strcmp(process, "snapd")) { -                        ret = dict_get_int32n (op_ctx, "snapd-count", -                                               SLEN ("snapd-count"), &count); -                        if (ret) { -                                gf_msg (THIS->name, GF_LOG_INFO, 0, -                                        GD_MSG_DICT_GET_FAILED, -                                        "Couldn't get snapd-count"); -                        } -                        snapd_count++; - -                } +    int ret = 0; +    char *process = 0; +    int32_t count = 0; +    int32_t fuse_count = 0; +    int32_t gfapi_count = 0; +    int32_t tierd_count = 0; +    int32_t rebalance_count = 0; +    int32_t glustershd_count = 0; +    int32_t quotad_count = 0; +    int32_t snapd_count = 0; +    int32_t client_count = 0; +    int i = 0; +    char key[64] = ""; + +    GF_ASSERT(rsp_dict); +    GF_ASSERT(op_ctx); +    GF_ASSERT(op_errstr); + +    ret = dict_get_int32n(rsp_dict, "clientcount", SLEN("clientcount"), +                          &client_count); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +               "Couldn't get node index"); +    } +    ret = dict_set_int32n(op_ctx, "client-count", SLEN("client-count"), +                          client_count); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Couldn't get node index"); +        goto out; +    } +    for (i = 0; i < client_count; i++) { +        count = 0; +        ret = snprintf(key, sizeof(key), "client%d.name", i); +        ret = dict_get_strn(rsp_dict, key, ret, &process); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +                   "Couldn't get client name"); +            goto out;          } - -        if (fuse_count) { -                ret = dict_set_int32n (op_ctx, "fuse-count", -                                       SLEN ("fuse-count"), fuse_count); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Couldn't set fuse-count"); -                        goto out; -                } +        ret = dict_add_dynstr_with_alloc(op_ctx, key, process); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_SET_FAILED, +                   "Couldn't set client name"); +        } +        if (!strncmp(process, "fuse", 4)) { +            ret = dict_get_int32n(op_ctx, "fuse-count", SLEN("fuse-count"), +                                  &count); +            if (ret) { +                gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +                       "Couldn't get fuse-count"); +            } +            fuse_count++; +            continue; +        } else if (!strncmp(process, "gfapi", 5)) { +            ret = dict_get_int32n(op_ctx, "gfapi-count", SLEN("gfapi-count"), +                                  &count); +            if (ret) { +                gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +                       "Couldn't get gfapi-count"); +            } +            gfapi_count++; +            continue; + +        } else if (!strcmp(process, "tierd")) { +            ret = dict_get_int32n(op_ctx, "tierd-count", SLEN("tierd-count"), +                                  &count); +            if (ret) { +                gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +                       "Couldn't get tierd-count"); +            } +            tierd_count++; +            continue; +        } else if (!strcmp(process, "rebalance")) { +            ret = dict_get_int32n(op_ctx, "rebalance-count", +                                  SLEN("rebalance-count"), &count); +            if (ret) { +                gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +                       "Couldn't get rebalance-count"); +            } +            rebalance_count++; +            continue; +        } else if (!strcmp(process, "glustershd")) { +            ret = dict_get_int32n(op_ctx, "glustershd-count", +                                  SLEN("glustershd-count"), &count); +            if (ret) { +                gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +                       "Couldn't get glustershd-count"); +            } +            glustershd_count++; +            continue; +        } else if (!strcmp(process, "quotad")) { +            ret = dict_get_int32n(op_ctx, "quotad-count", SLEN("quotad-count"), +                                  &count); +            if (ret) { +                gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +                       "Couldn't get quotad-count"); +            } +            quotad_count++; +            continue; +        } else if (!strcmp(process, "snapd")) { +            ret = dict_get_int32n(op_ctx, "snapd-count", SLEN("snapd-count"), +                                  &count); +            if (ret) { +                gf_msg(THIS->name, GF_LOG_INFO, 0, GD_MSG_DICT_GET_FAILED, +                       "Couldn't get snapd-count"); +            } +            snapd_count++; +        } +    } + +    if (fuse_count) { +        ret = dict_set_int32n(op_ctx, "fuse-count", SLEN("fuse-count"), +                              fuse_count); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Couldn't set fuse-count"); +            goto out;          } -        if (gfapi_count) { -                ret = dict_set_int32n (op_ctx, "gfapi-count", -                                       SLEN ("gfapi-count"), gfapi_count); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Couldn't set gfapi-count"); -                        goto out; -                } +    } +    if (gfapi_count) { +        ret = dict_set_int32n(op_ctx, "gfapi-count", SLEN("gfapi-count"), +                              gfapi_count); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Couldn't set gfapi-count"); +            goto out;          } -        if (tierd_count) { -                ret = dict_set_int32n (op_ctx, "tierd-count", -                                       SLEN ("tierd-count"), tierd_count); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Couldn't set tierd-count"); -                        goto out; -                } +    } +    if (tierd_count) { +        ret = dict_set_int32n(op_ctx, "tierd-count", SLEN("tierd-count"), +                              tierd_count); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Couldn't set tierd-count"); +            goto out;          } -        if (rebalance_count) { -                ret = dict_set_int32n (op_ctx, "rebalance-count", -                                       SLEN ("rebalance-count"), -                                       rebalance_count); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Couldn't set rebalance-count"); -                        goto out; -                } +    } +    if (rebalance_count) { +        ret = dict_set_int32n(op_ctx, "rebalance-count", +                              SLEN("rebalance-count"), rebalance_count); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Couldn't set rebalance-count"); +            goto out;          } -        if (glustershd_count) { -                ret = dict_set_int32n (op_ctx, "glustershd-count", -                                       SLEN ("glustershd-count"), -                                       glustershd_count); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Couldn't set glustershd-count"); -                        goto out; -                } +    } +    if (glustershd_count) { +        ret = dict_set_int32n(op_ctx, "glustershd-count", +                              SLEN("glustershd-count"), glustershd_count); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Couldn't set glustershd-count"); +            goto out;          } -        if (quotad_count) { -                ret = dict_set_int32n (op_ctx, "quotad-count", -                                       SLEN ("quotad-count"), quotad_count); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Couldn't set quotad-count"); -                        goto out; -                } +    } +    if (quotad_count) { +        ret = dict_set_int32n(op_ctx, "quotad-count", SLEN("quotad-count"), +                              quotad_count); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Couldn't set quotad-count"); +            goto out;          } -        if (snapd_count) { -                ret = dict_set_int32n (op_ctx, "snapd-count", -                                       SLEN ("snapd-count"), snapd_count); -                if (ret) { -                        gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Couldn't set snapd-count"); -                        goto out; -                } +    } +    if (snapd_count) { +        ret = dict_set_int32n(op_ctx, "snapd-count", SLEN("snapd-count"), +                              snapd_count); +        if (ret) { +            gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Couldn't set snapd-count"); +            goto out;          } +    }  out: -        return ret; +    return ret;  }  int -glusterd_tier_or_rebalance_rsp (dict_t *op_ctx, glusterd_rebalance_t *index, int32_t i) +glusterd_tier_or_rebalance_rsp(dict_t *op_ctx, glusterd_rebalance_t *index, +                               int32_t i)  { -        int                             ret = 0; -        char                            key[64] = ""; -        int                             keylen; - -        snprintf (key, sizeof (key), "files-%d", i); -        ret = dict_set_uint64 (op_ctx, key, index->rebalance_files); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "failed to set file count"); +    int ret = 0; +    char key[64] = ""; +    int keylen; -        snprintf (key, sizeof (key), "size-%d", i); -        ret = dict_set_uint64 (op_ctx, key, index->rebalance_data); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "failed to set size of xfer"); +    snprintf(key, sizeof(key), "files-%d", i); +    ret = dict_set_uint64(op_ctx, key, index->rebalance_files); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to set file count"); -        snprintf (key, sizeof (key), "lookups-%d", i); -        ret = dict_set_uint64 (op_ctx, key, index->lookedup_files); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "failed to set lookedup file count"); +    snprintf(key, sizeof(key), "size-%d", i); +    ret = dict_set_uint64(op_ctx, key, index->rebalance_data); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to set size of xfer"); -        keylen = snprintf (key, sizeof (key), "status-%d", i); -        ret = dict_set_int32n (op_ctx, key, keylen, index->defrag_status); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "failed to set status"); +    snprintf(key, sizeof(key), "lookups-%d", i); +    ret = dict_set_uint64(op_ctx, key, index->lookedup_files); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to set lookedup file count"); + +    keylen = snprintf(key, sizeof(key), "status-%d", i); +    ret = dict_set_int32n(op_ctx, key, keylen, index->defrag_status); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to set status"); + +    snprintf(key, sizeof(key), "failures-%d", i); +    ret = dict_set_uint64(op_ctx, key, index->rebalance_failures); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to set failure count"); -        snprintf (key, sizeof (key), "failures-%d", i); -        ret = dict_set_uint64 (op_ctx, key, index->rebalance_failures); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "failed to set failure count"); - -        snprintf (key, sizeof (key), "skipped-%d", i); -        ret = dict_set_uint64 (op_ctx, key, index->skipped_files); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "failed to set skipped count"); +    snprintf(key, sizeof(key), "skipped-%d", i); +    ret = dict_set_uint64(op_ctx, key, index->skipped_files); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to set skipped count"); -        snprintf (key, sizeof (key), "run-time-%d", i); -        ret = dict_set_double (op_ctx, key, index->rebalance_time); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "failed to set run-time"); +    snprintf(key, sizeof(key), "run-time-%d", i); +    ret = dict_set_double(op_ctx, key, index->rebalance_time); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to set run-time"); -        return ret; +    return ret;  }  int -glusterd_defrag_volume_node_rsp (dict_t *req_dict, dict_t *rsp_dict, -                                 dict_t *op_ctx) +glusterd_defrag_volume_node_rsp(dict_t *req_dict, dict_t *rsp_dict, +                                dict_t *op_ctx)  { -        int                             ret = 0; -        char                            *volname = NULL; -        glusterd_volinfo_t              *volinfo = NULL; -        char                            key[64] = ""; -        int                             keylen; -        int32_t                         i = 0; -        char                            buf[1024] = ""; -        char                            *node_str = NULL; -        int32_t                         cmd       = 0; +    int ret = 0; +    char *volname = NULL; +    glusterd_volinfo_t *volinfo = NULL; +    char key[64] = ""; +    int keylen; +    int32_t i = 0; +    char buf[1024] = ""; +    char *node_str = NULL; +    int32_t cmd = 0; -        GF_ASSERT (req_dict); +    GF_ASSERT(req_dict); -        ret = dict_get_strn (req_dict, "volname", SLEN ("volname"), &volname); -        if (ret) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Unable to get volume name"); -                goto out; -        } +    ret = dict_get_strn(req_dict, "volname", SLEN("volname"), &volname); +    if (ret) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get volume name"); +        goto out; +    } -        ret  = glusterd_volinfo_find (volname, &volinfo); +    ret = glusterd_volinfo_find(volname, &volinfo); -        ret = dict_get_int32n (req_dict, "rebalance-command", -                               SLEN ("rebalance-command"), &cmd); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_DICT_GET_FAILED, "Unable to get the cmd"); -                goto out; -        } +    ret = dict_get_int32n(req_dict, "rebalance-command", +                          SLEN("rebalance-command"), &cmd); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_DICT_GET_FAILED, +               "Unable to get the cmd"); +        goto out; +    } -        if (rsp_dict) { -                ret = glusterd_defrag_volume_status_update (volinfo, -                                                            rsp_dict, -                                                            cmd); -        } - -        if (!op_ctx) { -                dict_copy (rsp_dict, op_ctx); -                goto out; -        } - -        ret = dict_get_int32n (op_ctx, "count", SLEN ("count"), &i); -        i++; +    if (rsp_dict) { +        ret = glusterd_defrag_volume_status_update(volinfo, rsp_dict, cmd); +    } -        ret = dict_set_int32n (op_ctx, "count", SLEN ("count"), i); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to set count"); - -        snprintf (buf, sizeof (buf), "%s", uuid_utoa (MY_UUID)); -        node_str = gf_strdup (buf); - -        keylen = snprintf (key, sizeof (key), "node-uuid-%d", i); -        ret = dict_set_dynstrn (op_ctx, key, keylen, node_str); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "failed to set node-uuid"); - -        if (cmd == GF_DEFRAG_CMD_STATUS_TIER) -                glusterd_tier_or_rebalance_rsp (op_ctx, &volinfo->tier, i); -        else -                glusterd_tier_or_rebalance_rsp (op_ctx, &volinfo->rebal, i); - -        snprintf (key, sizeof (key), "time-left-%d", i); -        ret = dict_set_uint64 (op_ctx, key, volinfo->rebal.time_left); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_DICT_SET_FAILED, -                        "failed to set time left"); - -        snprintf (key, sizeof (key), "promoted-%d", i); -        ret = dict_set_uint64 (op_ctx, key, volinfo->tier_info.promoted); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_DICT_SET_FAILED, -                        "failed to set lookedup file count"); - -        snprintf (key, sizeof (key), "demoted-%d", i); -        ret = dict_set_uint64 (op_ctx, key, volinfo->tier_info.demoted); -        if (ret) -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_DICT_SET_FAILED, -                        "failed to set lookedup file count"); - -out: -        return ret; +    if (!op_ctx) { +        dict_copy(rsp_dict, op_ctx); +        goto out; +    } + +    ret = dict_get_int32n(op_ctx, "count", SLEN("count"), &i); +    i++; + +    ret = dict_set_int32n(op_ctx, "count", SLEN("count"), i); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set count"); + +    snprintf(buf, sizeof(buf), "%s", uuid_utoa(MY_UUID)); +    node_str = gf_strdup(buf); + +    keylen = snprintf(key, sizeof(key), "node-uuid-%d", i); +    ret = dict_set_dynstrn(op_ctx, key, keylen, node_str); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "failed to set node-uuid"); + +    if (cmd == GF_DEFRAG_CMD_STATUS_TIER) +        glusterd_tier_or_rebalance_rsp(op_ctx, &volinfo->tier, i); +    else +        glusterd_tier_or_rebalance_rsp(op_ctx, &volinfo->rebal, i); + +    snprintf(key, sizeof(key), "time-left-%d", i); +    ret = dict_set_uint64(op_ctx, key, volinfo->rebal.time_left); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_DICT_SET_FAILED, +               "failed to set time left"); + +    snprintf(key, sizeof(key), "promoted-%d", i); +    ret = dict_set_uint64(op_ctx, key, volinfo->tier_info.promoted); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_DICT_SET_FAILED, +               "failed to set lookedup file count"); + +    snprintf(key, sizeof(key), "demoted-%d", i); +    ret = dict_set_uint64(op_ctx, key, volinfo->tier_info.demoted); +    if (ret) +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_DICT_SET_FAILED, +               "failed to set lookedup file count"); + +out: +    return ret;  }  int32_t -glusterd_handle_node_rsp (dict_t *req_dict, void *pending_entry, -                          glusterd_op_t op, dict_t *rsp_dict, dict_t *op_ctx, -                          char **op_errstr, gd_node_type type) +glusterd_handle_node_rsp(dict_t *req_dict, void *pending_entry, +                         glusterd_op_t op, dict_t *rsp_dict, dict_t *op_ctx, +                         char **op_errstr, gd_node_type type)  { -        int                     ret = 0; -        int32_t                 cmd = GF_OP_CMD_NONE; +    int ret = 0; +    int32_t cmd = GF_OP_CMD_NONE; -        GF_ASSERT (op_errstr); +    GF_ASSERT(op_errstr); -        switch (op) { +    switch (op) {          case GD_OP_PROFILE_VOLUME: -                ret = glusterd_profile_volume_brick_rsp (pending_entry, -                                                         rsp_dict, op_ctx, -                                                         op_errstr, type); -                break; +            ret = glusterd_profile_volume_brick_rsp(pending_entry, rsp_dict, +                                                    op_ctx, op_errstr, type); +            break;          case GD_OP_STATUS_VOLUME: -                ret = dict_get_int32n (req_dict, "cmd", SLEN ("cmd"), &cmd); -                if (!ret && (cmd & GF_CLI_STATUS_CLIENT_LIST)) { -                        ret = glusterd_status_volume_client_list (rsp_dict, -                                        op_ctx, op_errstr); -                } else -                        ret = glusterd_status_volume_brick_rsp (rsp_dict, -                                        op_ctx, op_errstr); -                break; +            ret = dict_get_int32n(req_dict, "cmd", SLEN("cmd"), &cmd); +            if (!ret && (cmd & GF_CLI_STATUS_CLIENT_LIST)) { +                ret = glusterd_status_volume_client_list(rsp_dict, op_ctx, +                                                         op_errstr); +            } else +                ret = glusterd_status_volume_brick_rsp(rsp_dict, op_ctx, +                                                       op_errstr); +            break;          case GD_OP_TIER_STATUS:          case GD_OP_DETACH_TIER_STATUS:          case GD_OP_DEFRAG_BRICK_VOLUME: -                glusterd_defrag_volume_node_rsp (req_dict, -                                                 rsp_dict, op_ctx); -                break; +            glusterd_defrag_volume_node_rsp(req_dict, rsp_dict, op_ctx); +            break;          case GD_OP_HEAL_VOLUME: -                ret = glusterd_heal_volume_brick_rsp (req_dict, rsp_dict, -                                                      op_ctx, op_errstr); -                break; +            ret = glusterd_heal_volume_brick_rsp(req_dict, rsp_dict, op_ctx, +                                                 op_errstr); +            break;          case GD_OP_SCRUB_STATUS: -                ret = glusterd_bitrot_volume_node_rsp (op_ctx, rsp_dict); +            ret = glusterd_bitrot_volume_node_rsp(op_ctx, rsp_dict); -                break; +            break;          default: -                break; -        } +            break; +    } -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret;  }  int32_t -glusterd_set_originator_uuid (dict_t *dict) +glusterd_set_originator_uuid(dict_t *dict)  { -        int          ret              = -1; -        uuid_t      *originator_uuid  = NULL; +    int ret = -1; +    uuid_t *originator_uuid = NULL; -        GF_ASSERT (dict); +    GF_ASSERT(dict); -        originator_uuid = GF_MALLOC (sizeof(uuid_t), -                                     gf_common_mt_uuid_t); -        if (!originator_uuid) { -                ret = -1; -                goto out; -        } +    originator_uuid = GF_MALLOC(sizeof(uuid_t), gf_common_mt_uuid_t); +    if (!originator_uuid) { +        ret = -1; +        goto out; +    } -        gf_uuid_copy (*originator_uuid, MY_UUID); -        ret = dict_set_bin (dict, "originator_uuid", -                            originator_uuid, sizeof (uuid_t)); -        if (ret) { -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to set originator_uuid."); -                goto out; -        } +    gf_uuid_copy(*originator_uuid, MY_UUID); +    ret = dict_set_bin(dict, "originator_uuid", originator_uuid, +                       sizeof(uuid_t)); +    if (ret) { +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set originator_uuid."); +        goto out; +    }  out: -        if (ret && originator_uuid) -                GF_FREE (originator_uuid); +    if (ret && originator_uuid) +        GF_FREE(originator_uuid); -        return ret; +    return ret;  }  /* Should be used only when an operation is in progress, as that is the only   * time a lock_owner is set   */  gf_boolean_t -is_origin_glusterd (dict_t *dict) +is_origin_glusterd(dict_t *dict)  { -        gf_boolean_t  ret              = _gf_false; -        uuid_t        lock_owner       = {0,}; -        uuid_t        *originator_uuid = NULL; +    gf_boolean_t ret = _gf_false; +    uuid_t lock_owner = { +        0, +    }; +    uuid_t *originator_uuid = NULL; -        GF_ASSERT (dict); +    GF_ASSERT(dict); -        ret = dict_get_bin (dict, "originator_uuid", -                            (void **) &originator_uuid); +    ret = dict_get_bin(dict, "originator_uuid", (void **)&originator_uuid); +    if (ret) { +        /* If not originator_uuid has been set, then the command +         * has been originated from a glusterd running on older version +         * Hence fetching the lock owner */ +        ret = glusterd_get_lock_owner(&lock_owner);          if (ret) { -                /* If not originator_uuid has been set, then the command -                 * has been originated from a glusterd running on older version -                 * Hence fetching the lock owner */ -                ret = glusterd_get_lock_owner (&lock_owner); -                if (ret) { -                        ret = _gf_false; -                        goto out; -                } -                ret = !gf_uuid_compare (MY_UUID, lock_owner); -        } else -                ret = !gf_uuid_compare (MY_UUID, *originator_uuid); +            ret = _gf_false; +            goto out; +        } +        ret = !gf_uuid_compare(MY_UUID, lock_owner); +    } else +        ret = !gf_uuid_compare(MY_UUID, *originator_uuid);  out: -        return ret; +    return ret;  }  int -glusterd_generate_and_set_task_id (dict_t *dict, char *key, const int keylen) +glusterd_generate_and_set_task_id(dict_t *dict, char *key, const int keylen)  { -        int             ret = -1; -        uuid_t          task_id = {0,}; -        char            *uuid_str = NULL; -        xlator_t        *this = NULL; +    int ret = -1; +    uuid_t task_id = { +        0, +    }; +    char *uuid_str = NULL; +    xlator_t *this = NULL; -        GF_ASSERT (dict); +    GF_ASSERT(dict); -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        gf_uuid_generate (task_id); -        uuid_str = gf_strdup (uuid_utoa (task_id)); -        if (!uuid_str) { -                ret = -1; -                goto out; -        } +    gf_uuid_generate(task_id); +    uuid_str = gf_strdup(uuid_utoa(task_id)); +    if (!uuid_str) { +        ret = -1; +        goto out; +    } -        ret = dict_set_dynstrn (dict, key, keylen, uuid_str); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, "Failed to set %s in dict", -                        key); -                goto out; -        } -        gf_msg (this->name, GF_LOG_INFO, 0, -                GD_MSG_TASK_ID_INFO, "Generated task-id %s for key %s", -                uuid_str, key); +    ret = dict_set_dynstrn(dict, key, keylen, uuid_str); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set %s in dict", key); +        goto out; +    } +    gf_msg(this->name, GF_LOG_INFO, 0, GD_MSG_TASK_ID_INFO, +           "Generated task-id %s for key %s", uuid_str, key);  out: -        if (ret) -                GF_FREE (uuid_str); -        return ret; +    if (ret) +        GF_FREE(uuid_str); +    return ret;  }  int -glusterd_copy_uuid_to_dict (uuid_t uuid, dict_t *dict, char *key, -                            const int keylen) +glusterd_copy_uuid_to_dict(uuid_t uuid, dict_t *dict, char *key, +                           const int keylen)  { -        int             ret = -1; -        char            tmp_str[40] = ""; -        char            *task_id_str = NULL; +    int ret = -1; +    char tmp_str[40] = ""; +    char *task_id_str = NULL; -        GF_ASSERT (dict); -        GF_ASSERT (key); +    GF_ASSERT(dict); +    GF_ASSERT(key); -        gf_uuid_unparse (uuid, tmp_str); -        task_id_str = gf_strdup (tmp_str); -        if (!task_id_str) -                return -1; +    gf_uuid_unparse(uuid, tmp_str); +    task_id_str = gf_strdup(tmp_str); +    if (!task_id_str) +        return -1; -        ret = dict_set_dynstrn (dict, key, keylen, task_id_str); -        if (ret) { -                GF_FREE (task_id_str); -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Error setting uuid in dict with key %s", key); -        } +    ret = dict_set_dynstrn(dict, key, keylen, task_id_str); +    if (ret) { +        GF_FREE(task_id_str); +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Error setting uuid in dict with key %s", key); +    } -        return 0; +    return 0;  }  int -_update_volume_op_versions (dict_t *this, char *key, data_t *value, void *data) +_update_volume_op_versions(dict_t *this, char *key, data_t *value, void *data)  { -        int                op_version = 0; -        glusterd_volinfo_t *ctx       = NULL; -        gf_boolean_t       enabled    = _gf_true; -        int                ret        = -1; +    int op_version = 0; +    glusterd_volinfo_t *ctx = NULL; +    gf_boolean_t enabled = _gf_true; +    int ret = -1; -        GF_ASSERT (data); -        ctx = data; +    GF_ASSERT(data); +    ctx = data; -        op_version = glusterd_get_op_version_for_key (key); +    op_version = glusterd_get_op_version_for_key(key); -        if (gd_is_xlator_option (key) || gd_is_boolean_option (key)) { -                ret = gf_string2boolean (value->data, &enabled); -                if (ret) -                        return 0; +    if (gd_is_xlator_option(key) || gd_is_boolean_option(key)) { +        ret = gf_string2boolean(value->data, &enabled); +        if (ret) +            return 0; -                if (!enabled) -                        return 0; -        } +        if (!enabled) +            return 0; +    } -        if (op_version > ctx->op_version) -                ctx->op_version = op_version; +    if (op_version > ctx->op_version) +        ctx->op_version = op_version; -        if (gd_is_client_option (key) && -            (op_version > ctx->client_op_version)) -                ctx->client_op_version = op_version; +    if (gd_is_client_option(key) && (op_version > ctx->client_op_version)) +        ctx->client_op_version = op_version; -        return 0; +    return 0;  }  void -gd_update_volume_op_versions (glusterd_volinfo_t *volinfo) +gd_update_volume_op_versions(glusterd_volinfo_t *volinfo)  { -        glusterd_conf_t *conf = NULL; -        gf_boolean_t    ob_enabled = _gf_false; +    glusterd_conf_t *conf = NULL; +    gf_boolean_t ob_enabled = _gf_false; -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        conf = THIS->private; -        GF_ASSERT (conf); +    conf = THIS->private; +    GF_ASSERT(conf); -        /* Reset op-versions to minimum */ -        volinfo->op_version = 1; -        volinfo->client_op_version = 1; +    /* Reset op-versions to minimum */ +    volinfo->op_version = 1; +    volinfo->client_op_version = 1; -        dict_foreach (volinfo->dict, _update_volume_op_versions, volinfo); +    dict_foreach(volinfo->dict, _update_volume_op_versions, volinfo); -        /* Special case for open-behind -         * If cluster op-version >= 2 and open-behind hasn't been explicitly -         * disabled, volume op-versions must be updated to account for it -         */ +    /* Special case for open-behind +     * If cluster op-version >= 2 and open-behind hasn't been explicitly +     * disabled, volume op-versions must be updated to account for it +     */ -        /* TODO: Remove once we have a general way to update automatically -         * enabled features -         */ -        if (conf->op_version >= 2) { -                ob_enabled = dict_get_str_boolean (volinfo->dict, -                                                   "performance.open-behind", -                                                   _gf_true); -                if (ob_enabled) { - -                        if (volinfo->op_version < 2) -                                volinfo->op_version = 2; -                        if (volinfo->client_op_version < 2) -                                volinfo->client_op_version = 2; -                } +    /* TODO: Remove once we have a general way to update automatically +     * enabled features +     */ +    if (conf->op_version >= 2) { +        ob_enabled = dict_get_str_boolean(volinfo->dict, +                                          "performance.open-behind", _gf_true); +        if (ob_enabled) { +            if (volinfo->op_version < 2) +                volinfo->op_version = 2; +            if (volinfo->client_op_version < 2) +                volinfo->client_op_version = 2;          } +    } -        if (volinfo->type == GF_CLUSTER_TYPE_DISPERSE) { -                if (volinfo->op_version < GD_OP_VERSION_3_6_0) -                        volinfo->op_version = GD_OP_VERSION_3_6_0; -                if (volinfo->client_op_version < GD_OP_VERSION_3_6_0) -                        volinfo->client_op_version = GD_OP_VERSION_3_6_0; -        } +    if (volinfo->type == GF_CLUSTER_TYPE_DISPERSE) { +        if (volinfo->op_version < GD_OP_VERSION_3_6_0) +            volinfo->op_version = GD_OP_VERSION_3_6_0; +        if (volinfo->client_op_version < GD_OP_VERSION_3_6_0) +            volinfo->client_op_version = GD_OP_VERSION_3_6_0; +    } -        return; +    return;  }  int -op_version_check (xlator_t *this, int min_op_version, char *msg, int msglen) +op_version_check(xlator_t *this, int min_op_version, char *msg, int msglen)  { -       int              ret  = 0; -       glusterd_conf_t *priv = NULL; +    int ret = 0; +    glusterd_conf_t *priv = NULL; -       GF_ASSERT (this); -       GF_ASSERT (msg); +    GF_ASSERT(this); +    GF_ASSERT(msg); -       priv = this->private; -       if (priv->op_version < min_op_version) { -                snprintf (msg, msglen, "One or more nodes do not support " -                          "the required op-version. Cluster op-version must " -                          "at least be %d.", min_op_version); -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_UNSUPPORTED_VERSION, "%s", msg); -                ret = -1; -      } -      return ret; +    priv = this->private; +    if (priv->op_version < min_op_version) { +        snprintf(msg, msglen, +                 "One or more nodes do not support " +                 "the required op-version. Cluster op-version must " +                 "at least be %d.", +                 min_op_version); +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_UNSUPPORTED_VERSION, "%s", +               msg); +        ret = -1; +    } +    return ret;  } -  /* A task is committed/completed once the task-id for it is cleared */  gf_boolean_t -gd_is_remove_brick_committed (glusterd_volinfo_t *volinfo) +gd_is_remove_brick_committed(glusterd_volinfo_t *volinfo)  { -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        if ((GD_OP_REMOVE_BRICK == volinfo->rebal.op) && -            !gf_uuid_is_null (volinfo->rebal.rebalance_id)) -                        return _gf_false; +    if ((GD_OP_REMOVE_BRICK == volinfo->rebal.op) && +        !gf_uuid_is_null(volinfo->rebal.rebalance_id)) +        return _gf_false; -        return _gf_true; +    return _gf_true;  }  gf_boolean_t -glusterd_is_status_tasks_op (glusterd_op_t op, dict_t *dict) +glusterd_is_status_tasks_op(glusterd_op_t op, dict_t *dict)  { -        int           ret             = -1; -        uint32_t      cmd             = GF_CLI_STATUS_NONE; -        gf_boolean_t  is_status_tasks = _gf_false; +    int ret = -1; +    uint32_t cmd = GF_CLI_STATUS_NONE; +    gf_boolean_t is_status_tasks = _gf_false; -        if (op != GD_OP_STATUS_VOLUME) -                goto out; +    if (op != GD_OP_STATUS_VOLUME) +        goto out; -        ret = dict_get_uint32 (dict, "cmd", &cmd); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get opcode"); -                goto out; -        } +    ret = dict_get_uint32(dict, "cmd", &cmd); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get opcode"); +        goto out; +    } -        if (cmd & GF_CLI_STATUS_TASKS) -                is_status_tasks = _gf_true; +    if (cmd & GF_CLI_STATUS_TASKS) +        is_status_tasks = _gf_true;  out: -        return is_status_tasks; +    return is_status_tasks;  }  /* Tells if rebalance needs to be started for the given volume on the peer @@ -12700,368 +12333,363 @@ out:   * peer   */  gf_boolean_t -gd_should_i_start_rebalance  (glusterd_volinfo_t *volinfo) { -        gf_boolean_t         retval     = _gf_false; -        int                  ret        = -1; -        glusterd_brickinfo_t *brick     = NULL; -        int                  count      = 0; -        int                  i          = 0; -        char                 key[64]  = ""; -        int                  keylen; -        char                 *brickname = NULL; - - -        switch (volinfo->rebal.op) { +gd_should_i_start_rebalance(glusterd_volinfo_t *volinfo) +{ +    gf_boolean_t retval = _gf_false; +    int ret = -1; +    glusterd_brickinfo_t *brick = NULL; +    int count = 0; +    int i = 0; +    char key[64] = ""; +    int keylen; +    char *brickname = NULL; + +    switch (volinfo->rebal.op) {          case GD_OP_REBALANCE: -                cds_list_for_each_entry (brick, &volinfo->bricks, brick_list) { -                        if (gf_uuid_compare (MY_UUID, brick->uuid) == 0) { -                                retval = _gf_true; -                                break; -                        } -                } -                break; +            cds_list_for_each_entry(brick, &volinfo->bricks, brick_list) +            { +                if (gf_uuid_compare(MY_UUID, brick->uuid) == 0) { +                    retval = _gf_true; +                    break; +                } +            } +            break;          case GD_OP_REMOVE_BRICK: -                ret = dict_get_int32n (volinfo->rebal.dict, "count", -                                       SLEN ("count"), &count); -                if (ret) { -                        goto out; -                } -                for (i = 1; i <= count; i++) { -                        keylen = snprintf (key, sizeof (key), "brick%d", i); -                        ret = dict_get_strn (volinfo->rebal.dict, key, keylen, -                                            &brickname); -                        if (ret) -                                goto out; -                        ret = glusterd_volume_brickinfo_get_by_brick (brickname, -                                                                      volinfo, -                                                                      &brick, -                                                                      _gf_false); -                        if (ret) -                                goto out; -                        if (gf_uuid_compare (MY_UUID, brick->uuid) == 0) { -                                retval = _gf_true; -                                break; -                        } +            ret = dict_get_int32n(volinfo->rebal.dict, "count", SLEN("count"), +                                  &count); +            if (ret) { +                goto out; +            } +            for (i = 1; i <= count; i++) { +                keylen = snprintf(key, sizeof(key), "brick%d", i); +                ret = dict_get_strn(volinfo->rebal.dict, key, keylen, +                                    &brickname); +                if (ret) +                    goto out; +                ret = glusterd_volume_brickinfo_get_by_brick(brickname, volinfo, +                                                             &brick, _gf_false); +                if (ret) +                    goto out; +                if (gf_uuid_compare(MY_UUID, brick->uuid) == 0) { +                    retval = _gf_true; +                    break;                  } -                break; +            } +            break;          default: -                break; -        } +            break; +    }  out: -        return retval; +    return retval;  }  int -glusterd_is_volume_quota_enabled (glusterd_volinfo_t *volinfo) +glusterd_is_volume_quota_enabled(glusterd_volinfo_t *volinfo)  { -        return (glusterd_volinfo_get_boolean (volinfo, VKEY_FEATURES_QUOTA)); +    return (glusterd_volinfo_get_boolean(volinfo, VKEY_FEATURES_QUOTA));  }  int -glusterd_is_volume_inode_quota_enabled (glusterd_volinfo_t *volinfo) +glusterd_is_volume_inode_quota_enabled(glusterd_volinfo_t *volinfo)  { -        return (glusterd_volinfo_get_boolean (volinfo, -                                              VKEY_FEATURES_INODE_QUOTA)); +    return (glusterd_volinfo_get_boolean(volinfo, VKEY_FEATURES_INODE_QUOTA));  }  int -glusterd_is_tierd_supposed_to_be_enabled (glusterd_volinfo_t *volinfo) +glusterd_is_tierd_supposed_to_be_enabled(glusterd_volinfo_t *volinfo)  { -        if ((volinfo->type != GF_CLUSTER_TYPE_TIER) || -                        (volinfo->tier.op == GD_OP_DETACH_TIER)) -                return _gf_false; -        else -                return _gf_true; +    if ((volinfo->type != GF_CLUSTER_TYPE_TIER) || +        (volinfo->tier.op == GD_OP_DETACH_TIER)) +        return _gf_false; +    else +        return _gf_true;  }  int -glusterd_is_tierd_enabled (glusterd_volinfo_t *volinfo) +glusterd_is_tierd_enabled(glusterd_volinfo_t *volinfo)  { -        return volinfo->is_tier_enabled; +    return volinfo->is_tier_enabled;  }  int -glusterd_is_bitrot_enabled (glusterd_volinfo_t *volinfo) +glusterd_is_bitrot_enabled(glusterd_volinfo_t *volinfo)  { -        return glusterd_volinfo_get_boolean (volinfo, VKEY_FEATURES_BITROT); +    return glusterd_volinfo_get_boolean(volinfo, VKEY_FEATURES_BITROT);  }  int -glusterd_validate_and_set_gfid (dict_t *op_ctx, dict_t *req_dict, -                                char **op_errstr) +glusterd_validate_and_set_gfid(dict_t *op_ctx, dict_t *req_dict, +                               char **op_errstr)  { -        int        ret           = -1; -        int        count         = 0; -        int        i             = 0; -        int        op_code       = GF_QUOTA_OPTION_TYPE_NONE; -        uuid_t     uuid1         = {0}; -        uuid_t     uuid2         = {0,}; -        char      *path          = NULL; -        char       key[64]      = ""; -        int        keylen; -        char      *uuid1_str     = NULL; -        char      *uuid1_str_dup = NULL; -        char      *uuid2_str     = NULL; -        xlator_t  *this          = NULL; +    int ret = -1; +    int count = 0; +    int i = 0; +    int op_code = GF_QUOTA_OPTION_TYPE_NONE; +    uuid_t uuid1 = {0}; +    uuid_t uuid2 = { +        0, +    }; +    char *path = NULL; +    char key[64] = ""; +    int keylen; +    char *uuid1_str = NULL; +    char *uuid1_str_dup = NULL; +    char *uuid2_str = NULL; +    xlator_t *this = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        ret = dict_get_int32n (op_ctx, "type", SLEN ("type"), &op_code); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get quota opcode"); -                goto out; -        } +    ret = dict_get_int32n(op_ctx, "type", SLEN("type"), &op_code); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get quota opcode"); +        goto out; +    } -        if ((op_code != GF_QUOTA_OPTION_TYPE_LIMIT_USAGE) && -            (op_code != GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS) && -            (op_code != GF_QUOTA_OPTION_TYPE_REMOVE) && -            (op_code != GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS)) { -                ret = 0; -                goto out; +    if ((op_code != GF_QUOTA_OPTION_TYPE_LIMIT_USAGE) && +        (op_code != GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS) && +        (op_code != GF_QUOTA_OPTION_TYPE_REMOVE) && +        (op_code != GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS)) { +        ret = 0; +        goto out; +    } + +    ret = dict_get_strn(op_ctx, "path", SLEN("path"), &path); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get path"); +        goto out; +    } + +    ret = dict_get_int32n(op_ctx, "count", SLEN("count"), &count); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get count"); +        goto out; +    } + +    /* If count is 0, fail the command with ENOENT. +     * +     * If count is 1, treat gfid0 as the gfid on which the operation +     * is to be performed and resume the command. +     * +     * if count > 1, get the 0th gfid from the op_ctx and, +     * compare it with the remaining 'count -1' gfids. +     * If they are found to be the same, set gfid0 in the op_ctx and +     * resume the operation, else error out. +     */ + +    if (count == 0) { +        gf_asprintf(op_errstr, +                    "Failed to get trusted.gfid attribute " +                    "on path %s. Reason : %s", +                    path, strerror(ENOENT)); +        ret = -ENOENT; +        goto out; +    } + +    keylen = snprintf(key, sizeof(key), "gfid%d", 0); + +    ret = dict_get_strn(op_ctx, key, keylen, &uuid1_str); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get key '%s'", key); +        goto out; +    } + +    gf_uuid_parse(uuid1_str, uuid1); + +    for (i = 1; i < count; i++) { +        keylen = snprintf(key, sizeof(key), "gfid%d", i); + +        ret = dict_get_strn(op_ctx, key, keylen, &uuid2_str); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                   "Failed to get key " +                   "'%s'", +                   key); +            goto out;          } -        ret = dict_get_strn (op_ctx, "path", SLEN ("path"), &path); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get path"); -                goto out; -        } +        gf_uuid_parse(uuid2_str, uuid2); -        ret = dict_get_int32n (op_ctx, "count", SLEN ("count"), &count); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get count"); -                goto out; +        if (gf_uuid_compare(uuid1, uuid2)) { +            gf_asprintf(op_errstr, +                        "gfid mismatch between %s and " +                        "%s for path %s", +                        uuid1_str, uuid2_str, path); +            ret = -1; +            goto out;          } +    } -        /* If count is 0, fail the command with ENOENT. -         * -         * If count is 1, treat gfid0 as the gfid on which the operation -         * is to be performed and resume the command. -         * -         * if count > 1, get the 0th gfid from the op_ctx and, -         * compare it with the remaining 'count -1' gfids. -         * If they are found to be the same, set gfid0 in the op_ctx and -         * resume the operation, else error out. -         */ - -        if (count == 0) { -                gf_asprintf (op_errstr, "Failed to get trusted.gfid attribute " -                             "on path %s. Reason : %s", path, -                             strerror (ENOENT)); -                ret = -ENOENT; -                goto out; +    if (i == count) { +        uuid1_str_dup = gf_strdup(uuid1_str); +        if (!uuid1_str_dup) { +            ret = -1; +            goto out;          } -        keylen = snprintf (key, sizeof (key), "gfid%d", 0); - -        ret = dict_get_strn (op_ctx, key, keylen, &uuid1_str); +        ret = dict_set_dynstrn(req_dict, "gfid", SLEN("gfid"), uuid1_str_dup);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get key '%s'", -                        key); -                goto out; -        } - -        gf_uuid_parse (uuid1_str, uuid1); - -        for (i = 1; i < count; i++) { -                keylen = snprintf (key, sizeof (key), "gfid%d", i); - -                ret = dict_get_strn (op_ctx, key, keylen, &uuid2_str); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_GET_FAILED, -                                "Failed to get key " -                                "'%s'", key); -                        goto out; -                } - -                gf_uuid_parse (uuid2_str, uuid2); - -                if (gf_uuid_compare (uuid1, uuid2)) { -                        gf_asprintf (op_errstr, "gfid mismatch between %s and " -                                     "%s for path %s", uuid1_str, uuid2_str, -                                     path); -                        ret = -1; -                        goto out; -                } -        } - -        if (i == count) { -                uuid1_str_dup = gf_strdup (uuid1_str); -                if (!uuid1_str_dup) { -                        ret = -1; -                        goto out; -                } - -                ret = dict_set_dynstrn (req_dict, "gfid", SLEN ("gfid"), -                                        uuid1_str_dup); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Failed to set gfid"); -                        GF_FREE (uuid1_str_dup); -                        goto out; -                } -        } else { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_ITER_FAIL, -                        "Failed to iterate through %d" -                        " entries in the req dict", count); -                ret = -1; -                goto out; +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Failed to set gfid"); +            GF_FREE(uuid1_str_dup); +            goto out;          } +    } else { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_ITER_FAIL, +               "Failed to iterate through %d" +               " entries in the req dict", +               count); +        ret = -1; +        goto out; +    } -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  }  void -glusterd_clean_up_quota_store (glusterd_volinfo_t *volinfo) +glusterd_clean_up_quota_store(glusterd_volinfo_t *volinfo)  { -        char      voldir[PATH_MAX]         = ""; -        char      quota_confpath[PATH_MAX] = ""; -        char      cksum_path[PATH_MAX]     = ""; -        xlator_t  *this                    = NULL; -        glusterd_conf_t *conf              = NULL; -        int32_t   len                      = 0; +    char voldir[PATH_MAX] = ""; +    char quota_confpath[PATH_MAX] = ""; +    char cksum_path[PATH_MAX] = ""; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    int32_t len = 0; -        this = THIS; -        GF_ASSERT (this); -        conf = this->private; -        GF_ASSERT (conf); +    this = THIS; +    GF_ASSERT(this); +    conf = this->private; +    GF_ASSERT(conf); -        GLUSTERD_GET_VOLUME_DIR (voldir, volinfo, conf); +    GLUSTERD_GET_VOLUME_DIR(voldir, volinfo, conf); -        len = snprintf (quota_confpath, sizeof (quota_confpath), "%s/%s", -                        voldir, GLUSTERD_VOLUME_QUOTA_CONFIG); -        if ((len < 0) || (len >= sizeof(quota_confpath))) { -                quota_confpath[0] = 0; -        } -        len = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", voldir, -                        GLUSTERD_VOL_QUOTA_CKSUM_FILE); -        if ((len < 0) || (len >= sizeof(cksum_path))) { -                cksum_path[0] = 0; -        } - -        sys_unlink (quota_confpath); -        sys_unlink (cksum_path); +    len = snprintf(quota_confpath, sizeof(quota_confpath), "%s/%s", voldir, +                   GLUSTERD_VOLUME_QUOTA_CONFIG); +    if ((len < 0) || (len >= sizeof(quota_confpath))) { +        quota_confpath[0] = 0; +    } +    len = snprintf(cksum_path, sizeof(cksum_path), "%s/%s", voldir, +                   GLUSTERD_VOL_QUOTA_CKSUM_FILE); +    if ((len < 0) || (len >= sizeof(cksum_path))) { +        cksum_path[0] = 0; +    } -        gf_store_handle_destroy (volinfo->quota_conf_shandle); -        volinfo->quota_conf_shandle = NULL; -        volinfo->quota_conf_version = 0; +    sys_unlink(quota_confpath); +    sys_unlink(cksum_path); +    gf_store_handle_destroy(volinfo->quota_conf_shandle); +    volinfo->quota_conf_shandle = NULL; +    volinfo->quota_conf_version = 0;  }  int -glusterd_remove_auxiliary_mount (char *volname) +glusterd_remove_auxiliary_mount(char *volname)  { -        int       ret                = -1; -        char      mountdir[PATH_MAX] = ""; -        xlator_t *this               = NULL; +    int ret = -1; +    char mountdir[PATH_MAX] = ""; +    xlator_t *this = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        GLUSTERD_GET_QUOTA_LIMIT_MOUNT_PATH (mountdir, volname, "/"); -        ret = gf_umount_lazy (this->name, mountdir, 1); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, errno, -                        GD_MSG_LAZY_UMOUNT_FAIL, "umount on %s failed, " -                        "reason : %s", mountdir, strerror (errno)); +    GLUSTERD_GET_QUOTA_LIMIT_MOUNT_PATH(mountdir, volname, "/"); +    ret = gf_umount_lazy(this->name, mountdir, 1); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_LAZY_UMOUNT_FAIL, +               "umount on %s failed, " +               "reason : %s", +               mountdir, strerror(errno)); -                /* Hide EBADF as it means the mount is already gone */ -                if (errno == EBADF) -                       ret = 0; -        } +        /* Hide EBADF as it means the mount is already gone */ +        if (errno == EBADF) +            ret = 0; +    } -        return ret; +    return ret;  }  /* Stops the rebalance process of the given volume   */  int -gd_stop_rebalance_process (glusterd_volinfo_t *volinfo) +gd_stop_rebalance_process(glusterd_volinfo_t *volinfo)  { -        int              ret               = -1; -        xlator_t        *this              = NULL; -        glusterd_conf_t *conf              = NULL; -        char             pidfile[PATH_MAX] = ""; +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    char pidfile[PATH_MAX] = ""; -        GF_ASSERT (volinfo); +    GF_ASSERT(volinfo); -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        conf = this->private; -        GF_ASSERT (conf); +    conf = this->private; +    GF_ASSERT(conf); -        GLUSTERD_GET_DEFRAG_PID_FILE (pidfile, volinfo, conf); -        ret = glusterd_service_stop ("rebalance", pidfile, SIGTERM, _gf_true); +    GLUSTERD_GET_DEFRAG_PID_FILE(pidfile, volinfo, conf); +    ret = glusterd_service_stop("rebalance", pidfile, SIGTERM, _gf_true); -        return ret; +    return ret;  }  rpc_clnt_t * -glusterd_rpc_clnt_unref (glusterd_conf_t *conf, rpc_clnt_t *rpc) +glusterd_rpc_clnt_unref(glusterd_conf_t *conf, rpc_clnt_t *rpc)  { -        rpc_clnt_t *ret = NULL; +    rpc_clnt_t *ret = NULL; -        GF_ASSERT (conf); -        GF_ASSERT (rpc); -        synclock_unlock (&conf->big_lock); -        (void) rpc_clnt_reconnect_cleanup (&rpc->conn); -        ret = rpc_clnt_unref (rpc); -        synclock_lock (&conf->big_lock); +    GF_ASSERT(conf); +    GF_ASSERT(rpc); +    synclock_unlock(&conf->big_lock); +    (void)rpc_clnt_reconnect_cleanup(&rpc->conn); +    ret = rpc_clnt_unref(rpc); +    synclock_lock(&conf->big_lock); -        return ret; +    return ret;  }  int32_t  glusterd_compare_volume_name(struct cds_list_head *list1,                               struct cds_list_head *list2)  { -        glusterd_volinfo_t *volinfo1 = NULL; -        glusterd_volinfo_t *volinfo2 = NULL; +    glusterd_volinfo_t *volinfo1 = NULL; +    glusterd_volinfo_t *volinfo2 = NULL; -        volinfo1 = cds_list_entry (list1, glusterd_volinfo_t, vol_list); -        volinfo2 = cds_list_entry (list2, glusterd_volinfo_t, vol_list); -        return strcmp(volinfo1->volname, volinfo2->volname); +    volinfo1 = cds_list_entry(list1, glusterd_volinfo_t, vol_list); +    volinfo2 = cds_list_entry(list2, glusterd_volinfo_t, vol_list); +    return strcmp(volinfo1->volname, volinfo2->volname);  }  static int -gd_default_synctask_cbk (int ret, call_frame_t *frame, void *opaque) +gd_default_synctask_cbk(int ret, call_frame_t *frame, void *opaque)  { -        glusterd_conf_t     *priv = THIS->private; -        synclock_unlock (&priv->big_lock); -        return ret; +    glusterd_conf_t *priv = THIS->private; +    synclock_unlock(&priv->big_lock); +    return ret;  }  void -glusterd_launch_synctask (synctask_fn_t fn, void *opaque) +glusterd_launch_synctask(synctask_fn_t fn, void *opaque)  { -        xlator_t        *this = NULL; -        int             ret   = -1; +    xlator_t *this = NULL; +    int ret = -1; -        this = THIS; +    this = THIS; -        /* synclock_lock must be called from within synctask, @fn must call it before -         * it starts with its work*/ -        ret = synctask_new (this->ctx->env, fn, gd_default_synctask_cbk, NULL, -                            opaque); -        if (ret) -                gf_msg (this->name, GF_LOG_CRITICAL, 0, -                        GD_MSG_SPAWN_SVCS_FAIL, "Failed to spawn bricks" -                        " and other volume related services"); +    /* synclock_lock must be called from within synctask, @fn must call it +     * before it starts with its work*/ +    ret = synctask_new(this->ctx->env, fn, gd_default_synctask_cbk, NULL, +                       opaque); +    if (ret) +        gf_msg(this->name, GF_LOG_CRITICAL, 0, GD_MSG_SPAWN_SVCS_FAIL, +               "Failed to spawn bricks" +               " and other volume related services");  }  /* @@ -13073,8 +12701,8 @@ glusterd_launch_synctask (synctask_fn_t fn, void *opaque)   * @option  - option to be set to default. If NULL, all possible options will be   *            set to default   * - * Returns 0 on success and -1 on failure. If @option is given, but doesn't match - * any of the options that could be set, it is a success. + * Returns 0 on success and -1 on failure. If @option is given, but doesn't + * match any of the options that could be set, it is a success.   */  /*   * TODO: Make this able to parse the volume-set table to set options @@ -13085,130 +12713,126 @@ glusterd_launch_synctask (synctask_fn_t fn, void *opaque)   * default values   */  int -glusterd_enable_default_options (glusterd_volinfo_t *volinfo, char *option) +glusterd_enable_default_options(glusterd_volinfo_t *volinfo, char *option)  { -        int ret = 0; -        xlator_t *this = NULL; -        glusterd_conf_t *conf = NULL; +    int ret = 0; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        GF_VALIDATE_OR_GOTO (this->name, volinfo, out); +    GF_VALIDATE_OR_GOTO(this->name, volinfo, out); -        conf = this->private; -        GF_ASSERT (conf); +    conf = this->private; +    GF_ASSERT(conf);  #ifdef GD_OP_VERSION_3_8_0 -        if (conf->op_version >= GD_OP_VERSION_3_8_0) { -                /* nfs.disable needs to be enabled for new volumes with -                 * >= gluster version 3.7 (for now) 3.8 later -                 */ -                if (!option || !strcmp (NFS_DISABLE_MAP_KEY, option)) { -                        ret = dict_set_dynstr_with_alloc (volinfo->dict, -                                        NFS_DISABLE_MAP_KEY, "on"); -                        if (ret) { -                                gf_msg (this->name, GF_LOG_ERROR, errno, -                                        GD_MSG_DICT_SET_FAILED, -                                        "Failed to set option '" -                                        NFS_DISABLE_MAP_KEY "' on volume " -                                        "%s", volinfo->volname); -                                goto out; -                        } -                } -        } +    if (conf->op_version >= GD_OP_VERSION_3_8_0) { +        /* nfs.disable needs to be enabled for new volumes with +         * >= gluster version 3.7 (for now) 3.8 later +         */ +        if (!option || !strcmp(NFS_DISABLE_MAP_KEY, option)) { +            ret = dict_set_dynstr_with_alloc(volinfo->dict, NFS_DISABLE_MAP_KEY, +                                             "on"); +            if (ret) { +                gf_msg(this->name, GF_LOG_ERROR, errno, GD_MSG_DICT_SET_FAILED, +                       "Failed to set option '" NFS_DISABLE_MAP_KEY +                       "' on volume " +                       "%s", +                       volinfo->volname); +                goto out; +            } +        } +    }  #endif -        if (conf->op_version >= GD_OP_VERSION_3_7_0) { -                /* Set needed volume options in volinfo->dict -                 * For ex., -                 * -                 * if (!option || !strcmp("someoption", option) { -                 *      ret = dict_set_str(volinfo->dict, "someoption", "on"); -                 *      ... -                 * } -                 * */ - -                /* Option 'features.quota-deem-statfs' should not be turned off -                 * with 'gluster volume reset <VOLNAME>', since quota features -                 * can be reset only with 'gluster volume quota <VOLNAME> -                 * disable'. -                 */ +    if (conf->op_version >= GD_OP_VERSION_3_7_0) { +        /* Set needed volume options in volinfo->dict +         * For ex., +         * +         * if (!option || !strcmp("someoption", option) { +         *      ret = dict_set_str(volinfo->dict, "someoption", "on"); +         *      ... +         * } +         * */ + +        /* Option 'features.quota-deem-statfs' should not be turned off +         * with 'gluster volume reset <VOLNAME>', since quota features +         * can be reset only with 'gluster volume quota <VOLNAME> +         * disable'. +         */ -                if (!option || !strcmp ("features.quota-deem-statfs", option)) { -                        if (glusterd_is_volume_quota_enabled(volinfo)) { -                                ret = dict_set_dynstr_with_alloc (volinfo->dict, -                                            "features.quota-deem-statfs", "on"); -                                if (ret) { -                                        gf_msg (this->name, GF_LOG_ERROR, errno, -                                                GD_MSG_DICT_SET_FAILED, -                                                "Failed to set option " -                                                "'features.quota-deem-statfs' " -                                                "on volume %s", -                                                volinfo->volname); -                                        goto out; -                                } -                        } +        if (!option || !strcmp("features.quota-deem-statfs", option)) { +            if (glusterd_is_volume_quota_enabled(volinfo)) { +                ret = dict_set_dynstr_with_alloc( +                    volinfo->dict, "features.quota-deem-statfs", "on"); +                if (ret) { +                    gf_msg(this->name, GF_LOG_ERROR, errno, +                           GD_MSG_DICT_SET_FAILED, +                           "Failed to set option " +                           "'features.quota-deem-statfs' " +                           "on volume %s", +                           volinfo->volname); +                    goto out;                  } +            } +        } -                if (!option || !strcmp ("features.ctr-enabled", option)) { -                        if (volinfo->type == GF_CLUSTER_TYPE_TIER) { -                                ret = dict_set_dynstr_with_alloc (volinfo->dict, -                                            "features.ctr-enabled", "on"); -                                if (ret) { -                                        gf_msg (this->name, GF_LOG_ERROR, errno, -                                                GD_MSG_DICT_SET_FAILED, -                                                "Failed to set option " -                                                "'features.ctr-enabled' " -                                                "on volume %s", -                                                volinfo->volname); -                                        goto out; -                                } -                        } +        if (!option || !strcmp("features.ctr-enabled", option)) { +            if (volinfo->type == GF_CLUSTER_TYPE_TIER) { +                ret = dict_set_dynstr_with_alloc(volinfo->dict, +                                                 "features.ctr-enabled", "on"); +                if (ret) { +                    gf_msg(this->name, GF_LOG_ERROR, errno, +                           GD_MSG_DICT_SET_FAILED, +                           "Failed to set option " +                           "'features.ctr-enabled' " +                           "on volume %s", +                           volinfo->volname); +                    goto out;                  } - +            }          } +    }  out: -        return ret; +    return ret;  }  void -glusterd_get_gfproxy_client_volfile (glusterd_volinfo_t *volinfo, -                                        char *path, int path_len) +glusterd_get_gfproxy_client_volfile(glusterd_volinfo_t *volinfo, char *path, +                                    int path_len)  { -        char                    workdir[PATH_MAX]      = ""; -        glusterd_conf_t        *priv                    = THIS->private; +    char workdir[PATH_MAX] = ""; +    glusterd_conf_t *priv = THIS->private; -        GLUSTERD_GET_VOLUME_DIR (workdir, volinfo, priv); +    GLUSTERD_GET_VOLUME_DIR(workdir, volinfo, priv); -        switch (volinfo->transport_type) { +    switch (volinfo->transport_type) {          case GF_TRANSPORT_TCP: -                snprintf (path, path_len, -                                "%s/trusted-%s.tcp-gfproxy-fuse.vol", -                                workdir, volinfo->volname); -                break; +            snprintf(path, path_len, "%s/trusted-%s.tcp-gfproxy-fuse.vol", +                     workdir, volinfo->volname); +            break;          case GF_TRANSPORT_RDMA: -                snprintf (path, path_len, -                                "%s/trusted-%s.rdma-gfproxy-fuse.vol", -                                workdir, volinfo->volname); -                break; +            snprintf(path, path_len, "%s/trusted-%s.rdma-gfproxy-fuse.vol", +                     workdir, volinfo->volname); +            break;          default: -                break; -        } +            break; +    }  }  void -glusterd_get_rebalance_volfile (glusterd_volinfo_t *volinfo, -                                char *path, int path_len) +glusterd_get_rebalance_volfile(glusterd_volinfo_t *volinfo, char *path, +                               int path_len)  { -        char                    workdir[PATH_MAX]      = ""; -        glusterd_conf_t        *priv                   = THIS->private; +    char workdir[PATH_MAX] = ""; +    glusterd_conf_t *priv = THIS->private; -        GLUSTERD_GET_VOLUME_DIR (workdir, volinfo, priv); +    GLUSTERD_GET_VOLUME_DIR(workdir, volinfo, priv); -        snprintf (path, path_len, "%s/%s-rebalance.vol", workdir, -                  volinfo->volname); +    snprintf(path, path_len, "%s/%s-rebalance.vol", workdir, volinfo->volname);  }  /* This function will update the backend file-system @@ -13221,862 +12845,843 @@ glusterd_get_rebalance_volfile (glusterd_volinfo_t *volinfo,   * @return 0 on success and -1 on failure   */  int -glusterd_update_mntopts (char *brick_path, glusterd_brickinfo_t *brickinfo) -{ -        int32_t               ret               = -1; -        char                 *mnt_pt            = NULL; -        char                  buff[PATH_MAX]    = ""; -        struct mntent        *entry             = NULL; -        struct mntent         save_entry        = {0,}; -        xlator_t             *this              = NULL; - -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (brick_path); -        GF_ASSERT (brickinfo); +glusterd_update_mntopts(char *brick_path, glusterd_brickinfo_t *brickinfo) +{ +    int32_t ret = -1; +    char *mnt_pt = NULL; +    char buff[PATH_MAX] = ""; +    struct mntent *entry = NULL; +    struct mntent save_entry = { +        0, +    }; +    xlator_t *this = NULL; + +    this = THIS; +    GF_ASSERT(this); +    GF_ASSERT(brick_path); +    GF_ASSERT(brickinfo); + +    ret = glusterd_get_brick_root(brick_path, &mnt_pt); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRICKPATH_ROOT_GET_FAIL, +               "getting the root " +               "of the brick (%s) failed ", +               brick_path); +        goto out; +    } + +    entry = glusterd_get_mnt_entry_info(mnt_pt, buff, sizeof(buff), +                                        &save_entry); +    if (!entry) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_MNTENTRY_GET_FAIL, +               "getting the mount entry for " +               "the brick (%s) failed", +               brick_path); +        ret = -1; +        goto out; +    } -        ret = glusterd_get_brick_root (brick_path, &mnt_pt); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BRICKPATH_ROOT_GET_FAIL, -                        "getting the root " -                        "of the brick (%s) failed ", brick_path); -                goto out; -        } +    if (snprintf(brickinfo->fstype, sizeof(brickinfo->fstype), "%s", +                 entry->mnt_type) >= sizeof(brickinfo->fstype)) { +        ret = -1; +        goto out; +    } +    strcpy(brickinfo->mnt_opts, entry->mnt_opts); + +    ret = 0; +out: +    if (mnt_pt) +        GF_FREE(mnt_pt); +    return ret; +} + +int +glusterd_get_value_for_vme_entry(struct volopt_map_entry *vme, char **def_val) +{ +    int ret = -1; +    char *key = NULL; +    xlator_t *this = NULL; +    char *descr = NULL; +    char *local_def_val = NULL; +    void *dl_handle = NULL; +    volume_opt_list_t vol_opt_handle = { +        {0}, +    }; + +    this = THIS; +    GF_ASSERT(this); + +    CDS_INIT_LIST_HEAD(&vol_opt_handle.list); + +    if (_get_xlator_opt_key_from_vme(vme, &key)) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_GET_KEY_FAILED, +               "Failed to get %s key from " +               "volume option entry", +               vme->key); +        goto out; +    } + +    ret = xlator_volopt_dynload(vme->voltype, &dl_handle, &vol_opt_handle); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_XLATOR_VOLOPT_DYNLOAD_ERROR, +               "xlator_volopt_dynload error " +               "(%d)", +               ret); +        ret = -2; +        goto cont; +    } + +    ret = xlator_option_info_list(&vol_opt_handle, key, &local_def_val, &descr); +    if (ret) { +        /*Swallow Error if option not found*/ +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_GET_KEY_FAILED, +               "Failed to get option for %s " +               "key", +               key); +        ret = -2; +        goto cont; +    } +    if (!local_def_val) +        local_def_val = "(null)"; + +    *def_val = gf_strdup(local_def_val); -        entry = glusterd_get_mnt_entry_info (mnt_pt, buff, sizeof (buff), -                                             &save_entry); -        if (!entry) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_MNTENTRY_GET_FAIL, -                        "getting the mount entry for " -                        "the brick (%s) failed", brick_path); -                ret = -1; -                goto out; +cont: +    if (dl_handle) { +        dlclose(dl_handle); +        dl_handle = NULL; +        vol_opt_handle.given_opt = NULL; +    } +    if (key) { +        _free_xlator_opt_key(key); +        key = NULL; +    } + +    if (ret) +        goto out; + +out: +    gf_msg_debug(this->name, 0, "Returning %d", ret); +    return ret; +} + +int +glusterd_get_global_max_op_version(rpcsvc_request_t *req, dict_t *ctx, +                                   int count) +{ +    int ret = -1; +    char *def_val = NULL; +    char dict_key[50] = ""; +    int keylen; + +    ret = glusterd_mgmt_v3_initiate_all_phases(req, GD_OP_MAX_OPVERSION, ctx); + +    ret = dict_get_strn(ctx, "max-opversion", SLEN("max-opversion"), &def_val); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get max-opversion value from" +               " dictionary"); +        goto out; +    } + +    keylen = sprintf(dict_key, "key%d", count); +    ret = dict_set_nstrn(ctx, dict_key, keylen, GLUSTERD_MAX_OP_VERSION_KEY, +                         SLEN(GLUSTERD_MAX_OP_VERSION_KEY)); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set %s in " +               "dictionary", +               GLUSTERD_MAX_OP_VERSION_KEY); +        goto out; +    } + +    sprintf(dict_key, "value%d", count); +    ret = dict_set_dynstr_with_alloc(ctx, dict_key, def_val); +    if (ret) { +        gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set %s for key %s in dictionary", def_val, +               GLUSTERD_MAX_OP_VERSION_KEY); +        goto out; +    } + +out: +    return ret; +} + +int +glusterd_get_global_options_for_all_vols(rpcsvc_request_t *req, dict_t *ctx, +                                         char **op_errstr) +{ +    int ret = -1; +    int count = 0; +    gf_boolean_t all_opts = _gf_false; +    gf_boolean_t key_found = _gf_false; +    glusterd_conf_t *priv = NULL; +    xlator_t *this = NULL; +    char *key = NULL; +    char *key_fixed = NULL; +    char dict_key[50] = ""; +    char *def_val = NULL; +    char err_str[PATH_MAX] = ""; +    char *allvolopt = NULL; +    int32_t i = 0; +    gf_boolean_t exists = _gf_false; +    gf_boolean_t need_free = _gf_false; + +    this = THIS; +    GF_VALIDATE_OR_GOTO(THIS->name, this, out); + +    priv = this->private; +    GF_VALIDATE_OR_GOTO(this->name, priv, out); + +    GF_VALIDATE_OR_GOTO(this->name, ctx, out); + +    ret = dict_get_strn(ctx, "key", SLEN("key"), &key); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Failed to get option key from dictionary"); +        goto out; +    } + +    if (strcasecmp(key, "all") == 0) +        all_opts = _gf_true; +    else { +        exists = glusterd_check_option_exists(key, &key_fixed); +        if (!exists) { +            snprintf(err_str, sizeof(err_str), +                     "Option " +                     "with name: %s does not exist", +                     key); +            gf_msg(this->name, GF_LOG_ERROR, EINVAL, GD_MSG_UNKNOWN_KEY, "%s", +                   err_str); +            if (key_fixed) +                snprintf(err_str, sizeof(err_str), "Did you mean %s?", +                         key_fixed); +            ret = -1; +            goto out;          } +        if (key_fixed) +            key = key_fixed; +    } -        if (snprintf (brickinfo->fstype, sizeof (brickinfo->fstype), "%s", -                      entry->mnt_type) >= sizeof (brickinfo->fstype)) { -                ret = -1; -                goto out; -        } -        strcpy (brickinfo->mnt_opts, entry->mnt_opts); +    ALL_VOLUME_OPTION_CHECK("all", _gf_true, key, ret, op_errstr, out); -        ret = 0; -out: -        if (mnt_pt) -                GF_FREE (mnt_pt); -        return ret; -} - -int -glusterd_get_value_for_vme_entry (struct volopt_map_entry *vme, char **def_val) -{ -        int                      ret = -1; -        char                    *key = NULL; -        xlator_t                *this = NULL; -        char                    *descr = NULL; -        char                    *local_def_val = NULL; -        void                    *dl_handle = NULL; -        volume_opt_list_t        vol_opt_handle = {{0},}; +    for (i = 0; valid_all_vol_opts[i].option; i++) { +        allvolopt = valid_all_vol_opts[i].option; -        this = THIS; -        GF_ASSERT (this); +        if (!all_opts && strcmp(key, allvolopt) != 0) +            continue; -        CDS_INIT_LIST_HEAD (&vol_opt_handle.list); - -        if (_get_xlator_opt_key_from_vme (vme, &key)) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_GET_KEY_FAILED, -                        "Failed to get %s key from " -                        "volume option entry", vme->key); +        /* Found global option */ +        if (strcmp(allvolopt, GLUSTERD_MAX_OP_VERSION_KEY) == 0) { +            count++; +            ret = glusterd_get_global_max_op_version(req, ctx, count); +            if (ret)                  goto out; +            else +                continue;          } -        ret = xlator_volopt_dynload (vme->voltype, &dl_handle, &vol_opt_handle); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_XLATOR_VOLOPT_DYNLOAD_ERROR, -                        "xlator_volopt_dynload error " -                        "(%d)", ret); -                ret = -2; -                goto cont; -        } - -        ret = xlator_option_info_list (&vol_opt_handle,key, -                                       &local_def_val, &descr); -        if (ret) { -                /*Swallow Error if option not found*/ -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_GET_KEY_FAILED, -                        "Failed to get option for %s " -                        "key", key); -                ret = -2; -                goto cont; -        } -        if (!local_def_val) -                local_def_val = "(null)"; +        ret = dict_get_str(priv->opts, allvolopt, &def_val); -        *def_val = gf_strdup (local_def_val); +        /* If global option isn't set explicitly */ -cont: -        if (dl_handle) { -                dlclose (dl_handle); -                dl_handle = NULL; -                vol_opt_handle.given_opt = NULL; +        if (!def_val) { +            if (!strcmp(allvolopt, GLUSTERD_GLOBAL_OP_VERSION_KEY)) { +                gf_asprintf(&def_val, "%d", priv->op_version); +                need_free = _gf_true; +            } else { +                def_val = valid_all_vol_opts[i].dflt_val; +            }          } -        if (key) { -                _free_xlator_opt_key (key); -                key = NULL; -        } - -        if (ret) -                goto out; -out: -        gf_msg_debug (this->name, 0, "Returning %d", ret); -        return ret; -} - -int -glusterd_get_global_max_op_version (rpcsvc_request_t *req, dict_t *ctx, -                                    int count) -{ -        int     ret = -1; -        char    *def_val = NULL; -        char    dict_key[50] = ""; -        int     keylen; - -        ret = glusterd_mgmt_v3_initiate_all_phases (req, GD_OP_MAX_OPVERSION, -                                                    ctx); - -        ret = dict_get_strn (ctx, "max-opversion", -                             SLEN ("max-opversion"), &def_val); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get max-opversion value from" -                        " dictionary"); -                goto out; -        } - -        keylen = sprintf (dict_key, "key%d", count); -        ret = dict_set_nstrn (ctx, dict_key, keylen, -                              GLUSTERD_MAX_OP_VERSION_KEY, -                              SLEN (GLUSTERD_MAX_OP_VERSION_KEY)); -        if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, "Failed to set %s in " -                        "dictionary", GLUSTERD_MAX_OP_VERSION_KEY); -                goto out; -        } - -        sprintf (dict_key, "value%d", count); -        ret = dict_set_dynstr_with_alloc (ctx, dict_key, def_val); +        count++; +        ret = sprintf(dict_key, "key%d", count); +        ret = dict_set_strn(ctx, dict_key, ret, allvolopt);          if (ret) { -                gf_msg (THIS->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to set %s for key %s in dictionary", -                        def_val, GLUSTERD_MAX_OP_VERSION_KEY); -                goto out; +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Failed to set %s in dictionary", allvolopt); +            goto out;          } -out: -        return ret; -} - -int -glusterd_get_global_options_for_all_vols (rpcsvc_request_t *req, dict_t *ctx, -                                          char **op_errstr) -{ -        int                     ret = -1; -        int                     count = 0; -        gf_boolean_t            all_opts = _gf_false; -        gf_boolean_t            key_found = _gf_false; -        glusterd_conf_t         *priv = NULL; -        xlator_t                *this = NULL; -        char                    *key = NULL; -        char                    *key_fixed = NULL; -        char                    dict_key[50] = ""; -        char                    *def_val = NULL; -        char                    err_str[PATH_MAX] = ""; -        char                    *allvolopt = NULL; -        int32_t                 i = 0; -        gf_boolean_t            exists = _gf_false; -        gf_boolean_t            need_free = _gf_false; - -        this = THIS; -        GF_VALIDATE_OR_GOTO (THIS->name, this, out); - -        priv = this->private; -        GF_VALIDATE_OR_GOTO (this->name, priv, out); - -        GF_VALIDATE_OR_GOTO (this->name, ctx, out); - -        ret = dict_get_strn (ctx, "key", SLEN ("key"), &key); +        sprintf(dict_key, "value%d", count); +        ret = dict_set_dynstr_with_alloc(ctx, dict_key, def_val);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Failed to get option key from dictionary"); -                goto out; +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Failed to set %s for key %s in dictionary", def_val, +                   allvolopt); +            goto out;          } -        if (strcasecmp (key, "all") == 0) -                all_opts = _gf_true; -        else { -                exists = glusterd_check_option_exists (key, &key_fixed); -                if (!exists) { -                        snprintf (err_str, sizeof (err_str), "Option " -                                  "with name: %s does not exist", key); -                        gf_msg (this->name, GF_LOG_ERROR, EINVAL, -                                GD_MSG_UNKNOWN_KEY, "%s", err_str); -                        if (key_fixed) -                                snprintf (err_str, sizeof (err_str), -                                          "Did you mean %s?", key_fixed); -                        ret = -1; -                        goto out; -                } -                if (key_fixed) -                        key = key_fixed; +        if (need_free) { +            GF_FREE(def_val); +            need_free = _gf_false;          } +        def_val = NULL; +        allvolopt = NULL; -        ALL_VOLUME_OPTION_CHECK ("all", _gf_true, key, ret, op_errstr, out); - -        for (i = 0; valid_all_vol_opts[i].option; i++) { -                allvolopt = valid_all_vol_opts[i].option; - -                if (!all_opts && strcmp (key, allvolopt) != 0) -                        continue; - -                /* Found global option */ -                if (strcmp (allvolopt, GLUSTERD_MAX_OP_VERSION_KEY) == 0) { -                        count++; -                        ret = glusterd_get_global_max_op_version (req, ctx, -                                                                  count); -                        if (ret) -                                goto out; -                        else -                                continue; -                } - -                ret = dict_get_str (priv->opts, allvolopt, &def_val); +        if (!all_opts) +            break; +    } -                /* If global option isn't set explicitly */ - -                if (!def_val) { -                        if (!strcmp (allvolopt, -                                     GLUSTERD_GLOBAL_OP_VERSION_KEY)) { -                                gf_asprintf (&def_val, "%d", priv->op_version); -                                need_free = _gf_true; -                        } else { -                                def_val = valid_all_vol_opts[i].dflt_val; -                        } -                } - -                count++; -                ret = sprintf (dict_key, "key%d", count); -                ret = dict_set_strn (ctx, dict_key, ret, allvolopt); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Failed to set %s in dictionary", allvolopt); -                        goto out; -                } - -                sprintf (dict_key, "value%d", count); -                ret = dict_set_dynstr_with_alloc (ctx, dict_key, def_val); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Failed to set %s for key %s in dictionary", -                                def_val, allvolopt); -                        goto out; -                } - -                if (need_free) { -                        GF_FREE (def_val); -                        need_free = _gf_false; -                } -                def_val = NULL; -                allvolopt = NULL; - -                if (!all_opts) -                        break; -        } - -        ret = dict_set_int32n (ctx, "count", SLEN ("count"), count); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, -                        "Failed to set count in dictionary"); -        } +    ret = dict_set_int32n(ctx, "count", SLEN("count"), count); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set count in dictionary"); +    }  out: -        if (ret && !all_opts && !key_found) { -                if (err_str[0] == 0) -                        snprintf (err_str, sizeof (err_str), -                                  "option %s does not exist", key); -                if (*op_errstr == NULL) -                        *op_errstr = gf_strdup (err_str); -        } +    if (ret && !all_opts && !key_found) { +        if (err_str[0] == 0) +            snprintf(err_str, sizeof(err_str), "option %s does not exist", key); +        if (*op_errstr == NULL) +            *op_errstr = gf_strdup(err_str); +    } -        if (ret && need_free) { -                GF_FREE (def_val); -        } +    if (ret && need_free) { +        GF_FREE(def_val); +    } -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); -        return ret; +    return ret;  }  char * -glusterd_get_option_value (glusterd_volinfo_t *volinfo, char *key) +glusterd_get_option_value(glusterd_volinfo_t *volinfo, char *key)  { -        char *value = NULL; +    char *value = NULL; -        if (!glusterd_is_volume_replicate(volinfo)) -                goto ret; +    if (!glusterd_is_volume_replicate(volinfo)) +        goto ret; -        if (!strcmp (key, "performance.client-io-threads")) { -                value = "off"; -        } else if (!strcmp (key, "cluster.quorum-type")) { -                if (volinfo->replica_count%2) { -                        value = "auto"; -                } +    if (!strcmp(key, "performance.client-io-threads")) { +        value = "off"; +    } else if (!strcmp(key, "cluster.quorum-type")) { +        if (volinfo->replica_count % 2) { +            value = "auto";          } +    }  ret: -        return value; +    return value;  }  int -glusterd_get_default_val_for_volopt (dict_t *ctx, gf_boolean_t all_opts, -                                     char *input_key, char *orig_key, -                                     glusterd_volinfo_t *volinfo, -                                     char **op_errstr) -{ -        struct volopt_map_entry *vme = NULL; -        int                      ret = -1; -        int                      count = 0; -        xlator_t                *this = NULL; -        char                    *def_val = NULL; -        char                     dict_key[50] = ""; -        int                      keylen; -        gf_boolean_t             key_found = _gf_false; -        glusterd_conf_t         *priv = NULL; -        dict_t                  *vol_dict = NULL; - -        this = THIS; -        GF_ASSERT (this); - -        priv = this->private; -        GF_VALIDATE_OR_GOTO (this->name, priv, out); - -        vol_dict = volinfo->dict; -        GF_VALIDATE_OR_GOTO (this->name, vol_dict, out); - -        /* Check whether key is passed for a single option */ -        if (!all_opts && !input_key) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_KEY_NULL, -                        "Key is NULL"); -                goto out; -        } - -        for (vme = &glusterd_volopt_map[0]; vme->key; vme++) { -                if (!all_opts && strcmp (vme->key, input_key)) -                        continue; -                key_found = _gf_true; -                /* First look for the key in the priv->opts for global option -                 * and then into vol_dict, if its not present then look for -                 * translator default value */ -                keylen = strlen (vme->key); -                ret = dict_get_strn (priv->opts, vme->key, keylen, &def_val); -                if (!def_val) { -                        ret = dict_get_strn (vol_dict, vme->key, keylen, -                                             &def_val); -                        if (ret == -ENOENT) -                                def_val = glusterd_get_option_value (volinfo, -                                                                     vme->key); -                        if (!def_val) { -                                if (vme->value) { -                                        def_val = vme->value; -                                } else { -                                        ret = glusterd_get_value_for_vme_entry -                                                 (vme, &def_val); -                                        if (!all_opts && ret) -                                                goto out; -                                        else if (ret == -2) -                                                continue; -                                } -                        } -                } -                count++; -                keylen = sprintf (dict_key, "key%d", count); -                ret = dict_set_strn (ctx, dict_key, keylen, vme->key); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Failed to " -                                "set %s in dictionary", vme->key); -                        goto out; -                } -                sprintf (dict_key, "value%d", count); -                ret = dict_set_dynstr_with_alloc (ctx, dict_key, def_val); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                GD_MSG_DICT_SET_FAILED, -                                "Failed to " -                                "set %s for key %s in dictionary", def_val, -                                vme->key); +glusterd_get_default_val_for_volopt(dict_t *ctx, gf_boolean_t all_opts, +                                    char *input_key, char *orig_key, +                                    glusterd_volinfo_t *volinfo, +                                    char **op_errstr) +{ +    struct volopt_map_entry *vme = NULL; +    int ret = -1; +    int count = 0; +    xlator_t *this = NULL; +    char *def_val = NULL; +    char dict_key[50] = ""; +    int keylen; +    gf_boolean_t key_found = _gf_false; +    glusterd_conf_t *priv = NULL; +    dict_t *vol_dict = NULL; + +    this = THIS; +    GF_ASSERT(this); + +    priv = this->private; +    GF_VALIDATE_OR_GOTO(this->name, priv, out); + +    vol_dict = volinfo->dict; +    GF_VALIDATE_OR_GOTO(this->name, vol_dict, out); + +    /* Check whether key is passed for a single option */ +    if (!all_opts && !input_key) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_KEY_NULL, "Key is NULL"); +        goto out; +    } + +    for (vme = &glusterd_volopt_map[0]; vme->key; vme++) { +        if (!all_opts && strcmp(vme->key, input_key)) +            continue; +        key_found = _gf_true; +        /* First look for the key in the priv->opts for global option +         * and then into vol_dict, if its not present then look for +         * translator default value */ +        keylen = strlen(vme->key); +        ret = dict_get_strn(priv->opts, vme->key, keylen, &def_val); +        if (!def_val) { +            ret = dict_get_strn(vol_dict, vme->key, keylen, &def_val); +            if (ret == -ENOENT) +                def_val = glusterd_get_option_value(volinfo, vme->key); +            if (!def_val) { +                if (vme->value) { +                    def_val = vme->value; +                } else { +                    ret = glusterd_get_value_for_vme_entry(vme, &def_val); +                    if (!all_opts && ret)                          goto out; +                    else if (ret == -2) +                        continue;                  } -                def_val = NULL; -                if (!all_opts) -                        break; - +            }          } -        if (!all_opts && !key_found) -                goto out; - -        ret = dict_set_int32n (ctx, "count", SLEN ("count"), count); +        count++; +        keylen = sprintf(dict_key, "key%d", count); +        ret = dict_set_strn(ctx, dict_key, keylen, vme->key);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_SET_FAILED, -                        "Failed to set count " -                        "in dictionary"); +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Failed to " +                   "set %s in dictionary", +                   vme->key); +            goto out;          } - -out: -        if (ret && !all_opts && !key_found) { -                char err_str[PATH_MAX]; -                snprintf (err_str, sizeof (err_str), -                          "option %s does not exist", orig_key); -                *op_errstr = gf_strdup (err_str); +        sprintf(dict_key, "value%d", count); +        ret = dict_set_dynstr_with_alloc(ctx, dict_key, def_val); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                   "Failed to " +                   "set %s for key %s in dictionary", +                   def_val, vme->key); +            goto out;          } -        if (def_val) -                GF_FREE (def_val); -        gf_msg_debug (this->name, 0, "Returning %d", ret); -        return ret; -} - -int -glusterd_get_volopt_content (dict_t * ctx, gf_boolean_t xml_out) -{ -        void                    *dl_handle = NULL; -        volume_opt_list_t        vol_opt_handle = {{0},}; -        char                    *key = NULL; -        struct volopt_map_entry *vme = NULL; -        int                      ret = -1; -        char                    *def_val = NULL; -        char                    *descr = NULL; -        char                    *output = NULL; -        size_t                   size = 0; -        size_t                   used = 0; +        def_val = NULL; +        if (!all_opts) +            break; +    } +    if (!all_opts && !key_found) +        goto out; + +    ret = dict_set_int32n(ctx, "count", SLEN("count"), count); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +               "Failed to set count " +               "in dictionary"); +    } + +out: +    if (ret && !all_opts && !key_found) { +        char err_str[PATH_MAX]; +        snprintf(err_str, sizeof(err_str), "option %s does not exist", +                 orig_key); +        *op_errstr = gf_strdup(err_str); +    } +    if (def_val) +        GF_FREE(def_val); +    gf_msg_debug(this->name, 0, "Returning %d", ret); +    return ret; +} + +int +glusterd_get_volopt_content(dict_t *ctx, gf_boolean_t xml_out) +{ +    void *dl_handle = NULL; +    volume_opt_list_t vol_opt_handle = { +        {0}, +    }; +    char *key = NULL; +    struct volopt_map_entry *vme = NULL; +    int ret = -1; +    char *def_val = NULL; +    char *descr = NULL; +    char *output = NULL; +    size_t size = 0; +    size_t used = 0;  #if (HAVE_LIB_XML) -        xmlTextWriterPtr         writer = NULL; -        xmlBufferPtr             buf = NULL; +    xmlTextWriterPtr writer = NULL; +    xmlBufferPtr buf = NULL; -        if (xml_out) { -                ret = init_sethelp_xml_doc (&writer, &buf); -                if (ret) /*logging done in init_xml_lib*/ -                        goto out; -        } +    if (xml_out) { +        ret = init_sethelp_xml_doc(&writer, &buf); +        if (ret) /*logging done in init_xml_lib*/ +            goto out; +    }  #endif -        if (!xml_out) { -                size = 65536; -                output = GF_MALLOC(size, gf_common_mt_char); -                if (output == NULL) { -                        ret = -1; -                        goto out; -                } +    if (!xml_out) { +        size = 65536; +        output = GF_MALLOC(size, gf_common_mt_char); +        if (output == NULL) { +            ret = -1; +            goto out;          } +    } -        CDS_INIT_LIST_HEAD (&vol_opt_handle.list); +    CDS_INIT_LIST_HEAD(&vol_opt_handle.list); -        for (vme = &glusterd_volopt_map[0]; vme->key; vme++) { +    for (vme = &glusterd_volopt_map[0]; vme->key; vme++) { +        if ((vme->type == NO_DOC) || (vme->type == GLOBAL_NO_DOC)) +            continue; -                if ((vme->type == NO_DOC) || (vme->type == GLOBAL_NO_DOC)) -                        continue; +        if (vme->description) { +            descr = vme->description; +            def_val = vme->value; +        } else { +            if (_get_xlator_opt_key_from_vme(vme, &key)) { +                gf_msg_debug("glusterd", 0, +                             "Failed to " +                             "get %s key from volume option entry", +                             vme->key); +                goto out; /*Some error while getting key*/ +            } + +            ret = xlator_volopt_dynload(vme->voltype, &dl_handle, +                                        &vol_opt_handle); + +            if (ret) { +                gf_msg_debug("glusterd", 0, "xlator_volopt_dynload error(%d)", +                             ret); +                ret = 0; +                goto cont; +            } -                if (vme->description) { -                        descr = vme->description; -                        def_val = vme->value; -                } else { -                        if (_get_xlator_opt_key_from_vme (vme, &key)) { -                                gf_msg_debug ("glusterd", 0, "Failed to " -                                        "get %s key from volume option entry", -                                        vme->key); -                                goto out; /*Some error while getting key*/ -                        } - -                        ret = xlator_volopt_dynload (vme->voltype, -                                                     &dl_handle, -                                                     &vol_opt_handle); - -                        if (ret) { -                                gf_msg_debug ("glusterd", 0, -                                        "xlator_volopt_dynload error(%d)", ret); -                                ret = 0; -                                goto cont; -                        } - -                        ret = xlator_option_info_list (&vol_opt_handle, key, -                                                       &def_val, &descr); -                        if (ret) { /*Swallow Error i.e if option not found*/ -                                gf_msg_debug ("glusterd", 0, -                                        "Failed to get option for %s key", key); -                                ret = 0; -                                goto cont; -                        } -                } +            ret = xlator_option_info_list(&vol_opt_handle, key, &def_val, +                                          &descr); +            if (ret) { /*Swallow Error i.e if option not found*/ +                gf_msg_debug("glusterd", 0, "Failed to get option for %s key", +                             key); +                ret = 0; +                goto cont; +            } +        } -                if (xml_out) { +        if (xml_out) {  #if (HAVE_LIB_XML) -                        if (xml_add_volset_element (writer,vme->key, -                                                    def_val, descr)) { -                                ret = -1; -                                goto cont; -                        } +            if (xml_add_volset_element(writer, vme->key, def_val, descr)) { +                ret = -1; +                goto cont; +            }  #else -                        gf_msg ("glusterd", GF_LOG_ERROR, 0, -                                GD_MSG_MODULE_NOT_INSTALLED, -                                "Libxml not present"); +            gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_MODULE_NOT_INSTALLED, +                   "Libxml not present");  #endif -                } else { -                        void *tmp; -                        int len; - -                        do { -                                len = snprintf(output + used, size - used, -                                               "Option: %s\nDefault Value: %s\n" -                                               "Description: %s\n\n", -                                               vme->key, def_val, descr); -                                if (len < 0) { -                                        ret = -1; -                                        goto cont; -                                } -                                if (used + len < size) { -                                        used += len; -                                        break; -                                } - -                                size += (len + 65536) & ~65535; -                                tmp = GF_REALLOC(output, size); -                                if (tmp == NULL) { -                                        ret = -1; -                                        goto cont; -                                } -                                output = tmp; -                        } while (1); +        } else { +            void *tmp; +            int len; + +            do { +                len = snprintf(output + used, size - used, +                               "Option: %s\nDefault Value: %s\n" +                               "Description: %s\n\n", +                               vme->key, def_val, descr); +                if (len < 0) { +                    ret = -1; +                    goto cont;                  } -cont: -                if (dl_handle) { -                        dlclose (dl_handle); -                        dl_handle = NULL; -                        vol_opt_handle.given_opt = NULL; +                if (used + len < size) { +                    used += len; +                    break;                  } -                if (key) { -                        _free_xlator_opt_key (key); -                        key = NULL; + +                size += (len + 65536) & ~65535; +                tmp = GF_REALLOC(output, size); +                if (tmp == NULL) { +                    ret = -1; +                    goto cont;                  } -                if (ret) -                        goto out; +                output = tmp; +            } while (1); +        } +    cont: +        if (dl_handle) { +            dlclose(dl_handle); +            dl_handle = NULL; +            vol_opt_handle.given_opt = NULL;          } +        if (key) { +            _free_xlator_opt_key(key); +            key = NULL; +        } +        if (ret) +            goto out; +    }  #if (HAVE_LIB_XML) -        if ((xml_out) && -            (ret = end_sethelp_xml_doc (writer))) -                goto out; +    if ((xml_out) && (ret = end_sethelp_xml_doc(writer))) +        goto out;  #else -        if (xml_out) -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_MODULE_NOT_INSTALLED, -                        "Libxml not present"); +    if (xml_out) +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_MODULE_NOT_INSTALLED, +               "Libxml not present");  #endif -        if (xml_out) { +    if (xml_out) {  #if (HAVE_LIB_XML) -                output = gf_strdup ((char *)buf->content); -                if (NULL == output) { -                        ret = -1; -                        goto out; -                } +        output = gf_strdup((char *)buf->content); +        if (NULL == output) { +            ret = -1; +            goto out; +        }  #else -                gf_msg ("glusterd", GF_LOG_ERROR, 0, -                        GD_MSG_MODULE_NOT_INSTALLED, -                        "Libxml not present"); +        gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_MODULE_NOT_INSTALLED, +               "Libxml not present");  #endif -        } - -        ret = dict_set_dynstrn (ctx, "help-str", SLEN ("help-str"), output); -        if (ret >= 0) { -                output = NULL; -        } -out: -        GF_FREE(output); -        gf_msg_debug ("glusterd", 0, "Returning %d", ret); -        return ret; -} - -int -glusterd_check_client_op_version_support (char *volname, uint32_t op_version, -                                          char **op_errstr) -{ -        int                     ret = 0; -        xlator_t                *this = NULL; -        glusterd_conf_t         *priv = NULL; -        rpc_transport_t         *xprt = NULL; - -        this = THIS; -        GF_ASSERT(this); -        priv = this->private; -        GF_ASSERT(priv); - -        pthread_mutex_lock (&priv->xprt_lock); -        list_for_each_entry (xprt, &priv->xprt_list, list) { -                if ((!strcmp(volname, xprt->peerinfo.volname)) && -                    ((op_version > xprt->peerinfo.max_op_version) || -                     (op_version < xprt->peerinfo.min_op_version))) { -                        ret = -1; -                        break; -                } -        } -        pthread_mutex_unlock (&priv->xprt_lock); +    } + +    ret = dict_set_dynstrn(ctx, "help-str", SLEN("help-str"), output); +    if (ret >= 0) { +        output = NULL; +    } +out: +    GF_FREE(output); +    gf_msg_debug("glusterd", 0, "Returning %d", ret); +    return ret; +} + +int +glusterd_check_client_op_version_support(char *volname, uint32_t op_version, +                                         char **op_errstr) +{ +    int ret = 0; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    rpc_transport_t *xprt = NULL; + +    this = THIS; +    GF_ASSERT(this); +    priv = this->private; +    GF_ASSERT(priv); + +    pthread_mutex_lock(&priv->xprt_lock); +    list_for_each_entry(xprt, &priv->xprt_list, list) +    { +        if ((!strcmp(volname, xprt->peerinfo.volname)) && +            ((op_version > xprt->peerinfo.max_op_version) || +             (op_version < xprt->peerinfo.min_op_version))) { +            ret = -1; +            break; +        } +    } +    pthread_mutex_unlock(&priv->xprt_lock); + +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_UNSUPPORTED_VERSION, +               "Client %s is running with min_op_version as %d and " +               "max_op_version as %d and don't support the required " +               "op-version %d", +               xprt->peerinfo.identifier, xprt->peerinfo.min_op_version, +               xprt->peerinfo.max_op_version, op_version); +        if (op_errstr) +            ret = gf_asprintf(op_errstr, +                              "One of the client %s is " +                              "running with op-version %d and " +                              "doesn't support the required " +                              "op-version %d. This client needs to" +                              " be upgraded or disconnected " +                              "before running this command again", +                              xprt->peerinfo.identifier, +                              xprt->peerinfo.max_op_version, op_version); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_UNSUPPORTED_VERSION, -                        "Client %s is running with min_op_version as %d and " -                        "max_op_version as %d and don't support the required " -                        "op-version %d", xprt->peerinfo.identifier, -                        xprt->peerinfo.min_op_version, -                        xprt->peerinfo.max_op_version, op_version); -                if (op_errstr) -                        ret = gf_asprintf (op_errstr, "One of the client %s is " -                                           "running with op-version %d and " -                                           "doesn't support the required " -                                           "op-version %d. This client needs to" -                                           " be upgraded or disconnected " -                                           "before running this command again", -                                           xprt->peerinfo.identifier, -                                           xprt->peerinfo.max_op_version, -                                           op_version); - -                return -1; -        } -        return 0; +        return -1; +    } +    return 0;  }  gf_boolean_t -glusterd_have_peers () +glusterd_have_peers()  { -        xlator_t        *this = NULL; -        glusterd_conf_t *conf = NULL; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; -        this = THIS; -        GF_ASSERT (this); -        conf = this->private; -        GF_ASSERT (conf); +    this = THIS; +    GF_ASSERT(this); +    conf = this->private; +    GF_ASSERT(conf); -        return !cds_list_empty (&conf->peers); +    return !cds_list_empty(&conf->peers);  }  gf_boolean_t -glusterd_is_volume_started (glusterd_volinfo_t  *volinfo) +glusterd_is_volume_started(glusterd_volinfo_t *volinfo)  { -        GF_ASSERT (volinfo); -        return (volinfo->status == GLUSTERD_STATUS_STARTED); +    GF_ASSERT(volinfo); +    return (volinfo->status == GLUSTERD_STATUS_STARTED);  }  int -glusterd_volume_get_type_str (glusterd_volinfo_t *volinfo, char **voltype_str) +glusterd_volume_get_type_str(glusterd_volinfo_t *volinfo, char **voltype_str)  { -        int ret = -1; -        int type = 0; +    int ret = -1; +    int type = 0; -        GF_VALIDATE_OR_GOTO (THIS->name, volinfo, out); +    GF_VALIDATE_OR_GOTO(THIS->name, volinfo, out); -        type = get_vol_type (volinfo->type, volinfo->dist_leaf_count, -                             volinfo->brick_count); +    type = get_vol_type(volinfo->type, volinfo->dist_leaf_count, +                        volinfo->brick_count); -        *voltype_str = vol_type_str[type]; +    *voltype_str = vol_type_str[type]; -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_volume_get_status_str (glusterd_volinfo_t *volinfo, char *status_str) +glusterd_volume_get_status_str(glusterd_volinfo_t *volinfo, char *status_str)  { -        int ret = -1; +    int ret = -1; -        GF_VALIDATE_OR_GOTO (THIS->name, volinfo, out); -        GF_VALIDATE_OR_GOTO (THIS->name, status_str, out); +    GF_VALIDATE_OR_GOTO(THIS->name, volinfo, out); +    GF_VALIDATE_OR_GOTO(THIS->name, status_str, out); -        switch (volinfo->status) { +    switch (volinfo->status) {          case GLUSTERD_STATUS_NONE: -                sprintf (status_str, "%s", "Created"); -                break; +            sprintf(status_str, "%s", "Created"); +            break;          case GLUSTERD_STATUS_STARTED: -                sprintf (status_str, "%s", "Started"); -                break; +            sprintf(status_str, "%s", "Started"); +            break;          case GLUSTERD_STATUS_STOPPED: -                sprintf (status_str, "%s", "Stopped"); -                break; +            sprintf(status_str, "%s", "Stopped"); +            break;          default: -                goto out; - -        } -        ret = 0; +            goto out; +    } +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_volume_get_transport_type_str (glusterd_volinfo_t *volinfo, -                                        char *transport_type_str) +glusterd_volume_get_transport_type_str(glusterd_volinfo_t *volinfo, +                                       char *transport_type_str)  { -        int ret = -1; +    int ret = -1; -        GF_VALIDATE_OR_GOTO (THIS->name, volinfo, out); -        GF_VALIDATE_OR_GOTO (THIS->name, transport_type_str, out); +    GF_VALIDATE_OR_GOTO(THIS->name, volinfo, out); +    GF_VALIDATE_OR_GOTO(THIS->name, transport_type_str, out); -        switch (volinfo->transport_type) { +    switch (volinfo->transport_type) {          case GF_TRANSPORT_TCP: -                sprintf (transport_type_str, "%s", "tcp"); -                break; +            sprintf(transport_type_str, "%s", "tcp"); +            break;          case GF_TRANSPORT_RDMA: -                sprintf (transport_type_str, "%s", "rdma"); -                break; +            sprintf(transport_type_str, "%s", "rdma"); +            break;          case GF_TRANSPORT_BOTH_TCP_RDMA: -                sprintf (transport_type_str, "%s", "tcp_rdma_both"); -                break; +            sprintf(transport_type_str, "%s", "tcp_rdma_both"); +            break;          default: -                goto out; - -        } -        ret = 0; +            goto out; +    } +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_volume_get_quorum_status_str (glusterd_volinfo_t *volinfo, -                                       char *quorum_status_str) +glusterd_volume_get_quorum_status_str(glusterd_volinfo_t *volinfo, +                                      char *quorum_status_str)  { -        int ret = -1; +    int ret = -1; -        GF_VALIDATE_OR_GOTO (THIS->name, volinfo, out); -        GF_VALIDATE_OR_GOTO (THIS->name, quorum_status_str, out); +    GF_VALIDATE_OR_GOTO(THIS->name, volinfo, out); +    GF_VALIDATE_OR_GOTO(THIS->name, quorum_status_str, out); -        switch (volinfo->quorum_status) { +    switch (volinfo->quorum_status) {          case NOT_APPLICABLE_QUORUM: -                sprintf (quorum_status_str, "%s", "not_applicable"); -                break; +            sprintf(quorum_status_str, "%s", "not_applicable"); +            break;          case MEETS_QUORUM: -                sprintf (quorum_status_str, "%s", "meets"); -                break; +            sprintf(quorum_status_str, "%s", "meets"); +            break;          case DOESNT_MEET_QUORUM: -                sprintf (quorum_status_str, "%s", "does_not_meet"); -                break; +            sprintf(quorum_status_str, "%s", "does_not_meet"); +            break;          default: -                goto out; - -        } -        ret = 0; +            goto out; +    } +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_volume_get_rebalance_status_str (glusterd_volinfo_t *volinfo, -                                          char *rebal_status_str) +glusterd_volume_get_rebalance_status_str(glusterd_volinfo_t *volinfo, +                                         char *rebal_status_str)  { -        int ret = -1; +    int ret = -1; -        GF_VALIDATE_OR_GOTO (THIS->name, volinfo, out); -        GF_VALIDATE_OR_GOTO (THIS->name, rebal_status_str, out); +    GF_VALIDATE_OR_GOTO(THIS->name, volinfo, out); +    GF_VALIDATE_OR_GOTO(THIS->name, rebal_status_str, out); -        switch (volinfo->rebal.defrag_status) { +    switch (volinfo->rebal.defrag_status) {          case GF_DEFRAG_STATUS_NOT_STARTED: -                sprintf (rebal_status_str, "%s", "not_started"); -                break; +            sprintf(rebal_status_str, "%s", "not_started"); +            break;          case GF_DEFRAG_STATUS_STARTED: -                sprintf (rebal_status_str, "%s", "started"); -                break; +            sprintf(rebal_status_str, "%s", "started"); +            break;          case GF_DEFRAG_STATUS_STOPPED: -                sprintf (rebal_status_str, "%s", "stopped"); -                break; +            sprintf(rebal_status_str, "%s", "stopped"); +            break;          case GF_DEFRAG_STATUS_COMPLETE: -                sprintf (rebal_status_str, "%s", "completed"); -                break; +            sprintf(rebal_status_str, "%s", "completed"); +            break;          case GF_DEFRAG_STATUS_FAILED: -                sprintf (rebal_status_str, "%s", "failed"); -                break; +            sprintf(rebal_status_str, "%s", "failed"); +            break;          case GF_DEFRAG_STATUS_LAYOUT_FIX_STARTED: -                sprintf (rebal_status_str, "%s", "layout_fix_started"); -                break; +            sprintf(rebal_status_str, "%s", "layout_fix_started"); +            break;          case GF_DEFRAG_STATUS_LAYOUT_FIX_STOPPED: -                sprintf (rebal_status_str, "%s", "layout_fix_stopped"); -                break; +            sprintf(rebal_status_str, "%s", "layout_fix_stopped"); +            break;          case GF_DEFRAG_STATUS_LAYOUT_FIX_COMPLETE: -                sprintf (rebal_status_str, "%s", "layout_fix_complete"); -                break; +            sprintf(rebal_status_str, "%s", "layout_fix_complete"); +            break;          case GF_DEFRAG_STATUS_LAYOUT_FIX_FAILED: -                sprintf (rebal_status_str, "%s", "layout_fix_failed"); -                break; +            sprintf(rebal_status_str, "%s", "layout_fix_failed"); +            break;          default: -                goto out; -        } -        ret = 0; +            goto out; +    } +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_volume_get_hot_tier_type_str (glusterd_volinfo_t *volinfo, -                                       char **hot_tier_type_str) +glusterd_volume_get_hot_tier_type_str(glusterd_volinfo_t *volinfo, +                                      char **hot_tier_type_str)  { -        int ret = -1; -        int hot_tier_type = 0; -        int hot_dist_count = 0; +    int ret = -1; +    int hot_tier_type = 0; +    int hot_dist_count = 0; -        GF_VALIDATE_OR_GOTO (THIS->name, volinfo, out); -        GF_VALIDATE_OR_GOTO (THIS->name, hot_tier_type_str, out); +    GF_VALIDATE_OR_GOTO(THIS->name, volinfo, out); +    GF_VALIDATE_OR_GOTO(THIS->name, hot_tier_type_str, out); -        hot_dist_count = volinfo->tier_info.hot_replica_count ? -                                volinfo->tier_info.hot_replica_count : 1; +    hot_dist_count = volinfo->tier_info.hot_replica_count +                         ? volinfo->tier_info.hot_replica_count +                         : 1; -        hot_tier_type = get_vol_type (volinfo->tier_info.hot_type, hot_dist_count, -                                      volinfo->tier_info.hot_brick_count); +    hot_tier_type = get_vol_type(volinfo->tier_info.hot_type, hot_dist_count, +                                 volinfo->tier_info.hot_brick_count); -        *hot_tier_type_str = vol_type_str[hot_tier_type]; +    *hot_tier_type_str = vol_type_str[hot_tier_type]; -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_volume_get_cold_tier_type_str (glusterd_volinfo_t *volinfo, -                                        char **cold_tier_type_str) +glusterd_volume_get_cold_tier_type_str(glusterd_volinfo_t *volinfo, +                                       char **cold_tier_type_str)  { -        int ret = -1; -        int cold_tier_type = 0; +    int ret = -1; +    int cold_tier_type = 0; -        GF_VALIDATE_OR_GOTO (THIS->name, volinfo, out); -        GF_VALIDATE_OR_GOTO (THIS->name, cold_tier_type_str, out); +    GF_VALIDATE_OR_GOTO(THIS->name, volinfo, out); +    GF_VALIDATE_OR_GOTO(THIS->name, cold_tier_type_str, out); -        cold_tier_type = get_vol_type (volinfo->tier_info.cold_type, -                                       volinfo->tier_info.cold_dist_leaf_count, -                                       volinfo->tier_info.cold_brick_count); +    cold_tier_type = get_vol_type(volinfo->tier_info.cold_type, +                                  volinfo->tier_info.cold_dist_leaf_count, +                                  volinfo->tier_info.cold_brick_count); -        *cold_tier_type_str = vol_type_str[cold_tier_type]; +    *cold_tier_type_str = vol_type_str[cold_tier_type]; -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  }  /* This function will insert the element to the list in a order. @@ -14086,46 +13691,46 @@ out:     >0: if first argument is greater than second argument     <0: if first argument is less than second argument */  void -glusterd_list_add_order (struct cds_list_head *new, struct cds_list_head *head, +glusterd_list_add_order(struct cds_list_head *new, struct cds_list_head *head,                          int (*compare)(struct cds_list_head *,                                         struct cds_list_head *))  { -        struct cds_list_head *pos = NULL; +    struct cds_list_head *pos = NULL; -        cds_list_for_each_rcu (pos, head) { -                if (compare (new, pos) <= 0) -                        break; -        } +    cds_list_for_each_rcu(pos, head) +    { +        if (compare(new, pos) <= 0) +            break; +    } -        cds_list_add_rcu (new, rcu_dereference (pos->prev)); +    cds_list_add_rcu(new, rcu_dereference(pos->prev));  } -  int -glusterd_disallow_op_for_tier (glusterd_volinfo_t *volinfo, glusterd_op_t op, -                               int cmd) +glusterd_disallow_op_for_tier(glusterd_volinfo_t *volinfo, glusterd_op_t op, +                              int cmd)  { +    xlator_t *this = NULL; +    int ret = 0; -        xlator_t          *this       = NULL; -        int                ret        = 0; +    this = THIS; +    GF_VALIDATE_OR_GOTO(this->name, volinfo, out); -        this = THIS; -        GF_VALIDATE_OR_GOTO (this->name, volinfo, out); +    if (volinfo->type != GF_CLUSTER_TYPE_TIER) +        goto out; -        if (volinfo->type != GF_CLUSTER_TYPE_TIER) -                goto out; - -        switch (op) { +    switch (op) {          case GD_OP_ADD_BRICK:          case GD_OP_REPLACE_BRICK: -	case GD_OP_RESET_BRICK: -                ret = -1; -                gf_msg_debug (this->name, 0, "Operation not " -                        "permitted on tiered volume %s", -                        volinfo->volname); -                break; +        case GD_OP_RESET_BRICK: +            ret = -1; +            gf_msg_debug(this->name, 0, +                         "Operation not " +                         "permitted on tiered volume %s", +                         volinfo->volname); +            break;          case GD_OP_REBALANCE: -                switch (cmd) { +            switch (cmd) {                  case GF_DEFRAG_CMD_START_TIER:                  case GF_DEFRAG_CMD_STATUS_TIER:                  case GF_DEFRAG_CMD_START_DETACH_TIER: @@ -14137,629 +13742,623 @@ glusterd_disallow_op_for_tier (glusterd_volinfo_t *volinfo, glusterd_op_t op,                  case GF_DEFRAG_CMD_DETACH_COMMIT:                  case GF_DEFRAG_CMD_DETACH_COMMIT_FORCE:                  case GF_DEFRAG_CMD_DETACH_STOP: -                        ret = 0; -                        break; +                    ret = 0; +                    break;                  default: -                        gf_msg_debug (this->name, 0, -                             "Rebalance Operation not permitted" -                             " on tiered volume %s", -                             volinfo->volname); -                        ret = -1; -                        break; -                } -                break; +                    gf_msg_debug(this->name, 0, +                                 "Rebalance Operation not permitted" +                                 " on tiered volume %s", +                                 volinfo->volname); +                    ret = -1; +                    break; +            } +            break;          case GD_OP_REMOVE_BRICK: -                switch (cmd) { +            switch (cmd) {                  case GF_DEFRAG_CMD_DETACH_START:                  case GF_OP_CMD_DETACH_COMMIT_FORCE:                  case GF_OP_CMD_DETACH_COMMIT:                  case GF_OP_CMD_DETACH_START:                  case GF_DEFRAG_CMD_STOP_DETACH_TIER: -                        ret = 0; -                        break; +                    ret = 0; +                    break;                  default: -                        gf_msg_debug (this->name, 0, -                             "Remove brick operation not " -                             "permitted on tiered volume %s", -                             volinfo->volname); -                        ret = -1; -                        break; -                } -                break; +                    gf_msg_debug(this->name, 0, +                                 "Remove brick operation not " +                                 "permitted on tiered volume %s", +                                 volinfo->volname); +                    ret = -1; +                    break; +            } +            break;          default: -                break; -        } +            break; +    }  out: -        return ret; +    return ret;  }  int32_t -glusterd_count_connected_peers (int32_t *count) -{ -        glusterd_peerinfo_t  *peerinfo  = NULL; -        glusterd_conf_t      *conf      = NULL; -        int32_t               ret       = -1; -        xlator_t             *this      = NULL; - -        this = THIS; -        GF_VALIDATE_OR_GOTO ("glusterd", this, out); -        conf = this->private; -        GF_VALIDATE_OR_GOTO (this->name, conf, out); -        GF_VALIDATE_OR_GOTO (this->name, count, out); - -        *count = 1; - -        rcu_read_lock (); -        cds_list_for_each_entry_rcu (peerinfo, &conf->peers, uuid_list) { -                /* Find peer who is connected and is a friend */ -                if ((peerinfo->connected) && -                     (peerinfo->state.state == GD_FRIEND_STATE_BEFRIENDED)) { -                        (*count)++; -                } +glusterd_count_connected_peers(int32_t *count) +{ +    glusterd_peerinfo_t *peerinfo = NULL; +    glusterd_conf_t *conf = NULL; +    int32_t ret = -1; +    xlator_t *this = NULL; + +    this = THIS; +    GF_VALIDATE_OR_GOTO("glusterd", this, out); +    conf = this->private; +    GF_VALIDATE_OR_GOTO(this->name, conf, out); +    GF_VALIDATE_OR_GOTO(this->name, count, out); + +    *count = 1; + +    rcu_read_lock(); +    cds_list_for_each_entry_rcu(peerinfo, &conf->peers, uuid_list) +    { +        /* Find peer who is connected and is a friend */ +        if ((peerinfo->connected) && +            (peerinfo->state.state == GD_FRIEND_STATE_BEFRIENDED)) { +            (*count)++;          } -        rcu_read_unlock (); +    } +    rcu_read_unlock(); -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  } -char* -gd_get_shd_key (int type) +char * +gd_get_shd_key(int type)  { -        char            *key               = NULL; +    char *key = NULL; -        switch (type) { +    switch (type) {          case GF_CLUSTER_TYPE_REPLICATE:          case GF_CLUSTER_TYPE_STRIPE_REPLICATE: -                key = "cluster.self-heal-daemon"; -                break; +            key = "cluster.self-heal-daemon"; +            break;          case GF_CLUSTER_TYPE_DISPERSE: -                key = "cluster.disperse-self-heal-daemon"; -                break; +            key = "cluster.disperse-self-heal-daemon"; +            break;          default: -                key = NULL; -                break; -        } -        return key; +            key = NULL; +            break; +    } +    return key;  }  int -glusterd_handle_replicate_brick_ops (glusterd_volinfo_t *volinfo, -                                     glusterd_brickinfo_t *brickinfo, -                                     glusterd_op_t op) -{ -        int32_t                    ret               = -1; -        char                       tmpmount[]        = "/tmp/mntXXXXXX"; -        char                       logfile[PATH_MAX] = ""; -        int                        dirty[3]          = {0,}; -        runner_t                   runner            = {0}; -        glusterd_conf_t           *priv              = NULL; -        char                      *pid               = NULL; -        char                       vpath[PATH_MAX]   = ""; -        char                      *volfileserver     = NULL; - -        priv = THIS->private; -        GF_VALIDATE_OR_GOTO (THIS->name, priv, out); - -        dirty[2] = hton32(1); +glusterd_handle_replicate_brick_ops(glusterd_volinfo_t *volinfo, +                                    glusterd_brickinfo_t *brickinfo, +                                    glusterd_op_t op) +{ +    int32_t ret = -1; +    char tmpmount[] = "/tmp/mntXXXXXX"; +    char logfile[PATH_MAX] = ""; +    int dirty[3] = { +        0, +    }; +    runner_t runner = {0}; +    glusterd_conf_t *priv = NULL; +    char *pid = NULL; +    char vpath[PATH_MAX] = ""; +    char *volfileserver = NULL; + +    priv = THIS->private; +    GF_VALIDATE_OR_GOTO(THIS->name, priv, out); + +    dirty[2] = hton32(1); + +    ret = sys_lsetxattr(brickinfo->path, GF_AFR_DIRTY, dirty, sizeof(dirty), 0); +    if (ret == -1) { +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_SETXATTR_FAIL, +               "Failed to set extended" +               " attribute %s : %s.", +               GF_AFR_DIRTY, strerror(errno)); +        goto out; +    } + +    if (mkdtemp(tmpmount) == NULL) { +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_DIR_OP_FAILED, +               "failed to create a temporary mount directory."); +        ret = -1; +        goto out; +    } -        ret = sys_lsetxattr (brickinfo->path, GF_AFR_DIRTY, dirty, -                             sizeof (dirty), 0); -        if (ret == -1) { -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_SETXATTR_FAIL, "Failed to set extended" -                        " attribute %s : %s.", GF_AFR_DIRTY, strerror (errno)); -                goto out; -        } +    ret = gf_asprintf(&pid, "%d", GF_CLIENT_PID_SELF_HEALD); +    if (ret < 0) +        goto out; -        if (mkdtemp (tmpmount) == NULL) { -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_DIR_OP_FAILED, -                        "failed to create a temporary mount directory."); +    switch (op) { +        case GD_OP_REPLACE_BRICK: +            if (dict_get_strn(THIS->options, "transport.socket.bind-address", +                              SLEN("transport.socket.bind-address"), +                              &volfileserver) != 0) +                volfileserver = "localhost"; + +            snprintf(logfile, sizeof(logfile), +                     DEFAULT_LOG_FILE_DIRECTORY "/%s-replace-brick-mount.log", +                     volinfo->volname); +            if (!*logfile) {                  ret = -1;                  goto out; -        } - -        ret = gf_asprintf (&pid, "%d", GF_CLIENT_PID_SELF_HEALD); -        if (ret < 0) -                goto out; - -        switch (op) { -        case GD_OP_REPLACE_BRICK: -                if (dict_get_strn (THIS->options, -                                   "transport.socket.bind-address", -                                   SLEN ("transport.socket.bind-address"), -                                   &volfileserver) != 0) -                        volfileserver = "localhost"; - -                snprintf (logfile, sizeof (logfile), -                          DEFAULT_LOG_FILE_DIRECTORY"/%s-replace-brick-mount.log", -                          volinfo->volname); -                if (!*logfile) { -                        ret = -1; -                        goto out; -                } -                runinit (&runner); -                runner_add_args (&runner, SBIN_DIR"/glusterfs", -                                 "-s", volfileserver, -                                 "--volfile-id", volinfo->volname, -                                 "--client-pid", pid, -                                 "-l", logfile, tmpmount, NULL); -                break; +            } +            runinit(&runner); +            runner_add_args(&runner, SBIN_DIR "/glusterfs", "-s", volfileserver, +                            "--volfile-id", volinfo->volname, "--client-pid", +                            pid, "-l", logfile, tmpmount, NULL); +            break;          case GD_OP_ADD_BRICK: -                snprintf (logfile, sizeof (logfile), -                          DEFAULT_LOG_FILE_DIRECTORY"/%s-add-brick-mount.log", -                          volinfo->volname); -                if (!*logfile) { -                        ret = -1; -                        goto out; -                } -                ret = glusterd_get_dummy_client_filepath (vpath, volinfo, -                                                    volinfo->transport_type); -                if (ret) { -                        gf_log ("", GF_LOG_ERROR, "Failed to get " -                                "volfile path"); -                        goto out; -                } -                runinit (&runner); -                runner_add_args (&runner, SBIN_DIR"/glusterfs", -                                 "--volfile", vpath, -                                 "--client-pid", pid, -                                 "-l", logfile, tmpmount, NULL); -                break; +            snprintf(logfile, sizeof(logfile), +                     DEFAULT_LOG_FILE_DIRECTORY "/%s-add-brick-mount.log", +                     volinfo->volname); +            if (!*logfile) { +                ret = -1; +                goto out; +            } +            ret = glusterd_get_dummy_client_filepath(vpath, volinfo, +                                                     volinfo->transport_type); +            if (ret) { +                gf_log("", GF_LOG_ERROR, +                       "Failed to get " +                       "volfile path"); +                goto out; +            } +            runinit(&runner); +            runner_add_args(&runner, SBIN_DIR "/glusterfs", "--volfile", vpath, +                            "--client-pid", pid, "-l", logfile, tmpmount, NULL); +            break;          default: -                break; -        } -        synclock_unlock (&priv->big_lock); -        ret = runner_run (&runner); - -        if (ret) { -                gf_log (THIS->name, GF_LOG_ERROR, "mount command" -                        " failed."); -                goto lock; -        } -        ret = sys_lsetxattr (tmpmount, (op == GD_OP_REPLACE_BRICK) ? -                             GF_AFR_REPLACE_BRICK : GF_AFR_ADD_BRICK, -                             brickinfo->brick_id, sizeof (brickinfo->brick_id), -                             0); -        if (ret == -1) -                gf_msg (THIS->name, GF_LOG_ERROR, errno, -                        GD_MSG_SETXATTR_FAIL, "Failed to set extended" -                        " attribute %s : %s", (op == GD_OP_REPLACE_BRICK) ? -                        GF_AFR_REPLACE_BRICK : GF_AFR_ADD_BRICK, -                        strerror (errno)); -        gf_umount_lazy (THIS->name, tmpmount, 1); +            break; +    } +    synclock_unlock(&priv->big_lock); +    ret = runner_run(&runner); + +    if (ret) { +        gf_log(THIS->name, GF_LOG_ERROR, +               "mount command" +               " failed."); +        goto lock; +    } +    ret = sys_lsetxattr( +        tmpmount, +        (op == GD_OP_REPLACE_BRICK) ? GF_AFR_REPLACE_BRICK : GF_AFR_ADD_BRICK, +        brickinfo->brick_id, sizeof(brickinfo->brick_id), 0); +    if (ret == -1) +        gf_msg(THIS->name, GF_LOG_ERROR, errno, GD_MSG_SETXATTR_FAIL, +               "Failed to set extended" +               " attribute %s : %s", +               (op == GD_OP_REPLACE_BRICK) ? GF_AFR_REPLACE_BRICK +                                           : GF_AFR_ADD_BRICK, +               strerror(errno)); +    gf_umount_lazy(THIS->name, tmpmount, 1);  lock: -        synclock_lock (&priv->big_lock); +    synclock_lock(&priv->big_lock);  out: -        if (pid) -                GF_FREE (pid); -        gf_msg_debug ("glusterd", 0, "Returning with ret"); -        return ret; +    if (pid) +        GF_FREE(pid); +    gf_msg_debug("glusterd", 0, "Returning with ret"); +    return ret;  }  void -assign_brick_groups (glusterd_volinfo_t *volinfo) +assign_brick_groups(glusterd_volinfo_t *volinfo)  { -        glusterd_brickinfo_t    *brickinfo      = NULL; -        uint16_t                group_num       = 0; -        int                     in_group        = 0; +    glusterd_brickinfo_t *brickinfo = NULL; +    uint16_t group_num = 0; +    int in_group = 0; -        list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                brickinfo->group = group_num; -                if (++in_group >= volinfo->replica_count) { -                        in_group = 0; -                        ++group_num; -                } +    list_for_each_entry(brickinfo, &volinfo->bricks, brick_list) +    { +        brickinfo->group = group_num; +        if (++in_group >= volinfo->replica_count) { +            in_group = 0; +            ++group_num;          } +    }  } -glusterd_brickinfo_t* -get_last_brick_of_brick_group (glusterd_volinfo_t *volinfo, -                               glusterd_brickinfo_t *brickinfo) +glusterd_brickinfo_t * +get_last_brick_of_brick_group(glusterd_volinfo_t *volinfo, +                              glusterd_brickinfo_t *brickinfo)  { -        glusterd_brickinfo_t  *next = NULL; -        glusterd_brickinfo_t  *last = NULL; +    glusterd_brickinfo_t *next = NULL; +    glusterd_brickinfo_t *last = NULL; -        last = brickinfo; -        for (;;) { -                next = list_next (last, &volinfo->bricks, -                                  glusterd_brickinfo_t, brick_list); -                if (!next || (next->group != brickinfo->group)) { -                        break; -                } -                last = next; +    last = brickinfo; +    for (;;) { +        next = list_next(last, &volinfo->bricks, glusterd_brickinfo_t, +                         brick_list); +        if (!next || (next->group != brickinfo->group)) { +            break;          } +        last = next; +    } -        return last; +    return last;  }  int -glusterd_get_rb_dst_brickinfo (glusterd_volinfo_t *volinfo, -                               glusterd_brickinfo_t **brickinfo) +glusterd_get_rb_dst_brickinfo(glusterd_volinfo_t *volinfo, +                              glusterd_brickinfo_t **brickinfo)  { -        int32_t                 ret = -1; +    int32_t ret = -1; -        if (!volinfo || !brickinfo) -                goto out; +    if (!volinfo || !brickinfo) +        goto out; -        *brickinfo = volinfo->rep_brick.dst_brick; +    *brickinfo = volinfo->rep_brick.dst_brick; -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  }  int -rb_update_dstbrick_port (glusterd_brickinfo_t *dst_brickinfo, dict_t *rsp_dict, -                         dict_t *req_dict) +rb_update_dstbrick_port(glusterd_brickinfo_t *dst_brickinfo, dict_t *rsp_dict, +                        dict_t *req_dict)  { -        int     ret           = 0; -        int     dict_ret      = 0; -        int     dst_port      = 0; +    int ret = 0; +    int dict_ret = 0; +    int dst_port = 0; -        dict_ret = dict_get_int32n (req_dict, "dst-brick-port", -                                    SLEN ("dst-brick-port"), &dst_port); -        if (!dict_ret) -                dst_brickinfo->port = dst_port; +    dict_ret = dict_get_int32n(req_dict, "dst-brick-port", +                               SLEN("dst-brick-port"), &dst_port); +    if (!dict_ret) +        dst_brickinfo->port = dst_port; -        if (gf_is_local_addr (dst_brickinfo->hostname)) { -                gf_msg ("glusterd", GF_LOG_INFO, 0, -                        GD_MSG_BRK_PORT_NO_ADD_INDO, -                        "adding dst-brick port no %d", dst_port); +    if (gf_is_local_addr(dst_brickinfo->hostname)) { +        gf_msg("glusterd", GF_LOG_INFO, 0, GD_MSG_BRK_PORT_NO_ADD_INDO, +               "adding dst-brick port no %d", dst_port); -                if (rsp_dict) { -                        ret = dict_set_int32n (rsp_dict, "dst-brick-port", -                                               SLEN ("dst-brick-port"), -                                               dst_brickinfo->port); -                        if (ret) { -                                gf_msg_debug ("glusterd", 0, -                                        "Could not set dst-brick port no in rsp dict"); -                                goto out; -                        } -                } +        if (rsp_dict) { +            ret = dict_set_int32n(rsp_dict, "dst-brick-port", +                                  SLEN("dst-brick-port"), dst_brickinfo->port); +            if (ret) { +                gf_msg_debug("glusterd", 0, +                             "Could not set dst-brick port no in rsp dict"); +                goto out; +            } +        } -                if (req_dict && !dict_ret) { -                        ret = dict_set_int32n (req_dict, "dst-brick-port", -                                               SLEN ("dst-brick-port"),  -                                               dst_brickinfo->port); -                        if (ret) { -                                gf_msg_debug ("glusterd", 0, -                                        "Could not set dst-brick port no"); -                                goto out; -                        } -                } +        if (req_dict && !dict_ret) { +            ret = dict_set_int32n(req_dict, "dst-brick-port", +                                  SLEN("dst-brick-port"), dst_brickinfo->port); +            if (ret) { +                gf_msg_debug("glusterd", 0, "Could not set dst-brick port no"); +                goto out; +            }          } +    }  out: -        return ret; +    return ret;  }  int -glusterd_brick_op_prerequisites (dict_t *dict, -                                 char **op, -                                 glusterd_op_t *gd_op, char **volname, -                                 glusterd_volinfo_t **volinfo, -                                 char **src_brick, glusterd_brickinfo_t -                                 **src_brickinfo, char *pidfile, -                                 char **op_errstr, dict_t *rsp_dict) +glusterd_brick_op_prerequisites(dict_t *dict, char **op, glusterd_op_t *gd_op, +                                char **volname, glusterd_volinfo_t **volinfo, +                                char **src_brick, +                                glusterd_brickinfo_t **src_brickinfo, +                                char *pidfile, char **op_errstr, +                                dict_t *rsp_dict)  { -        int                                      ret                = 0; -        char                                     msg[2048]          = ""; -        gsync_status_param_t                     param              = {0,}; -        xlator_t                                *this               = NULL; -        glusterd_conf_t                         *priv               = NULL; -        glusterd_volinfo_t                      *v                  = NULL; -        glusterd_brickinfo_t                    *b                  = NULL; +    int ret = 0; +    char msg[2048] = ""; +    gsync_status_param_t param = { +        0, +    }; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    glusterd_volinfo_t *v = NULL; +    glusterd_brickinfo_t *b = NULL; -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        priv = this->private; -        GF_ASSERT (priv); +    priv = this->private; +    GF_ASSERT(priv); -        ret = dict_get_strn (dict, "operation", SLEN ("operation"), op); -        if (ret) { -                gf_msg_debug (this->name, 0, -                        "dict get on operation type failed"); -                goto out; -        } +    ret = dict_get_strn(dict, "operation", SLEN("operation"), op); +    if (ret) { +        gf_msg_debug(this->name, 0, "dict get on operation type failed"); +        goto out; +    } -        *gd_op = gd_cli_to_gd_op (*op); -        if (*gd_op < 0) -                goto out; +    *gd_op = gd_cli_to_gd_op(*op); +    if (*gd_op < 0) +        goto out; -        ret = dict_get_strn (dict, "volname", SLEN ("volname"), volname); +    ret = dict_get_strn(dict, "volname", SLEN("volname"), volname); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, "Unable to get volume name"); -                goto out; -        } +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get volume name"); +        goto out; +    } -        ret = glusterd_volinfo_find (*volname, volinfo); -        if (ret) { -                snprintf (msg, sizeof (msg), "volume: %s does not exist", -                          *volname); -                *op_errstr = gf_strdup (msg); -                goto out; -        } - -        if (GLUSTERD_STATUS_STARTED != (*volinfo)->status) { -                ret = -1; -                snprintf (msg, sizeof (msg), "volume: %s is not started", -                          *volname); -                *op_errstr = gf_strdup (msg); -                goto out; -        } - -        ret = glusterd_disallow_op_for_tier (*volinfo, *gd_op, -1); -        if (ret) { -                snprintf (msg, sizeof (msg), "%sbrick commands are not " -                          "supported on tiered volume %s", -                          (*gd_op == GD_OP_REPLACE_BRICK) ? "replace-" : -                          "reset-", -                           *volname); -                *op_errstr = gf_strdup (msg); -                goto out; -        } +    ret = glusterd_volinfo_find(*volname, volinfo); +    if (ret) { +        snprintf(msg, sizeof(msg), "volume: %s does not exist", *volname); +        *op_errstr = gf_strdup(msg); +        goto out; +    } -        /* If geo-rep is configured, for this volume, it should be stopped. */ -        param.volinfo = *volinfo; -        ret = glusterd_check_geo_rep_running (¶m, op_errstr); -        if (ret || param.is_active) { -                ret = -1; -                goto out; -        } - -        if (glusterd_is_defrag_on(*volinfo)) { -                snprintf (msg, sizeof(msg), "Volume name %s rebalance is in " -                          "progress. Please retry after completion", *volname); -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_OIP_RETRY_LATER, "%s", msg); -                *op_errstr = gf_strdup (msg); -                ret = -1; -                goto out; +    if (GLUSTERD_STATUS_STARTED != (*volinfo)->status) { +        ret = -1; +        snprintf(msg, sizeof(msg), "volume: %s is not started", *volname); +        *op_errstr = gf_strdup(msg); +        goto out; +    } + +    ret = glusterd_disallow_op_for_tier(*volinfo, *gd_op, -1); +    if (ret) { +        snprintf(msg, sizeof(msg), +                 "%sbrick commands are not " +                 "supported on tiered volume %s", +                 (*gd_op == GD_OP_REPLACE_BRICK) ? "replace-" : "reset-", +                 *volname); +        *op_errstr = gf_strdup(msg); +        goto out; +    } + +    /* If geo-rep is configured, for this volume, it should be stopped. */ +    param.volinfo = *volinfo; +    ret = glusterd_check_geo_rep_running(¶m, op_errstr); +    if (ret || param.is_active) { +        ret = -1; +        goto out; +    } + +    if (glusterd_is_defrag_on(*volinfo)) { +        snprintf(msg, sizeof(msg), +                 "Volume name %s rebalance is in " +                 "progress. Please retry after completion", +                 *volname); +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_OIP_RETRY_LATER, "%s", msg); +        *op_errstr = gf_strdup(msg); +        ret = -1; +        goto out; +    } + +    if (dict) { +        if (!glusterd_is_fuse_available()) { +            gf_msg(this->name, GF_LOG_ERROR, 0, +                   (*gd_op == GD_OP_REPLACE_BRICK) +                       ? GD_MSG_RB_CMD_FAIL +                       : GD_MSG_RESET_BRICK_CMD_FAIL, +                   "Unable to open /dev/" +                   "fuse (%s), %s command failed", +                   strerror(errno), gd_rb_op_to_str(*op)); +            snprintf(msg, sizeof(msg), +                     "Fuse unavailable\n " +                     "%s failed", +                     gd_rb_op_to_str(*op)); +            *op_errstr = gf_strdup(msg); +            ret = -1; +            goto out;          } +    } -        if (dict) { -                if (!glusterd_is_fuse_available ()) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                (*gd_op == GD_OP_REPLACE_BRICK) ? -                                GD_MSG_RB_CMD_FAIL : -                                GD_MSG_RESET_BRICK_CMD_FAIL, -                                "Unable to open /dev/" -                                "fuse (%s), %s command failed", -                                strerror (errno), gd_rb_op_to_str (*op)); -                        snprintf (msg, sizeof(msg), "Fuse unavailable\n " -                                "%s failed", gd_rb_op_to_str (*op)); -                        *op_errstr = gf_strdup (msg); -                        ret = -1; -                        goto out; -                } -        } +    ret = dict_get_strn(dict, "src-brick", SLEN("src-brick"), src_brick); -        ret = dict_get_strn (dict, "src-brick", SLEN ("src-brick"), src_brick); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get src brick"); +        goto out; +    } -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, "Unable to get src brick"); -                goto out; -        } +    gf_msg_debug(this->name, 0, "src brick=%s", *src_brick); -        gf_msg_debug (this->name, 0, "src brick=%s", *src_brick); +    ret = glusterd_volume_brickinfo_get_by_brick(*src_brick, *volinfo, +                                                 src_brickinfo, _gf_false); +    if (ret) { +        snprintf(msg, sizeof(msg), +                 "brick: %s does not exist in " +                 "volume: %s", +                 *src_brick, *volname); +        *op_errstr = gf_strdup(msg); +        goto out; +    } -        ret = glusterd_volume_brickinfo_get_by_brick (*src_brick, *volinfo, -                                                      src_brickinfo, -                                                      _gf_false); -        if (ret) { -                snprintf (msg, sizeof (msg), "brick: %s does not exist in " -                          "volume: %s", *src_brick, *volname); -                *op_errstr = gf_strdup (msg); -                goto out; +    if (gf_is_local_addr((*src_brickinfo)->hostname)) { +        gf_msg_debug(this->name, 0, "I AM THE SOURCE HOST"); +        if ((*src_brickinfo)->port && rsp_dict) { +            ret = dict_set_int32n(rsp_dict, "src-brick-port", +                                  SLEN("src-brick-port"), +                                  (*src_brickinfo)->port); +            if (ret) { +                gf_msg_debug(this->name, 0, "Could not set src-brick-port=%d", +                             (*src_brickinfo)->port); +            }          } -        if (gf_is_local_addr ((*src_brickinfo)->hostname)) { -                gf_msg_debug (this->name, 0, -                        "I AM THE SOURCE HOST"); -                if ((*src_brickinfo)->port && rsp_dict) { -                        ret = dict_set_int32n (rsp_dict, "src-brick-port", -                                               SLEN ("src-brick-port"), -                                               (*src_brickinfo)->port); -                        if (ret) { -                                gf_msg_debug (this->name, 0, -                                        "Could not set src-brick-port=%d", -                                        (*src_brickinfo)->port); -                        } -                } +        v = *volinfo; +        b = *src_brickinfo; +        GLUSTERD_GET_BRICK_PIDFILE(pidfile, v, b, priv); +    } -                v = *volinfo; -                b = *src_brickinfo; -                GLUSTERD_GET_BRICK_PIDFILE (pidfile, v, b, -                                            priv); -        } - -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_get_dst_brick_info (char **dst_brick, char *volname, char **op_errstr, -                             glusterd_brickinfo_t **dst_brickinfo, char **host, -                             dict_t *dict, char **dup_dstbrick) +glusterd_get_dst_brick_info(char **dst_brick, char *volname, char **op_errstr, +                            glusterd_brickinfo_t **dst_brickinfo, char **host, +                            dict_t *dict, char **dup_dstbrick)  { +    char *path = NULL; +    char *c = NULL; +    char msg[2048] = ""; +    xlator_t *this = NULL; +    glusterd_conf_t *priv = NULL; +    int ret = 0; -        char                                    *path               = NULL; -        char                                    *c                  = NULL; -        char                                     msg[2048]          = ""; -        xlator_t                                *this               = NULL; -        glusterd_conf_t                         *priv               = NULL; -        int                                      ret                = 0; - -        this = THIS; -        GF_ASSERT (this); +    this = THIS; +    GF_ASSERT(this); -        priv = this->private; -        GF_ASSERT (priv); +    priv = this->private; +    GF_ASSERT(priv); -        ret = dict_get_strn (dict, "dst-brick", SLEN ("dst-brick"), dst_brick); - -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_DICT_GET_FAILED, -                        "Unable to get dest brick."); -                goto out; -        } +    ret = dict_get_strn(dict, "dst-brick", SLEN("dst-brick"), dst_brick); -        gf_msg_debug (this->name, 0, "dst brick=%s", *dst_brick); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +               "Unable to get dest brick."); +        goto out; +    } -        if (!glusterd_store_is_valid_brickpath (volname, *dst_brick) || -                !glusterd_is_valid_volfpath (volname, *dst_brick)) { -                snprintf (msg, sizeof (msg), "brick path %s is too " -                          "long.", *dst_brick); -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BRKPATH_TOO_LONG, "%s", msg); -                *op_errstr = gf_strdup (msg); +    gf_msg_debug(this->name, 0, "dst brick=%s", *dst_brick); -                ret = -1; -                goto out; -        } +    if (!glusterd_store_is_valid_brickpath(volname, *dst_brick) || +        !glusterd_is_valid_volfpath(volname, *dst_brick)) { +        snprintf(msg, sizeof(msg), +                 "brick path %s is too " +                 "long.", +                 *dst_brick); +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BRKPATH_TOO_LONG, "%s", msg); +        *op_errstr = gf_strdup(msg); -        *dup_dstbrick = gf_strdup (*dst_brick); -        if (!*dup_dstbrick) { -                ret = -1; -                goto out; -        } +        ret = -1; +        goto out; +    } -        /* -         * IPv4 address contains '.' and ipv6 addresses contains ':' -         * So finding the last occurrence of ':' to -         * mark the start of brick path -         */ -        c = strrchr(*dup_dstbrick, ':'); -        if (c != NULL) { -                c[0] = '\0'; -                *host = *dup_dstbrick; -                path = c++; -        } - -        if (!host || !path) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_BAD_FORMAT, -                        "dst brick %s is not of " -                        "form <HOSTNAME>:<export-dir>", -                        *dst_brick); -                ret = -1; -                goto out; -        } +    *dup_dstbrick = gf_strdup(*dst_brick); +    if (!*dup_dstbrick) { +        ret = -1; +        goto out; +    } + +    /* +     * IPv4 address contains '.' and ipv6 addresses contains ':' +     * So finding the last occurrence of ':' to +     * mark the start of brick path +     */ +    c = strrchr(*dup_dstbrick, ':'); +    if (c != NULL) { +        c[0] = '\0'; +        *host = *dup_dstbrick; +        path = c++; +    } + +    if (!host || !path) { +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_BAD_FORMAT, +               "dst brick %s is not of " +               "form <HOSTNAME>:<export-dir>", +               *dst_brick); +        ret = -1; +        goto out; +    } -        ret = glusterd_brickinfo_new_from_brick (*dst_brick, -                                                 dst_brickinfo, -                                                 _gf_true, NULL); -        if (ret) -                goto out; +    ret = glusterd_brickinfo_new_from_brick(*dst_brick, dst_brickinfo, _gf_true, +                                            NULL); +    if (ret) +        goto out; -        ret = 0; +    ret = 0;  out: -        return ret; +    return ret;  }  int -glusterd_get_volinfo_from_brick (char *brick, glusterd_volinfo_t **volinfo) +glusterd_get_volinfo_from_brick(char *brick, glusterd_volinfo_t **volinfo)  { -        int             ret                 = -1; -        xlator_t                *this       = NULL; -        glusterd_conf_t         *conf       = NULL; -        glusterd_volinfo_t      *voliter    = NULL; -        glusterd_brickinfo_t    *brickiter  = NULL; -        glusterd_snap_t         *snap    = NULL; +    int ret = -1; +    xlator_t *this = NULL; +    glusterd_conf_t *conf = NULL; +    glusterd_volinfo_t *voliter = NULL; +    glusterd_brickinfo_t *brickiter = NULL; +    glusterd_snap_t *snap = NULL; -        this = THIS; -        GF_VALIDATE_OR_GOTO ("glusterd", this, out); -        conf = this->private; -        GF_VALIDATE_OR_GOTO (this->name, conf, out); +    this = THIS; +    GF_VALIDATE_OR_GOTO("glusterd", this, out); +    conf = this->private; +    GF_VALIDATE_OR_GOTO(this->name, conf, out); -        /* First check for normal volumes */ -        cds_list_for_each_entry (voliter, &conf->volumes, vol_list) { -                cds_list_for_each_entry (brickiter, &voliter->bricks, -                                         brick_list) { -                        if (gf_uuid_compare (brickiter->uuid, MY_UUID)) -                                continue; -                        if (!strcmp(brickiter->path, brick)) { -                                *volinfo = voliter; -                                return 0; -                        } -                } +    /* First check for normal volumes */ +    cds_list_for_each_entry(voliter, &conf->volumes, vol_list) +    { +        cds_list_for_each_entry(brickiter, &voliter->bricks, brick_list) +        { +            if (gf_uuid_compare(brickiter->uuid, MY_UUID)) +                continue; +            if (!strcmp(brickiter->path, brick)) { +                *volinfo = voliter; +                return 0; +            }          } -        /* In case normal volume is not found, check for snapshot volumes */ -        cds_list_for_each_entry (snap, &conf->snapshots, snap_list) { -                cds_list_for_each_entry (voliter, &snap->volumes, vol_list) { -                        cds_list_for_each_entry (brickiter, &voliter->bricks, -                                                 brick_list) { -                                if (gf_uuid_compare (brickiter->uuid, MY_UUID)) -                                        continue; -                                if (!strcmp(brickiter->path, brick)) { -                                        *volinfo = voliter; -                                        return 0; -                                } -                        } +    } +    /* In case normal volume is not found, check for snapshot volumes */ +    cds_list_for_each_entry(snap, &conf->snapshots, snap_list) +    { +        cds_list_for_each_entry(voliter, &snap->volumes, vol_list) +        { +            cds_list_for_each_entry(brickiter, &voliter->bricks, brick_list) +            { +                if (gf_uuid_compare(brickiter->uuid, MY_UUID)) +                    continue; +                if (!strcmp(brickiter->path, brick)) { +                    *volinfo = voliter; +                    return 0;                  } +            }          } +    }  out: -        return ret; +    return ret;  }  glusterd_op_t -gd_cli_to_gd_op (char *cli_op) +gd_cli_to_gd_op(char *cli_op)  { -        if (!strcmp (cli_op, "GF_RESET_OP_START") || -            !strcmp(cli_op, "GF_RESET_OP_COMMIT") || -            !strcmp (cli_op, "GF_RESET_OP_COMMIT_FORCE")) { -                return GD_OP_RESET_BRICK; -        } +    if (!strcmp(cli_op, "GF_RESET_OP_START") || +        !strcmp(cli_op, "GF_RESET_OP_COMMIT") || +        !strcmp(cli_op, "GF_RESET_OP_COMMIT_FORCE")) { +        return GD_OP_RESET_BRICK; +    } -        if (!strcmp (cli_op, "GF_REPLACE_OP_COMMIT_FORCE")) -                return GD_OP_REPLACE_BRICK; +    if (!strcmp(cli_op, "GF_REPLACE_OP_COMMIT_FORCE")) +        return GD_OP_REPLACE_BRICK; -        return -1; +    return -1;  }  char * -gd_rb_op_to_str (char *op) -{ -        if (!strcmp (op, "GF_RESET_OP_START")) -                return "reset-brick start"; -        if (!strcmp (op, "GF_RESET_OP_COMMIT")) -                return "reset-brick commit"; -        if (!strcmp (op, "GF_RESET_OP_COMMIT_FORCE")) -                return "reset-brick commit force"; -        if (!strcmp (op, "GF_REPLACE_OP_COMMIT_FORCE")) -                return "replace-brick commit force"; -        return NULL; +gd_rb_op_to_str(char *op) +{ +    if (!strcmp(op, "GF_RESET_OP_START")) +        return "reset-brick start"; +    if (!strcmp(op, "GF_RESET_OP_COMMIT")) +        return "reset-brick commit"; +    if (!strcmp(op, "GF_RESET_OP_COMMIT_FORCE")) +        return "reset-brick commit force"; +    if (!strcmp(op, "GF_REPLACE_OP_COMMIT_FORCE")) +        return "replace-brick commit force"; +    return NULL;  }  gf_boolean_t -glusterd_is_profile_on (glusterd_volinfo_t *volinfo) -{ -        int                                     ret = -1; -        gf_boolean_t                            is_latency_on = _gf_false; -        gf_boolean_t                            is_fd_stats_on = _gf_false; - -        GF_ASSERT (volinfo); - -        ret = glusterd_volinfo_get_boolean (volinfo, VKEY_DIAG_CNT_FOP_HITS); -        if (ret != -1) -                is_fd_stats_on = ret; -        ret = glusterd_volinfo_get_boolean (volinfo, VKEY_DIAG_LAT_MEASUREMENT); -        if (ret != -1) -                is_latency_on = ret; -        if ((_gf_true == is_latency_on) && -            (_gf_true == is_fd_stats_on)) -                return _gf_true; -        return _gf_false; -} +glusterd_is_profile_on(glusterd_volinfo_t *volinfo) +{ +    int ret = -1; +    gf_boolean_t is_latency_on = _gf_false; +    gf_boolean_t is_fd_stats_on = _gf_false; +    GF_ASSERT(volinfo); + +    ret = glusterd_volinfo_get_boolean(volinfo, VKEY_DIAG_CNT_FOP_HITS); +    if (ret != -1) +        is_fd_stats_on = ret; +    ret = glusterd_volinfo_get_boolean(volinfo, VKEY_DIAG_LAT_MEASUREMENT); +    if (ret != -1) +        is_latency_on = ret; +    if ((_gf_true == is_latency_on) && (_gf_true == is_fd_stats_on)) +        return _gf_true; +    return _gf_false; +}  | 
