int ImageCtx::snap_set(string in_snap_name)
{
- assert(snap_lock.is_locked());
map<string, SnapInfo>::iterator it = snaps_by_name.find(in_snap_name);
if (it != snaps_by_name.end()) {
snap_name = in_snap_name;
void ImageCtx::snap_unset()
{
- assert(snap_lock.is_locked());
snap_id = CEPH_NOSNAP;
snap_name = "";
snap_exists = true;
snap_t ImageCtx::get_snap_id(string in_snap_name) const
{
- assert(snap_lock.is_locked());
map<string, SnapInfo>::const_iterator it = snaps_by_name.find(in_snap_name);
if (it != snaps_by_name.end())
return it->second.id;
int ImageCtx::get_snap_name(snapid_t in_snap_id, string *out_snap_name) const
{
- assert(snap_lock.is_locked());
map<string, SnapInfo>::const_iterator it;
for (it = snaps_by_name.begin(); it != snaps_by_name.end(); it++) {
int ImageCtx::get_parent_spec(snapid_t in_snap_id, parent_spec *out_pspec)
{
- assert(snap_lock.is_locked());
map<string, SnapInfo>::iterator it;
for (it = snaps_by_name.begin(); it != snaps_by_name.end(); it++) {
int ImageCtx::is_snap_protected(string in_snap_name, bool *is_protected) const
{
- assert(snap_lock.is_locked());
map<string, SnapInfo>::const_iterator it = snaps_by_name.find(in_snap_name);
if (it != snaps_by_name.end()) {
*is_protected =
int ImageCtx::is_snap_unprotected(string in_snap_name,
bool *is_unprotected) const
{
- assert(snap_lock.is_locked());
map<string, SnapInfo>::const_iterator it = snaps_by_name.find(in_snap_name);
if (it != snaps_by_name.end()) {
*is_unprotected =
int ImageCtx::get_snap_size(string in_snap_name, uint64_t *out_size) const
{
- assert(snap_lock.is_locked());
map<string, SnapInfo>::const_iterator it = snaps_by_name.find(in_snap_name);
if (it != snaps_by_name.end()) {
*out_size = it->second.size;
parent_info parent,
uint8_t protection_status)
{
- assert(snap_lock.is_locked());
snaps.push_back(id);
SnapInfo info(id, in_size, features, parent, protection_status);
snaps_by_name.insert(pair<string, SnapInfo>(in_snap_name, info));
uint64_t ImageCtx::get_image_size(snap_t in_snap_id) const
{
- assert(md_lock.is_locked());
- assert(snap_lock.is_locked());
if (in_snap_id == CEPH_NOSNAP) {
return size;
}
int ImageCtx::get_features(snap_t in_snap_id, uint64_t *out_features) const
{
- assert(md_lock.is_locked());
- assert(snap_lock.is_locked());
if (in_snap_id == CEPH_NOSNAP) {
*out_features = features;
return 0;
int64_t ImageCtx::get_parent_pool_id(snap_t in_snap_id) const
{
- assert(snap_lock.is_locked());
- assert(parent_lock.is_locked());
if (in_snap_id == CEPH_NOSNAP) {
return parent_md.spec.pool_id;
}
string ImageCtx::get_parent_image_id(snap_t in_snap_id) const
{
- assert(snap_lock.is_locked());
- assert(parent_lock.is_locked());
if (in_snap_id == CEPH_NOSNAP) {
return parent_md.spec.image_id;
}
uint64_t ImageCtx::get_parent_snap_id(snap_t in_snap_id) const
{
- assert(snap_lock.is_locked());
- assert(parent_lock.is_locked());
if (in_snap_id == CEPH_NOSNAP) {
return parent_md.spec.snap_id;
}
int ImageCtx::get_parent_overlap(snap_t in_snap_id, uint64_t *overlap) const
{
- assert(snap_lock.is_locked());
- assert(parent_lock.is_locked());
if (in_snap_id == CEPH_NOSNAP) {
*overlap = parent_md.overlap;
return 0;
void ImageCtx::aio_read_from_cache(object_t o, bufferlist *bl, size_t len,
uint64_t off, Context *onfinish) {
- snap_lock.Lock();
+ snap_lock.get_read();
ObjectCacher::OSDRead *rd = object_cacher->prepare_read(snap_id, bl, 0);
- snap_lock.Unlock();
+ snap_lock.put_read();
ObjectExtent extent(o, 0 /* a lie */, off, len);
extent.oloc.pool = data_ctx.get_id();
extent.buffer_extents.push_back(make_pair(0, len));
void ImageCtx::write_to_cache(object_t o, bufferlist& bl, size_t len,
uint64_t off) {
- snap_lock.Lock();
+ snap_lock.get_read();
ObjectCacher::OSDWrite *wr = object_cacher->prepare_write(snapc, bl,
utime_t(), 0);
- snap_lock.Unlock();
+ snap_lock.put_read();
ObjectExtent extent(o, 0, off, len);
extent.oloc.pool = data_ctx.get_id();
extent.buffer_extents.push_back(make_pair(0, len));
}
void ImageCtx::shutdown_cache() {
- md_lock.Lock();
+ md_lock.get_write();
invalidate_cache();
- md_lock.Unlock();
+ md_lock.put_write();
object_cacher->stop();
}
void ImageCtx::invalidate_cache() {
- assert(md_lock.is_locked());
if (!object_cacher)
return;
cache_lock.Lock();
size_t ImageCtx::parent_io_len(uint64_t offset, size_t length,
snap_t in_snap_id)
{
- assert(snap_lock.is_locked());
- assert(parent_lock.is_locked());
uint64_t overlap = 0;
get_parent_overlap(in_snap_id, &overlap);
void image_info(ImageCtx *ictx, image_info_t& info, size_t infosize)
{
int obj_order = ictx->order;
- ictx->md_lock.Lock();
- ictx->snap_lock.Lock();
+ ictx->md_lock.get_read();
+ ictx->snap_lock.get_read();
info.size = ictx->get_image_size(ictx->snap_id);
- ictx->snap_lock.Unlock();
- ictx->md_lock.Unlock();
+ ictx->snap_lock.put_read();
+ ictx->md_lock.put_read();
info.obj_size = 1ULL << obj_order;
info.num_objs = howmany(info.size, ictx->get_object_size());
info.order = obj_order;
void trim_image(ImageCtx *ictx, uint64_t newsize, ProgressContext& prog_ctx)
{
- assert(ictx->md_lock.is_locked());
CephContext *cct = (CephContext *)ictx->data_ctx.cct();
uint64_t size = ictx->get_current_size();
uint64_t ver;
if (ictx) {
- assert(ictx->md_lock.is_locked());
ictx->refresh_lock.Lock();
ldout(ictx->cct, 20) << "notify_change refresh_seq = " << ictx->refresh_seq
<< " last_refresh = " << ictx->last_refresh << dendl;
int rollback_image(ImageCtx *ictx, uint64_t snap_id,
ProgressContext& prog_ctx)
{
- assert(ictx->md_lock.is_locked());
uint64_t numseg = ictx->get_num_objects();
uint64_t bsize = ictx->get_object_size();
if (r < 0)
return r;
- Mutex::Locker l(ictx->md_lock);
+ RWLock::RLocker l(ictx->md_lock);
do {
r = add_snap(ictx, snap_name);
} while (r == -ESTALE);
if (r < 0)
return r;
- Mutex::Locker l(ictx->md_lock);
+ RWLock::RLocker l(ictx->md_lock);
snap_t snap_id;
{
// block for purposes of auto-destruction of l2 on early return
- Mutex::Locker l2(ictx->snap_lock);
+ RWLock::RLocker l2(ictx->snap_lock);
snap_id = ictx->get_snap_id(snap_name);
if (snap_id == CEPH_NOSNAP)
return -ENOENT;
parent_spec our_pspec;
- Mutex::Locker l3(ictx->parent_lock);
+ RWLock::RLocker l3(ictx->parent_lock);
r = ictx->get_parent_spec(snap_id, &our_pspec);
if (r < 0) {
lderr(ictx->cct) << "snap_remove: can't get parent spec" << dendl;
if (r < 0)
return r;
- Mutex::Locker l(ictx->md_lock);
- Mutex::Locker l2(ictx->snap_lock);
+ 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 (is_protected)
return -EBUSY;
-
+
r = cls_client::set_protection_status(&ictx->md_ctx,
ictx->header_oid,
snap_id,
if (r < 0)
return r;
- Mutex::Locker l(ictx->md_lock);
- Mutex::Locker l2(ictx->snap_lock);
+ 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 (r < 0)
return r;
- Mutex::Locker l(ictx->snap_lock);
+ RWLock::RLocker l(ictx->snap_lock);
bool is_unprotected;
r = ictx->is_snap_unprotected(snap_name, &is_unprotected);
// consider both PROTECTED or UNPROTECTING to be 'protected',
goto err_close_parent;
}
- p_imctx->md_lock.Lock();
- p_imctx->snap_lock.Lock();
+ p_imctx->md_lock.get_read();
+ p_imctx->snap_lock.get_read();
p_imctx->get_features(p_imctx->snap_id, &p_features);
size = p_imctx->get_image_size(p_imctx->snap_id);
p_imctx->is_snap_protected(p_imctx->snap_name, &snap_protected);
- p_imctx->snap_lock.Unlock();
- p_imctx->md_lock.Unlock();
+ p_imctx->snap_lock.put_read();
+ p_imctx->md_lock.put_read();
if ((p_features & RBD_FEATURE_LAYERING) != RBD_FEATURE_LAYERING) {
lderr(cct) << "parent image must support layering" << dendl;
goto err_close_child;
}
- p_imctx->md_lock.Lock();
+ p_imctx->md_lock.get_write();
r = ictx_refresh(p_imctx);
- p_imctx->md_lock.Unlock();
+ p_imctx->md_lock.put_write();
if (r == 0) {
- p_imctx->snap_lock.Lock();
+ p_imctx->snap_lock.get_read();
r = p_imctx->is_snap_protected(p_imctx->snap_name, &snap_protected);
- p_imctx->snap_lock.Unlock();
+ p_imctx->snap_lock.put_read();
}
if (r < 0 || !snap_protected) {
// we lost the race with unprotect
int r = ictx_check(ictx);
if (r < 0)
return r;
- Mutex::Locker l(ictx->md_lock);
- Mutex::Locker l2(ictx->snap_lock);
+ RWLock::RLocker l(ictx->md_lock);
+ RWLock::RLocker l2(ictx->snap_lock);
*size = ictx->get_image_size(ictx->snap_id);
return 0;
}
int r = ictx_check(ictx);
if (r < 0)
return r;
- Mutex::Locker l(ictx->md_lock);
- Mutex::Locker l2(ictx->snap_lock);
+ RWLock::RLocker l(ictx->md_lock);
+ RWLock::RLocker l2(ictx->snap_lock);
return ictx->get_features(ictx->snap_id, features);
}
int r = ictx_check(ictx);
if (r < 0)
return r;
- Mutex::Locker l(ictx->snap_lock);
- Mutex::Locker l2(ictx->parent_lock);
+ RWLock::RLocker l(ictx->snap_lock);
+ RWLock::RLocker l2(ictx->parent_lock);
return ictx->get_parent_overlap(ictx->snap_id, overlap);
}
int open_parent(ImageCtx *ictx)
{
- assert(ictx->snap_lock.is_locked());
- assert(ictx->parent_lock.is_locked());
string pool_name;
Rados rados(ictx->md_ctx);
return r;
}
- ictx->parent->snap_lock.Lock();
+ ictx->parent->snap_lock.get_write();
r = ictx->parent->get_snap_name(parent_snap_id, &ictx->parent->snap_name);
if (r < 0) {
lderr(ictx->cct) << "parent snapshot does not exist" << dendl;
- ictx->parent->snap_lock.Unlock();
+ ictx->parent->snap_lock.put_write();
close_image(ictx->parent);
ictx->parent = NULL;
return r;
}
ictx->parent->snap_set(ictx->parent->snap_name);
- ictx->parent->snap_lock.Unlock();
+ ictx->parent->snap_lock.put_write();
return 0;
}
if (r < 0)
return r;
- Mutex::Locker l(ictx->snap_lock);
- Mutex::Locker l2(ictx->parent_lock);
+ RWLock::RLocker l(ictx->snap_lock);
+ RWLock::RLocker l2(ictx->parent_lock);
parent_spec parent_spec;
}
if (parent_snap_name) {
- Mutex::Locker l(ictx->parent->snap_lock);
+ RWLock::RLocker l(ictx->parent->snap_lock);
r = ictx->parent->get_snap_name(parent_spec.snap_id,
parent_snap_name);
if (r < 0) {
old_format = ictx->old_format;
unknown_format = false;
id = ictx->id;
- ictx->md_lock.Lock();
+ ictx->md_lock.get_read();
trim_image(ictx, 0, prog_ctx);
- ictx->md_lock.Unlock();
+ ictx->md_lock.put_read();
- ictx->parent_lock.Lock();
+ ictx->parent_lock.get_read();
// struct assignment
parent_info parent_info = ictx->parent_md;
- ictx->parent_lock.Unlock();
+ ictx->parent_lock.put_read();
r = cls_client::remove_child(&ictx->md_ctx, RBD_CHILDREN,
parent_info.spec, id);
int resize_helper(ImageCtx *ictx, uint64_t size, ProgressContext& prog_ctx)
{
- assert(ictx->md_lock.is_locked());
CephContext *cct = ictx->cct;
if (size == ictx->size) {
if (r < 0)
return r;
- Mutex::Locker l(ictx->md_lock);
+ RWLock::WLocker l(ictx->md_lock);
if (size < ictx->size && ictx->object_cacher) {
// need to invalidate since we're deleting objects, and
// ObjectCacher doesn't track non-existent objects
return r;
bufferlist bl, bl2;
- Mutex::Locker l(ictx->snap_lock);
+ RWLock::RLocker l(ictx->snap_lock);
for (map<string, SnapInfo>::iterator it = ictx->snaps_by_name.begin();
it != ictx->snaps_by_name.end(); ++it) {
snap_info_t info;
int add_snap(ImageCtx *ictx, const char *snap_name)
{
- assert(ictx->md_lock.is_locked());
-
uint64_t snap_id;
int r = ictx->md_ctx.selfmanaged_snap_create(&snap_id);
int rm_snap(ImageCtx *ictx, const char *snap_name)
{
- assert(ictx->md_lock.is_locked());
-
int r;
if (ictx->old_format) {
r = cls_client::old_snapshot_remove(&ictx->md_ctx,
ictx->header_oid, snap_name);
} else {
- Mutex::Locker l(ictx->snap_lock);
+ RWLock::RLocker l(ictx->snap_lock);
r = cls_client::snapshot_remove(&ictx->md_ctx,
ictx->header_oid,
ictx->get_snap_id(snap_name));
ictx->refresh_lock.Unlock();
if (needs_refresh) {
- Mutex::Locker l(ictx->md_lock);
+ RWLock::WLocker l(ictx->md_lock);
int r = ictx_refresh(ictx);
if (r < 0) {
}
int refresh_parent(ImageCtx *ictx) {
- assert(ictx->snap_lock.is_locked());
- assert(ictx->parent_lock.is_locked());
// close the parent if it changed or this image no longer needs
// to read from it
int r;
int ictx_refresh(ImageCtx *ictx)
{
CephContext *cct = ictx->cct;
- assert(ictx->md_lock.is_locked());
bufferlist bl, bl2;
ldout(cct, 20) << "ictx_refresh " << ictx << dendl;
vector<parent_info> snap_parents;
vector<uint8_t> snap_protection;
{
- Mutex::Locker l(ictx->snap_lock);
+ RWLock::WLocker l(ictx->snap_lock);
{
- Mutex::Locker l2(ictx->parent_lock);
+ RWLock::WLocker l2(ictx->parent_lock);
ictx->lockers.clear();
if (ictx->old_format) {
r = read_header(ictx->md_ctx, ictx->header_oid, &ictx->header, NULL);
if (r < 0)
return r;
- Mutex::Locker l(ictx->md_lock);
- Mutex::Locker l2(ictx->snap_lock);
+ RWLock::WLocker l(ictx->md_lock);
+ RWLock::WLocker l2(ictx->snap_lock);
if (!ictx->snap_exists)
return -ENOENT;
<< " -> " << destname << dendl;
int order = src->order;
- src->md_lock.Lock();
- src->snap_lock.Lock();
+ src->md_lock.get_read();
+ src->snap_lock.get_read();
uint64_t src_size = src->get_image_size(src->snap_id);
- src->snap_lock.Unlock();
- src->md_lock.Unlock();
+ src->snap_lock.put_read();
+ src->md_lock.put_read();
int r = create(dest_md_ctx, destname, src_size, src->old_format,
src->features, &order, src->stripe_unit, src->stripe_count);
{
CopyProgressCtx cp(prog_ctx);
- src->md_lock.Lock();
- src->snap_lock.Lock();
+ src->md_lock.get_read();
+ src->snap_lock.get_read();
uint64_t src_size = src->get_image_size(src->snap_id);
- src->snap_lock.Unlock();
- src->md_lock.Unlock();
+ src->snap_lock.put_read();
+ src->md_lock.put_read();
- dest->md_lock.Lock();
- dest->snap_lock.Lock();
+ dest->md_lock.get_read();
+ dest->snap_lock.get_read();
uint64_t dest_size = dest->get_image_size(dest->snap_id);
- dest->snap_lock.Unlock();
- dest->md_lock.Unlock();
+ dest->snap_lock.put_read();
+ dest->md_lock.put_read();
if (dest_size < src_size) {
lderr(src->cct) << " src size " << src_size << " != dest size " << dest_size << dendl;
int _snap_set(ImageCtx *ictx, const char *snap_name)
{
- Mutex::Locker l1(ictx->snap_lock);
- Mutex::Locker l2(ictx->parent_lock);
+ RWLock::WLocker l1(ictx->snap_lock);
+ RWLock::WLocker l2(ictx->parent_lock);
int r;
if ((snap_name != NULL) && (strlen(snap_name) != 0)) {
r = ictx->snap_set(snap_name);
}
}
- ictx->md_lock.Lock();
+ ictx->md_lock.get_write();
r = ictx_refresh(ictx);
- ictx->md_lock.Unlock();
+ ictx->md_lock.put_write();
if (r < 0)
goto err_close;
return r;
}
- Mutex::Locker l(ictx->md_lock);
- Mutex::Locker l2(ictx->snap_lock);
- Mutex::Locker l3(ictx->parent_lock);
+ uint64_t object_size;
+ uint64_t period;
+ uint64_t overlap;
+ uint64_t overlap_periods;
+ uint64_t overlap_objects;
- // can't flatten a non-clone
- if (ictx->parent_md.spec.pool_id == -1) {
- lderr(ictx->cct) << "image has no parent" << dendl;
- return -EINVAL;
- }
- if (ictx->snap_id != CEPH_NOSNAP || ictx->read_only) {
- lderr(ictx->cct) << "snapshots cannot be flattened" << dendl;
- return -EROFS;
- }
+ {
+ RWLock::RLocker l(ictx->md_lock);
+ RWLock::RLocker l2(ictx->snap_lock);
+ RWLock::RLocker l3(ictx->parent_lock);
- assert(ictx->parent != NULL);
- assert(ictx->parent_md.overlap <= ictx->size);
+ // can't flatten a non-clone
+ if (ictx->parent_md.spec.pool_id == -1) {
+ lderr(ictx->cct) << "image has no parent" << dendl;
+ return -EINVAL;
+ }
+ if (ictx->snap_id != CEPH_NOSNAP || ictx->read_only) {
+ lderr(ictx->cct) << "snapshots cannot be flattened" << dendl;
+ return -EROFS;
+ }
- uint64_t object_size = ictx->get_object_size();
- uint64_t period = ictx->get_stripe_period();
- uint64_t overlap = ictx->parent_md.overlap;
- uint64_t overlap_periods = (overlap + period - 1) / period;
- uint64_t overlap_objects = overlap_periods * ictx->get_stripe_count();
+ assert(ictx->parent != NULL);
+ assert(ictx->parent_md.overlap <= ictx->size);
+
+ object_size = ictx->get_object_size();
+ period = ictx->get_stripe_period();
+ overlap = ictx->parent_md.overlap;
+ overlap_periods = (overlap + period - 1) / period;
+ overlap_objects = overlap_periods * ictx->get_stripe_count();
+ }
char *buf = new char[object_size];
uint64_t object_overlap = ictx->prune_parent_extents(objectx, overlap);
assert(object_overlap <= object_size);
+ RWLock::RLocker l(ictx->parent_lock);
if ((r = read(ictx->parent, objectx, buf, NULL)) < 0) {
lderr(ictx->cct) << "reading from parent failed" << dendl;
goto err;
// and if there are no snaps, remove from the children object as well
// (if snapshots remain, they have their own parent info, and the child
// will be removed when the last snap goes away)
+ ictx->snap_lock.get_read();
if (ictx->snaps.empty()) {
ldout(ictx->cct, 2) << "removing child from children list..." << dendl;
int r = cls_client::remove_child(&ictx->md_ctx, RBD_CHILDREN,
ictx->parent_md.spec, ictx->id);
if (r < 0) {
lderr(ictx->cct) << "error removing child from children list" << dendl;
+ ictx->snap_lock.put_read();
return r;
}
}
+ ictx->snap_lock.put_read();
notify_change(ictx->md_ctx, ictx->header_oid, NULL, ictx);
ldout(ictx->cct, 20) << "finished flattening" << dendl;
if (r < 0)
return r;
- Mutex::Locker locker(ictx->md_lock);
+ RWLock::RLocker locker(ictx->md_lock);
if (exclusive)
*exclusive = ictx->exclusive_locked;
if (tag)
* checks that we think we will succeed. But for now, let's not
* duplicate that code.
*/
- Mutex::Locker locker(ictx->md_lock);
+ RWLock::RLocker locker(ictx->md_lock);
r = rados::cls::lock::lock(&ictx->md_ctx, ictx->header_oid, RBD_LOCK_NAME,
exclusive ? LOCK_EXCLUSIVE : LOCK_SHARED,
cookie, tag, "", utime_t(), 0);
if (r < 0)
return r;
- Mutex::Locker locker(ictx->md_lock);
+ RWLock::RLocker locker(ictx->md_lock);
r = rados::cls::lock::unlock(&ictx->md_ctx, ictx->header_oid,
RBD_LOCK_NAME, cookie);
if (r < 0)
<< "'" << dendl;
return -EINVAL;
}
- Mutex::Locker locker(ictx->md_lock);
+ RWLock::RLocker locker(ictx->md_lock);
r = rados::cls::lock::break_lock(&ictx->md_ctx, ictx->header_oid,
RBD_LOCK_NAME, cookie, lock_client);
if (r < 0)
// validate extent against image size; clip to image size if necessary
int clip_io(ImageCtx *ictx, uint64_t off, uint64_t *len)
{
- ictx->md_lock.Lock();
- ictx->snap_lock.Lock();
+ ictx->md_lock.get_read();
+ ictx->snap_lock.get_read();
uint64_t image_size = ictx->get_image_size(ictx->snap_id);
bool snap_exists = ictx->snap_exists;
- ictx->snap_lock.Unlock();
- ictx->md_lock.Unlock();
+ ictx->snap_lock.put_read();
+ ictx->md_lock.put_read();
if (!snap_exists)
return -ENOENT;
if (r < 0)
return r;
- ictx->snap_lock.Lock();
+ ictx->snap_lock.get_read();
snapid_t snap_id = ictx->snap_id;
::SnapContext snapc = ictx->snapc;
- ictx->parent_lock.Lock();
+ ictx->parent_lock.get_read();
uint64_t overlap = 0;
ictx->get_parent_overlap(ictx->snap_id, &overlap);
- ictx->parent_lock.Unlock();
- ictx->snap_lock.Unlock();
+ ictx->parent_lock.put_read();
+ ictx->snap_lock.put_read();
if (snap_id != CEPH_NOSNAP || ictx->read_only)
return -EROFS;
return r;
// TODO: check for snap
- ictx->snap_lock.Lock();
+ ictx->snap_lock.get_read();
snapid_t snap_id = ictx->snap_id;
::SnapContext snapc = ictx->snapc;
- ictx->parent_lock.Lock();
+ ictx->parent_lock.get_read();
uint64_t overlap = 0;
ictx->get_parent_overlap(ictx->snap_id, &overlap);
- ictx->parent_lock.Unlock();
- ictx->snap_lock.Unlock();
+ ictx->parent_lock.put_read();
+ ictx->snap_lock.put_read();
if (snap_id != CEPH_NOSNAP || ictx->read_only)
return -EROFS;
if (r < 0)
return r;
- ictx->snap_lock.Lock();
+ ictx->snap_lock.get_read();
snap_t snap_id = ictx->snap_id;
- ictx->snap_lock.Unlock();
+ ictx->snap_lock.put_read();
// map
map<object_t,vector<ObjectExtent> > object_extents;