From: Sage Weil Date: Thu, 28 Mar 2013 21:13:03 +0000 (-0700) Subject: librbd: fix diff_iterate arithmetic for non-standard striping X-Git-Tag: v0.62~118^2~34 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=39689fea49c3d0fd9dfcd7f6abc865f7d4a9697d;p=ceph.git librbd: fix diff_iterate arithmetic for non-standard striping This code is confusing because we are moving back and forth between image offsets, "buffer" offsets (image offsets relative to off), and object offsets. Fix the math. Signed-off-by: Sage Weil --- diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 1340ba26f942..b4594832c436 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2400,7 +2400,7 @@ reprotect_and_return_err: for (vector >::iterator r = q->buffer_extents.begin(); r != q->buffer_extents.end(); ++r) { - interval_set overlap; + interval_set overlap; // object extents overlap.insert(opos, r->second); overlap.intersection_of(diff); ldout(ictx->cct, 20) << " opos " << opos @@ -2410,7 +2410,8 @@ reprotect_and_return_err: for (interval_set::iterator s = overlap.begin(); s != overlap.end(); ++s) { - uint64_t logical_off = off + s.get_start(); + uint64_t su_off = s.get_start() - opos; + uint64_t logical_off = off + r->first + su_off; ldout(ictx->cct, 20) << " overlap extent " << s.get_start() << "~" << s.get_len() << " logical " << logical_off << "~" << s.get_len()