diff options
-rw-r--r-- | src/librbd/AioRequest.cc | 15 | ||||
-rw-r--r-- | src/librbd/AioRequest.h | 43 | ||||
-rw-r--r-- | src/librbd/LibrbdWriteback.cc | 6 | ||||
-rw-r--r-- | src/librbd/internal.cc | 19 |
4 files changed, 35 insertions, 48 deletions
diff --git a/src/librbd/AioRequest.cc b/src/librbd/AioRequest.cc index 11e111f7514..b5e38b5ab0d 100644 --- a/src/librbd/AioRequest.cc +++ b/src/librbd/AioRequest.cc @@ -21,15 +21,14 @@ namespace librbd { AioRequest::AioRequest() : m_ictx(NULL), m_ioctx(NULL), m_object_no(0), m_object_off(0), m_object_len(0), - m_snap_id(CEPH_NOSNAP), m_completion(NULL), m_parent_completion(NULL), + m_completion(NULL), m_parent_completion(NULL), m_hide_enoent(false) {} AioRequest::AioRequest(ImageCtx *ictx, const std::string &oid, uint64_t objectno, uint64_t off, uint64_t len, - librados::snap_t snap_id, Context *completion, bool hide_enoent) : m_ictx(ictx), m_ioctx(&ictx->data_ctx), m_oid(oid), m_object_no(objectno), - m_object_off(off), m_object_len(len), m_snap_id(snap_id), + m_object_off(off), m_object_len(len), m_completion(completion), m_parent_completion(NULL), m_hide_enoent(hide_enoent) {} @@ -108,21 +107,18 @@ namespace librbd { /** read **/ AbstractWrite::AbstractWrite() - : m_state(LIBRBD_AIO_WRITE_FLAT), - m_parent_overlap(0) {} + : m_state(LIBRBD_AIO_WRITE_FLAT) {} AbstractWrite::AbstractWrite(ImageCtx *ictx, const std::string &oid, uint64_t object_no, uint64_t object_off, uint64_t len, vector<pair<uint64_t,uint64_t> >& objectx, - uint64_t object_overlap, - const ::SnapContext &snapc, librados::snap_t snap_id, + const ::SnapContext &snapc, Context *completion, bool hide_enoent) - : AioRequest(ictx, oid, object_no, object_off, len, snap_id, completion, + : AioRequest(ictx, oid, object_no, object_off, len, completion, hide_enoent), m_state(LIBRBD_AIO_WRITE_FLAT), m_snap_seq(snapc.seq.val) { m_object_image_extents = objectx; - m_parent_overlap = object_overlap; // TODO: find a way to make this less stupid for (std::vector<snapid_t>::const_iterator it = snapc.snaps.begin(); @@ -172,7 +168,6 @@ namespace librbd { break; } - // If parent still exists, overlap might also have changed. uint64_t newlen = m_ictx->prune_parent_extents( m_object_image_extents, m_ictx->parent_md.overlap); diff --git a/src/librbd/AioRequest.h b/src/librbd/AioRequest.h index ac74a99dad3..f8a79e8f864 100644 --- a/src/librbd/AioRequest.h +++ b/src/librbd/AioRequest.h @@ -28,8 +28,7 @@ namespace librbd { AioRequest(); AioRequest(ImageCtx *ictx, const std::string &oid, uint64_t objectno, uint64_t off, uint64_t len, - librados::snap_t snap_id, Context *completion, - bool hide_enoent); + Context *completion, bool hide_enoent); virtual ~AioRequest(); void complete(int r) @@ -52,7 +51,6 @@ namespace librbd { librados::IoCtx *m_ioctx; std::string m_oid; uint64_t m_object_no, m_object_off, m_object_len; - librados::snap_t m_snap_id; Context *m_completion; AioCompletion *m_parent_completion; ceph::bufferlist m_read_data; @@ -66,9 +64,10 @@ namespace librbd { vector<pair<uint64_t,uint64_t> >& be, librados::snap_t snap_id, bool sparse, Context *completion) - : AioRequest(ictx, oid, objectno, offset, len, snap_id, completion, + : AioRequest(ictx, oid, objectno, offset, len, completion, false), m_buffer_extents(be), + m_snap_id(snap_id), m_tried_parent(false), m_sparse(sparse) { } virtual ~AioRead() {} @@ -84,6 +83,7 @@ namespace librbd { private: vector<pair<uint64_t,uint64_t> > m_buffer_extents; + librados::snap_t m_snap_id; bool m_tried_parent; bool m_sparse; }; @@ -93,9 +93,8 @@ namespace librbd { AbstractWrite(); AbstractWrite(ImageCtx *ictx, const std::string &oid, uint64_t object_no, uint64_t object_off, uint64_t len, - vector<pair<uint64_t,uint64_t> >& objectx, uint64_t object_overlap, + vector<pair<uint64_t,uint64_t> >& objectx, const ::SnapContext &snapc, - librados::snap_t snap_id, Context *completion, bool hide_enoent); virtual ~AbstractWrite() {} @@ -135,7 +134,6 @@ namespace librbd { write_state_d m_state; vector<pair<uint64_t,uint64_t> > m_object_image_extents; - uint64_t m_parent_overlap; librados::ObjectWriteOperation m_write; librados::ObjectWriteOperation m_copyup; uint64_t m_snap_seq; @@ -149,14 +147,13 @@ namespace librbd { public: AioWrite(ImageCtx *ictx, const std::string &oid, uint64_t object_no, uint64_t object_off, - vector<pair<uint64_t,uint64_t> >& objectx, uint64_t object_overlap, + vector<pair<uint64_t,uint64_t> >& objectx, const ceph::bufferlist &data, const ::SnapContext &snapc, - librados::snap_t snap_id, Context *completion) : AbstractWrite(ictx, oid, object_no, object_off, data.length(), - objectx, object_overlap, - snapc, snap_id, + objectx, + snapc, completion, false), m_write_data(data) { guard_write(); @@ -177,13 +174,13 @@ namespace librbd { public: AioRemove(ImageCtx *ictx, const std::string &oid, uint64_t object_no, - vector<pair<uint64_t,uint64_t> >& objectx, uint64_t object_overlap, - const ::SnapContext &snapc, librados::snap_t snap_id, + vector<pair<uint64_t,uint64_t> >& objectx, + const ::SnapContext &snapc, Context *completion) : AbstractWrite(ictx, oid, object_no, 0, 0, - objectx, object_overlap, - snapc, snap_id, completion, + objectx, + snapc, completion, true) { if (has_parent()) m_write.truncate(0); @@ -203,13 +200,13 @@ namespace librbd { public: AioTruncate(ImageCtx *ictx, const std::string &oid, uint64_t object_no, uint64_t object_off, - vector<pair<uint64_t,uint64_t> >& objectx, uint64_t object_overlap, - const ::SnapContext &snapc, librados::snap_t snap_id, + vector<pair<uint64_t,uint64_t> >& objectx, + const ::SnapContext &snapc, Context *completion) : AbstractWrite(ictx, oid, object_no, object_off, 0, - objectx, object_overlap, - snapc, snap_id, completion, + objectx, + snapc, completion, true) { guard_write(); m_write.truncate(object_off); @@ -226,13 +223,13 @@ namespace librbd { public: AioZero(ImageCtx *ictx, const std::string &oid, uint64_t object_no, uint64_t object_off, uint64_t object_len, - vector<pair<uint64_t,uint64_t> >& objectx, uint64_t object_overlap, - const ::SnapContext &snapc, librados::snap_t snap_id, + vector<pair<uint64_t,uint64_t> >& objectx, + const ::SnapContext &snapc, Context *completion) : AbstractWrite(ictx, oid, object_no, object_off, object_len, - objectx, object_overlap, - snapc, snap_id, completion, + objectx, + snapc, completion, true) { guard_write(); m_write.zero(object_off, object_len); diff --git a/src/librbd/LibrbdWriteback.cc b/src/librbd/LibrbdWriteback.cc index b8f4b536e9d..5c2be446c89 100644 --- a/src/librbd/LibrbdWriteback.cc +++ b/src/librbd/LibrbdWriteback.cc @@ -147,10 +147,8 @@ namespace librbd { m_writes[oid.name].push(result); ldout(m_ictx->cct, 20) << "write will wait for result " << result << dendl; C_OrderedWrite *req_comp = new C_OrderedWrite(m_ictx->cct, result, this); - AioWrite *req = new AioWrite(m_ictx, oid.name, - object_no, off, objectx, object_overlap, - bl, snapc, LIBRADOS_SNAP_HEAD, - req_comp); + AioWrite *req = new AioWrite(m_ictx, oid.name, object_no, off, objectx, + bl, snapc, req_comp); req->send(); return ++m_tid; } diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index bf8a0afc062..11cc7904301 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2171,8 +2171,7 @@ reprotect_and_return_err: bufferlist bl; string oid = ictx->get_object_name(ono); Context *comp = new C_SimpleThrottle(&throttle); - AioWrite *req = new AioWrite(ictx, oid, ono, 0, objectx, object_overlap, - bl, snapc, CEPH_NOSNAP, comp); + AioWrite *req = new AioWrite(ictx, oid, ono, 0, objectx, bl, snapc, comp); r = req->send(); if (r < 0) { lderr(cct) << "failed to flatten object " << oid << dendl; @@ -2917,11 +2916,10 @@ reprotect_and_return_err: Striper::extent_to_file(ictx->cct, &ictx->layout, p->objectno, 0, ictx->layout.fl_object_size, objectx); - uint64_t object_overlap = ictx->prune_parent_extents(objectx, overlap); + ictx->prune_parent_extents(objectx, overlap); AioWrite *req = new AioWrite(ictx, p->oid.name, p->objectno, p->offset, - objectx, object_overlap, - bl, snapc, snap_id, req_comp); + objectx, bl, snapc, req_comp); c->add_request(); r = req->send(); if (r < 0) @@ -2993,15 +2991,14 @@ reprotect_and_return_err: } if (p->offset == 0 && p->length == ictx->layout.fl_object_size) { - req = new AioRemove(ictx, p->oid.name, p->objectno, objectx, object_overlap, - snapc, snap_id, req_comp); + req = new AioRemove(ictx, p->oid.name, p->objectno, objectx, snapc, + req_comp); } else if (p->offset + p->length == ictx->layout.fl_object_size) { - req = new AioTruncate(ictx, p->oid.name, p->objectno, p->offset, objectx, object_overlap, - snapc, snap_id, req_comp); + req = new AioTruncate(ictx, p->oid.name, p->objectno, p->offset, objectx, + snapc, req_comp); } else { req = new AioZero(ictx, p->oid.name, p->objectno, p->offset, p->length, - objectx, object_overlap, - snapc, snap_id, req_comp); + objectx, snapc, req_comp); } r = req->send(); |