Skip to content

Commit

Permalink
ceph: fix intra strip unit length calculation
Browse files Browse the repository at this point in the history
Commit 645a102 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: Noah Watkins <noah@noahdesu.com>
Signed-off-by: Sage Weil <sage@newdream.net>
  • Loading branch information
Noah Watkins authored and Sage Weil committed Oct 30, 2009
1 parent 645a102 commit ff1d1f7
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions fs/ceph/osdmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;

*oxlen = min_t(u64, *plen, su - *oxoff);
su_offset = do_div(t, su);
*oxoff = su_offset + (stripeno % su_per_object) * su;

/*
* 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);
Expand Down

0 comments on commit ff1d1f7

Please sign in to comment.