From: xinxin shu Date: Wed, 21 Oct 2015 11:01:21 +0000 (+0800) Subject: librbd : fix enable objectmap feature issue X-Git-Tag: v10.0.0~12^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F6339%2Fhead;p=ceph.git librbd : fix enable objectmap feature issue Fixes: #13558 Signed-off-by: xinxin shu --- diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 727168232d36..5a940ca95f1f 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -79,6 +79,36 @@ int remove_object_map(ImageCtx *ictx) { } return 0; } +int create_object_map(ImageCtx *ictx) { + assert(ictx->snap_lock.is_locked()); + CephContext *cct = ictx->cct; + + int r; + std::vector snap_ids; + snap_ids.push_back(CEPH_NOSNAP); + for (std::map::iterator it = ictx->snap_info.begin(); + it != ictx->snap_info.end(); ++it) { + snap_ids.push_back(it->first); + } + + for (std::vector::iterator it = snap_ids.begin(); + it != snap_ids.end(); ++it) { + librados::ObjectWriteOperation op; + std::string oid(ObjectMap::object_map_name(ictx->id, *it)); + uint64_t snap_size = ictx->get_image_size(*it); + cls_client::object_map_resize(&op, Striper::get_num_objects(ictx->layout, snap_size), + OBJECT_NONEXISTENT); + r = ictx->md_ctx.operate(oid, &op); + if (r < 0) { + lderr(cct) << "failed to create object map " << oid << ": " + << cpp_strerror(r) << dendl; + return r; + } + } + + return 0; +} + int update_all_flags(ImageCtx *ictx, uint64_t flags, uint64_t mask) { assert(ictx->snap_lock.is_locked()); @@ -1616,6 +1646,14 @@ reprotect_and_return_err: lderr(cct) << "failed to update features: " << cpp_strerror(r) << dendl; } + if (((ictx->features & RBD_FEATURE_OBJECT_MAP) == 0) && + ((features & RBD_FEATURE_OBJECT_MAP) != 0)) { + r = create_object_map(ictx); + if (r < 0) { + lderr(cct) << "failed to create object map" << dendl; + return r; + } + } if (disable_flags != 0) { r = update_all_flags(ictx, 0, disable_flags);