Compare commits

...
151 Commits
Author SHA1 Message Date
Antonio SJ Musumeci 11a5706dc3 config.cpp 2025-10-02 20:24:41 -05:00
Antonio SJ Musumeci fe6518c4a6 config.cpp 2025-10-02 20:22:46 -05:00
Antonio SJ Musumeci 64d37be555 option_parser.cpp 2025-10-02 20:20:40 -05:00
Antonio SJ Musumeci e06fc110ad option_parser.cpp 2025-10-02 20:20:24 -05:00
Antonio SJ Musumeci d9ea3fff4b option_parser.cpp 2025-10-02 20:20:11 -05:00
Antonio SJ Musumeci 02544b649f from_string.cpp 2025-10-02 20:19:15 -05:00
Antonio SJ Musumeci efa630db5c from_string.cpp 2025-10-02 20:18:57 -05:00
Antonio SJ Musumeci 4820724f9d from_string.hpp 2025-10-02 20:18:04 -05:00
Antonio SJ Musumeci 7f215c5ffd to_string.cpp 2025-10-02 20:17:30 -05:00
Antonio SJ Musumeci 587d2dbd43 to_string.hpp 2025-10-02 20:17:00 -05:00
Antonio SJ Musumeci e95b409276 config.hpp 2025-10-02 20:16:41 -05:00
Antonio SJ Musumeci 7f9f7c5278 config.hpp 2025-10-02 20:16:22 -05:00
Antonio SJ Musumeci f92daf0a9e config.hpp 2025-10-02 20:15:55 -05:00
Antonio SJ Musumeci d86224571b config.hpp 2025-10-02 20:15:48 -05:00
Antonio SJ Musumeci f400eec2ad config.hpp 2025-10-02 20:15:14 -05:00
Antonio SJ Musumeci 7566c0485a config.hpp 2025-10-02 20:14:45 -05:00
Antonio SJ Musumeci f748d63dd0 config.hpp 2025-10-02 20:10:14 -05:00
Antonio SJ Musumeci 915b60a957 option_parser.cpp 2025-10-02 20:09:04 -05:00
Antonio SJ Musumeci 1d0f5b1180 option_parser.cpp 2025-10-02 20:08:59 -05:00
Antonio SJ Musumeci 1e8aa240e2 option_parser.cpp 2025-10-02 20:08:08 -05:00
Antonio SJ Musumeci e5a4793332 option_parser.cpp 2025-10-02 20:02:28 -05:00
Antonio SJ Musumeci bb7daa6173 option_parser.cpp 2025-10-02 19:40:58 -05:00
Antonio SJ Musumeci 02b87df975 option_parser.cpp 2025-10-02 19:40:18 -05:00
Antonio SJ Musumeci 133539e4b6 option_parser.cpp 2025-10-02 19:35:58 -05:00
Antonio SJ Musumeci 77805d4742 option_parser.cpp 2025-10-02 19:35:45 -05:00
Antonio SJ Musumeci f48648b056 option_parser.cpp 2025-10-02 19:35:36 -05:00
Antonio SJ Musumeci 798222f37f option_parser.cpp 2025-10-02 19:35:30 -05:00
Antonio SJ Musumeci 641bf41023 option_parser.cpp 2025-10-02 19:35:18 -05:00
Antonio SJ Musumeci b3f9c20279 option_parser.cpp 2025-10-02 19:35:08 -05:00
Antonio SJ Musumeci a8357acbc6 option_parser.cpp 2025-10-02 19:35:00 -05:00
Antonio SJ Musumeci 539c90b029 option_parser.cpp 2025-10-02 19:34:48 -05:00
Antonio SJ Musumeci c531289541 option_parser.cpp 2025-10-02 19:34:43 -05:00
Antonio SJ Musumeci 8f5ef638ec option_parser.cpp 2025-10-02 19:34:38 -05:00
Antonio SJ Musumeci 8efdb641e7 option_parser.cpp 2025-10-02 19:34:34 -05:00
Antonio SJ Musumeci abc05c4c0f option_parser.cpp 2025-10-02 19:34:28 -05:00
Antonio SJ Musumeci 435632b737 option_parser.cpp 2025-10-02 19:34:19 -05:00
Antonio SJ Musumeci d3c1ebf19f option_parser.cpp 2025-10-02 19:34:11 -05:00
Antonio SJ Musumeci 82c72cf6a0 option_parser.cpp 2025-10-02 19:34:03 -05:00
Antonio SJ Musumeci 1d6fe14c5d option_parser.cpp 2025-10-02 19:33:59 -05:00
Antonio SJ Musumeci 2d9300aadc option_parser.cpp 2025-10-02 19:33:48 -05:00
Antonio SJ Musumeci 01c4e72ff4 option_parser.cpp 2025-10-02 19:33:46 -05:00
Antonio SJ Musumeci 6390c34585 option_parser.cpp 2025-10-02 19:33:34 -05:00
Antonio SJ Musumeci 2de22c8893 option_parser.cpp 2025-10-02 19:32:38 -05:00
Antonio SJ Musumeci 517ca11335 option_parser.cpp 2025-10-02 19:32:08 -05:00
Antonio SJ Musumeci 921a21f5a0 option_parser.cpp 2025-10-02 19:22:39 -05:00
Antonio SJ Musumeci 1287daf86e option_parser.cpp 2025-10-02 19:22:18 -05:00
Antonio SJ Musumeci 90c511fbde option_parser.cpp 2025-10-02 19:22:03 -05:00
Antonio SJ Musumeci b4ab6daf88 option_parser.cpp 2025-10-02 19:21:38 -05:00
Antonio SJ Musumeci 6578b589c6 option_parser.cpp 2025-10-02 19:17:34 -05:00
Antonio SJ Musumeci e5bf3e265f option_parser.cpp 2025-10-02 19:17:33 -05:00
Antonio SJ Musumeci b9d2895429 option_parser.cpp 2025-10-02 19:16:53 -05:00
Antonio SJ Musumeci 2d8aad7c77 option_parser.cpp 2025-10-02 19:16:05 -05:00
Antonio SJ Musumeci f398ea2393 option_parser.cpp 2025-10-02 19:15:53 -05:00
Antonio SJ Musumeci d4c39b46d6 option_parser.cpp 2025-10-02 19:11:42 -05:00
Antonio SJ Musumeci 94bf1ef7dc option_parser.cpp 2025-10-02 19:10:58 -05:00
Antonio SJ Musumeci 14ef951f87 option_parser.cpp 2025-10-02 19:07:43 -05:00
Antonio SJ Musumeci 9def5089d3 option_parser.cpp 2025-10-02 19:07:30 -05:00
Antonio SJ Musumeci 45bb98343f option_parser.cpp 2025-10-02 19:05:59 -05:00
Antonio SJ Musumeci 988ec2f7aa option_parser.cpp 2025-10-02 19:05:55 -05:00
Antonio SJ Musumeci 72dd01fd46 option_parser.cpp 2025-10-02 19:05:38 -05:00
Antonio SJ Musumeci 8f45dd01c1 option_parser.cpp 2025-10-02 19:02:49 -05:00
Antonio SJ Musumeci 8106ec2664 option_parser.cpp 2025-10-02 19:00:31 -05:00
Antonio SJ Musumeci 87b4971c26 option_parser.cpp 2025-10-02 18:59:52 -05:00
Antonio SJ Musumeci 73bd437213 option_parser.cpp 2025-10-02 18:59:28 -05:00
Antonio SJ Musumeci d8b27f1a89 option_parser.cpp 2025-10-02 18:56:45 -05:00
Antonio SJ Musumeci aecc6f3d84 option_parser.cpp 2025-10-02 18:56:38 -05:00
Antonio SJ Musumeci 59560b5e2b option_parser.cpp 2025-10-02 18:56:28 -05:00
Antonio SJ Musumeci 7429c3a779 option_parser.cpp 2025-10-02 18:56:17 -05:00
Antonio SJ Musumeci 5d3206f255 option_parser.cpp 2025-10-02 18:55:04 -05:00
Antonio SJ Musumeci 12e8345183 option_parser.cpp 2025-10-02 18:54:47 -05:00
Antonio SJ Musumeci 22c58fce90 option_parser.cpp 2025-10-02 18:53:10 -05:00
Antonio SJ Musumeci f23ede2ccb option_parser.cpp 2025-10-02 18:52:14 -05:00
Antonio SJ Musumeci df7b9fd538 option_parser.cpp 2025-10-02 18:51:58 -05:00
Antonio SJ Musumeci 9bbd5397f6 option_parser.cpp 2025-10-02 18:51:46 -05:00
Antonio SJ Musumeci d0080985ac option_parser.cpp 2025-10-02 18:51:22 -05:00
Antonio SJ Musumeci 2bfa459323 option_parser.cpp 2025-10-02 18:51:18 -05:00
Antonio SJ Musumeci cf07e9cb89 mergerfs.cpp 2025-10-02 18:40:48 -05:00
Antonio SJ Musumeci 075cbfc23f mergerfs.cpp 2025-10-02 18:37:34 -05:00
Antonio SJ Musumeci 9826e97693 mergerfs.cpp 2025-10-02 18:36:32 -05:00
Antonio SJ Musumeci 9843f48627 mergerfs.cpp 2025-10-02 18:35:45 -05:00
Antonio SJ Musumeci 21c41c1e85 mergerfs.cpp 2025-10-02 18:35:17 -05:00
Antonio SJ Musumeci d26d7c439f mergerfs.cpp 2025-10-02 18:35:07 -05:00
Antonio SJ Musumeci 5e607d5dc1 mergerfs.cpp 2025-10-02 18:34:01 -05:00
Antonio SJ Musumeci c39ddb09d1 mergerfs.cpp 2025-10-02 18:33:54 -05:00
Antonio SJ Musumeci addcdd6246 mergerfs.cpp 2025-10-02 18:33:35 -05:00
Antonio SJ Musumeci 9f43af18cc mergerfs.cpp 2025-10-02 18:21:58 -05:00
Antonio SJ Musumeci 8399ca0694 mergerfs.cpp 2025-10-02 18:20:55 -05:00
Antonio SJ Musumeci 4c358f9a3e mergerfs.cpp 2025-10-02 18:19:00 -05:00
Antonio SJ Musumeci 9640e1bf4d mergerfs.cpp 2025-10-02 18:16:44 -05:00
Antonio SJ Musumeci 79eafe549d mergerfs.cpp 2025-10-02 18:11:35 -05:00
Antonio SJ Musumeci 3ca304aad6 mergerfs.cpp 2025-10-02 18:11:26 -05:00
Antonio SJ Musumeci f81058ddc8 mergerfs.cpp 2025-10-02 17:56:22 -05:00
Antonio SJ Musumeci 335f4cf62b mergerfs.cpp 2025-10-02 17:55:59 -05:00
Antonio SJ Musumeci d8750e4343 mergerfs.cpp 2025-10-02 17:55:53 -05:00
Antonio SJ Musumeci 3742a3a937 mergerfs.cpp 2025-10-02 17:46:48 -05:00
Antonio SJ Musumeci a507019415 mergerfs.cpp 2025-10-02 17:46:46 -05:00
Antonio SJ Musumeci 9486554e4e mergerfs.cpp 2025-10-02 17:45:26 -05:00
Antonio SJ Musumeci 9a2a4076ba mergerfs.cpp 2025-10-02 17:45:06 -05:00
Antonio SJ Musumeci 9de89cd29b mergerfs.cpp 2025-10-02 17:43:56 -05:00
Antonio SJ Musumeci c0635b4240 mergerfs.cpp 2025-10-02 17:43:02 -05:00
Antonio SJ Musumeci 857cde4634 mergerfs.cpp 2025-10-02 17:42:43 -05:00
Antonio SJ Musumeci 353032a9ad mergerfs.cpp 2025-10-02 17:38:03 -05:00
Antonio SJ Musumeci 7dae8d6746 mergerfs.cpp 2025-10-02 17:38:00 -05:00
Antonio SJ Musumeci f97b780546 mergerfs.cpp 2025-10-02 17:37:48 -05:00
Antonio SJ Musumeci c2bf982be6 mergerfs.cpp 2025-10-02 17:37:25 -05:00
Antonio SJ Musumeci 2f75003e0e mergerfs.cpp 2025-10-02 17:37:16 -05:00
Antonio SJ Musumeci 70411b35a6 mergerfs.cpp 2025-10-02 17:34:00 -05:00
Antonio SJ Musumeci 34386ea0fc mergerfs.cpp 2025-10-02 17:33:58 -05:00
Antonio SJ Musumeci 3c7adb71e5 mergerfs.cpp 2025-10-02 17:33:03 -05:00
Antonio SJ Musumeci e116f195c4 mergerfs.cpp 2025-10-02 17:33:02 -05:00
Antonio SJ Musumeci aa762bbcf8 mergerfs.cpp 2025-10-02 17:32:04 -05:00
Antonio SJ Musumeci d58b3e5e26 mergerfs.cpp 2025-10-02 17:31:42 -05:00
Antonio SJ Musumeci 39479f747f mergerfs.cpp 2025-10-02 17:31:14 -05:00
Antonio SJ Musumeci 969037a293 mergerfs.cpp 2025-10-02 17:30:25 -05:00
Antonio SJ Musumeci 22f6277deb mergerfs.cpp 2025-10-02 17:30:03 -05:00
Antonio SJ Musumeci 864526c668 mergerfs.cpp 2025-10-02 17:29:41 -05:00
Antonio SJ Musumeci 04e2342848 mergerfs.cpp 2025-10-02 17:29:11 -05:00
Antonio SJ Musumeci 20e9053715 mergerfs.cpp 2025-10-02 17:26:26 -05:00
Antonio SJ Musumeci d8399f375a mergerfs.cpp 2025-10-02 17:26:23 -05:00
Antonio SJ Musumeci a8c38a6f86 mergerfs.cpp 2025-10-02 17:26:20 -05:00
Antonio SJ Musumeci 4b2c92db90 mergerfs.cpp 2025-10-02 17:25:50 -05:00
Antonio SJ Musumeci 6c1190566b mergerfs.cpp 2025-10-02 17:24:45 -05:00
Antonio SJ Musumeci ce4a88b27c mergerfs.cpp 2025-10-02 17:24:43 -05:00
Antonio SJ Musumeci 8f9da0d5b1 mergerfs.cpp 2025-10-02 17:24:13 -05:00
Antonio SJ Musumeci ea15534e52 mergerfs.cpp 2025-10-02 17:22:38 -05:00
Antonio SJ Musumeci e81dbc2adc mergerfs.cpp 2025-10-02 17:21:33 -05:00
Antonio SJ Musumeci 1df1a94231 mergerfs.cpp 2025-10-02 17:20:33 -05:00
Antonio SJ Musumeci 4e68e1eed9 mergerfs.cpp 2025-10-02 17:20:31 -05:00
Antonio SJ Musumeci 26b5585911 mergerfs.cpp 2025-10-02 17:20:16 -05:00
Antonio SJ Musumeci 12cbd2f88a mergerfs.cpp 2025-10-02 17:20:07 -05:00
Antonio SJ Musumeci 73db2ca9b7 mergerfs.cpp 2025-10-02 17:19:53 -05:00
Antonio SJ Musumeci c56b0e644f mergerfs.cpp 2025-10-02 17:18:36 -05:00
Antonio SJ Musumeci b72f8587c3 mergerfs.cpp 2025-10-02 17:18:15 -05:00
Antonio SJ Musumeci c25340aba5 mergerfs.cpp 2025-10-02 17:15:58 -05:00
Antonio SJ Musumeci a7de2c5212 mergerfs.cpp 2025-10-02 17:15:51 -05:00
Antonio SJ Musumeci 851b982518 mergerfs.cpp 2025-10-02 17:15:43 -05:00
Antonio SJ Musumeci f30ad6d45b mergerfs.cpp 2025-10-02 17:15:19 -05:00
Antonio SJ Musumeci 16110672fc mergerfs.cpp 2025-10-02 17:15:15 -05:00
Antonio SJ Musumeci 750866d842 mergerfs.cpp 2025-10-02 17:15:13 -05:00
Antonio SJ Musumeci 7f039a5e7e mergerfs.cpp 2025-10-02 17:13:22 -05:00
Antonio SJ Musumeci 52fe5a5e40 mergerfs.cpp 2025-10-02 17:12:44 -05:00
Antonio SJ Musumeci af5928cbe2 mergerfs.cpp 2025-10-02 17:12:29 -05:00
Antonio SJ Musumeci 6c45d23ecb mergerfs.cpp 2025-10-02 17:10:08 -05:00
Antonio SJ Musumeci 2b2877b8f3 mergerfs.cpp 2025-10-02 17:08:44 -05:00
Antonio SJ Musumeci 882ad29b87 mergerfs.cpp 2025-10-02 17:08:03 -05:00
Antonio SJ Musumeci 8340bc9370 mergerfs.cpp 2025-10-02 17:04:29 -05:00
Antonio SJ Musumeci 92e89a9e99 mergerfs.cpp 2025-10-02 17:02:49 -05:00
Antonio SJ Musumeci 5da92025e0 fuse.cpp 2025-10-01 17:29:57 -05:00
Antonio SJ Musumeci ad8c19118e option_parser.cpp 2025-10-01 17:15:51 -05:00
Antonio SJ Musumeci d4d3aee354 option_parser.cpp 2025-10-01 17:13:43 -05:00
Antonio SJ Musumeci 4b580522c1 Allow setting of passthrough max_stack_depth 2025-10-01 16:32:14 -05:00
12 changed files with 175 additions and 77 deletions
+15 -1
View File
@@ -861,11 +861,25 @@ fuse_syslog_fuse_init_out(const struct fuse_init_out *arg_)
output = fmt::format("fuse_init_out:"
" major={};"
" minor={};"
" max_readahead={};"
" max_background={};"
" congestion_threshold={};"
" max_write={};"
" time_gran={};"
" max_pages={};"
" map_alignment={};"
" max_stack_depth={};"
" flags=(",
arg_->major,
arg_->minor,
arg_->max_pages);
arg_->max_readahead,
arg_->max_background,
arg_->congestion_threshold,
arg_->max_write,
arg_->time_gran,
arg_->max_pages,
arg_->map_alignment,
arg_->max_stack_depth);
for(uint64_t i = 0; i < (sizeof(flags)*8); i++)
{
+8 -8
View File
@@ -4165,14 +4165,14 @@ fuse_new_common(struct fuse_chan *ch,
return NULL;
}
struct fuse*
fuse_new(struct fuse_chan *ch,
struct fuse_args *args,
const struct fuse_operations *op,
size_t op_size)
{
return fuse_new_common(ch,args,op,op_size);
}
// struct fuse*
// fuse_new(struct fuse_chan *ch,
// struct fuse_args *args,
// const struct fuse_operations *op,
// size_t op_size)
// {
// return fuse_new_common(ch,args,op,op_size);
// }
void
fuse_destroy(struct fuse *f)
+1
View File
@@ -69,6 +69,7 @@ struct fuse_ll
int broken_splice_nonblock;
uint64_t notify_ctr;
struct fuse_notify_req notify_list;
int passthrough_max_stack_depth;
};
struct fuse_cmd
+3 -2
View File
@@ -1117,7 +1117,7 @@ do_init(fuse_req_t req,
struct fuse_in_header *hdr_)
{
struct fuse_init_out outarg = {0};
struct fuse_init_in *arg = (struct fuse_init_in *) &hdr_[1];
struct fuse_init_in *arg = (struct fuse_init_in*)&hdr_[1];
struct fuse_ll *f = req->f;
size_t bufsize = fuse_chan_bufsize(req->ch);
uint64_t inargflags;
@@ -1288,7 +1288,7 @@ do_init(fuse_req_t req,
if(f->conn.want & FUSE_CAP_PASSTHROUGH)
{
outargflags |= FUSE_PASSTHROUGH;
outarg.max_stack_depth = 2;
outarg.max_stack_depth = (f->passthrough_max_stack_depth + 1);
}
if(inargflags & FUSE_INIT_EXT)
@@ -1800,6 +1800,7 @@ enum {
static const struct fuse_opt fuse_ll_opts[] =
{
{ "passthrough-max-stack-depth=%u", offsetof(struct fuse_ll, passthrough_max_stack_depth), 0 },
{ "debug", offsetof(struct fuse_ll, debug), 1 },
{ "-d", offsetof(struct fuse_ll, debug), 1 },
{ "max_readahead=%u", offsetof(struct fuse_ll, conn.max_readahead), 0 },
+2
View File
@@ -65,6 +65,7 @@ namespace l
IFERT("kernel-permissions-check");
IFERT("mount");
IFERT("nullrw");
IFERT("passthrough-max-stack-depth");
IFERT("pid");
IFERT("pin-threads");
IFERT("process-thread-count");
@@ -204,6 +205,7 @@ Config::Config()
_map["nfsopenhack"] = &nfsopenhack;
_map["nullrw"] = &nullrw;
_map["passthrough"] = &passthrough;
_map["passthrough-max-stack-depth"] = &passthrough_max_stack_depth;
_map["pid"] = &pid;
_map["parallel-direct-writes"] = &parallel_direct_writes;
_map["pin-threads"] = &fuse_pin_threads;
+2
View File
@@ -56,6 +56,7 @@
#include <sys/stat.h>
typedef ToFromWrapper<bool> ConfigBOOL;
typedef ToFromWrapper<uint32_t> ConfigUINT32;
typedef ToFromWrapper<uint64_t> ConfigUINT64;
typedef ToFromWrapper<int64_t> ConfigS64;
typedef ToFromWrapper<int> ConfigINT;
@@ -124,6 +125,7 @@ public:
NFSOpenHack nfsopenhack;
ConfigBOOL nullrw;
Passthrough passthrough = Passthrough::ENUM::OFF;
ConfigUINT32 passthrough_max_stack_depth = 1;
ConfigBOOL parallel_direct_writes;
ConfigGetPid pid;
ConfigBOOL posix_acl;
+47
View File
@@ -65,6 +65,53 @@ str::from(const std::string_view val_,
return 0;
}
int
str::from(const std::string_view val_,
uint32_t *rv_)
{
uint64_t tmp;
const int base = 10;
auto [ptr,ec] = std::from_chars(val_.begin(),
val_.end(),
tmp,
base);
if(ec != std::errc{})
return -EINVAL;
*rv_ = tmp;
if(ptr == val_.end())
return 0;
switch(*ptr)
{
case 'b':
case 'B':
*rv_ *= 1ULL;
break;
case 'k':
case 'K':
*rv_ *= 1024ULL;
break;
case 'm':
case 'M':
*rv_ *= (1024ULL * 1024ULL);
break;
case 'g':
case 'G':
*rv_ *= (1024ULL * 1024ULL * 1024ULL);
break;
default:
return -EINVAL;
}
return 0;
}
int
str::from(const std::string_view val_,
int64_t *rv_)
+1
View File
@@ -29,6 +29,7 @@ namespace str
{
int from(const std::string_view, bool *);
int from(const std::string_view, int *);
int from(const std::string_view, uint32_t *);
int from(const std::string_view, uint64_t *);
int from(const std::string_view, int64_t *);
int from(const std::string_view, std::string *);
+2
View File
@@ -18,6 +18,8 @@
#include "mergerfs_fsck.hpp"
#include "mergerfs_collect_info.hpp"
#include "CLI11.hpp"
#include "fs_path.hpp"
#include "fs_readahead.hpp"
#include "fs_umount2.hpp"
+87 -66
View File
@@ -53,6 +53,12 @@ enum
MERGERFS_OPT_VERSION
};
struct OptParseState
{
std::vector<std::string> opts;
std::vector<std::string> branches;
Config::ErrVec *errs;
};
static
void
@@ -79,30 +85,29 @@ _set_kv_option(const std::string &key_,
static
void
_set_fuse_threads(Config &cfg_)
_set_fuse_threads()
{
fuse_config_set_read_thread_count(cfg_.fuse_read_thread_count);
fuse_config_set_process_thread_count(cfg_.fuse_process_thread_count);
fuse_config_set_process_thread_queue_depth(cfg_.fuse_process_thread_queue_depth);
fuse_config_set_pin_threads(cfg_.fuse_pin_threads);
fuse_config_set_read_thread_count(cfg.fuse_read_thread_count);
fuse_config_set_process_thread_count(cfg.fuse_process_thread_count);
fuse_config_set_process_thread_queue_depth(cfg.fuse_process_thread_queue_depth);
fuse_config_set_pin_threads(cfg.fuse_pin_threads);
}
static
void
_set_fsname(Config &cfg_,
fuse_args *args_)
_set_fsname(fuse_args *args_)
{
if(cfg_.fsname->empty())
if(cfg.fsname->empty())
{
std::vector<std::string> paths;
cfg_.branches->to_paths(paths);
cfg.branches->to_paths(paths);
if(paths.size() > 0)
cfg_.fsname = str::remove_common_prefix_and_join(paths,':');
cfg.fsname = str::remove_common_prefix_and_join(paths,':');
}
::_set_kv_option("fsname",cfg_.fsname,args_);
::_set_kv_option("fsname",cfg.fsname,args_);
}
static
@@ -114,10 +119,9 @@ _set_subtype(fuse_args *args_)
static
void
_set_default_options(fuse_args *args_,
Config &cfg_)
_set_default_options(fuse_args *args_)
{
if(cfg_.kernel_permissions_check)
if(cfg.kernel_permissions_check)
::_set_option("default_permissions",args_);
if(geteuid() == 0)
@@ -158,8 +162,7 @@ _should_ignore(const std::string &key_)
static
int
_parse_and_process_kv_arg(Config &cfg_,
Config::ErrVec *errs_,
_parse_and_process_kv_arg(Config::ErrVec *errs_,
const std::string &key_,
const std::string &val_)
{
@@ -169,7 +172,7 @@ _parse_and_process_kv_arg(Config &cfg_,
rv = 0;
if(key == "config")
return ((cfg_.from_file(val_,errs_) < 0) ? 1 : 0);
return ((cfg.from_file(val_,errs_) < 0) ? 1 : 0);
ef(key == "attr_timeout")
key = "cache.attr";
ef(key == "entry_timeout")
@@ -189,10 +192,10 @@ _parse_and_process_kv_arg(Config &cfg_,
ef(::_should_ignore(key_))
return 0;
if(cfg_.has_key(key) == false)
if(cfg.has_key(key) == false)
return 1;
rv = cfg_.set_raw(key,val);
rv = cfg.set_raw(key,val);
if(rv)
errs_->push_back({rv,key+'='+val});
@@ -201,9 +204,8 @@ _parse_and_process_kv_arg(Config &cfg_,
static
int
_process_opt(Config &cfg_,
Config::ErrVec *errs_,
const std::string &arg_)
_process_opt(Config::ErrVec *errs_,
const std::string &arg_)
{
std::string key;
std::string val;
@@ -212,20 +214,19 @@ _process_opt(Config &cfg_,
key = str::trim(key);
val = str::trim(val);
return ::_parse_and_process_kv_arg(cfg_,errs_,key,val);
return ::_parse_and_process_kv_arg(errs_,key,val);
}
static
int
_process_branches(Config &cfg_,
Config::ErrVec *errs_,
const char *arg_)
_process_branches(Config::ErrVec *errs_,
const char *arg_)
{
int rv;
std::string arg;
arg = arg_;
rv = cfg_.set_raw("branches",arg);
rv = cfg.set_raw("branches",arg);
if(rv)
errs_->push_back({rv,"branches="+arg});
@@ -234,15 +235,14 @@ _process_branches(Config &cfg_,
static
int
_process_mount(Config &cfg_,
Config::ErrVec *errs_,
const char *arg_)
_process_mount(Config::ErrVec *errs_,
const char *arg_)
{
int rv;
std::string arg;
arg = arg_;
rv = cfg_.set_raw("mount",arg);
rv = cfg.set_raw("mount",arg);
if(rv)
errs_->push_back({rv,"mount="+arg});
@@ -251,26 +251,26 @@ _process_mount(Config &cfg_,
static
void
_postprocess_passthrough(Config &cfg_)
_postprocess_passthrough()
{
if(cfg_.passthrough == Passthrough::ENUM::OFF)
if(cfg.passthrough == Passthrough::ENUM::OFF)
return;
if(cfg_.cache_files == CacheFiles::ENUM::OFF)
if(cfg.cache_files == CacheFiles::ENUM::OFF)
{
SysLog::warning("'cache.files' can not be 'off' when using 'passthrough'."
" Setting 'cache.files=full'");
cfg_.cache_files = CacheFiles::ENUM::FULL;
cfg.cache_files = CacheFiles::ENUM::FULL;
}
if(cfg_.writeback_cache == true)
if(cfg.writeback_cache == true)
{
SysLog::warning("'cache.writeback' can not be enabled when using 'passthrough'."
" Setting 'cache.writeback=false'");
cfg_.writeback_cache = false;
cfg.writeback_cache = false;
}
if(cfg_.moveonenospc.enabled == true)
if(cfg.moveonenospc.enabled == true)
{
SysLog::warning("`moveonenospc` will not function when `passthrough` is enabled");
}
@@ -292,18 +292,16 @@ _option_processor(void *data_,
int key_,
fuse_args *outargs_)
{
Config::ErrVec *errs = (Config::ErrVec*)data_;
OptParseState &state = *(OptParseState*)data_;
switch(key_)
{
case FUSE_OPT_KEY_OPT:
return ::_process_opt(cfg,errs,arg_);
return ::_process_opt(state.errs,arg_);
case FUSE_OPT_KEY_NONOPT:
if(cfg.branches->empty())
return ::_process_branches(cfg,errs,arg_);
else
return ::_process_mount(cfg,errs,arg_);
state.branches.push_back(arg_);
return 0;
case MERGERFS_OPT_HELP:
::_usage();
@@ -341,15 +339,14 @@ _option_processor(void *data_,
static
void
_check_for_mount_loop(Config &cfg_,
Config::ErrVec *errs_)
_check_for_mount_loop(Config::ErrVec *errs_)
{
fs::path mount;
std::vector<fs::path> branches;
std::error_code ec;
mount = *cfg_.mountpoint;
branches = cfg_.branches->to_paths();
mount = *cfg.mountpoint;
branches = cfg.branches->to_paths();
for(const auto &branch : branches)
{
if(std::filesystem::equivalent(branch,mount,ec))
@@ -365,25 +362,25 @@ _check_for_mount_loop(Config &cfg_,
static
void
_print_warnings(Config &cfg_)
_print_warnings()
{
if(cfg_.passthrough != Passthrough::ENUM::OFF)
if(cfg.passthrough != Passthrough::ENUM::OFF)
{
if(cfg_.cache_files == CacheFiles::ENUM::OFF)
if(cfg.cache_files == CacheFiles::ENUM::OFF)
{
SysLog::warning("'cache.files' can not be 'off' when using 'passthrough'."
" Setting 'cache.files=auto-full'");
cfg_.cache_files = CacheFiles::ENUM::AUTO_FULL;
cfg.cache_files = CacheFiles::ENUM::AUTO_FULL;
}
if(cfg_.writeback_cache == true)
if(cfg.writeback_cache == true)
{
SysLog::warning("'cache.writeback' can not be enabled when using 'passthrough'."
" Setting 'cache.writeback=false'");
cfg_.writeback_cache = false;
cfg.writeback_cache = false;
}
if(cfg_.moveonenospc.enabled == true)
if(cfg.moveonenospc.enabled == true)
{
SysLog::warning("`moveonenospc` will not function when `passthrough` is enabled");
}
@@ -392,10 +389,10 @@ _print_warnings(Config &cfg_)
static
void
_cleanup_options(Config &cfg_)
_cleanup_options()
{
if(!cfg_.symlinkify)
cfg_.symlinkify_timeout = -1;
if(!cfg.symlinkify)
cfg.symlinkify_timeout = -1;
}
namespace options
@@ -413,25 +410,49 @@ namespace options
FUSE_OPT_KEY("--version",MERGERFS_OPT_VERSION),
{NULL,-1U,0}
};
OptParseState state{.errs=errs_};
fuse_opt_parse(args_,
errs_,
&state,
opts,
::_option_processor);
if(state.branches.size() < 2)
errs_->push_back({0,"mountpoint not set"});
if(state.branches.size() < 1)
errs_->push_back({0,"branches not set"});
if(!errs_->empty())
return;
_process_mount(errs_,
state.branches.back().c_str());
state.branches.pop_back();
_process_branches(errs_,
str::join(state.branches,':').c_str());
if(cfg.branches->empty())
errs_->push_back({0,"branches not set"});
if(cfg.mountpoint->empty())
errs_->push_back({0,"mountpoint not set"});
::_check_for_mount_loop(errs_);
if(!errs_->empty())
return;
::_postprocess_passthrough(cfg);
::_check_for_mount_loop(cfg,errs_);
::_set_default_options(args_,cfg);
::_set_fsname(cfg,args_);
fuse_opt_add_arg(args_,
cfg.mountpoint.to_string().c_str());
::_postprocess_passthrough();
::_set_default_options(args_);
::_set_fsname(args_);
::_set_subtype(args_);
::_set_fuse_threads(cfg);
::_print_warnings(cfg);
::_cleanup_options(cfg);
::_set_fuse_threads();
::_print_warnings();
::_cleanup_options();
_set_option(fmt::format("passthrough-max-stack-depth={}",
cfg.passthrough_max_stack_depth.to_string()),
args_);
cfg.finish_initializing();
}
+6
View File
@@ -36,6 +36,12 @@ str::to(const int int_)
return fmt::format("{}",int_);
}
std::string
str::to(const uint32_t i_)
{
return fmt::format("{}",i_);
}
std::string
str::to(const uint64_t uint64_)
{
+1
View File
@@ -29,6 +29,7 @@ namespace str
{
std::string to(const bool);
std::string to(const int);
std::string to(const uint32_t);
std::string to(const uint64_t);
std::string to(const int64_t);
std::string to(const std::string&);