]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: specify object id as string
authorSage Weil <sage@newdream.net>
Wed, 3 Jun 2009 22:42:35 +0000 (15:42 -0700)
committerSage Weil <sage@newdream.net>
Wed, 3 Jun 2009 22:42:35 +0000 (15:42 -0700)
src/kernel/debugfs.c
src/kernel/osd_client.c
src/kernel/osd_client.h
src/kernel/osdmap.c
src/kernel/osdmap.h

index 6e8629074168631b568aaaa52d136a4e003e79c2..554d4a66bd9e73e24c19eec773cffff18fe2f997 100644 (file)
@@ -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;
 }
 
index 866133a297dbb85343a7dac7204c6f50b89ae671..0d852e7e83e0bccc94c7edc6a91033d230f179d0 100644 (file)
@@ -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);
index 1c5de22b2c9d2a244be63756e396c885525e83fb..9ad25590609fefd1f0c7c875658a13a3816ff8b6 100644 (file)
@@ -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;
index 47c7afbb265b0aad28dfd178cbee2fb9d9a5332e..aecdc54c91442a5b322d4ff8729e8308e62a614e 100644 (file)
@@ -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);
 
index 6b55f743c628c3f59803871f663658542c839f9d..757aaf500759c744e532a94672e1b3be60daddb9 100644 (file)
@@ -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,