]> git.apps.os.sepia.ceph.com Git - ceph.git/commit
librbd: diff-iterate reports incorrect offsets in fast-diff mode
authorIlya Dryomov <idryomov@gmail.com>
Tue, 4 Jan 2022 19:38:35 +0000 (20:38 +0100)
committerCory Snyder <csnyder@iland.com>
Tue, 11 Jan 2022 20:55:56 +0000 (15:55 -0500)
commitb508f64aa492c26c63323d30a7002b48187db19b
treec6562fc8f0ea57ac6df1af39611355496e147979
parentb78870188b9f298f2d65594d7afb6e2019bff155
librbd: diff-iterate reports incorrect offsets in fast-diff mode

If rbd_diff_iterate2() is called on an image offset that doesn't
correspond to an object boundary, the callback is invoked with an
incorrect image offset.  For example, assuming a fully allocated
image, a diff request for 806354944~57344 results in offs=807403520,
len=57344, exists=true invocation, which is ahead by 1048576 bytes.
This occurs only in fast-diff mode, for a diff request on an image
with the fast-diff feature disabled or if whole_object parameter is
set to false the invocation is correct.

This bug goes back to the introduction of fast-diff mode in commit
6d5b969d4206 ("librbd: add diff_iterate2 to API").

Fixes: https://tracker.ceph.com/issues/53784
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
(cherry picked from commit ea07d1e834018c693fc03637d338806f3c2f494f)

Conflicts:
src/librbd/api/DiffIterate.cc

Cherry-pick notes:
- Octopus still has explicit iterator syntax in for loop for extents
src/librbd/api/DiffIterate.cc
src/test/librbd/test_librbd.cc