From eed7b22eebcc21b974b7f092cd4a3ce06eb3c972 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 1f277afdd3d..0f88cded8d4 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -10609,12 +10609,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}); @@ -10925,11 +10919,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; @@ -15776,11 +15765,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 c0da9ccc758..dea5183b849 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