summaryrefslogtreecommitdiffstats
path: root/cli/src/cli-cmd-parser.c
diff options
context:
space:
mode:
authorAtin Mukherjee <amukherj@redhat.com>2016-05-11 18:24:40 +0530
committerKaushal M <kaushal@redhat.com>2016-05-18 02:06:07 -0700
commit5a4f4a945661a8bb24735524e152ccd5b1ba571a (patch)
tree27b1ab6c32de79672debb01b518e4464672e2fba /cli/src/cli-cmd-parser.c
parenta84034a5f7f547790c095950cd8a697c8c7b31ca (diff)
glusterd: copy real_path from older brickinfo during brick import
In glusterd_import_new_brick () new_brickinfo->real_path will not be populated for the first time and hence if the underlying file system is bad for the same brick, import will fail resulting in inconsistent configuration data. Fix is to populate real_path from old brickinfo object. Also there were many cases where we were unnecessarily calling realpath() and that may cause in failure. For eg - if a remove brick is executed with a brick whoose underlying file system has crashed, remove-brick fails since realpath() call fails. We'd need to call realpath() here as the value is of no use.Hence passing construct_realpath as _gf_false in glusterd_volume_brickinfo_get_by_brick () is a must in such cases. Change-Id: I7ec93871dc9e616f5d565ad5e540b2f1cacaf9dc BUG: 1335531 Signed-off-by: Atin Mukherjee <amukherj@redhat.com> Reviewed-on: http://review.gluster.org/14306 Smoke: Gluster Build System <jenkins@build.gluster.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Kaushal M <kaushal@redhat.com>
Diffstat (limited to 'cli/src/cli-cmd-parser.c')
0 files changed, 0 insertions, 0 deletions
href='#n144'>144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
/*
   Copyright (c) 2015 Red Hat, Inc. <http://www.redhat.com>
   This file is part of GlusterFS.

   This file is licensed to you under your choice of the GNU Lesser
   General Public License, version 3 or any later version (LGPLv3 or
   later), or the GNU General Public License, version 2 (GPLv2), in all
   cases as published by the Free Software Foundation.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <pthread.h>

#include <sys/socket.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>

#include "cli.h"
#include "cli-cmd.h"
#include "cli-mem-types.h"
#include "cli1-xdr.h"
#include "run.h"
#include "syscall.h"
#include "common-utils.h"

extern rpc_clnt_prog_t *cli_rpc_prog;

int
cli_cmd_global_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
                         const char **words, int wordcount);
int cli_cmd_ganesha_cbk (struct cli_state *state, struct cli_cmd_word *word,
                                         const char **words, int wordcount);
int
cli_cmd_get_state_cbk (struct cli_state *state, struct cli_cmd_word *word,
                              const char **words, int wordcount);

struct cli_cmd global_cmds[] = {
        { "global help",
           cli_cmd_global_help_cbk,
           "list global commands",
        },
        { "nfs-ganesha {enable| disable} ",
           cli_cmd_ganesha_cbk,
          "Enable/disable NFS-Ganesha support",
        },
        { "get-state [<daemon>] [odir </path/to/output/dir/>] [file <filename>]",
          cli_cmd_get_state_cbk,
          "Get local state representation of mentioned daemon",
        },
        {NULL,  NULL,  NULL}
};

int
cli_cmd_global_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
                      const char **words, int wordcount)
{
        struct cli_cmd        *cmd = NULL;
        struct cli_cmd        *global_cmd = NULL;
        int                   count     = 0;

        cmd = GF_CALLOC (1, sizeof (global_cmds), cli_mt_cli_cmd);
        memcpy (cmd, global_cmds, sizeof (global_cmds));
        count = (sizeof (global_cmds) / sizeof (struct cli_cmd));
        cli_cmd_sort (cmd, count);

        for (global_cmd = cmd; global_cmd->pattern; global_cmd++)
                if (_gf_false == global_cmd->disable)
                        cli_out ("%s - %s", global_cmd->pattern,
                                 global_cmd->desc);

        GF_FREE (cmd);
        return 0;
}

int
cli_cmd_global_register (struct cli_state *state)
{
        int ret = 0;
        struct cli_cmd *cmd =  NULL;
        for (cmd = global_cmds; cmd->pattern; cmd++) {
                ret = cli_cmd_register (&state->tree, cmd);
                        if (ret)
                                goto out;
        }
out:
        return ret;

}

int cli_cmd_ganesha_cbk (struct cli_state *state, struct cli_cmd_word *word,
                         const char **words, int wordcount)

{
         int                     sent        =   0;
         int                     parse_error =   0;
         int                     ret         =  -1;
         rpc_clnt_procedure_t    *proc       =  NULL;
         call_frame_t            *frame      =  NULL;
         dict_t                  *options    =  NULL;
         cli_local_t             *local      =  NULL;
         char                    *op_errstr  =  NULL;

        proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GANESHA];

        frame = create_frame (THIS, THIS->ctx->pool);
        if (!frame)
                goto out;

        ret = cli_cmd_ganesha_parse (state, words, wordcount,
                                     &options, &op_errstr);
        if (ret) {
                if (op_errstr) {
                    cli_err ("%s", op_errstr);
                    GF_FREE (op_errstr);
                } else
                    cli_usage_out (word->pattern);
                parse_error = 1;
                goto out;
        }

        CLI_LOCAL_INIT (local, words, frame, options);

        if (proc->fn) {
                ret = proc->fn (frame, THIS, options);
        }

out:
        if (ret) {
                cli_cmd_sent_status_get (&sent);
                if ((sent == 0) && (parse_error == 0))
                        cli_out ("Setting global option failed");
        }

        CLI_STACK_DESTROY (frame);
        return ret;
}

int
cli_cmd_get_state_cbk (struct cli_state *state, struct cli_cmd_word *word,
                       const char **words, int wordcount)
{
        int                     sent        =   0;
        int                     parse_error =   0;
        int                     ret         =  -1;
        rpc_clnt_procedure_t    *proc       =  NULL;
        call_frame_t            *frame      =  NULL;
        dict_t                  *options    =  NULL;
        cli_local_t             *local      =  NULL;
        char                    *op_errstr  =  NULL;

        frame = create_frame (THIS, THIS->ctx->pool);
        if (!frame)
                goto out;

        ret = cli_cmd_get_state_parse (state, words, wordcount, &options,
                                       &op_errstr);

        if (ret) {
                if (op_errstr) {
                        cli_err ("%s", op_errstr);
                        cli_usage_out (word->pattern);
                        GF_FREE (op_errstr);
                } else