]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-fuse: look for ceph.conf in standard locations 20598/head
authorRishabh Dave <ridave@redhat.com>
Thu, 25 Oct 2018 13:26:50 +0000 (13:26 +0000)
committerRishabh Dave <ridave@redhat.com>
Tue, 30 Oct 2018 12:14:58 +0000 (12:14 +0000)
Fixes: http://tracker.ceph.com/issues/12219
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/rbd_fuse/CMakeLists.txt
src/rbd_fuse/rbd-fuse.cc

index 618992b776a1d876708f4c166cd98d45efb1def2..e0bd3e2497d15eb21ae3341f3ab30863a353d0ca 100644 (file)
@@ -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)
index d6d44e051f9c57a2f5350b335a9f61609002c9cd..f40556a19720d35461d06d54587a0f107dc7f42f 100644 (file)
 
 #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<std::string, bool> filter_args = {
+               {"-f", false},
+               {"-d", false}};
+
+       std::vector<const char*> 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);
        }