ceph: fix object striping calculation for non-default striping schemes
authorSage Weil <sage@newdream.net>
Wed, 28 Oct 2009 22:15:05 +0000 (15:15 -0700)
committerSage Weil <sage@newdream.net>
Thu, 29 Oct 2009 00:45:41 +0000 (17:45 -0700)
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>
fs/ceph/osdmap.c

index a9a4143234faa3fd1ad2f670fc3da29ab6eb8a05..5a5520c5a2b3db21613a806e9d911b917e7e5d86 100644 (file)
@@ -723,7 +723,7 @@ bad:
  */
 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);
@@ -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;