From 8c28f2f28d960d823ffd632671edaf029c30fb0f Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 14 Dec 2015 17:41:49 -0500 Subject: [PATCH] librbd: optionally validate RBD pool configuration (snapshot support) Fixes: #13633 Signed-off-by: Jason Dillaman (cherry picked from commit 1fea4dadc60e13518e9ee55d136fbc4e9d3a621e) Conflicts: src/common/config_opts.h: trivial resolution --- src/common/config_opts.h | 1 + src/librbd/internal.cc | 50 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/common/config_opts.h b/src/common/config_opts.h index f2b16c58bcb7..91d822260fc4 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -899,6 +899,7 @@ OPTION(rbd_blacklist_on_break_lock, OPT_BOOL, true) // whether to blacklist clie OPTION(rbd_blacklist_expire_seconds, OPT_INT, 0) // number of seconds to blacklist - set to 0 for OSD default OPTION(rbd_request_timed_out_seconds, OPT_INT, 30) // number of seconds before maint request times out OPTION(rbd_tracing, OPT_BOOL, false) // true if LTTng-UST tracepoints should be enabled +OPTION(rbd_validate_pool, OPT_BOOL, true) // true if empty pools should be validated for RBD compatibility /* * The following options change the behavior for librbd's image creation methods that diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index b8f0e59f2df0..b4b4d9e48780 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -135,6 +135,41 @@ int invoke_async_request(ImageCtx *ictx, const std::string& request_type, return r; } +int validate_pool(IoCtx &io_ctx, CephContext *cct) { + if (!cct->_conf->rbd_validate_pool) { + return 0; + } + + int r = io_ctx.stat(RBD_DIRECTORY, NULL, NULL); + if (r == 0) { + return 0; + } else if (r < 0 && r != -ENOENT) { + lderr(cct) << "failed to stat RBD directory: " << cpp_strerror(r) << dendl; + return r; + } + + // allocate a self-managed snapshot id if this a new pool to force + // self-managed snapshot mode + uint64_t snap_id; + r = io_ctx.selfmanaged_snap_create(&snap_id); + if (r == -EINVAL) { + lderr(cct) << "pool not configured for self-managed RBD snapshot support" + << dendl; + return r; + } else if (r < 0) { + lderr(cct) << "failed to allocate self-managed snapshot: " + << cpp_strerror(r) << dendl; + return r; + } + + r = io_ctx.selfmanaged_snap_remove(snap_id); + if (r < 0) { + lderr(cct) << "failed to release self-managed snapshot " << snap_id + << ": " << cpp_strerror(r) << dendl; + } + return 0; +} + } // anonymous namespace const string id_obj_name(const string &name) @@ -872,8 +907,14 @@ reprotect_and_return_err: uint64_t size, int order) { CephContext *cct = (CephContext *)io_ctx.cct(); + + int r = validate_pool(io_ctx, cct); + if (r < 0) { + return r; + } + ldout(cct, 2) << "adding rbd image to directory..." << dendl; - int r = tmap_set(io_ctx, imgname); + r = tmap_set(io_ctx, imgname); if (r < 0) { lderr(cct) << "error adding image to directory: " << cpp_strerror(r) << dendl; @@ -918,9 +959,14 @@ reprotect_and_return_err: ceph_file_layout layout; + int r = validate_pool(io_ctx, cct); + if (r < 0) { + return r; + } + id_obj = id_obj_name(imgname); - int r = io_ctx.create(id_obj, true); + r = io_ctx.create(id_obj, true); if (r < 0) { lderr(cct) << "error creating rbd id object: " << cpp_strerror(r) << dendl; -- 2.47.3