diff --git a/src/Makefile.am b/src/Makefile.am index 5024d0b350e1c..6c2bf213da4c7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1386,6 +1386,7 @@ noinst_HEADERS = \ librbd/ImageCtx.h\ librbd/internal.h\ librbd/LibrbdWriteback.h\ + librbd/parent_types.h\ librbd/SnapInfo.h\ librbd/WatchCtx.h\ logrotate.conf\ diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index ab4eda57b1fb8..c6480ca43e8c8 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -238,7 +238,7 @@ namespace librbd { void ImageCtx::add_snap(string in_snap_name, snap_t id, uint64_t in_size, uint64_t features, - cls_client::parent_info parent) + parent_info parent) { assert(snap_lock.is_locked()); snaps.push_back(id); diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h index 12edf18dacae0..4515ed2a406d3 100644 --- a/src/librbd/ImageCtx.h +++ b/src/librbd/ImageCtx.h @@ -21,6 +21,7 @@ #include "librbd/cls_rbd_client.h" #include "librbd/LibrbdWriteback.h" #include "librbd/SnapInfo.h" +#include "librbd/parent_types.h" class CephContext; class PerfCounters; @@ -67,7 +68,7 @@ namespace librbd { std::string object_prefix; std::string header_oid; std::string id; // only used for new-format images - cls_client::parent_info parent_md; + parent_info parent_md; ImageCtx *parent; ObjectCacher *object_cacher; diff --git a/src/librbd/SnapInfo.h b/src/librbd/SnapInfo.h index 1bb271a5136e6..82323ce7ff5d0 100644 --- a/src/librbd/SnapInfo.h +++ b/src/librbd/SnapInfo.h @@ -8,6 +8,7 @@ #include "include/rados/librados.hpp" #include "librbd/cls_rbd_client.h" +#include "librbd/parent_types.h" namespace librbd { @@ -15,7 +16,7 @@ namespace librbd { librados::snap_t id; uint64_t size; uint64_t features; - cls_client::parent_info parent; + parent_info parent; SnapInfo(librados::snap_t _id, uint64_t _size, uint64_t _features, cls_client::parent_info _parent) : id(_id), size(_size), features(_features), parent(_parent) {} diff --git a/src/librbd/cls_rbd_client.h b/src/librbd/cls_rbd_client.h index 51c1c3a06cf83..4f2679b28bf84 100644 --- a/src/librbd/cls_rbd_client.h +++ b/src/librbd/cls_rbd_client.h @@ -8,35 +8,13 @@ #include "include/rados.h" #include "include/rados/librados.hpp" #include "include/types.h" +#include "librbd/parent_types.h" #include #include namespace librbd { namespace cls_client { - struct parent_spec { - int64_t pool_id; - string image_id; - snapid_t snap_id; - parent_spec() : pool_id(-1), snap_id(CEPH_NOSNAP) {} - parent_spec(uint64_t pool_id, string image_id, snapid_t snap_id) : - pool_id(pool_id), image_id(image_id), snap_id(snap_id) {} - bool operator==(const parent_spec &other) { - return ((this->pool_id == other.pool_id) && - (this->image_id == other.image_id) && - (this->snap_id == other.snap_id)); - } - bool operator!=(const parent_spec &other) { - return !(*this == other); - } - }; - - struct parent_info { - struct parent_spec spec; - uint64_t overlap; - parent_info() : overlap(0) {} - }; - // high-level interface to the header int get_immutable_metadata(librados::IoCtx *ioctx, const std::string &oid, std::string *object_prefix, uint8_t *order); diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index e3bf49d3f5954..29a5349d67c0f 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -12,6 +12,7 @@ #include "librbd/ImageCtx.h" #include "librbd/internal.h" +#include "librbd/parent_types.h" #define dout_subsys ceph_subsys_rbd #undef dout_prefix @@ -611,6 +612,9 @@ namespace librbd { return r; } + parent_spec pspec(p_ioctx.get_id(), p_imctx->id, + p_imctx->snap_id); + if (p_imctx->old_format) { lderr(cct) << "parent image must be in new format" << dendl; return -EINVAL; @@ -635,9 +639,6 @@ namespace librbd { order = p_imctx->order; } - cls_client::parent_spec pspec(p_ioctx.get_id(), p_imctx->id, - p_imctx->snap_id); - int remove_r; librbd::NoOpProgressContext no_op; ImageCtx *c_imctx = NULL; @@ -912,7 +913,7 @@ namespace librbd { Mutex::Locker l(ictx->snap_lock); Mutex::Locker l2(ictx->parent_lock); - cls_client::parent_info *parent_info; + parent_spec *parent_spec; if (ictx->snap_id == CEPH_NOSNAP) { if (!ictx->parent) @@ -991,7 +992,7 @@ namespace librbd { ictx->parent_lock.Lock(); // struct assignment - cls_client::parent_info parent_info = ictx->parent_md; + parent_info parent_info = ictx->parent_md; ictx->parent_lock.Unlock(); // scan snapshots; if none of them refer to this parent, @@ -1278,7 +1279,7 @@ namespace librbd { vector snap_names; vector snap_sizes; vector snap_features; - vector snap_parents; + vector snap_parents; { Mutex::Locker l(ictx->snap_lock); { @@ -1337,7 +1338,7 @@ namespace librbd { for (size_t i = 0; i < new_snapc.snaps.size(); ++i) { uint64_t features = ictx->old_format ? 0 : snap_features[i]; - cls_client::parent_info parent; + parent_info parent; if (!ictx->old_format) parent = snap_parents[i]; vector::const_iterator it = @@ -1356,7 +1357,7 @@ namespace librbd { ictx->snaps_by_name.clear(); for (size_t i = 0; i < new_snapc.snaps.size(); ++i) { uint64_t features = ictx->old_format ? 0 : snap_features[i]; - cls_client::parent_info parent; + parent_info parent; if (!ictx->old_format) parent = snap_parents[i]; ictx->add_snap(snap_names[i], new_snapc.snaps[i].val, diff --git a/src/librbd/parent_types.h b/src/librbd/parent_types.h new file mode 100644 index 0000000000000..07e6cfa503dc5 --- /dev/null +++ b/src/librbd/parent_types.h @@ -0,0 +1,34 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +#ifndef CEPH_LIBRBD_PARENT_TYPES_H +#define CEPH_LIBRBD_PARENT_TYPES_H + +// parent_spec uniquely identifies a parent in the clone relationship +// (clone(parent) creates child, then parent_spec <-> child_imageid) + +namespace librbd { + struct parent_spec { + int64_t pool_id; + string image_id; + snapid_t snap_id; + parent_spec() : pool_id(-1), snap_id(CEPH_NOSNAP) {} + parent_spec(uint64_t pool_id, string image_id, snapid_t snap_id) : + pool_id(pool_id), image_id(image_id), snap_id(snap_id) {} + bool operator==(const parent_spec &other) { + return ((this->pool_id == other.pool_id) && + (this->image_id == other.image_id) && + (this->snap_id == other.snap_id)); + } + bool operator!=(const parent_spec &other) { + return !(*this == other); + } + }; + + struct parent_info { + parent_spec spec; + uint64_t overlap; + parent_info() : overlap(0) {} + }; +} + +#endif diff --git a/src/test/rbd/test_cls_rbd.cc b/src/test/rbd/test_cls_rbd.cc index 505a993e9c458..36ff8c210d968 100644 --- a/src/test/rbd/test_cls_rbd.cc +++ b/src/test/rbd/test_cls_rbd.cc @@ -45,8 +45,8 @@ using ::librbd::cls_client::dir_list; using ::librbd::cls_client::dir_add_image; using ::librbd::cls_client::dir_remove_image; using ::librbd::cls_client::dir_rename_image; -using ::librbd::cls_client::parent_info; -using ::librbd::cls_client::parent_spec; +using ::librbd::parent_info; +using ::librbd::parent_spec; static char *random_buf(size_t len) {