idmap mount support (#1523)

* Add idmap mount support

* Further replacement of std::filesystem::path to fs::path

* Update docs regarding idmap support
This commit is contained in:
trapexit
2025-09-18 00:07:28 -05:00
committed by GitHub
parent 8c649d33ee
commit ca59ae53a5
22 changed files with 73 additions and 49 deletions
+1
View File
@@ -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
+5
View File
@@ -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;
@@ -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.
+3
View File
@@ -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
@@ -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).
+1
View File
@@ -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;
+1 -1
View File
@@ -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();
+9 -9
View File
@@ -64,9 +64,9 @@ namespace Policy
}
int
operator()(const Branches::Ptr &branches_,
const std::filesystem::path &fusepath_,
std::vector<Branch*> &output_) const
operator()(const Branches::Ptr &branches_,
const fs::path &fusepath_,
std::vector<Branch*> &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<Branch*>&) const = 0;
};
@@ -124,9 +124,9 @@ namespace Policy
}
int
operator()(const Branches::Ptr &branches_,
const std::filesystem::path &fusepath_,
std::vector<Branch*> &output_) const
operator()(const Branches::Ptr &branches_,
const fs::path &fusepath_,
std::vector<Branch*> &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<Branch*>&) 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<Branch*> &output_) const
{
return (*impl)(branches_,fusepath_,output_);
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -46,7 +46,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -34,7 +34,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -48,7 +48,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -46,7 +46,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -46,7 +46,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -46,7 +46,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -34,7 +34,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -48,7 +48,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -46,7 +46,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -46,7 +46,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -46,7 +46,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
@@ -61,7 +61,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
}
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -46,7 +46,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+3 -3
View File
@@ -33,7 +33,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) const final;
};
@@ -46,7 +46,7 @@ namespace Policy
public:
int operator()(const Branches::Ptr&,
const std::filesystem::path&,
const fs::path&,
std::vector<Branch*>&) 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<Branch*>&) const final;
};
}
+1 -1
View File
@@ -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();
}
+3 -1
View File
@@ -18,6 +18,8 @@
#pragma once
#include "fs_path.hpp"
#include <cstdint>
#include <filesystem>
#include <string>
@@ -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&);
}