int32_t ida_buffer_add_buffer(ida_local_t * local, ida_buffer_t * buffers, uint32_t size)
{
    struct iobuf * buffer;

    buffer = iobuf_get(local->xl->ctx->iobuf_pool);
    if (unlikely(buffer == NULL))
    {
        goto failed;
    }
    if (unlikely(iobuf_pagesize(buffer) < size))
    {
        gf_log(local->xl->name, GF_LOG_ERROR, "Insufficient space in buffer");

        goto failed_buffer;
    }
    if (iobref_add(buffers->buffers, buffer) != 0)
    {
        goto failed_buffer;
    }

    return 0;

failed_buffer:
    iobuf_unref(buffer);
failed:
    return ENOMEM;
}
int32_t ida_buffer_new(ida_local_t * local, ida_buffer_t * dst, uint32_t size)
{
    struct iobuf * buffer;

    dst->buffers = iobref_new();
    if (unlikely(dst->buffers == NULL))
    {
        goto failed;
    }
    buffer = iobuf_get(local->xl->ctx->iobuf_pool);
    if (unlikely(buffer == NULL))
    {
        goto failed_iobref;
    }
    if (unlikely(iobuf_pagesize(buffer) < size))
    {
        gf_log(local->xl->name, GF_LOG_ERROR, "Insufficient space in buffer");

        goto failed_buffer;
    }
    if (iobref_add(dst->buffers, buffer) != 0)
    {
        goto failed_buffer;
    }
    dst->vectors = IDA_ALLOC_OR_GOTO(local->xl->name, sizeof(struct iovec), gf_common_mt_iovec, failed_buffer);
    dst->vectors->iov_base = buffer->ptr;
    dst->vectors->iov_len = size;
    dst->count = 1;

    iobuf_unref(buffer);

    return 0;

failed_buffer:
    iobuf_unref(buffer);
failed_iobref:
    iobref_unref(dst->buffers);
    dst->buffers = NULL;
failed:
    return ENOMEM;
}
Example #3
0
int
rpc_clnt_mgmt_pmap_signout (glusterfs_ctx_t *ctx, char *brickname)
{
        int               ret = 0;
        pmap_signout_req  req = {0, };
        call_frame_t     *frame = NULL;
        cmd_args_t       *cmd_args = NULL;
        char              brick_name[PATH_MAX]  = {0,};
        struct iovec      iov = {0, };
        struct iobuf     *iobuf = NULL;
        struct iobref    *iobref = NULL;
        ssize_t           xdr_size = 0;

        frame = create_frame (THIS, ctx->pool);
        cmd_args = &ctx->cmd_args;

        if (!cmd_args->brick_port && (!cmd_args->brick_name || !brickname)) {
                gf_log ("fsd-mgmt", GF_LOG_DEBUG,
                        "portmapper signout arguments not given");
                goto out;
        }

        if (cmd_args->volfile_server_transport &&
            !strcmp(cmd_args->volfile_server_transport, "rdma")) {
                snprintf (brick_name, sizeof(brick_name), "%s.rdma",
                          cmd_args->brick_name);
                req.brick = brick_name;
        } else {
                if (brickname)
                        req.brick = brickname;
                else
                        req.brick = cmd_args->brick_name;
        }

        req.port  = cmd_args->brick_port;
        req.rdma_port = cmd_args->brick_port2;

        /* mgmt_submit_request is not available in libglusterfs.
         * Need to serialize and submit manually.
         */
        iobref = iobref_new ();
        if (!iobref) {
                goto out;
        }

        xdr_size = xdr_sizeof ((xdrproc_t)xdr_pmap_signout_req, &req);
        iobuf = iobuf_get2 (ctx->iobuf_pool, xdr_size);
        if (!iobuf) {
                goto out;
        };

        iobref_add (iobref, iobuf);

        iov.iov_base = iobuf->ptr;
        iov.iov_len  = iobuf_pagesize (iobuf);

        /* Create the xdr payload */
        ret = xdr_serialize_generic (iov, &req,
                                     (xdrproc_t)xdr_pmap_signout_req);
        if (ret == -1) {
                gf_log (THIS->name, GF_LOG_WARNING,
                        "failed to create XDR payload");
                goto out;
        }
        iov.iov_len = ret;

        ret = rpc_clnt_submit (ctx->mgmt, &clnt_pmap_signout_prog,
                               GF_PMAP_SIGNOUT, mgmt_pmap_signout_cbk,
                               &iov, 1,
                               NULL, 0, iobref, frame, NULL, 0, NULL, 0, NULL);
out:
        if (iobref)
                iobref_unref (iobref);

        if (iobuf)
                iobuf_unref (iobuf);
        return ret;
}