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 <sage@newdream.net>
This commit is contained in:
parent
87b315a5b5
commit
ec4318bcb4
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue