for (i = 0; i < client->osdc.osdmap->num_pools; i++) {
struct ceph_pg_pool_info *pool =
&client->osdc.osdmap->pg_pool[i];
- seq_printf(s, "pg_pool %d pg_num %d / %d, lpg_num %d / %d",
+ seq_printf(s, "pg_pool %d pg_num %d / %d, lpg_num %d / %d\n",
i, pool->v.pg_num, pool->pg_num_mask,
pool->v.lpg_num, pool->lpg_num_mask);
}
struct ceph_osd_request_head *head;
struct ceph_osd_op *op;
int num_ops;
- int opcode;
+ int opcode, olen;
int got, i;
got = radix_tree_gang_lookup(&osdc->request_tree,
head = req->r_request->front.iov_base;
op = (void *)(head + 1);
- seq_printf(s, "%llx.%08x.%llx\t",
- le64_to_cpu(head->oid.ino),
- le32_to_cpu(head->oid.bno),
- le64_to_cpu(head->oid.pad));
+ num_ops = le16_to_cpu(head->num_ops);
+ olen = le32_to_cpu(head->object_len);
+ seq_printf(s, "%.*s\t", olen,
+ (const char *)(head->ops + num_ops));
if (req->r_reassert_version.epoch)
seq_printf(s, "%u'%llu\t",
else
seq_printf(s, "\t");
- num_ops = le16_to_cpu(head->num_ops);
for (i = 0; i < num_ops; i++) {
opcode = le16_to_cpu(op->op);
seq_printf(s, "%s\t", ceph_osd_op_name(opcode));
seq_printf(s, "\n");
}
-
mutex_unlock(&osdc->request_mutex);
-
return 0;
}
struct ceph_osd_op *op = (void *)(reqhead + 1);
u64 orig_len = *plen;
u64 objoff, objlen; /* extent in object */
+ u64 bno;
- /* object extent? */
- reqhead->oid.ino = cpu_to_le64(vino.ino);
reqhead->snapid = cpu_to_le64(vino.snap);
- ceph_calc_file_object_mapping(layout, off, plen, &reqhead->oid,
+ /* object extent? */
+ ceph_calc_file_object_mapping(layout, off, plen, &bno,
&objoff, &objlen);
if (*plen < orig_len)
dout(10, " skipping last %llu, final file extent %llu~%llu\n",
orig_len - *plen, off, *plen);
+
+ sprintf(req->r_oid, "%llx.%08llx", vino.ino, bno);
+ req->r_oid_len = strlen(req->r_oid);
+
+
op->offset = cpu_to_le64(objoff);
op->length = cpu_to_le64(objlen);
req->r_num_pages = calc_pages_for(off, *plen);
- dout(10, "calc_layout %llx.%08x %llu~%llu (%d pages)\n",
- le64_to_cpu(reqhead->oid.ino), le32_to_cpu(reqhead->oid.bno),
- objoff, objlen, req->r_num_pages);
+ dout(10, "calc_layout %s (%d) %llu~%llu (%d pages)\n",
+ req->r_oid, req->r_oid_len, objoff, objlen, req->r_num_pages);
}
struct ceph_msg *msg;
struct ceph_osd_request_head *head;
struct ceph_osd_op *op;
- __le64 *snaps;
- void *ticketp;
+ void *p;
int do_trunc = truncate_seq && (off + *plen > truncate_size);
int num_op = 1 + do_sync + do_trunc;
size_t msg_size = sizeof(*head) + num_op*sizeof(*op);
WARN_ON((flags & (CEPH_OSD_FLAG_READ|CEPH_OSD_FLAG_WRITE)) == 0);
- /* create message */
- msg_size += osdc->client->signed_ticket_len;
+ /* create message; allow space for oid */
+ msg_size += 40 + osdc->client->signed_ticket_len;
if (snapc)
msg_size += sizeof(u64) * snapc->num_snaps;
msg = ceph_msg_new(CEPH_MSG_OSD_OP, msg_size, 0, 0, NULL);
memset(msg->front.iov_base, 0, msg->front.iov_len);
head = msg->front.iov_base;
op = (void *)(head + 1);
- ticketp = (void *)(op + num_op);
- snaps = ticketp + osdc->client->signed_ticket_len;
+ p = (void *)(op + num_op);
- head->ticket_len = cpu_to_le32(osdc->client->signed_ticket_len);
- memcpy(ticketp, osdc->client->signed_ticket,
- osdc->client->signed_ticket_len);
+ req->r_request = msg;
+ req->r_snapc = ceph_get_snap_context(snapc);
head->client_inc = cpu_to_le32(1); /* always, for now. */
head->flags = cpu_to_le32(flags);
head->num_ops = cpu_to_le16(num_op);
op->op = cpu_to_le16(opcode);
- req->r_request = msg;
- req->r_snapc = ceph_get_snap_context(snapc);
-
/* calculate max write size */
calc_layout(osdc, vino, layout, off, plen, req);
req->r_file_layout = *layout; /* keep a copy */
req->r_request->hdr.data_len = cpu_to_le32(*plen);
}
+ /* fill in oid, ticket */
+ head->object_len = cpu_to_le32(req->r_oid_len);
+ memcpy(p, req->r_oid, req->r_oid_len);
+ p += req->r_oid_len;
+
+ head->ticket_len = cpu_to_le32(osdc->client->signed_ticket_len);
+ memcpy(p, osdc->client->signed_ticket,
+ osdc->client->signed_ticket_len);
+ p += osdc->client->signed_ticket_len;
+
+
/* additional ops */
if (do_trunc) {
op++;
if (snapc) {
head->snap_seq = cpu_to_le64(snapc->seq);
head->num_snaps = cpu_to_le32(snapc->num_snaps);
- for (i = 0; i < snapc->num_snaps; i++)
- snaps[i] = cpu_to_le64(snapc->snaps[i]);
+ for (i = 0; i < snapc->num_snaps; i++) {
+ *(__le64 *)p = cpu_to_le64(snapc->snaps[i]);
+ p += sizeof(u64);
+ }
}
+
+ BUG_ON(p > msg->front.iov_base + msg->front.iov_len);
return req;
}
int i, num;
int err;
- err = ceph_calc_object_layout(&reqhead->layout, &reqhead->oid,
+ err = ceph_calc_object_layout(&reqhead->layout, req->r_oid,
&req->r_file_layout, osdc->osdmap);
if (err)
return err;
struct ceph_osd_reply_head *rhead = msg->front.iov_base;
struct ceph_osd_request *req;
u64 tid;
- int numops, flags;
+ int numops, object_len, flags;
if (msg->front.iov_len < sizeof(*rhead))
goto bad;
tid = le64_to_cpu(rhead->tid);
numops = le32_to_cpu(rhead->num_ops);
- if (msg->front.iov_len != sizeof(*rhead) +
+ object_len = le32_to_cpu(rhead->object_len);
+ if (msg->front.iov_len != sizeof(*rhead) + object_len +
numops * sizeof(struct ceph_osd_op))
goto bad;
dout(10, "handle_reply %p tid %llu\n", msg, tid);
*/
void ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
u64 off, u64 *plen,
- struct ceph_object *oid,
+ u64 *bno,
u64 *oxoff, u64 *oxlen)
{
u32 osize = le32_to_cpu(layout->fl_object_size);
stripepos = bl % sc;
objsetno = stripeno / su_per_object;
- oid->bno = cpu_to_le32(objsetno * sc + stripepos);
- dout(80, "objset %u * sc %u = bno %u\n", objsetno, sc, oid->bno);
+ *bno = cpu_to_le32(objsetno * sc + stripepos);
+ dout(80, "objset %u * sc %u = bno %u\n", objsetno, sc, (unsigned)*bno);
/* *oxoff = *off / layout->fl_stripe_unit; */
t = off;
*oxoff = do_div(t, su);
* file_layout, and osdmap
*/
int ceph_calc_object_layout(struct ceph_object_layout *ol,
- struct ceph_object *oid,
+ const char *oid,
struct ceph_file_layout *fl,
struct ceph_osdmap *osdmap)
{
unsigned num, num_mask;
union ceph_pg pgid;
- u64 ino = le64_to_cpu(oid->ino);
- unsigned bno = le32_to_cpu(oid->bno);
s32 preferred = (s32)le32_to_cpu(fl->fl_pg_preferred);
int poolid = le32_to_cpu(fl->fl_pg_pool);
struct ceph_pg_pool_info *pool;
}
pgid.pg64 = 0; /* start with it zeroed out */
- pgid.pg.ps = bno + crush_hash32_2(ino, ino>>32);
+ pgid.pg.ps = ceph_full_name_hash(oid, strlen(oid));
pgid.pg.preferred = preferred;
pgid.pg.pool = le32_to_cpu(fl->fl_pg_pool);