From: Christopher Hoffman Date: Thu, 17 Jul 2025 19:40:59 +0000 (+0000) Subject: client: During fscrypt rmw (write) use correct read type X-Git-Tag: testing/wip-pdonnell-testing-20260323.122957-tentacle~726 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f54fb6963dc4f763b7e71d55edbd1a8df6be8630;p=ceph-ci.git 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 Resolves: rhbz#2379330 (cherry picked from commit 033d6b844f944f1e5b78486b05b0d229024805a4) --- diff --git a/src/client/Client.cc b/src/client/Client.cc index b35f3152ad5..26e7ac14b15 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -11327,7 +11327,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)); @@ -11344,7 +11344,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; @@ -12123,10 +12123,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) { @@ -12134,7 +12134,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(); @@ -12180,7 +12180,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(); @@ -12192,7 +12192,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 9296c58043c..37cf40e01a0 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -1709,7 +1709,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; @@ -2066,7 +2066,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,