From: Rishabh Dave Date: Thu, 25 Oct 2018 13:26:50 +0000 (+0000) Subject: rbd-fuse: look for ceph.conf in standard locations X-Git-Tag: v14.1.0~1023^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a68cf961d5dae343378398518acfb8e2e191ba35;p=ceph.git rbd-fuse: look for ceph.conf in standard locations Fixes: http://tracker.ceph.com/issues/12219 Signed-off-by: Jason Dillaman --- diff --git a/src/rbd_fuse/CMakeLists.txt b/src/rbd_fuse/CMakeLists.txt index 618992b776a..e0bd3e2497d 100644 --- a/src/rbd_fuse/CMakeLists.txt +++ b/src/rbd_fuse/CMakeLists.txt @@ -1,5 +1,5 @@ add_executable(rbd-fuse rbd-fuse.cc) target_link_libraries(rbd-fuse - ceph-common librbd librados ${FUSE_LIBRARIES}) + ceph-common librbd librados global ${FUSE_LIBRARIES}) install(TARGETS rbd-fuse DESTINATION bin) diff --git a/src/rbd_fuse/rbd-fuse.cc b/src/rbd_fuse/rbd-fuse.cc index d6d44e051f9..f40556a1972 100644 --- a/src/rbd_fuse/rbd-fuse.cc +++ b/src/rbd_fuse/rbd-fuse.cc @@ -28,9 +28,14 @@ #include "include/compat.h" #include "include/rbd/librbd.h" - #include "include/ceph_assert.h" +#include "common/ceph_argparse.h" +#include "common/ceph_context.h" + +#include "global/global_init.h" +#include "global/global_context.h" + static int gotrados = 0; char *pool_name; char *mount_image_name; @@ -45,7 +50,6 @@ struct rbd_stat { }; struct rbd_options { - char *ceph_config; char *pool_name; char *image_name; }; @@ -68,8 +72,7 @@ struct rbd_openimage { #define MAX_RBD_IMAGES 128 struct rbd_openimage opentbl[MAX_RBD_IMAGES]; -struct rbd_options rbd_options = {(char*) "/etc/ceph/ceph.conf", (char*) "rbd", - NULL}; +struct rbd_options rbd_options = {(char*) "rbd", NULL}; #define rbdsize(fd) opentbl[fd].rbd_stat.rbd_info.size #define rbdblksize(fd) opentbl[fd].rbd_stat.rbd_info.obj_size @@ -759,8 +762,6 @@ const static struct fuse_operations rbdfs_oper = { enum { KEY_HELP, KEY_VERSION, - KEY_CEPH_CONFIG, - KEY_CEPH_CONFIG_LONG, KEY_RADOS_POOLNAME, KEY_RADOS_POOLNAME_LONG, KEY_RBD_IMAGENAME, @@ -772,15 +773,13 @@ static struct fuse_opt rbdfs_opts[] = { FUSE_OPT_KEY("--help", KEY_HELP), FUSE_OPT_KEY("-V", KEY_VERSION), FUSE_OPT_KEY("--version", KEY_VERSION), - {"-c %s", offsetof(struct rbd_options, ceph_config), KEY_CEPH_CONFIG}, - {"--configfile=%s", offsetof(struct rbd_options, ceph_config), - KEY_CEPH_CONFIG_LONG}, {"-p %s", offsetof(struct rbd_options, pool_name), KEY_RADOS_POOLNAME}, {"--poolname=%s", offsetof(struct rbd_options, pool_name), KEY_RADOS_POOLNAME_LONG}, {"-r %s", offsetof(struct rbd_options, image_name), KEY_RBD_IMAGENAME}, {"--image=%s", offsetof(struct rbd_options, image_name), KEY_RBD_IMAGENAME_LONG}, + FUSE_OPT_END }; static void usage(const char *progname) @@ -791,7 +790,7 @@ static void usage(const char *progname) "General options:\n" " -h --help print help\n" " -V --version print version\n" -" -c --configfile ceph configuration file [/etc/ceph/ceph.conf]\n" +" -c --conf ceph configuration file [/etc/ceph/ceph.conf]\n" " -p --poolname rados pool name [rbd]\n" " -r --image RBD image name\n" "\n", progname); @@ -813,15 +812,6 @@ static int rbdfs_opt_proc(void *data, const char *arg, int key, exit(0); } - if (key == KEY_CEPH_CONFIG) { - if (rbd_options.ceph_config != NULL) { - free(rbd_options.ceph_config); - rbd_options.ceph_config = NULL; - } - rbd_options.ceph_config = strdup(arg+2); - return 0; - } - if (key == KEY_RADOS_POOLNAME) { if (rbd_options.pool_name != NULL) { free(rbd_options.pool_name); @@ -854,36 +844,63 @@ int connect_to_cluster(rados_t *pcluster) { int r; + global_init_postfork_start(g_ceph_context); + common_init_finish(g_ceph_context); + global_init_postfork_finish(g_ceph_context); - r = rados_create(pcluster, NULL); + r = rados_create_with_context(pcluster, g_ceph_context); if (r < 0) { simple_err("Could not create cluster handle", r); return r; } - rados_conf_parse_env(*pcluster, NULL); - r = rados_conf_read_file(*pcluster, rbd_options.ceph_config); - if (r < 0) { - simple_err("Error reading Ceph config file", r); - goto failed_shutdown; - } + r = rados_connect(*pcluster); if (r < 0) { simple_err("Error connecting to cluster", r); - goto failed_shutdown; + rados_shutdown(*pcluster); + return r; } return 0; - -failed_shutdown: - rados_shutdown(*pcluster); - return r; } -int main(int argc, char *argv[]) +int main(int argc, const char *argv[]) { - struct fuse_args args = FUSE_ARGS_INIT(argc, argv); + // librados will filter out -f/-d options from command-line + std::map filter_args = { + {"-f", false}, + {"-d", false}}; + + std::vector arg_vector; + for (auto idx = 0; idx < argc; ++idx) { + auto it = filter_args.find(argv[idx]); + if (it != filter_args.end()) { + it->second = true; + } + arg_vector.push_back(argv[idx]); + } + + auto cct = global_init(NULL, arg_vector, CEPH_ENTITY_TYPE_CLIENT, + CODE_ENVIRONMENT_DAEMON, + CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS); + g_ceph_context->_conf.set_val_or_die("pid_file", ""); + g_ceph_context->_conf.set_val_or_die("daemonize", "true"); + + if (global_init_prefork(g_ceph_context) < 0) { + fprintf(stderr, "Failed to initialize librados\n"); + exit(1); + } + + for (auto& it : filter_args) { + if (it.second) { + arg_vector.push_back(it.first.c_str()); + } + } - if (fuse_opt_parse(&args, &rbd_options, rbdfs_opts, rbdfs_opt_proc) == -1) { + struct fuse_args args = FUSE_ARGS_INIT((int)arg_vector.size(), + (char**)&arg_vector.front()); + if (fuse_opt_parse(&args, &rbd_options, rbdfs_opts, + rbdfs_opt_proc) == -1) { exit(1); }