ioc->pending_aios.push_back(aio_t(ioc, choose_fd(false, write_hint)));
++ioc->num_pending;
auto& aio = ioc->pending_aios.back();
- aio.pread(off, len);
+ bufferptr p = buffer::create_small_page_aligned(len);
+ aio.bl.append(std::move(p));
+ aio.bl.prepare_iov(&aio.iov);
+ aio.preadv(off, len);
++injecting_crash;
} else {
if (bl.length() <= RW_IO_MAX) {
ioc->pending_aios.push_back(aio_t(ioc, fd_directs[WRITE_LIFE_NOT_SET]));
++ioc->num_pending;
aio_t& aio = ioc->pending_aios.back();
- aio.pread(off, len);
+ bufferptr p = buffer::create_small_page_aligned(len);
+ aio.bl.append(std::move(p));
+ aio.bl.prepare_iov(&aio.iov);
+ aio.preadv(off, len);
dout(30) << aio << dendl;
pbl->append(aio.bl);
dout(5) << __func__ << " 0x" << std::hex << off << "~" << len
}
#endif
}
- void pread(uint64_t _offset, uint64_t len) {
+
+ void preadv(uint64_t _offset, uint64_t len) {
offset = _offset;
length = len;
- bufferptr p = buffer::create_small_page_aligned(length);
#if defined(HAVE_LIBAIO)
- io_prep_pread(&iocb, fd, p.c_str(), length, offset);
+ io_prep_preadv(&iocb, fd, &iov[0], iov.size(), offset);
#elif defined(HAVE_POSIXAIO)
- n_aiocb = 1;
- aio.aiocb.aio_fildes = fd;
- aio.aiocb.aio_buf = p.c_str();
- aio.aiocb.aio_nbytes = length;
- aio.aiocb.aio_offset = offset;
+ n_aiocb = iov.size();
+ aio.aiocbp = (struct aiocb*)calloc(iov.size(), sizeof(struct aiocb));
+ for (size_t i = 0; i < iov.size(); i++) {
+ aio.aiocbp[i].aio_fildes = fd;
+ aio.aiocbp[i].aio_buf = iov[i].iov_base;
+ aio.aiocbp[i].aio_nbytes = iov[i].iov_len;
+ aio.aiocbp[i].aio_offset = offset;
+ aio.aiocbp[i].aio_lio_opcode = LIO_READ;
+ offset += iov[i].iov_len;
+ }
#endif
- bl.append(std::move(p));
}
long get_return_value() {