}
void ImageCtx::add_snap(string in_snap_name, snap_t id, uint64_t in_size,
- uint64_t features, parent_info parent,
- uint8_t protection_status, uint64_t flags)
+ parent_info parent, uint8_t protection_status,
+ uint64_t flags)
{
assert(snap_lock.is_wlocked());
snaps.push_back(id);
- SnapInfo info(in_snap_name, in_size, features, parent, protection_status,
- flags);
+ SnapInfo info(in_snap_name, in_size, parent, protection_status, flags);
snap_info.insert(pair<snap_t, SnapInfo>(id, info));
snap_ids.insert(pair<string, snap_t>(in_snap_name, id));
}
return 0;
}
- int ImageCtx::get_features(snap_t in_snap_id, uint64_t *out_features) const
- {
- assert(snap_lock.is_locked());
- if (in_snap_id == CEPH_NOSNAP) {
- *out_features = features;
- return 0;
- }
- const SnapInfo *info = get_snap_info(in_snap_id);
- if (info) {
- *out_features = info->features;
- return 0;
- }
- return -ENOENT;
- }
-
bool ImageCtx::test_features(uint64_t test_features) const
{
RWLock::RLocker l(snap_lock);
- uint64_t snap_features = 0;
- get_features(snap_id, &snap_features);
- return ((snap_features & test_features) == test_features);
+ return ((features & test_features) == test_features);
}
int ImageCtx::get_flags(librados::snap_t _snap_id, uint64_t *_flags) const
uint64_t get_stripe_period() const;
void add_snap(std::string in_snap_name, librados::snap_t id,
- uint64_t in_size, uint64_t features,
- parent_info parent, uint8_t protection_status,
- uint64_t flags);
+ uint64_t in_size, parent_info parent,
+ uint8_t protection_status, uint64_t flags);
uint64_t get_image_size(librados::snap_t in_snap_id) const;
- int get_features(librados::snap_t in_snap_id,
- uint64_t *out_features) const;
bool test_features(uint64_t test_features) const;
int get_flags(librados::snap_t in_snap_id, uint64_t *flags) const;
bool test_flags(uint64_t test_flags) const;
bool ImageWatcher::is_lock_supported() const {
assert(m_image_ctx.owner_lock.is_locked());
RWLock::RLocker l(m_image_ctx.snap_lock);
- uint64_t snap_features;
- m_image_ctx.get_features(m_image_ctx.snap_id, &snap_features);
- return ((snap_features & RBD_FEATURE_EXCLUSIVE_LOCK) != 0 &&
+ return ((m_image_ctx.features & RBD_FEATURE_EXCLUSIVE_LOCK) != 0 &&
!m_image_ctx.read_only && m_image_ctx.snap_id == CEPH_NOSNAP);
}
assert(m_image_ctx.snap_lock.is_wlocked());
RWLock::WLocker l(m_image_ctx.object_map_lock);
- uint64_t features;
- m_image_ctx.get_features(snap_id, &features);
- if ((features & RBD_FEATURE_OBJECT_MAP) == 0 ||
+ if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0 ||
(m_image_ctx.snap_id == snap_id && !m_image_ctx.snap_exists)) {
m_object_map.clear();
m_enabled = false;
CephContext *cct = m_image_ctx.cct;
ldout(cct, 10) << &m_image_ctx << " rollback object map" << dendl;
- uint64_t features;
- m_image_ctx.get_features(snap_id, &features);
- if ((features & RBD_FEATURE_OBJECT_MAP) == 0) {
+ if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0) {
r = m_image_ctx.md_ctx.remove(oid);
if (r < 0 && r != -ENOENT) {
lderr(cct) << "unable to remove object map: " << cpp_strerror(r)
void ObjectMap::snapshot(uint64_t snap_id) {
assert(m_image_ctx.snap_lock.is_wlocked());
- uint64_t features;
- m_image_ctx.get_features(CEPH_NOSNAP, &features);
- if ((features & RBD_FEATURE_OBJECT_MAP) == 0) {
+ if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0) {
return;
}
struct SnapInfo {
std::string name;
uint64_t size;
- uint64_t features;
parent_info parent;
uint8_t protection_status;
uint64_t flags;
- SnapInfo(std::string _name, uint64_t _size, uint64_t _features,
- parent_info _parent, uint8_t _protection_status, uint64_t _flags)
- : name(_name), size(_size), features(_features), parent(_parent),
+ SnapInfo(std::string _name, uint64_t _size, parent_info _parent,
+ uint8_t _protection_status, uint64_t _flags)
+ : name(_name), size(_size), parent(_parent),
protection_status(_protection_status), flags(_flags) {}
};
}
RWLock::RLocker l(ictx->md_lock);
RWLock::RLocker l2(ictx->snap_lock);
- uint64_t features;
- ictx->get_features(ictx->snap_id, &features);
- if ((features & RBD_FEATURE_LAYERING) == 0) {
+ if ((ictx->features & RBD_FEATURE_LAYERING) == 0) {
lderr(ictx->cct) << "snap_protect: image must support layering"
<< dendl;
return -ENOSYS;
RWLock::RLocker l(ictx->md_lock);
RWLock::RLocker l2(ictx->snap_lock);
- uint64_t features;
- ictx->get_features(ictx->snap_id, &features);
- if ((features & RBD_FEATURE_LAYERING) == 0) {
+ if ((ictx->features & RBD_FEATURE_LAYERING) == 0) {
lderr(ictx->cct) << "snap_unprotect: image must support layering"
<< dendl;
return -ENOSYS;
}
p_imctx->snap_lock.get_read();
- p_imctx->get_features(p_imctx->snap_id, &p_features);
+ p_features = p_imctx->features;
size = p_imctx->get_image_size(p_imctx->snap_id);
p_imctx->is_snap_protected(p_imctx->snap_id, &snap_protected);
p_imctx->snap_lock.put_read();
if (r < 0)
return r;
RWLock::RLocker l(ictx->snap_lock);
- return ictx->get_features(ictx->snap_id, features);
+ *features = ictx->features;
+ return 0;
}
int get_overlap(ImageCtx *ictx, uint64_t *overlap)
bool new_snap = false;
vector<string> snap_names;
vector<uint64_t> snap_sizes;
- vector<uint64_t> snap_features;
vector<parent_info> snap_parents;
vector<uint8_t> snap_protection;
vector<uint64_t> snap_flags;
r = cls_client::snapshot_list(&(ictx->md_ctx), ictx->header_oid,
new_snapc.snaps, &snap_names,
- &snap_sizes, &snap_features,
- &snap_parents, &snap_protection);
+ &snap_sizes, &snap_parents,
+ &snap_protection);
// -ENOENT here means we raced with snapshot deletion
if (r < 0 && r != -ENOENT) {
lderr(ictx->cct) << "snapc = " << new_snapc << dendl;
}
for (size_t i = 0; i < new_snapc.snaps.size(); ++i) {
- uint64_t features = ictx->old_format ? 0 : snap_features[i];
parent_info parent;
if (!ictx->old_format)
parent = snap_parents[i];
ldout(cct, 20) << "new snapshot id=" << new_snapc.snaps[i].val
<< " name=" << snap_names[i]
<< " size=" << snap_sizes[i]
- << " features=" << features
<< dendl;
}
}
ictx->snap_info.clear();
ictx->snap_ids.clear();
for (size_t i = 0; i < new_snapc.snaps.size(); ++i) {
- uint64_t features = ictx->old_format ? 0 : snap_features[i];
uint64_t flags = ictx->old_format ? 0 : snap_flags[i];
uint8_t protection_status = ictx->old_format ?
(uint8_t)RBD_PROTECTION_STATUS_UNPROTECTED : snap_protection[i];
if (!ictx->old_format)
parent = snap_parents[i];
ictx->add_snap(snap_names[i], new_snapc.snaps[i].val, snap_sizes[i],
- features, parent, protection_status, flags);
+ parent, protection_status, flags);
}
r = refresh_parent(ictx);
int order = src->order;
src->snap_lock.get_read();
- uint64_t src_features;
- src->get_features(src->snap_id, &src_features);
+ uint64_t src_features = src->features;
uint64_t src_size = src->get_image_size(src->snap_id);
src->snap_lock.put_read();