From ccdbc482760eafd02c67b6fe5745f15105064ef2 Mon Sep 17 00:00:00 2001 From: Christopher Hoffman Date: Mon, 3 Feb 2025 19:13:31 +0000 Subject: [PATCH] client: During fscrypt write, ensure we get Fr cap 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 --- src/client/Client.cc | 16 ---------------- src/client/Inode.cc | 8 +++++++- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 08d09ec5e50..ee3277da04c 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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( diff --git a/src/client/Inode.cc b/src/client/Inode.cc index 0d3aeebeb1d..66baf41a4fa 100644 --- a/src/client/Inode.cc +++ b/src/client/Inode.cc @@ -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; } -- 2.39.5