From 4c8f944ccf1136bdbd356f0db451f33895e743df Mon Sep 17 00:00:00 2001 From: Christopher Hoffman Date: Thu, 17 Jul 2025 19:40:59 +0000 Subject: [PATCH] client: During fscrypt rmw (write) use correct read type During fscrypt rmw use internal Client::_read to utilize correct buffered or non buffered reads based on client wide options. For example, if client_oc = false, use only non-buffered reads in rmw. Fixes: https://tracker.ceph.com/issues/72143 Signed-off-by: Christopher Hoffman --- src/client/Client.cc | 14 +++++++------- src/client/Client.h | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index a60a912fd1f4f..92b33cbd90d24 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -11435,7 +11435,7 @@ error: } int64_t Client::_read(Fh *f, int64_t offset, uint64_t size, bufferlist *bl, - Context *onfinish) + Context *onfinish, bool read_for_write) { ceph_assert(ceph_mutex_is_locked_by_me(client_lock)); @@ -11452,7 +11452,7 @@ int64_t Client::_read(Fh *f, int64_t offset, uint64_t size, bufferlist *bl, ldout(cct, 10) << __func__ << " " << *in << " " << offset << "~" << size << dendl; - if ((f->mode & CEPH_FILE_MODE_RD) == 0) + if ((f->mode & CEPH_FILE_MODE_RD) == 0 && !read_for_write) return -EBADF; //bool lazy = f->mode == CEPH_FILE_MODE_LAZY; @@ -12256,10 +12256,10 @@ int Client::WriteEncMgr::init() return 0; } -int Client::WriteEncMgr::read_async(uint64_t off, uint64_t len, bufferlist *bl, +int Client::WriteEncMgr::read(uint64_t off, uint64_t len, bufferlist *bl, iofinish_method_ctx *ioctx) { - ldout(cct, 10) << __func__ << dendl; + ldout(cct, 20) << __func__ << dendl; get(); if (off >= in->size) { @@ -12267,7 +12267,7 @@ int Client::WriteEncMgr::read_async(uint64_t off, uint64_t len, bufferlist *bl, return 0; } - int r = clnt->_read_async(f, off, len, bl, ioctx->ctx()); + int r = clnt->_read(f, off, len, bl, ioctx->ctx(), true); if (r < 0) { ioctx->cancel(r); put(); @@ -12313,7 +12313,7 @@ int Client::WriteEncMgr::read_modify_write(Context *_iofinish) if (read_start_size > 0) { finish_read_start_ctx.reset(new iofinish_method_ctx(*this, &WriteEncMgr::finish_read_start_cb, &aioc)); - r = read_async(start_block_ofs, read_start_size, &startbl, finish_read_start_ctx.get()); + r = read(start_block_ofs, read_start_size, &startbl, finish_read_start_ctx.get()); if (r < 0) { finish_read_start_ctx.reset(); @@ -12325,7 +12325,7 @@ int Client::WriteEncMgr::read_modify_write(Context *_iofinish) if (need_read_end) { finish_read_end_ctx.reset(new iofinish_method_ctx(*this, &WriteEncMgr::finish_read_end_cb, &aioc)); - r = read_async(end_block_ofs, FSCRYPT_BLOCK_SIZE, &endbl, finish_read_end_ctx.get()); + r = read(end_block_ofs, FSCRYPT_BLOCK_SIZE, &endbl, finish_read_end_ctx.get()); if (r < 0) { finish_read_end_ctx.reset(); diff --git a/src/client/Client.h b/src/client/Client.h index 3cee9219d789d..bb06f81349672 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -1758,7 +1758,7 @@ private: return is_finished; } - int read_async(uint64_t off, uint64_t len, bufferlist *bl, iofinish_method_ctx *ioctx); + int read(uint64_t off, uint64_t len, bufferlist *bl, iofinish_method_ctx *ioctx); protected: virtual int do_write() = 0; @@ -2116,7 +2116,7 @@ private: loff_t _lseek(Fh *fh, loff_t offset, int whence); int64_t _read(Fh *fh, int64_t offset, uint64_t size, bufferlist *bl, - Context *onfinish = nullptr); + Context *onfinish = nullptr, bool read_for_write = false); void do_readahead(Fh *f, Inode *in, uint64_t off, uint64_t len); int64_t _write_success(Fh *fh, utime_t start, uint64_t fpos, int64_t request_offset, uint64_t request_size, -- 2.39.5