Skip to content

Commit

Permalink
ceph: fix object striping calculation for non-default striping schemes
Browse files Browse the repository at this point in the history
We were incorrectly calculationing of object offset.  If we have multiple
stripe units per object, we need to shift to the start of the current
su in addition to the offset within the su.

Also rename bno to ono (object number) to avoid some variable naming
confusion.

Signed-off-by: Sage Weil <sage@newdream.net>
  • Loading branch information
Sage Weil committed Oct 29, 2009
1 parent 5600f5e commit 645a102
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions fs/ceph/osdmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -723,7 +723,7 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
*/
void ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
u64 off, u64 *plen,
u64 *bno,
u64 *ono,
u64 *oxoff, u64 *oxlen)
{
u32 osize = le32_to_cpu(layout->fl_object_size);
Expand All @@ -750,11 +750,14 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
stripepos = bl % sc;
objsetno = stripeno / su_per_object;

*bno = objsetno * sc + stripepos;
dout("objset %u * sc %u = bno %u\n", objsetno, sc, (unsigned)*bno);
/* *oxoff = *off % layout->fl_stripe_unit; */
*ono = objsetno * sc + stripepos;
dout("objset %u * sc %u = ono %u\n", objsetno, sc, (unsigned)*ono);

/* *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);
*plen = *oxlen;

Expand Down

0 comments on commit 645a102

Please sign in to comment.