From: Sage Weil Date: Fri, 19 Mar 2010 20:24:39 +0000 (-0700) Subject: ceph: fix snap rebuild condition X-Git-Tag: v2.6.34-rc3~6^2~9 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ec4318bcb4c59d8b8bf7037c9f444a9887ccb265;p=platform%2Fkernel%2Flinux-exynos.git ceph: fix snap rebuild condition We were rebuilding the snap context when it was not necessary (i.e. when the realm seq hadn't changed _and_ the parent seq was still older), which caused page snapc pointers to not match the realm's snapc pointer (even though the snap context itself was identical). This confused begin_write and put it into an endless loop. The correct logic is: rebuild snapc if _my_ realm seq changed, or if my parent realm's seq is newer than mine (and thus mine needs to be rebuilt too). Signed-off-by: Sage Weil --- diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c index 8a43bc8..df04e21 100644 --- a/fs/ceph/snap.c +++ b/fs/ceph/snap.c @@ -314,9 +314,9 @@ static int build_snap_context(struct ceph_snap_realm *realm) because we rebuild_snap_realms() works _downward_ in hierarchy after each update.) */ if (realm->cached_context && - realm->cached_context->seq <= realm->seq && + realm->cached_context->seq == realm->seq && (!parent || - realm->cached_context->seq <= parent->cached_context->seq)) { + realm->cached_context->seq >= parent->cached_context->seq)) { dout("build_snap_context %llx %p: %p seq %lld (%d snaps)" " (unchanged)\n", realm->ino, realm, realm->cached_context,