From: Jason Dillaman Date: Fri, 27 Mar 2015 06:44:50 +0000 (-0400) Subject: librbd: snap_remove proxy requests require fast diff feature X-Git-Tag: v9.0.1~55^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=883169f73902cfdf706a75ab21295650a8a5ca0b;p=ceph.git librbd: snap_remove proxy requests require fast diff feature Since older Ceph clients that support exclusive locking won't support snap_remove, only attempt to proxy the command if fast diff is enabled. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 7ceed9982e33..532f10219b7f 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -748,20 +748,29 @@ int invoke_async_request(ImageCtx *ictx, const std::string& request_type, if (r < 0) return r; + bool fast_diff_enabled = false; { RWLock::RLocker snap_locker(ictx->snap_lock); if (ictx->get_snap_id(snap_name) == CEPH_NOSNAP) { return -ENOENT; } + fast_diff_enabled = ((ictx->features & RBD_FEATURE_FAST_DIFF) != 0); } - r = invoke_async_request(ictx, "snap_remove", - boost::bind(&snap_remove_helper, ictx, _1, - snap_name), - boost::bind(&ImageWatcher::notify_snap_remove, - ictx->image_watcher, snap_name)); - if (r < 0 && r != -EEXIST) { - return r; + if (fast_diff_enabled) { + r = invoke_async_request(ictx, "snap_remove", + boost::bind(&snap_remove_helper, ictx, _1, + snap_name), + boost::bind(&ImageWatcher::notify_snap_remove, + ictx->image_watcher, snap_name)); + if (r < 0 && r != -EEXIST) { + return r; + } + } else { + r = snap_remove_helper(ictx, NULL, snap_name); + if (r < 0) { + return r; + } } notify_change(ictx->md_ctx, ictx->header_oid, ictx); @@ -772,9 +781,14 @@ int invoke_async_request(ImageCtx *ictx, const std::string& request_type, int snap_remove_helper(ImageCtx *ictx, Context *ctx, const char *snap_name) { - assert(ictx->owner_lock.is_locked()); - assert(!ictx->image_watcher->is_lock_supported() || - ictx->image_watcher->is_lock_owner()); + { + RWLock::RLocker snap_locker(ictx->snap_lock); + if ((ictx->features & RBD_FEATURE_FAST_DIFF) != 0) { + assert(ictx->owner_lock.is_locked()); + assert(!ictx->image_watcher->is_lock_supported() || + ictx->image_watcher->is_lock_owner()); + } + } ldout(ictx->cct, 20) << "snap_remove_helper " << ictx << " " << snap_name << dendl;