#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;
};
struct rbd_options {
- char *ceph_config;
char *pool_name;
char *image_name;
};
#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
enum {
KEY_HELP,
KEY_VERSION,
- KEY_CEPH_CONFIG,
- KEY_CEPH_CONFIG_LONG,
KEY_RADOS_POOLNAME,
KEY_RADOS_POOLNAME_LONG,
KEY_RBD_IMAGENAME,
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)
"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);
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);
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);
}