diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index c0bcae941fd..f6a3ae2224b 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -1350,6 +1350,12 @@ struct os_aio_userdata_t fil_node_t* node; IORequest type; void* message; + + os_aio_userdata_t(fil_node_t*node, IORequest type, void*message) : + node(node), type(type), message(message) {} + + /** Construct from tpool::aiocb::m_userdata[] */ + os_aio_userdata_t(const char *buf) { memcpy((void*)this, buf, sizeof*this); } }; /** NOTE! Use the corresponding macro os_aio(), not directly this function! diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 02040da9e52..096bbd8ff0b 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -3883,7 +3883,7 @@ extern void fil_aio_callback(os_aio_userdata_t *data); static void io_callback(tpool::aiocb* cb) { ut_a(cb->m_err == DB_SUCCESS); - os_aio_userdata_t data = *(os_aio_userdata_t*)cb->m_userdata; + os_aio_userdata_t data(cb->m_userdata); /* Return cb back to cache*/ if (cb->m_opcode == tpool::aio_opcode::AIO_PREAD) { if (read_slots->contains(cb)) { diff --git a/tpool/tpool.h b/tpool/tpool.h index 403a7faba50..ae9baf236b0 100644 --- a/tpool/tpool.h +++ b/tpool/tpool.h @@ -137,7 +137,7 @@ struct aiocb int m_err; void *m_internal; task m_internal_task; - char m_userdata[MAX_AIO_USERDATA_LEN]; + alignas(8) char m_userdata[MAX_AIO_USERDATA_LEN]; aiocb() : m_internal_task(nullptr, nullptr) {}