#include "mon/MonClient.h"
#include "include/ceph_features.h"
#include "common/config.h"
-#include "extblkdev/ExtBlkDevPlugin.h"
#include "mon/MonMap.h"
}
forker.exit(0);
}
-
- {
- int r = extblkdev::preload(g_ceph_context);
- if (r < 0) {
- derr << "Failed preloading extblkdev plugins, error code: " << r << dendl;
- forker.exit(1);
- }
- }
string magic;
uuid_d cluster_fsid, osd_fsid;
flags:
- create
with_legacy: true
+- name: bluestore_use_ebd
+ type: bool
+ level: advanced
+ desc: EBD plugin used during mkfs is required for mounts.
+ long_desc: The flag has two effects, on mkfs and on mount.
+ If set for mkfs and EBD plugin did attach to the device then save plugin name to OSD metadata.
+ If set when mounting and plugin name is stored in OSD metadata then refuse to mount.
+ The flag has no meaning if the device has no associated EBD plugin.
+ default: true
+ see_also:
+ - osd_extblkdev_plugins
+ with_legacy: true
- name: bluestore_bdev_label_multi
type: bool
level: advanced
#include "Writer.h"
#include "Compression.h"
#include "BlueAdmin.h"
+#include "extblkdev/ExtBlkDevPlugin.h"
#if defined(WITH_LTTNG)
#define TRACEPOINT_DEFINE
ceph_assert(bdev == NULL);
string p = path + "/block";
bdev = BlockDevice::create(cct, p, aio_cb, static_cast<void*>(this), discard_cb, static_cast<void*>(this), "bluestore");
- int r = bdev->open(p);
+ int r = 0;
+ int plugin_preload_r = 0;
+ if (cct->_conf->bluestore_use_ebd) {
+ //load plugins
+ plugin_preload_r = extblkdev::preload(cct);
+ // do not complain yet. wait until we check "extblkdev" meta.
+ }
+
+ r = bdev->open(p);
if (r < 0)
goto fail;
dout(5) << __func__ << " trimmed device:" << p << dendl;
}
+ if (!create && cct->_conf->bluestore_use_ebd) {
+ // for regular bdev opens check if it was deployed with plugin
+ string meta_plugin_id;
+ r = read_meta("extblkdev", &meta_plugin_id);
+ if (r == 0) {
+ // plugin selection fixed to meta, plugins must be loaded
+ if (plugin_preload_r != 0) {
+ // we will complain twice - once generally about not loading plugins,
+ // and later that specific plugin is not ready
+ derr << "Failed preloading extblkdev plugins, error code: " << plugin_preload_r << dendl;
+ }
+ string bdev_plugin_id;
+ r = bdev->get_ebd_id(bdev_plugin_id);
+ if (r != 0) {
+ derr << __func__ << " plugin " << meta_plugin_id << " not loaded" << dendl;
+ goto fail_close;
+ }
+ if (meta_plugin_id != bdev_plugin_id) {
+ derr << __func__ << " plugin '" << meta_plugin_id << "' used on mkfs, "
+ << "but now uses plugin '" << bdev_plugin_id << "'" << dendl;
+ goto fail_close;
+ }
+ }
+ }
+
if (bdev->supported_bdev_label()) {
if (create) {
r = _set_main_bdev_label();
return r;
}
}
+ if (cct->_conf->bluestore_use_ebd) {
+ // check if EBD plugin is enabled
+ string plugin_id;
+ r = bdev->get_ebd_id(plugin_id);
+ if (r == 0) {
+ // retrieved name, save plugin into bdev metadata
+ r = write_meta("extblkdev", plugin_id);
+ if (r < 0)
+ return r;
+ } else {
+ // Non zero result is not a problem, it just means we do not have EBD plugin.
+ r = 0;
+ }
+ }
freelist_type = "bitmap";
dout(10) << " freelist_type " << freelist_type << dendl;