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));
+}