From: Jason Dillaman Date: Fri, 10 Apr 2015 17:56:39 +0000 (-0400) Subject: cls_rbd: add object_map_save method X-Git-Tag: v9.0.1~149^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e5adbaa80b32ff5c983029916238403b7e9cc0c0;p=ceph.git cls_rbd: add object_map_save method Allow the object map rebuild process to build the full object map in memory and save it to disk with one operation. Signed-off-by: Jason Dillaman --- diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index ef18c6ea08bb..c8748651d5b9 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -95,6 +95,7 @@ cls_method_handle_t h_dir_add_image; cls_method_handle_t h_dir_remove_image; cls_method_handle_t h_dir_rename_image; cls_method_handle_t h_object_map_load; +cls_method_handle_t h_object_map_save; cls_method_handle_t h_object_map_resize; cls_method_handle_t h_object_map_update; cls_method_handle_t h_metadata_set; @@ -2028,6 +2029,32 @@ int object_map_load(cls_method_context_t hctx, bufferlist *in, bufferlist *out) return 0; } +/** + * Save an rbd image's object map + * + * Input: + * @param object map bit vector + * + * Output: + * @returns 0 on success, negative error code on failure + */ +int object_map_save(cls_method_context_t hctx, bufferlist *in, bufferlist *out) +{ + BitVector<2> object_map; + try { + bufferlist::iterator iter = in->begin(); + ::decode(object_map, iter); + } catch (const buffer::error &err) { + return -EINVAL; + } + + bufferlist bl; + ::encode(object_map, bl); + CLS_LOG(20, "object_map_save: object size=%" PRIu64 ", byte size=%u", + object_map.size(), bl.length()); + return cls_cxx_write_full(hctx, &bl); +} + /** * Resize an rbd image's object map * @@ -2672,6 +2699,9 @@ void __cls_init() cls_register_cxx_method(h_class, "object_map_load", CLS_METHOD_RD, object_map_load, &h_object_map_load); + cls_register_cxx_method(h_class, "object_map_save", + CLS_METHOD_RD | CLS_METHOD_WR, + object_map_save, &h_object_map_save); cls_register_cxx_method(h_class, "object_map_resize", CLS_METHOD_RD | CLS_METHOD_WR, object_map_resize, &h_object_map_resize);