fix: remove access() implementation from FUSE driver (see gh #244)

This commit is contained in:
Marcus Holland-Moritz 2024-12-18 17:15:19 +01:00
parent f3afc72ea0
commit a340410365
2 changed files with 5 additions and 77 deletions

View File

@ -740,25 +740,6 @@ bool check_readonly(fs::path const& p, bool readonly) {
return false;
}
#ifndef _WIN32
{
auto r = ::access(p.string().c_str(), W_OK);
if (readonly) {
if (r != -1 || errno != EACCES) {
std::cerr << "access(" << p << ", W_OK) = " << r << " (errno=" << errno
<< ") [readonly]\n";
return false;
}
} else {
if (r != 0) {
std::cerr << "access(" << p << ", W_OK) = " << r << "\n";
return false;
}
}
}
#endif
return true;
}
@ -1309,19 +1290,19 @@ TEST_P(tools_test, mutating_and_error_ops) {
{
std::error_code ec;
EXPECT_FALSE(fs::remove(file, ec)) << runner.cmdline();
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
}
{
std::error_code ec;
EXPECT_FALSE(fs::remove(empty_dir, ec)) << runner.cmdline();
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
}
{
std::error_code ec;
EXPECT_FALSE(fs::remove(non_empty_dir, ec)) << runner.cmdline();
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
}
{
@ -1329,7 +1310,7 @@ TEST_P(tools_test, mutating_and_error_ops) {
EXPECT_EQ(static_cast<std::uintmax_t>(-1),
fs::remove_all(non_empty_dir, ec))
<< runner.cmdline();
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
}
// rename
@ -1405,7 +1386,7 @@ TEST_P(tools_test, mutating_and_error_ops) {
{
std::error_code ec;
fs::resize_file(file, 1, ec);
EXPECT_EC_UNIX_WIN(ec, ENOSYS, ERROR_ACCESS_DENIED);
EXPECT_EC_UNIX_MAC_WIN(ec, ENOSYS, EACCES, ERROR_ACCESS_DENIED);
}
// create directory

View File

@ -224,7 +224,6 @@ struct dwarfs_userdata {
PERFMON_EXT_TIMER_DECL(op_init)
PERFMON_EXT_TIMER_DECL(op_lookup)
PERFMON_EXT_TIMER_DECL(op_getattr)
PERFMON_EXT_TIMER_DECL(op_access)
PERFMON_EXT_TIMER_DECL(op_readlink)
PERFMON_EXT_TIMER_DECL(op_open)
PERFMON_EXT_TIMER_DECL(op_read)
@ -499,55 +498,6 @@ int op_getattr(char const* path, native_stat* st, struct fuse_file_info*) {
}
#endif
template <typename LogProxy, typename Find>
int op_access_common(LogProxy& log_, dwarfs_userdata& userdata, int mode,
file_stat::uid_type uid, file_stat::gid_type gid,
Find const& find) {
return checked_call(log_, [&] {
if (auto iv = find()) {
std::error_code ec;
userdata.fs.access(*iv, mode, uid, gid, ec);
return ec.value();
}
return ENOENT;
});
}
#if DWARFS_FUSE_LOWLEVEL
template <typename LoggerPolicy>
void op_access(fuse_req_t req, fuse_ino_t ino, int mode) {
dUSERDATA;
PERFMON_EXT_SCOPED_SECTION(userdata, op_access)
LOG_PROXY(LoggerPolicy, userdata.lgr);
LOG_DEBUG << __func__ << "(" << ino << ")" << get_caller_context(req);
PERFMON_SET_CONTEXT(ino)
auto ctx = fuse_req_ctx(req);
int err =
op_access_common(log_, userdata, mode, ctx->uid, ctx->gid,
[&userdata, ino] { return userdata.fs.find(ino); });
fuse_reply_err(req, err);
}
#else
template <typename LoggerPolicy>
int op_access(char const* path, int mode) {
dUSERDATA;
PERFMON_EXT_SCOPED_SECTION(userdata, op_access)
LOG_PROXY(LoggerPolicy, userdata.lgr);
LOG_DEBUG << __func__ << "(" << path << ")" << get_caller_context();
auto ctx = fuse_get_context();
return -op_access_common(log_, userdata, mode, ctx->uid, ctx->gid, [&] {
return find_inode(PERFMON_SECTION_ARG_ userdata.fs, path);
});
}
#endif
template <typename LogProxy, typename Find>
int op_readlink_common(LogProxy& log_, dwarfs_userdata& userdata,
std::string* str, Find const& find) {
@ -1304,7 +1254,6 @@ void init_fuse_ops(struct fuse_lowlevel_ops& ops,
ops.init = &op_init<LoggerPolicy>;
ops.lookup = &op_lookup<LoggerPolicy>;
ops.getattr = &op_getattr<LoggerPolicy>;
ops.access = &op_access<LoggerPolicy>;
if (userdata.fs.has_symlinks()) {
ops.readlink = &op_readlink<LoggerPolicy>;
}
@ -1321,7 +1270,6 @@ void init_fuse_ops(struct fuse_operations& ops,
dwarfs_userdata const& userdata) {
ops.init = &op_init<LoggerPolicy>;
ops.getattr = &op_getattr<LoggerPolicy>;
ops.access = &op_access<LoggerPolicy>;
if (userdata.fs.has_symlinks()) {
ops.readlink = &op_readlink<LoggerPolicy>;
}
@ -1502,7 +1450,6 @@ void load_filesystem(dwarfs_userdata& userdata) {
PERFMON_EXT_TIMER_SETUP(userdata, op_init)
PERFMON_EXT_TIMER_SETUP(userdata, op_lookup, "inode")
PERFMON_EXT_TIMER_SETUP(userdata, op_getattr, "inode")
PERFMON_EXT_TIMER_SETUP(userdata, op_access, "inode")
PERFMON_EXT_TIMER_SETUP(userdata, op_readlink, "inode")
PERFMON_EXT_TIMER_SETUP(userdata, op_open, "inode")
PERFMON_EXT_TIMER_SETUP(userdata, op_read, "inode", "size")