From 819c9800dfb92c935277a38d769cb7a93a8c79db Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 6 May 2015 21:28:25 -0400 Subject: [PATCH] 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 --- src/librbd/internal.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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; } } -- 2.47.3