diff --git a/libfuse/include/fuse_common.h b/libfuse/include/fuse_common.h index 573f55d4..e631c056 100644 --- a/libfuse/include/fuse_common.h +++ b/libfuse/include/fuse_common.h @@ -133,6 +133,7 @@ struct fuse_file_info_t #define FUSE_CAP_PASSTHROUGH (1ULL << 25) #define FUSE_CAP_HANDLE_KILLPRIV (1ULL << 26) #define FUSE_CAP_HANDLE_KILLPRIV_V2 (1ULL << 27) +#define FUSE_CAP_ALLOW_IDMAP (1ULL << 28) /** * Ioctl flags diff --git a/libfuse/lib/fuse_lowlevel.cpp b/libfuse/lib/fuse_lowlevel.cpp index 6af3130c..a7a8fdca 100644 --- a/libfuse/lib/fuse_lowlevel.cpp +++ b/libfuse/lib/fuse_lowlevel.cpp @@ -1203,6 +1203,8 @@ do_init(fuse_req_t req, f->conn.capable |= FUSE_CAP_HANDLE_KILLPRIV; if(inargflags & FUSE_HANDLE_KILLPRIV_V2) f->conn.capable |= FUSE_CAP_HANDLE_KILLPRIV_V2; + if(inargflags & FUSE_ALLOW_IDMAP) + f->conn.capable |= FUSE_CAP_ALLOW_IDMAP; } else { @@ -1280,6 +1282,9 @@ do_init(fuse_req_t req, outargflags |= FUSE_HANDLE_KILLPRIV; if(f->conn.want & FUSE_CAP_HANDLE_KILLPRIV_V2) outargflags |= FUSE_HANDLE_KILLPRIV_V2; + if(f->conn.want & FUSE_CAP_ALLOW_IDMAP) + outargflags |= FUSE_ALLOW_IDMAP; + if(f->conn.want & FUSE_CAP_PASSTHROUGH) { outargflags |= FUSE_PASSTHROUGH; diff --git a/mkdocs/docs/config/kernel-permissions-check.md b/mkdocs/docs/config/kernel-permissions-check.md index 547c818a..c4fb253e 100644 --- a/mkdocs/docs/config/kernel-permissions-check.md +++ b/mkdocs/docs/config/kernel-permissions-check.md @@ -16,4 +16,4 @@ help. Like [export-support](export-support.md) this is mostly for debugging. This option is a kernel mount option so unable to be changed at -runtime. +runtime. It controls the `default_permissions` FUSE kernel option. diff --git a/mkdocs/docs/config/options.md b/mkdocs/docs/config/options.md index 8a282dad..5695e98e 100644 --- a/mkdocs/docs/config/options.md +++ b/mkdocs/docs/config/options.md @@ -86,6 +86,9 @@ config file. * **[export-support](export-support.md)=BOOL**: Sets a low-level FUSE feature intended to indicate the filesystem can support being exported via NFS. (default: true) +* **[kernel-permissions-check](kernel-permissions-check.md)=BOOL**: + Controls the FUSE `default_permissions` option. Primarily for + debugging. (default: true) * **security_capability=BOOL**: If false return ENOATTR when xattr security.capability is queried. (default: true) * **[xattr](xattr.md)=passthrough|noattr|nosys**: Runtime control of diff --git a/mkdocs/docs/faq/technical_behavior_and_limitations.md b/mkdocs/docs/faq/technical_behavior_and_limitations.md index 50dfc3a0..136aaa0d 100644 --- a/mkdocs/docs/faq/technical_behavior_and_limitations.md +++ b/mkdocs/docs/faq/technical_behavior_and_limitations.md @@ -201,3 +201,15 @@ contention and therefore lower performance than Linux. Additionally, mergerfs [utilizes a cache for supplemental groups](../known_issues_bugs.md#supplemental-user-groups) due the the high cost of querying that information. + + +## Does mergerfs support idmap? + +Yes. At least in so far as it's been enabled now the FUSE itself +allows a filesystem to indicate it is allowed. + +Requires that +[kernel-permissions-check](../config/kernel-permissions-check.md) be +enabled (the default.) + +If there are any usage issues contact the [author](../support.md). diff --git a/src/fuse_init.cpp b/src/fuse_init.cpp index 84d1c49b..d99d95ea 100644 --- a/src/fuse_init.cpp +++ b/src/fuse_init.cpp @@ -206,6 +206,7 @@ FUSE::init(fuse_conn_info *conn_) ::_want_if_capable(conn_,FUSE_CAP_POSIX_ACL,&cfg.posix_acl); ::_want_if_capable(conn_,FUSE_CAP_READDIR_PLUS,&cfg.readdirplus); ::_want_if_capable(conn_,FUSE_CAP_WRITEBACK_CACHE,&cfg.writeback_cache); + ::_want_if_capable(conn_,FUSE_CAP_ALLOW_IDMAP); // ::_want_if_capable(conn_,FUSE_CAP_READDIR_PLUS_AUTO); ::_want_if_capable_max_pages(conn_,cfg); conn_->want &= ~FUSE_CAP_POSIX_LOCKS; diff --git a/src/mergerfs.cpp b/src/mergerfs.cpp index 5cd44136..fbf4a32b 100644 --- a/src/mergerfs.cpp +++ b/src/mergerfs.cpp @@ -362,7 +362,7 @@ int _pick_app_and_run(int argc_, char **argv_) { - std::filesystem::path appname; + fs::path appname; appname = argv_[0]; appname = appname.filename(); diff --git a/src/policy.hpp b/src/policy.hpp index 7c7341ce..58707d53 100644 --- a/src/policy.hpp +++ b/src/policy.hpp @@ -64,9 +64,9 @@ namespace Policy } int - operator()(const Branches::Ptr &branches_, - const std::filesystem::path &fusepath_, - std::vector &output_) const + operator()(const Branches::Ptr &branches_, + const fs::path &fusepath_, + std::vector &output_) const { return (*impl)(branches_,fusepath_,output_); } @@ -92,7 +92,7 @@ namespace Policy std::string name; virtual bool path_preserving(void) const = 0; virtual int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const = 0; }; @@ -124,9 +124,9 @@ namespace Policy } int - operator()(const Branches::Ptr &branches_, - const std::filesystem::path &fusepath_, - std::vector &output_) const + operator()(const Branches::Ptr &branches_, + const fs::path &fusepath_, + std::vector &output_) const { return (*impl)(branches_,fusepath_,output_); } @@ -151,7 +151,7 @@ namespace Policy public: std::string name; virtual int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const = 0; }; @@ -178,7 +178,7 @@ namespace Policy int operator()(const Branches::Ptr &branches_, - const std::filesystem::path &fusepath_, + const fs::path &fusepath_, std::vector &output_) const { return (*impl)(branches_,fusepath_,output_); diff --git a/src/policy_all.hpp b/src/policy_all.hpp index 46e696f3..8cafc4a2 100644 --- a/src/policy_all.hpp +++ b/src/policy_all.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -46,7 +46,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving(void) const final { return false; } }; @@ -60,7 +60,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_epall.hpp b/src/policy_epall.hpp index 9e5eda10..96da8637 100644 --- a/src/policy_epall.hpp +++ b/src/policy_epall.hpp @@ -34,7 +34,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -48,7 +48,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving(void) const final { return true; } }; @@ -63,7 +63,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_epff.hpp b/src/policy_epff.hpp index c86652a2..385cee15 100644 --- a/src/policy_epff.hpp +++ b/src/policy_epff.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -46,7 +46,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving(void) const final { return true; } }; @@ -60,7 +60,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_eplfs.hpp b/src/policy_eplfs.hpp index 0ead02bf..f18a538c 100644 --- a/src/policy_eplfs.hpp +++ b/src/policy_eplfs.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -46,7 +46,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving(void) const final { return true; } }; @@ -60,7 +60,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_eplus.hpp b/src/policy_eplus.hpp index 410f60d3..a28eb4f2 100644 --- a/src/policy_eplus.hpp +++ b/src/policy_eplus.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -46,7 +46,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving(void) const final { return true; } }; @@ -60,7 +60,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_epmfs.hpp b/src/policy_epmfs.hpp index 8dc26908..85eb0537 100644 --- a/src/policy_epmfs.hpp +++ b/src/policy_epmfs.hpp @@ -34,7 +34,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -48,7 +48,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving(void) const final { return true; } }; @@ -63,7 +63,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_eppfrd.hpp b/src/policy_eppfrd.hpp index 0f431792..20a1f173 100644 --- a/src/policy_eppfrd.hpp +++ b/src/policy_eppfrd.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -46,7 +46,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving(void) const final { return true; } }; @@ -60,7 +60,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_eprand.hpp b/src/policy_eprand.hpp index aeb87a0d..9e8ea8a4 100644 --- a/src/policy_eprand.hpp +++ b/src/policy_eprand.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -46,7 +46,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving(void) const final { return true; } }; @@ -60,7 +60,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_erofs.hpp b/src/policy_erofs.hpp index d4e8d798..a0bdb1ed 100644 --- a/src/policy_erofs.hpp +++ b/src/policy_erofs.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -46,7 +46,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving(void) const final { return false; } }; @@ -60,7 +60,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_ff.hpp b/src/policy_ff.hpp index 5ddc622c..c28f75ef 100644 --- a/src/policy_ff.hpp +++ b/src/policy_ff.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -47,7 +47,7 @@ namespace Policy public: bool path_preserving(void) const final { return false; } int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -61,7 +61,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_lfs.hpp b/src/policy_lfs.hpp index 37d35856..370fde16 100644 --- a/src/policy_lfs.hpp +++ b/src/policy_lfs.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -46,7 +46,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving() const final { return false; } }; @@ -60,7 +60,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/policy_lus.hpp b/src/policy_lus.hpp index 23755790..a26f4b67 100644 --- a/src/policy_lus.hpp +++ b/src/policy_lus.hpp @@ -33,7 +33,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; @@ -46,7 +46,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; bool path_preserving() const final { return false; } }; @@ -60,7 +60,7 @@ namespace Policy public: int operator()(const Branches::Ptr&, - const std::filesystem::path&, + const fs::path&, std::vector&) const final; }; } diff --git a/src/to_string.cpp b/src/to_string.cpp index 241b89c8..94b3043e 100644 --- a/src/to_string.cpp +++ b/src/to_string.cpp @@ -55,7 +55,7 @@ str::to(const std::string &s_) } std::string -str::to(const std::filesystem::path &path_) +str::to(const fs::path &path_) { return path_.string(); } diff --git a/src/to_string.hpp b/src/to_string.hpp index 8a7b55af..18561bef 100644 --- a/src/to_string.hpp +++ b/src/to_string.hpp @@ -18,6 +18,8 @@ #pragma once +#include "fs_path.hpp" + #include #include #include @@ -30,5 +32,5 @@ namespace str std::string to(const uint64_t); std::string to(const int64_t); std::string to(const std::string&); - std::string to(const std::filesystem::path&); + std::string to(const fs::path&); }