From 39689fea49c3d0fd9dfcd7f6abc865f7d4a9697d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 28 Mar 2013 14:13:03 -0700 Subject: [PATCH] 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 --- src/librbd/internal.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 1340ba26f9424..b4594832c436d 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() -- 2.39.5