]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: add helper for determining if a perm check is necessary
authorPatrick Donnelly <pdonnell@ibm.com>
Thu, 14 Nov 2024 17:36:14 +0000 (12:36 -0500)
committerPatrick Donnelly <pdonnell@ibm.com>
Mon, 17 Mar 2025 19:43:16 +0000 (15:43 -0400)
To be used in subsequent commits.

Signed-off-by: Patrick Donnelly <pdonnell@ibm.com>
Fixes: https://tracker.ceph.com/issues/66373
(cherry picked from commit 5f53a239a44deb60b81ab83b48e9ae3bc5b7e504)

src/client/Client.cc
src/client/Client.h
src/client/fuse_ll.cc

index c6774006d8a61e3f9eb7d994c9a843aa58092189..691973b0c9d18dedc809fc96ca8a317e2ceb2657 100644 (file)
@@ -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<std::string_view>({KEYS});
@@ -17372,6 +17373,9 @@ void Client::handle_conf_change(const ConfigProxy& conf,
   if (changed.count("client_permissions")) {
     client_permissions = cct->_conf.get_val<bool>("client_permissions");
   }
+  if (changed.count("fuse_default_permissions")) {
+    fuse_default_permissions = cct->_conf.get_val<bool>("fuse_default_permissions");
+  }
   if (changed.count("client_cache_mid")) {
     lru.lru_set_midpoint(cct->_conf->client_cache_mid);
   }
index 5b575b9c8a1928895cab6a619287a819b2380de6..62dd3692bdbda9bed81ec9825d27f43995e5e9d3 100644 (file)
@@ -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<PerfCounters> logger;
   std::unique_ptr<MDSMap> 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;
 };
 
 /**
index 1b86af94965ea780284264aa29adfe8e669d8583..ce09db61fd5e9f63897d2c205488a6f698f55ad3 100644 (file)
@@ -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()