提交 ff1d1f71 编写于 作者: N Noah Watkins 提交者: Sage Weil

ceph: fix intra strip unit length calculation

Commit 645a1025 fixes calculation of object
offset for layouts with multiple stripes per object. This updates the
calculation of the length written to take into account multiple stripes per
object.
Signed-off-by: NNoah Watkins <noah@noahdesu.com>
Signed-off-by: NSage Weil <sage@newdream.net>
上级 645a1025
......@@ -731,7 +731,7 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
u32 sc = le32_to_cpu(layout->fl_stripe_count);
u32 bl, stripeno, stripepos, objsetno;
u32 su_per_object;
u64 t;
u64 t, su_offset;
dout("mapping %llu~%llu osize %u fl_su %u\n", off, *plen,
osize, su);
......@@ -755,10 +755,15 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
/* *oxoff = *off % layout->fl_stripe_unit; # offset in su */
t = off;
*oxoff = do_div(t, su);
*oxoff += (stripeno % su_per_object) * su;
su_offset = do_div(t, su);
*oxoff = su_offset + (stripeno % su_per_object) * su;
*oxlen = min_t(u64, *plen, su - *oxoff);
/*
* Calculate the length of the extent being written to the selected
* object. This is the minimum of the full length requested (plen) or
* the remainder of the current stripe being written to.
*/
*oxlen = min_t(u64, *plen, su - su_offset);
*plen = *oxlen;
dout(" obj extent %llu~%llu\n", *oxoff, *oxlen);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册