Browse Source

idmap mount support (#1523)

* Add idmap mount support

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

* Update docs regarding idmap support
pull/1524/head
trapexit 2 weeks ago
committed by GitHub
parent
commit
ca59ae53a5
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      libfuse/include/fuse_common.h
  2. 5
      libfuse/lib/fuse_lowlevel.cpp
  3. 2
      mkdocs/docs/config/kernel-permissions-check.md
  4. 3
      mkdocs/docs/config/options.md
  5. 12
      mkdocs/docs/faq/technical_behavior_and_limitations.md
  6. 1
      src/fuse_init.cpp
  7. 2
      src/mergerfs.cpp
  8. 18
      src/policy.hpp
  9. 6
      src/policy_all.hpp
  10. 6
      src/policy_epall.hpp
  11. 6
      src/policy_epff.hpp
  12. 6
      src/policy_eplfs.hpp
  13. 6
      src/policy_eplus.hpp
  14. 6
      src/policy_epmfs.hpp
  15. 6
      src/policy_eppfrd.hpp
  16. 6
      src/policy_eprand.hpp
  17. 6
      src/policy_erofs.hpp
  18. 6
      src/policy_ff.hpp
  19. 6
      src/policy_lfs.hpp
  20. 6
      src/policy_lus.hpp
  21. 2
      src/to_string.cpp
  22. 4
      src/to_string.hpp

1
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

5
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;

2
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.

3
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

12
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).

1
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;

2
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();

18
src/policy.hpp

@ -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_);

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

6
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<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;
};
}

2
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();
}

4
src/to_string.hpp

@ -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&);
}
Loading…
Cancel
Save