+int BitmapFreelistManager::_init_from_label(const bluestore_bdev_label_t& label)
+{
+ dout(1) << __func__ << dendl;
+
+ int r = ENOENT;
+ string err;
+
+ auto it = label.meta.find("bfm_size");
+ auto end = label.meta.end();
+ if (it != end) {
+ size = strict_iecstrtoll(it->second.c_str(), &err);
+ if (!err.empty()) {
+ derr << __func__ << " Failed to parse - "
+ << it->first << ":" << it->second
+ << ", error: " << err << dendl;
+ return r;
+ }
+ } else {
+ // this is expected for legacy deployed OSDs
+ dout(0) << __func__ << " bfm_size not found in bdev meta" << dendl;
+ return r;
+ }
+
+ it = label.meta.find("bfm_blocks");
+ if (it != end) {
+ blocks = strict_iecstrtoll(it->second.c_str(), &err);
+ if (!err.empty()) {
+ derr << __func__ << " Failed to parse - "
+ << it->first << ":" << it->second
+ << ", error: " << err << dendl;
+ return r;
+ }
+ } else {
+ derr << __func__ << " bfm_blocks not found in bdev meta" << dendl;
+ return r;
+ }
+
+ it = label.meta.find("bfm_bytes_per_block");
+ if (it != end) {
+ bytes_per_block = strict_iecstrtoll(it->second.c_str(), &err);
+ if (!err.empty()) {
+ derr << __func__ << " Failed to parse - "
+ << it->first << ":" << it->second
+ << ", error: " << err << dendl;
+ return r;
+ }
+ } else {
+ derr << __func__ << " bfm_bytes_per_block not found in bdev meta" << dendl;
+ return r;
+ }
+ it = label.meta.find("bfm_blocks_per_key");
+ if (it != end) {
+ blocks_per_key = strict_iecstrtoll(it->second.c_str(), &err);
+ if (!err.empty()) {
+ derr << __func__ << " Failed to parse - "
+ << it->first << ":" << it->second
+ << ", error: " << err << dendl;
+ return r;
+ }
+ } else {
+ derr << __func__ << " bfm_blocks_per_key not found in bdev meta" << dendl;
+ return r;
+ }
+ r = 0;
+ return 0;
+}
+