From dee913c1e6bad7fd0777c356b6f591aa0d05f6c0 Mon Sep 17 00:00:00 2001 From: Christopher Hoffman Date: Tue, 12 Aug 2025 13:14:57 +0000 Subject: [PATCH] client: During fscrypt write skip unneeded reads During an fscrypt write a read may be needed to ensure changed portion of file is merged with an existing data block. No need to read unnecessarily when writes line up to fscrypt block and span a whole block or more. Signed-off-by: Christopher Hoffman --- src/client/Client.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index b7f68033e9c72..c75e097cd7e95 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -12296,14 +12296,14 @@ int Client::WriteEncMgr::read_modify_write(Context *_iofinish) end_block_ofs = fscrypt_block_start(endoff - 1); ofs_in_end_block = fscrypt_ofs_in_block(endoff - 1); - need_read_start = ofs_in_start_block >= 0; + need_read_start = ofs_in_start_block > 0 || (ofs_in_start_block == 0 && ((endoff - offset) < FSCRYPT_BLOCK_SIZE)); need_read_end = (endoff <= in->effective_size() && ofs_in_end_block < FSCRYPT_BLOCK_SIZE && start_block != end_block); read_start_size = FSCRYPT_BLOCK_SIZE; bool need_read = need_read_start | need_read_end; - if (read_start_size > 0) { + if (need_read_start) { finish_read_start_ctx.reset(new iofinish_method_ctx(*this, &WriteEncMgr::finish_read_start_cb, &aioc)); r = read(start_block_ofs, read_start_size, &startbl, finish_read_start_ctx.get()); -- 2.39.5