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;
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
*
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);