]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
NVMEDevice: let IOContext can use NVMEDevice pointer
authorHaomai Wang <haomai@xsky.com>
Mon, 4 Jan 2016 16:07:32 +0000 (00:07 +0800)
committerHaomai Wang <haomai@xsky.com>
Mon, 1 Feb 2016 14:00:43 +0000 (22:00 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/os/bluestore/BlockDevice.h
src/os/bluestore/NVMEDevice.cc
src/os/bluestore/NVMEDevice.h

index b668048e6243cdaea4861a4dbd58682530810fe3..8a48a8313bd7f5afec3c5d3b817b209979d42477 100644 (file)
@@ -22,6 +22,9 @@
 /// track in-flight io
 struct IOContext {
   void *priv;
+#ifdef HAVE_SPDK
+  void *backend;
+#endif
 
   Mutex lock;
   Cond cond;
index 1c665353cb0e9e2fd39341007d4ad1c2d35b2519..0b03e4519409546054001bd90a4c04701ddefc78 100644 (file)
@@ -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;
index bc0534b3de7eccd6bb174b60a5816c7abcc84c6e..5a28272f89ed5fdfbf230937332642da67191c77 100644 (file)
@@ -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 {}