]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: fix file to object mapping
authorSage Weil <sage@newdream.net>
Mon, 6 Oct 2008 22:48:03 +0000 (15:48 -0700)
committerSage Weil <sage@newdream.net>
Mon, 6 Oct 2008 22:48:03 +0000 (15:48 -0700)
We ignore cases where the stripe_unit is small, for now, as that will require
passing a stride size back to the caller so that the correctly spaced
pages are used.

src/kernel/osd_client.c
src/kernel/osdmap.c
src/kernel/osdmap.h

index fbff834a128dad808be2d36f8a2ce94999df2a72..c7a7847c2126b238d063a116a24b071a3e9dde21 100644 (file)
@@ -39,26 +39,27 @@ static void calc_layout(struct ceph_osd_client *osdc,
                        struct ceph_osd_request *req)
 {
        struct ceph_osd_request_head *reqhead = req->r_request->front.iov_base;
-       __u64 toff = off, tlen = *plen;
+       __u64 orig_len = *plen;
+       __u64 objoff, objlen;
 
        reqhead->oid.ino = vino.ino;
        reqhead->oid.snap = vino.snap;
 
-       calc_file_object_mapping(layout, &toff, &tlen, &reqhead->oid,
-                                &off, plen);
-       if (tlen != 0)
+       calc_file_object_mapping(layout, off, plen, &reqhead->oid,
+                                &objoff, &objlen);
+       if (*plen < orig_len)
                dout(10, " skipping last %llu, writing  %llu~%llu\n",
-                    tlen, off, *plen);
-       reqhead->offset = cpu_to_le64(off);
-       reqhead->length = cpu_to_le64(*plen);
+                    orig_len - *plen, off, *plen);
+       reqhead->offset = cpu_to_le64(objoff);
+       reqhead->length = cpu_to_le64(objlen);
 
        calc_object_layout(&reqhead->layout, &reqhead->oid, layout,
                           osdc->osdmap);
        req->r_num_pages = calc_pages_for(off, *plen);
 
-       dout(10, "calc_layout bno %u on %llu~%llu pgid %llx (%d pages)\n",
-            le32_to_cpu(reqhead->oid.bno), off, *plen,
-            le64_to_cpu(reqhead->layout.ol_pgid),
+       dout(10, "calc_layout %08llx.%08x %llu~%llu pgid %llx (%d pages)\n",
+            le64_to_cpu(reqhead->oid.ino), le32_to_cpu(reqhead->oid.bno),
+            objoff, objlen, le64_to_cpu(reqhead->layout.ol_pgid),
             req->r_num_pages);
 }
 
index 89b20575879c2dc944a0d0501417d371227f16bc..513ae053fd2eb278edfcb1d8cea98609527da8fd 100644 (file)
@@ -559,27 +559,29 @@ bad:
 }
 
 
+
+
 /*
  * calculate file layout from given offset, length.
- * fill in correct oid and off,len within object.
- * update file offset,length to end of extent, or
- * the next file extent not included in current mapping.
+ * fill in correct oid, logical length, and object extent
+ * offset, length.
+ *
+ * for now, we write only a single su, until we can
+ * pass a stride back to the caller.
  */
 void calc_file_object_mapping(struct ceph_file_layout *layout,
-                             loff_t *off, loff_t *len,
+                             __u64 off, __u64 *plen,
                              struct ceph_object *oid,
                              __u64 *oxoff, __u64 *oxlen)
 {
        u32 osize = le32_to_cpu(layout->fl_object_size);
        u32 su = le32_to_cpu(layout->fl_stripe_unit);
        u32 sc = le32_to_cpu(layout->fl_stripe_count);
-       u32 stripe_len = layout->fl_stripe_count * layout->fl_stripe_unit;
        u32 bl, stripeno, stripepos, objsetno;
        u32 su_per_object;
-       u32 first_oxlen;
        u64 t;
 
-       dout(80, "mapping %llu~%llu  osize %u fl_su %u\n", *off, *len,
+       dout(80, "mapping %llu~%llu  osize %u fl_su %u\n", off, *plen,
             osize, su);
        su_per_object = osize / layout->fl_stripe_unit;
        dout(80, "osize %u / su %u = su_per_object %u\n", osize, su,
@@ -587,10 +589,10 @@ void calc_file_object_mapping(struct ceph_file_layout *layout,
 
        BUG_ON((su & ~PAGE_MASK) != 0);
        /* bl = *off / su; */
-       t = *off;
+       t = off;
        do_div(t, su);
        bl = t;
-       dout(80, "off %llu / su %u = bl %u\n", *off, su, bl);
+       dout(80, "off %llu / su %u = bl %u\n", off, su, bl);
        
        stripeno = bl / sc;
        stripepos = bl % sc;
@@ -599,21 +601,12 @@ void calc_file_object_mapping(struct ceph_file_layout *layout,
        oid->bno = objsetno * sc + stripepos;
        dout(80, "objset %u * sc %u = bno %u\n", objsetno, sc, oid->bno);
        /* *oxoff = *off / layout->fl_stripe_unit; */
-       t = *off;
-       *oxoff = do_div(t, le32_to_cpu(layout->fl_stripe_unit));
-       first_oxlen = min_t(loff_t, *len, le32_to_cpu(layout->fl_stripe_unit));
-       *oxlen = first_oxlen;
-
-       /* multiple stripe units across this object? */
-       t = *len;
-       while (t > stripe_len && *oxoff + *oxlen < osize) {
-               *oxlen += min_t(loff_t, su, t);
-               t -= stripe_len;
-       }
+       t = off;
+       *oxoff = do_div(t, su);
+       *oxlen = min_t(__u64, *plen, su - *oxoff);
+       *plen = *oxlen;
 
-       *off += first_oxlen;
-       *len -= *oxlen;
-       dout(80, " obj extent %llu~%llu\n", *off, *len);
+       dout(80, " obj extent %llu~%llu\n", *oxoff, *oxlen);
 }
 
 /*
index 4db3006e63f9e371c92808a32933cd0ddd69ec9f..41c5b0523ce9be63b75a2c9867bf02378f2f4dd8 100644 (file)
@@ -51,9 +51,10 @@ extern void osdmap_destroy(struct ceph_osdmap *map);
 extern struct ceph_osdmap *osdmap_decode(void **p, void *end);
 
 extern void calc_file_object_mapping(struct ceph_file_layout *layout,
-                                    loff_t *off, loff_t *len,
+                                    __u64 off, __u64 *plen,
                                     struct ceph_object *oid,
                                     __u64 *oxoff, __u64 *oxlen);
+
 extern void calc_object_layout(struct ceph_object_layout *ol,
                               struct ceph_object *oid,
                               struct ceph_file_layout *fl,