From f25fd90619a065b6ea728f3f64b69c4530ceb910 Mon Sep 17 00:00:00 2001 From: Dhairya Parmar Date: Wed, 6 Dec 2023 16:08:05 +0530 Subject: [PATCH 1/2] src/test: test sync call providing nullptr as ctx to async api Fixes: https://tracker.ceph.com/issues/63633 Signed-off-by: Dhairya Parmar --- src/test/client/nonblocking.cc | 59 ++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/test/client/nonblocking.cc b/src/test/client/nonblocking.cc index d5d5e7a5626..787e022d492 100644 --- a/src/test/client/nonblocking.cc +++ b/src/test/client/nonblocking.cc @@ -149,3 +149,62 @@ TEST_F(TestClient, LlreadvLlwritev) { ASSERT_EQ(0, client->ll_unlink(root, filename, myperm)); } +TEST_F(TestClient, LlreadvLlwritevNullContext) { + /* Test that if Client::ll_preadv_pwritev is called with nullptr context + then it performs a sync call. */ + + int mypid = getpid(); + char filename[256]; + + client->unmount(); + TearDown(); + SetUp(); + + sprintf(filename, "test_llreadvllwritevnullcontextfile%u", mypid); + + Inode *root, *file; + root = client->get_root(); + ASSERT_NE(root, (Inode *)NULL); + + Fh *fh; + struct ceph_statx stx; + + ASSERT_EQ(0, client->ll_createx(root, filename, 0666, + O_RDWR | O_CREAT | O_TRUNC, + &file, &fh, &stx, 0, 0, myperm)); + + char out0[] = "hello "; + char out1[] = "world\n"; + struct iovec iov_out[2] = { + {out0, sizeof(out0)}, + {out1, sizeof(out1)} + }; + + char in0[sizeof(out0)]; + char in1[sizeof(out1)]; + struct iovec iov_in[2] = { + {in0, sizeof(in0)}, + {in1, sizeof(in1)} + }; + + ssize_t bytes_to_write = iov_out[0].iov_len + iov_out[1].iov_len; + + int64_t rc; + bufferlist bl; + rc = client->ll_preadv_pwritev(fh, iov_out, 2, 0, true, nullptr, nullptr); + ASSERT_EQ(rc, bytes_to_write); + + rc = client->ll_preadv_pwritev(fh, iov_in, 2, 0, false, nullptr, &bl); + ASSERT_EQ(rc, bytes_to_write); + + copy_bufferlist_to_iovec(iov_in, 2, &bl, rc); + ASSERT_EQ(0, strncmp((const char*)iov_in[0].iov_base, + (const char*)iov_out[0].iov_base, + iov_out[0].iov_len)); + ASSERT_EQ(0, strncmp((const char*)iov_in[1].iov_base, + (const char*)iov_out[1].iov_base, + iov_out[1].iov_len)); + + client->ll_release(fh); + ASSERT_EQ(0, client->ll_unlink(root, filename, myperm)); +} From f78549da806e12474d04c446d2b3628f7136b9f9 Mon Sep 17 00:00:00 2001 From: Dhairya Parmar Date: Thu, 7 Dec 2023 18:38:35 +0530 Subject: [PATCH 2/2] client: fix copying bufferlist to iovec structures in Client::_read Fixes: https://tracker.ceph.com/issues/63633 Signed-off-by: Dhairya Parmar --- src/client/Client.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 195738efc87..8966bf60adb 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -11269,7 +11269,7 @@ int64_t Client::_preadv_pwritev_locked(Fh *fh, const struct iovec *iov, } client_lock.unlock(); - copy_bufferlist_to_iovec(iov, iovcnt, &bl, r); + copy_bufferlist_to_iovec(iov, iovcnt, blp ? blp : &bl, r); client_lock.lock(); return r; }