Browse Source

Fix setting of ugids for concurrent readdir

pull/1231/head
Antonio SJ Musumeci 1 year ago
parent
commit
e586d2fd1e
  1. 25
      src/fuse_readdir_cor.cpp
  2. 25
      src/fuse_readdir_cosr.cpp
  3. 4
      src/fuse_readdir_seq.cpp

25
src/fuse_readdir_cor.cpp

@ -120,7 +120,9 @@ namespace l
concurrent_readdir(ThreadPool &tp_, concurrent_readdir(ThreadPool &tp_,
const Branches::CPtr &branches_, const Branches::CPtr &branches_,
const char *dirname_, const char *dirname_,
fuse_dirents_t *buf_)
fuse_dirents_t *buf_,
uid_t const uid_,
gid_t const gid_)
{ {
HashSet names; HashSet names;
std::mutex names_mutex; std::mutex names_mutex;
@ -130,9 +132,12 @@ namespace l
for(auto const &branch : *branches_) for(auto const &branch : *branches_)
{ {
auto func = [&]()
auto func = [&,dirname_,buf_,uid_,gid_]()
{ {
std::string basepath = fs::path::make(branch.path,dirname_);
std::string basepath;
ugid::Set const ugid(uid_,gid_);
basepath = fs::path::make(branch.path,dirname_);
return l::readdir(basepath,names,names_mutex,buf_,dirents_mutex); return l::readdir(basepath,names,names_mutex,buf_,dirents_mutex);
}; };
@ -169,13 +174,15 @@ namespace l
readdir(ThreadPool &tp_, readdir(ThreadPool &tp_,
const Branches::CPtr &branches_, const Branches::CPtr &branches_,
const char *dirname_, const char *dirname_,
fuse_dirents_t *buf_)
fuse_dirents_t *buf_,
uid_t const uid_,
gid_t const gid_)
{ {
std::vector<int> rvs; std::vector<int> rvs;
fuse_dirents_reset(buf_); fuse_dirents_reset(buf_);
rvs = l::concurrent_readdir(tp_,branches_,dirname_,buf_);
rvs = l::concurrent_readdir(tp_,branches_,dirname_,buf_,uid_,gid_);
return l::calc_rv(rvs); return l::calc_rv(rvs);
} }
@ -188,7 +195,11 @@ FUSE::ReadDirCOR::operator()(fuse_file_info_t const *ffi_,
Config::Read cfg; Config::Read cfg;
DirInfo *di = reinterpret_cast<DirInfo*>(ffi_->fh); DirInfo *di = reinterpret_cast<DirInfo*>(ffi_->fh);
const fuse_context *fc = fuse_get_context(); const fuse_context *fc = fuse_get_context();
const ugid::Set ugid(fc->uid,fc->gid);
return l::readdir(_tp,cfg->branches,di->fusepath.c_str(),buf_);
return l::readdir(_tp,
cfg->branches,
di->fusepath.c_str(),
buf_,
fc->uid,
fc->gid);
} }

25
src/fuse_readdir_cosr.cpp

@ -65,15 +65,20 @@ namespace l
std::vector<std::future<DIR*>> std::vector<std::future<DIR*>>
opendir(ThreadPool &tp_, opendir(ThreadPool &tp_,
const Branches::CPtr &branches_, const Branches::CPtr &branches_,
char const *dirname_)
char const *dirname_,
uid_t const uid_,
gid_t const gid_)
{ {
std::vector<std::future<DIR*>> futures; std::vector<std::future<DIR*>> futures;
for(auto const &branch : *branches_) for(auto const &branch : *branches_)
{ {
auto func = [&branch,dirname_]()
auto func = [&branch,dirname_,uid_,gid_]()
{ {
std::string basepath = fs::path::make(branch.path,dirname_);
std::string basepath;
ugid::Set const ugid(uid_,gid_);
basepath = fs::path::make(branch.path,dirname_);
return fs::opendir(basepath); return fs::opendir(basepath);
}; };
@ -146,14 +151,16 @@ namespace l
readdir(ThreadPool &tp_, readdir(ThreadPool &tp_,
const Branches::CPtr &branches_, const Branches::CPtr &branches_,
const char *dirname_, const char *dirname_,
fuse_dirents_t *buf_)
fuse_dirents_t *buf_,
uid_t const uid_,
gid_t const gid_)
{ {
int rv; int rv;
std::vector<std::future<DIR*>> dh_futures; std::vector<std::future<DIR*>> dh_futures;
fuse_dirents_reset(buf_); fuse_dirents_reset(buf_);
dh_futures = l::opendir(tp_,branches_,dirname_);
dh_futures = l::opendir(tp_,branches_,dirname_,uid_,gid_);
rv = l::readdir(dh_futures,dirname_,buf_); rv = l::readdir(dh_futures,dirname_,buf_);
return rv; return rv;
@ -167,7 +174,11 @@ FUSE::ReadDirCOSR::operator()(fuse_file_info_t const *ffi_,
Config::Read cfg; Config::Read cfg;
DirInfo *di = reinterpret_cast<DirInfo*>(ffi_->fh); DirInfo *di = reinterpret_cast<DirInfo*>(ffi_->fh);
const fuse_context *fc = fuse_get_context(); const fuse_context *fc = fuse_get_context();
const ugid::Set ugid(fc->uid,fc->gid);
return l::readdir(_tp,cfg->branches,di->fusepath.c_str(),buf_);
return l::readdir(_tp,
cfg->branches,
di->fusepath.c_str(),
buf_,
fc->uid,
fc->gid);
} }

4
src/fuse_readdir_seq.cpp

@ -119,5 +119,7 @@ FUSE::ReadDirSeq::operator()(fuse_file_info_t const *ffi_,
const fuse_context *fc = fuse_get_context(); const fuse_context *fc = fuse_get_context();
const ugid::Set ugid(fc->uid,fc->gid); const ugid::Set ugid(fc->uid,fc->gid);
return l::readdir(cfg->branches,di->fusepath.c_str(),buf_);
return l::readdir(cfg->branches,
di->fusepath.c_str(),
buf_);
} }
Loading…
Cancel
Save