]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: During fscrypt write, ensure we get Fr cap
authorChristopher Hoffman <choffman@redhat.com>
Mon, 3 Feb 2025 19:13:31 +0000 (19:13 +0000)
committerChristopher Hoffman <choffman@redhat.com>
Wed, 5 Nov 2025 13:59:34 +0000 (13:59 +0000)
During fscrypt write will require Fr cap. It's best to ensure
this requirement is handled at the cap level instead of at the mode
level. Otherwise, O_WRONLY flag won't be enforced.

Signed-off-by: Christopher Hoffman <choffman@redhat.com>
src/client/Client.cc
src/client/Inode.cc

index 08d09ec5e504b257160d9a7891e263c2484a209e..ee3277da04cee4c653d74ec20ade970ef9bf9f47 100644 (file)
@@ -10671,12 +10671,6 @@ int Client::create_and_open(int dirfd, const char *relpath, int flags,
     return r;
   }
 
-  if (dirinode->is_fscrypt_enabled()) {
-    if (mask & CEPH_FILE_MODE_WR) {
-      mask |= CEPH_FILE_MODE_RD;
-    }
-  }
-
   walk_dentry_result wdr;
   bool require_target = !(flags & O_CREAT);
   r = path_walk(dirinode, path, &wdr, perms, {.followsym = followsym, .mask = (unsigned)mask, .require_target = require_target});
@@ -10987,11 +10981,6 @@ int Client::_open(const InodeRef& in, int flags, mode_t mode, Fh **fhp,
 
   int cmode = ceph_flags_to_mode(cflags);
 
-  if (in->fscrypt_ctx &&
-      cmode & CEPH_FILE_MODE_WR) {
-    cmode |= CEPH_FILE_MODE_RD;
-  }
-
   int want = ceph_caps_for_mode(cmode);
   int result = 0;
 
@@ -15894,11 +15883,6 @@ int Client::_create(const walk_dentry_result& wdr, int flags, mode_t mode,
 
   int cmode = ceph_flags_to_mode(cflags);
 
-  if (dir->fscrypt_ctx &&
-      cmode & CEPH_FILE_MODE_WR) {
-    cmode |= CEPH_FILE_MODE_RD;
-  }
-
   int64_t pool_id = -1;
   if (data_pool && *data_pool) {
     pool_id = objecter->with_osdmap(
index 0d3aeebeb1d6424dbfe5203ed7f5467e4b53bec2..66baf41a4fabbf185c7bdd778b228cf1bf3810d0 100644 (file)
@@ -345,8 +345,14 @@ int Inode::caps_file_wanted()
 {
   int want = 0;
   for (const auto &[mode, cnt] : open_by_mode)
-    if (cnt)
+    if (cnt) {
       want |= ceph_caps_for_mode(mode);
+
+      //want Fr cap during fscrypt rmw
+      if ((mode == CEPH_FILE_MODE_WR) && fscrypt_ctx) {
+        want |= CEPH_CAP_FILE_RD;
+      }
+    }
   return want;
 }