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);
+ }
+
int ImageCtx::get_flags(librados::snap_t _snap_id, uint64_t *_flags) const
{
if (_snap_id == CEPH_NOSNAP) {
int ObjectMap::lock()
{
- if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0) {
+ if (!m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP)) {
return 0;
}
int ObjectMap::unlock()
{
- if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0) {
+ if (!m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP)) {
return 0;
}
bool ObjectMap::object_may_exist(uint64_t object_no) const
{
// Fall back to default logic if object map is disabled or invalid
- if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0 ||
+ if (!m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP) ||
((m_image_ctx.flags & RBD_FLAG_OBJECT_MAP_INVALID) != 0)) {
return true;
}
void ObjectMap::aio_resize(uint64_t new_size, uint8_t default_object_state,
Context *on_finish) {
- assert((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) != 0);
+ assert(m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP));
assert(m_image_ctx.owner_lock.is_locked());
assert(m_image_ctx.image_watcher->is_lock_owner());
const boost::optional<uint8_t> ¤t_state,
Context *on_finish)
{
- assert((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) != 0);
+ assert(m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP));
assert(m_image_ctx.owner_lock.is_locked());
assert(m_image_ctx.image_watcher->is_lock_owner());
return r;
// no children for non-layered or old format image
- if ((ictx->features & RBD_FEATURE_LAYERING) == 0)
+ if (!ictx->test_features(RBD_FEATURE_LAYERING))
return 0;
parent_spec parent_spec(ictx->md_ctx.get_id(), ictx->id, ictx->snap_id);