From 82e9a9adf8838a60c016e883bb2d6757aa18846c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 3 Jun 2009 15:42:35 -0700 Subject: [PATCH] kclient: specify object id as string --- src/kernel/debugfs.c | 15 +++++------ src/kernel/osd_client.c | 60 +++++++++++++++++++++++++---------------- src/kernel/osd_client.h | 2 ++ src/kernel/osdmap.c | 12 ++++----- src/kernel/osdmap.h | 3 +-- 5 files changed, 51 insertions(+), 41 deletions(-) diff --git a/src/kernel/debugfs.c b/src/kernel/debugfs.c index 6e86290741686..554d4a66bd9e7 100644 --- a/src/kernel/debugfs.c +++ b/src/kernel/debugfs.c @@ -204,7 +204,7 @@ static int osdmap_show(struct seq_file *s, void *p) 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); } @@ -320,7 +320,7 @@ static int osdc_show(struct seq_file *s, void *p) 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, @@ -337,10 +337,10 @@ static int osdc_show(struct seq_file *s, void *p) 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", @@ -349,7 +349,6 @@ static int osdc_show(struct seq_file *s, void *p) 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)); @@ -358,9 +357,7 @@ static int osdc_show(struct seq_file *s, void *p) seq_printf(s, "\n"); } - mutex_unlock(&osdc->request_mutex); - return 0; } diff --git a/src/kernel/osd_client.c b/src/kernel/osd_client.c index 866133a297dbb..0d852e7e83e0b 100644 --- a/src/kernel/osd_client.c +++ b/src/kernel/osd_client.c @@ -32,23 +32,27 @@ static void calc_layout(struct ceph_osd_client *osdc, 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); } @@ -92,8 +96,7 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, 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); @@ -114,8 +117,8 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, 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); @@ -126,12 +129,10 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, 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); @@ -140,9 +141,6 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, 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 */ @@ -152,6 +150,17 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, 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++; @@ -168,9 +177,13 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, 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; } @@ -329,7 +342,7 @@ static int map_osds(struct ceph_osd_client *osdc, 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; @@ -422,13 +435,14 @@ void ceph_osdc_handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg) 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); diff --git a/src/kernel/osd_client.h b/src/kernel/osd_client.h index 1c5de22b2c9d2..9ad25590609fe 100644 --- a/src/kernel/osd_client.h +++ b/src/kernel/osd_client.h @@ -61,6 +61,8 @@ struct ceph_osd_request { struct inode *r_inode; /* for use by callbacks */ struct writeback_control *r_wbc; /* ditto */ + char r_oid[40]; /* object name */ + int r_oid_len; int r_last_osd; /* pg osds */ struct ceph_entity_addr r_last_osd_addr; unsigned long r_timeout_stamp; diff --git a/src/kernel/osdmap.c b/src/kernel/osdmap.c index 47c7afbb265b0..aecdc54c91442 100644 --- a/src/kernel/osdmap.c +++ b/src/kernel/osdmap.c @@ -623,7 +623,7 @@ bad: */ 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); @@ -650,8 +650,8 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout *layout, 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); @@ -666,14 +666,12 @@ void ceph_calc_file_object_mapping(struct ceph_file_layout *layout, * 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; @@ -691,7 +689,7 @@ int ceph_calc_object_layout(struct ceph_object_layout *ol, } 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); diff --git a/src/kernel/osdmap.h b/src/kernel/osdmap.h index 6b55f743c628c..757aaf500759c 100644 --- a/src/kernel/osdmap.h +++ b/src/kernel/osdmap.h @@ -72,8 +72,7 @@ extern void ceph_osdmap_destroy(struct ceph_osdmap *map); /* calculate mapping of a file extent to an object */ extern void ceph_calc_file_object_mapping(struct ceph_file_layout *layout, u64 off, u64 *plen, - const char *oid, - u64 *oxoff, u64 *oxlen); + u64 *bno, u64 *oxoff, u64 *oxlen); /* calculate mapping of object to a placement group */ extern int ceph_calc_object_layout(struct ceph_object_layout *ol, -- 2.39.5