From 01f04cb93279803da21d5d31e98f19f61a599ee0 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 19 Feb 2015 15:38:32 -0500 Subject: [PATCH] osdc: pass fadvise op flags to WritebackHandler read requests librbd was previously attempting to cast the provided Context to retrieve the fadvise flags. To eliminate the unsafe cast, now the fadvise flags are directly passed to the WritebackHandler::read callback. Fixes: #10914 Signed-off-by: Jason Dillaman --- src/client/ObjecterWriteback.h | 2 +- src/librbd/AioCompletion.h | 3 --- src/librbd/AioRequest.h | 4 ---- src/librbd/LibrbdWriteback.cc | 7 ++----- src/librbd/LibrbdWriteback.h | 2 +- src/osdc/ObjectCacher.cc | 7 ++++--- src/osdc/ObjectCacher.h | 2 +- src/osdc/WritebackHandler.h | 2 +- src/test/osdc/FakeWriteback.cc | 2 +- src/test/osdc/FakeWriteback.h | 2 +- 10 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/client/ObjecterWriteback.h b/src/client/ObjecterWriteback.h index f6506fa953dd5..b9e6f9c3cf1da 100644 --- a/src/client/ObjecterWriteback.h +++ b/src/client/ObjecterWriteback.h @@ -17,7 +17,7 @@ class ObjecterWriteback : public WritebackHandler { virtual void read(const object_t& oid, uint64_t object_no, const object_locator_t& oloc, uint64_t off, uint64_t len, snapid_t snapid, bufferlist *pbl, uint64_t trunc_size, - __u32 trunc_seq, Context *onfinish) { + __u32 trunc_seq, int op_flags, Context *onfinish) { m_objecter->read_trunc(oid, oloc, off, len, snapid, pbl, 0, trunc_size, trunc_seq, new C_OnFinisher(new C_Lock(m_lock, onfinish), diff --git a/src/librbd/AioCompletion.h b/src/librbd/AioCompletion.h index 6f6d74357aabb..41c89f2f0b934 100644 --- a/src/librbd/AioCompletion.h +++ b/src/librbd/AioCompletion.h @@ -146,9 +146,6 @@ namespace librbd { void set_req(AioRead *req) { m_req = req; } - AioRead *get_req() { - return m_req; - } private: CephContext *m_cct; AioCompletion *m_completion; diff --git a/src/librbd/AioRequest.h b/src/librbd/AioRequest.h index ae8c855038a6b..6da04b802fb4d 100644 --- a/src/librbd/AioRequest.h +++ b/src/librbd/AioRequest.h @@ -77,10 +77,6 @@ namespace librbd { return m_read_data; } - int get_op_flags() { - return m_op_flags; - } - std::map m_ext_map; friend class C_AioRead; diff --git a/src/librbd/LibrbdWriteback.cc b/src/librbd/LibrbdWriteback.cc index dd8f46b87116f..4c917d4adb7a3 100644 --- a/src/librbd/LibrbdWriteback.cc +++ b/src/librbd/LibrbdWriteback.cc @@ -102,7 +102,7 @@ namespace librbd { const object_locator_t& oloc, uint64_t off, uint64_t len, snapid_t snapid, bufferlist *pbl, uint64_t trunc_size, - __u32 trunc_seq, Context *onfinish) + __u32 trunc_seq, int op_flags, Context *onfinish) { // on completion, take the mutex and then call onfinish. Context *req = new C_Request(m_ictx->cct, onfinish, &m_lock); @@ -120,10 +120,7 @@ namespace librbd { librados::Rados::aio_create_completion(req, context_cb, NULL); librados::ObjectReadOperation op; op.read(off, len, pbl, NULL); - { - AioRead *req = (static_cast(onfinish))->get_req(); - op.set_op_flags2((uint32_t)req->get_op_flags()); - } + op.set_op_flags2(op_flags); int flags = m_ictx->get_read_flags(snapid); int r = m_ictx->data_ctx.aio_operate(oid.name, rados_completion, &op, flags, NULL); diff --git a/src/librbd/LibrbdWriteback.h b/src/librbd/LibrbdWriteback.h index 0212dad9a2cff..2c71e8434cb9d 100644 --- a/src/librbd/LibrbdWriteback.h +++ b/src/librbd/LibrbdWriteback.h @@ -27,7 +27,7 @@ namespace librbd { virtual void read(const object_t& oid, uint64_t object_no, const object_locator_t& oloc, uint64_t off, uint64_t len, snapid_t snapid, bufferlist *pbl, uint64_t trunc_size, - __u32 trunc_seq, Context *onfinish); + __u32 trunc_seq, int op_flags, Context *onfinish); // Determine whether a read to this extent could be affected by a write-triggered copy-on-write virtual bool may_copy_on_write(const object_t& oid, uint64_t read_off, uint64_t read_len, snapid_t snapid); diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index 70426b6437904..75174a68ff290 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -631,7 +631,7 @@ void ObjectCacher::close_object(Object *ob) -void ObjectCacher::bh_read(BufferHead *bh) +void ObjectCacher::bh_read(BufferHead *bh, int op_flags) { assert(lock.is_locked()); ldout(cct, 7) << "bh_read on " << *bh << " outstanding reads " @@ -647,7 +647,8 @@ void ObjectCacher::bh_read(BufferHead *bh) writeback_handler.read(bh->ob->get_oid(), bh->ob->get_object_number(), bh->ob->get_oloc(), bh->start(), bh->length(), bh->ob->get_snap(), &onfinish->bl, - bh->ob->truncate_size, bh->ob->truncate_seq, onfinish); + bh->ob->truncate_size, bh->ob->truncate_seq, + op_flags, onfinish); ++reads_outstanding; } @@ -1157,7 +1158,7 @@ int ObjectCacher::_readx(OSDRead *rd, ObjectSet *oset, Context *onfinish, bh_remove(o, bh_it->second); delete bh_it->second; } else { - bh_read(bh_it->second); + bh_read(bh_it->second, rd->fadvise_flags); if (success && onfinish) { ldout(cct, 10) << "readx missed, waiting on " << *bh_it->second << " off " << bh_it->first << dendl; diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 880e6eb6b6dcf..ca23549ceac95 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -453,7 +453,7 @@ class ObjectCacher { void bh_remove(Object *ob, BufferHead *bh); // io - void bh_read(BufferHead *bh); + void bh_read(BufferHead *bh, int op_flags); void bh_write(BufferHead *bh); void trim(); diff --git a/src/osdc/WritebackHandler.h b/src/osdc/WritebackHandler.h index caf20959b8a49..466f84e77983b 100644 --- a/src/osdc/WritebackHandler.h +++ b/src/osdc/WritebackHandler.h @@ -15,7 +15,7 @@ class WritebackHandler { virtual void read(const object_t& oid, uint64_t object_no, const object_locator_t& oloc, uint64_t off, uint64_t len, snapid_t snapid, bufferlist *pbl, uint64_t trunc_size, - __u32 trunc_seq, Context *onfinish) = 0; + __u32 trunc_seq, int op_flags, Context *onfinish) = 0; /** * check if a given extent read result may change due to a write * diff --git a/src/test/osdc/FakeWriteback.cc b/src/test/osdc/FakeWriteback.cc index d444ff6d0c18a..69f32991b89ea 100644 --- a/src/test/osdc/FakeWriteback.cc +++ b/src/test/osdc/FakeWriteback.cc @@ -62,7 +62,7 @@ void FakeWriteback::read(const object_t& oid, uint64_t object_no, const object_locator_t& oloc, uint64_t off, uint64_t len, snapid_t snapid, bufferlist *pbl, uint64_t trunc_size, - __u32 trunc_seq, Context *onfinish) + __u32 trunc_seq, int op_flags, Context *onfinish) { C_Delay *wrapper = new C_Delay(m_cct, onfinish, m_lock, off, pbl, m_delay_ns); m_finisher->queue(wrapper, len); diff --git a/src/test/osdc/FakeWriteback.h b/src/test/osdc/FakeWriteback.h index ef2bb3d1f3b67..9b9598ed94800 100644 --- a/src/test/osdc/FakeWriteback.h +++ b/src/test/osdc/FakeWriteback.h @@ -20,7 +20,7 @@ public: virtual void read(const object_t& oid, uint64_t object_no, const object_locator_t& oloc, uint64_t off, uint64_t len, snapid_t snapid, bufferlist *pbl, uint64_t trunc_size, - __u32 trunc_seq, Context *onfinish); + __u32 trunc_seq, int op_flags, Context *onfinish); virtual ceph_tid_t write(const object_t& oid, const object_locator_t& oloc, uint64_t off, uint64_t len, -- 2.39.5