From b89945252620d958225624bd2d751412d99566d1 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Tue, 5 Jan 2016 00:07:32 +0800 Subject: [PATCH] NVMEDevice: let IOContext can use NVMEDevice pointer Signed-off-by: Haomai Wang --- src/os/bluestore/BlockDevice.h | 3 +++ src/os/bluestore/NVMEDevice.cc | 17 ++++++++++------- src/os/bluestore/NVMEDevice.h | 5 +++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/os/bluestore/BlockDevice.h b/src/os/bluestore/BlockDevice.h index b668048e6243c..8a48a8313bd7f 100644 --- a/src/os/bluestore/BlockDevice.h +++ b/src/os/bluestore/BlockDevice.h @@ -22,6 +22,9 @@ /// track in-flight io struct IOContext { void *priv; +#ifdef HAVE_SPDK + void *backend; +#endif Mutex lock; Cond cond; diff --git a/src/os/bluestore/NVMEDevice.cc b/src/os/bluestore/NVMEDevice.cc index 1c665353cb0e9..0b03e45194095 100644 --- a/src/os/bluestore/NVMEDevice.cc +++ b/src/os/bluestore/NVMEDevice.cc @@ -52,9 +52,10 @@ static void io_complete(void *ctx, const struct nvme_completion *completion) { assert(0); } - IOContext *ioc; + IOContext *ioc = ctx; + NVMEDevice *device = ioc->backend; if (ioc->priv) { - aio_callback(aio_callback_priv, ioc->priv); + device->aio_callback(device->_callback_priv, ioc->priv); } } @@ -64,10 +65,10 @@ static void io_complete(void *ctx, const struct nvme_completion *completion) { NVMEDevice::NVMEDevice(aio_callback_t cb, void *cbpriv) : aio_queue(g_conf->bdev_aio_max_queue_depth), - aio_callback(cb), - aio_callback_priv(cbpriv), aio_stop(false), - aio_thread(this) + aio_thread(this), + aio_callback(cb), + aio_callback_priv(cbpriv) { zeros = buffer::create_page_aligned(1048576); zeros.zero(); @@ -269,8 +270,9 @@ int NVMEDevice::aio_write( bl.rebuild(); } + ioc->backend = this; int rc = nvme_ns_cmd_write(ns, bl.c_str(), off, - bl.length()/block_size, io_complete, ioc->priv); + bl.length()/block_size, io_complete, ioc); if (rc < 0) { derr << __func__ << " failed to do write command" << dendl; return rc; @@ -318,7 +320,8 @@ int NVMEDevice::read(uint64_t off, uint64_t len, bufferlist *pbl, assert(off + len <= size); bufferptr p = buffer::create_page_aligned(len); - int r = nvme_ns_cmd_read(ns, p.c_str(), off, len / block_size, io_complete, ioc->priv); + ioc->backend = this; + int r = nvme_ns_cmd_read(ns, p.c_str(), off, len / block_size, io_complete, ioc); if (r < 0) { r = -errno; derr << __func__ << " failed to read" << dendl; diff --git a/src/os/bluestore/NVMEDevice.h b/src/os/bluestore/NVMEDevice.h index bc0534b3de7ec..5a28272f89ed5 100644 --- a/src/os/bluestore/NVMEDevice.h +++ b/src/os/bluestore/NVMEDevice.h @@ -38,8 +38,6 @@ class NVMEDevice : public BlockDevice { uint64_t size; uint64_t block_size; - aio_callback_t aio_callback; - void *aio_callback_priv; bool aio_stop; struct AioCompletionThread : public Thread { @@ -56,6 +54,9 @@ class NVMEDevice : public BlockDevice { void _aio_stop(); public: + aio_callback_t aio_callback; + void *aio_callback_priv; + NVMEDevice(aio_callback_t cb, void *cbpriv); void aio_submit(IOContext *ioc) override {} -- 2.39.5