From: Jason Dillaman Date: Thu, 7 May 2015 01:28:25 +0000 (-0400) Subject: librbd: fast diff should treat all _EXISTS objects as dirty X-Git-Tag: v9.0.2~226^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F4603%2Fhead;p=ceph.git librbd: fast diff should treat all _EXISTS objects as dirty With the fast-diff feature enabled, if the object map marks the object as _EXISTS, it can only occur due to a write -- otherwise it would be _EXISTS_CLEAN. Therefore, ensure it is properly flagged as an updated object for diff_iterate. Fixes: #11553 Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index c3f49b4df1a..94dbb73ff1b 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -139,9 +139,10 @@ int diff_object_map(ImageCtx* ictx, uint64_t from_snap_id, uint64_t to_snap_id, if (prev_object_map[i] != OBJECT_NONEXISTENT) { (*object_diff_state)[i] = OBJECT_DIFF_STATE_HOLE; } - } else if (prev_object_map[i] != object_map[i] && - !(prev_object_map[i] == OBJECT_EXISTS && - object_map[i] == OBJECT_EXISTS_CLEAN)) { + } else if (object_map[i] == OBJECT_EXISTS || + (prev_object_map[i] != object_map[i] && + !(prev_object_map[i] == OBJECT_EXISTS && + object_map[i] == OBJECT_EXISTS_CLEAN))) { (*object_diff_state)[i] = OBJECT_DIFF_STATE_UPDATED; } }