struct fuse_session *se;
#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0)
struct fuse_cmdline_opts opts;
+ struct fuse_conn_info_opts *conn_opts;
#else
struct fuse_chan *ch;
char *mountpoint;
CephFuse::Handle *cfuse = (CephFuse::Handle *)data;
Client *client = cfuse->client;
+#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0)
+ fuse_apply_conn_info_opts(cfuse->conn_opts, conn);
+#endif
+
#if !defined(__APPLE__)
if (!client->fuse_default_permissions && client->ll_handle_umask()) {
// apply umask in userspace if posix acl is enabled
fuse_session_unmount(se);
fuse_session_destroy(se);
}
+ if (conn_opts)
+ free(conn_opts);
if (opts.mountpoint)
free(opts.mountpoint);
#else
// set up fuse argc/argv
int newargc = 0;
- const char **newargv = (const char **) malloc((argc + 10) * sizeof(char *));
+ const char **newargv = (const char **) malloc((argc + 11) * sizeof(char *));
if(!newargv)
return ENOMEM;
#if FUSE_VERSION < FUSE_MAKE_VERSION(3, 0)
auto fuse_big_writes = client->cct->_conf.get_val<bool>(
"fuse_big_writes");
+#endif
auto fuse_max_write = client->cct->_conf.get_val<Option::size_t>(
"fuse_max_write");
auto fuse_atomic_o_trunc = client->cct->_conf.get_val<bool>(
"fuse_atomic_o_trunc");
-#endif
auto fuse_debug = client->cct->_conf.get_val<bool>(
"fuse_debug");
newargv[newargc++] = "-o";
newargv[newargc++] = "big_writes";
}
+#endif
if (fuse_max_write > 0) {
char strsplice[65];
newargv[newargc++] = "-o";
newargv[newargc++] = "-o";
newargv[newargc++] = "atomic_o_trunc";
}
-#endif
#endif
if (fuse_debug)
newargv[newargc++] = "-d";
return EINVAL;
}
+#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0)
+ derr << "init, args.argv = " << args.argv << " args.argc=" << args.argc << dendl;
+ conn_opts = fuse_parse_conn_info_opts(&args);
+ if (!conn_opts) {
+ derr << "fuse_parse_conn_info_opts failed" << dendl;
+ fuse_opt_free_args(&args);
+ free(newargv);
+ return EINVAL;
+ }
+#endif
+
ceph_assert(args.allocated); // Checking fuse has realloc'd args so we can free newargv
free(newargv);
return 0;
{
#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0)
se = fuse_session_new(&args, &fuse_ll_oper, sizeof(fuse_ll_oper), this);
+ if (!se) {
+ derr << "fuse_session_new failed" << dendl;
+ return EDOM;
+ }
#else
ch = fuse_mount(mountpoint, &args);
if (!ch) {
}
se = fuse_lowlevel_new(&args, &fuse_ll_oper, sizeof(fuse_ll_oper), this);
-#endif
if (!se) {
derr << "fuse_lowlevel_new failed" << dendl;
return EDOM;
}
+#endif
signal(SIGTERM, SIG_DFL);
signal(SIGINT, SIG_DFL);