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);
}
}
+
+
/*
* 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,
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;
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);
}
/*