int librbd::RBDClient::rollback_image(PoolCtx *pp, ImageCtx *ictx, uint64_t snapid)
{
- assert(ictx->lock.is_locked());
-
uint64_t numseg = get_max_block(&(ictx->header));
for (uint64_t i = 0; i < numseg; i++) {
int librbd::RBDClient::create_snap(PoolCtx *pp, ImageCtx *ictx, const char *snap_name)
{
- ictx->lock.Lock();
int r = check_ictx(ictx);
- ictx->lock.Unlock();
if (r < 0)
return r;
int librbd::RBDClient::remove_snap(PoolCtx *pp, ImageCtx *ictx, const char *snap_name)
{
- ictx->lock.Lock();
int r = check_ictx(ictx);
- if (r < 0) {
- ictx->lock.Unlock();
+ if (r < 0)
return r;
- }
string md_oid = ictx->name;
md_oid += RBD_SUFFIX;
r = ictx->set_snap(snap_name);
- if (r < 0) {
- ictx->lock.Unlock();
+ if (r < 0)
return r;
- }
r = rados.set_snap_context(pp->data, ictx->snapc.seq, ictx->snaps);
- if (r < 0) {
- ictx->lock.Unlock();
+ if (r < 0)
return r;
- }
rados.set_snap(pp->data, ictx->snapid);
r = rm_snap(pp, md_oid, snap_name);
r = rados.selfmanaged_snap_remove(pp->data, ictx->snapid);
- ictx->lock.Unlock();
notify_change(pp->md, md_oid, NULL, ictx);
return r;
int librbd::RBDClient::info(PoolCtx *pp, ImageCtx *ictx, librbd::image_info_t& info)
{
- Mutex::Locker l(ictx->lock);
int r = check_ictx(ictx);
if (r < 0)
return r;
int librbd::RBDClient::resize(PoolCtx *pp, ImageCtx *ictx, uint64_t size)
{
- // Mutex::Locker l(ictx->lock);
- ictx->lock.Lock();
int r = check_ictx(ictx);
- if (r < 0) {
- ictx->lock.Unlock();
+ if (r < 0)
return r;
- }
+
string md_oid = ictx->name;
md_oid += RBD_SUFFIX;
// trim
if (size == ictx->header.image_size) {
dout(2) << "no change in size (" << size << " -> " << ictx->header.image_size << ")" << dendl;
- ictx->lock.Unlock();
return 0;
}
bufferlist bl;
bl.append((const char *)&(ictx->header), sizeof(ictx->header));
r = rados.write(pp->md, md_oid, 0, bl, bl.length());
- ictx->lock.Unlock();
if (r == -ERANGE)
derr << "operation might have conflicted with another client!" << dendl;
if (r < 0) {
int librbd::RBDClient::list_snaps(PoolCtx *pp, ImageCtx *ictx, std::vector<librbd::snap_info_t>& snaps)
{
- ictx->lock.Lock();
int r = check_ictx(ictx);
- ictx->lock.Unlock();
if (r < 0)
return r;
bufferlist bl, bl2;
int librbd::RBDClient::check_ictx(ImageCtx *ictx)
{
- assert(ictx->lock.is_locked());
+ ictx->lock.Lock();
+ bool needs_refresh = ictx->needs_refresh;
+ ictx->lock.Unlock();
+
int r = 0;
- if (ictx->needs_refresh)
+ if (needs_refresh)
r = refresh_ictx(ictx, NULL);
return r;
}
int librbd::RBDClient::refresh_ictx(ImageCtx *ictx, const char *snap_name)
{
- assert(ictx->lock.is_locked());
- if (!ictx->needs_refresh)
- return 0;
-
bufferlist bl, bl2;
PoolCtx *pp = ictx->pctx;
string md_oid = ictx->name;
}
}
+ ictx->lock.Lock();
ictx->needs_refresh = false;
+ ictx->lock.Unlock();
return 0;
}
int librbd::RBDClient::rollback_snap(PoolCtx *pp, ImageCtx *ictx, const char *snap_name)
{
- Mutex::Locker l(ictx->lock);
int r = check_ictx(ictx);
if (r < 0)
return r;
int librbd::RBDClient::set_snap(PoolCtx *pp, ImageCtx *ictx, const char *snap_name)
{
- ictx->lock.Lock();
int r = check_ictx(ictx);
- ictx->lock.Unlock();
if (r < 0)
return r;
string md_oid = ictx->name;
int librbd::RBDClient::open_image(PoolCtx *pctx, ImageCtx *ictx, const char *name, const char *snap_name)
{
- Mutex::Locker l(ictx->lock);
int r = refresh_ictx(ictx, snap_name);
if (r < 0)
return r;
md_oid += RBD_SUFFIX;
ictx->wctx->invalidate();
- ictx->lock.Lock();
rados.unwatch(ictx->pctx->md, md_oid, ictx->wctx->cookie);
delete ictx->wctx;
- ictx->lock.Unlock();
delete ictx;
ictx = NULL;
}
int (*cb)(off_t, size_t, const char *, void *),
void *arg)
{
- ictx->lock.Lock();
int r = check_ictx(ictx);
- ictx->lock.Unlock();
if (r < 0)
return r;
int64_t ret;
if (!len)
return 0;
- ictx->lock.Lock();
int r = check_ictx(ictx);
- ictx->lock.Unlock();
if (r < 0)
return r;
if (!len)
return 0;
- ictx->lock.Lock();
int r = check_ictx(ictx);
- ictx->lock.Unlock();
if (r < 0)
return r;
char *buf,
AioCompletion *c)
{
- ictx->lock.Lock();
int r = check_ictx(ictx);
- ictx->lock.Unlock();
if (r < 0)
return r;