mirror of
https://github.com/trapexit/mergerfs.git
synced 2026-10-20 00:17:43 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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&);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user