ceph: fix intra strip unit length calculation
authorNoah Watkins <noah@noahdesu.com>
Fri, 30 Oct 2009 19:57:30 +0000 (12:57 -0700)
committerSage Weil <sage@newdream.net>
Fri, 30 Oct 2009 20:56:14 +0000 (13:56 -0700)
Commit 645a102581b3639836b17d147c35d574fd6e8267 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>
fs/ceph/osdmap.c

index 5a5520c5a2b3db21613a806e9d911b917e7e5d86..d62e111b8a342f3a4127238e113e01561fcafaa6 100644 (file)
@@ -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;
-
-       *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);