From 9fd4cd3def59037653e6c9f95f04ad84798716e0 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Thu, 14 Nov 2024 12:36:14 -0500 Subject: [PATCH] client: add helper for determining if a perm check is necessary To be used in subsequent commits. Signed-off-by: Patrick Donnelly Fixes: https://tracker.ceph.com/issues/66373 (cherry picked from commit 5f53a239a44deb60b81ab83b48e9ae3bc5b7e504) --- src/client/Client.cc | 6 +++++- src/client/Client.h | 14 +++++++++++++- src/client/fuse_ll.cc | 3 ++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index c6774006d8a61..691973b0c9d18 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -17344,7 +17344,8 @@ const char** Client::get_tracked_conf_keys() const "client_oc_max_objects", \ "client_oc_size", \ "client_oc_target_dirty", \ - "client_permissions" \ + "client_permissions", \ + "fuse_default_permissions" constexpr bool is_sorted = [] () constexpr { constexpr auto arr = std::to_array({KEYS}); @@ -17372,6 +17373,9 @@ void Client::handle_conf_change(const ConfigProxy& conf, if (changed.count("client_permissions")) { client_permissions = cct->_conf.get_val("client_permissions"); } + if (changed.count("fuse_default_permissions")) { + fuse_default_permissions = cct->_conf.get_val("fuse_default_permissions"); + } if (changed.count("client_cache_mid")) { lru.lru_set_midpoint(cct->_conf->client_cache_mid); } diff --git a/src/client/Client.h b/src/client/Client.h index 5b575b9c8a192..62dd3692bdbda 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -930,6 +930,13 @@ public: return std::make_pair(opened_inodes, inode_map.size()); } + void set_is_fuse() { + is_fuse = true; + } + bool get_fuse_default_permissions() const { + return fuse_default_permissions; + } + /* timer_lock for 'timer' */ ceph::mutex timer_lock = ceph::make_mutex("Client::timer_lock"); SafeTimer timer; @@ -942,7 +949,6 @@ public: std::unique_ptr logger; std::unique_ptr mdsmap; - bool fuse_default_permissions; bool _collect_and_send_global_metrics; protected: @@ -1813,6 +1819,10 @@ private: void update_io_stat_read(utime_t latency); void update_io_stat_write(utime_t latency); + bool should_check_perms() const { + return (is_fuse && !fuse_default_permissions) || (!is_fuse && client_permissions); + } + uint32_t deleg_timeout = 0; client_switch_interrupt_callback_t switch_interrupt_cb = nullptr; @@ -1940,7 +1950,9 @@ private: feature_bitset_t myfeatures; + bool is_fuse = false; bool client_permissions; + bool fuse_default_permissions; }; /** diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index 1b86af94965ea..ce09db61fd5e9 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -1293,7 +1293,7 @@ static void do_init(void *data, fuse_conn_info *conn) conn->want |= FUSE_CAP_SPLICE_MOVE; #if !defined(__APPLE__) - if (!client->fuse_default_permissions && client->ll_handle_umask()) { + if (!client->get_fuse_default_permissions() && client->ll_handle_umask()) { // apply umask in userspace if posix acl is enabled if(conn->capable & FUSE_CAP_DONT_MASK) conn->want |= FUSE_CAP_DONT_MASK; @@ -1781,6 +1781,7 @@ fuse_req_t CephFuse::Handle::get_fuse_req() CephFuse::CephFuse(Client *c, int fd) : _handle(new CephFuse::Handle(c, fd)) { + c->set_is_fuse(); } CephFuse::~CephFuse() -- 2.39.5