]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: During fscrypt rmw (write) use correct read type
authorChristopher Hoffman <choffman@redhat.com>
Thu, 17 Jul 2025 19:40:59 +0000 (19:40 +0000)
committerChristopher Hoffman <choffman@redhat.com>
Wed, 5 Nov 2025 13:59:35 +0000 (13:59 +0000)
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 <choffman@redhat.com>
src/client/Client.cc
src/client/Client.h

index a60a912fd1f4fc9286c806bdc510689a41b65b4e..92b33cbd90d2475c4d9e2f1004deee70e5565c4d 100644 (file)
@@ -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<WriteEncMgr> *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<WriteEncMgr>(*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<WriteEncMgr>(*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();
 
index 3cee9219d789d5778b41273d49da828f395cd099..bb06f8134967221f87f1f2ca70448dbd0e5347f9 100644 (file)
@@ -1758,7 +1758,7 @@ private:
       return is_finished;
     }
 
-    int read_async(uint64_t off, uint64_t len, bufferlist *bl, iofinish_method_ctx<WriteEncMgr> *ioctx);
+    int read(uint64_t off, uint64_t len, bufferlist *bl, iofinish_method_ctx<WriteEncMgr> *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,