aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Dryomov <ilya.dryomov@inktank.com>2014-01-27 10:40:18 -0500
committerIlya Dryomov <ilya.dryomov@inktank.com>2014-01-27 16:57:28 -0500
commit4295f2217a5aa8ef2738e3a368db3c1ceab41212 (patch)
tree557b4efd8558bfa71bae87413d0f4d6f0ba0511a
parent2d0ebc5d591f49131bf8f93b54c5424162c3fb7f (diff)
libceph: introduce and start using oid abstraction
In preparation for tiering support, which would require having two (base and target) object names for each osd request and also copying those names around, introduce struct ceph_object_id (oid) and a couple helpers to facilitate those copies and encapsulate the fact that object name is not necessarily a NUL-terminated string. Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r--drivers/block/rbd.c10
-rw-r--r--include/linux/ceph/osd_client.h9
-rw-r--r--include/linux/ceph/osdmap.h36
-rw-r--r--net/ceph/debugfs.c3
-rw-r--r--net/ceph/osd_client.c17
5 files changed, 50 insertions, 25 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 98792b2a7f65..6fdc5fc00447 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1809,10 +1809,7 @@ static struct ceph_osd_request *rbd_osd_req_create(
1809 osd_req->r_priv = obj_request; 1809 osd_req->r_priv = obj_request;
1810 1810
1811 osd_req->r_oloc.pool = ceph_file_layout_pg_pool(rbd_dev->layout); 1811 osd_req->r_oloc.pool = ceph_file_layout_pg_pool(rbd_dev->layout);
1812 1812 ceph_oid_set_name(&osd_req->r_oid, obj_request->object_name);
1813 osd_req->r_oid_len = strlen(obj_request->object_name);
1814 rbd_assert(osd_req->r_oid_len < sizeof (osd_req->r_oid));
1815 memcpy(osd_req->r_oid, obj_request->object_name, osd_req->r_oid_len);
1816 1813
1817 return osd_req; 1814 return osd_req;
1818} 1815}
@@ -1850,10 +1847,7 @@ rbd_osd_req_create_copyup(struct rbd_obj_request *obj_request)
1850 osd_req->r_priv = obj_request; 1847 osd_req->r_priv = obj_request;
1851 1848
1852 osd_req->r_oloc.pool = ceph_file_layout_pg_pool(rbd_dev->layout); 1849 osd_req->r_oloc.pool = ceph_file_layout_pg_pool(rbd_dev->layout);
1853 1850 ceph_oid_set_name(&osd_req->r_oid, obj_request->object_name);
1854 osd_req->r_oid_len = strlen(obj_request->object_name);
1855 rbd_assert(osd_req->r_oid_len < sizeof (osd_req->r_oid));
1856 memcpy(osd_req->r_oid, obj_request->object_name, osd_req->r_oid_len);
1857 1851
1858 return osd_req; 1852 return osd_req;
1859} 1853}
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index b42f15848cae..8d8bb53994b1 100644
--- a/include/linux/ceph/osd_client.h
+++ b/include/linux/ceph/osd_client.h
@@ -12,12 +12,6 @@
12#include <linux/ceph/auth.h> 12#include <linux/ceph/auth.h>
13#include <linux/ceph/pagelist.h> 13#include <linux/ceph/pagelist.h>
14 14
15/*
16 * Maximum object name size
17 * (must be at least as big as RBD_MAX_MD_NAME_LEN -- currently 100)
18 */
19#define CEPH_MAX_OID_NAME_LEN 100
20
21struct ceph_msg; 15struct ceph_msg;
22struct ceph_snap_context; 16struct ceph_snap_context;
23struct ceph_osd_request; 17struct ceph_osd_request;
@@ -160,9 +154,8 @@ struct ceph_osd_request {
160 void *r_priv; /* ditto */ 154 void *r_priv; /* ditto */
161 155
162 struct ceph_object_locator r_oloc; 156 struct ceph_object_locator r_oloc;
157 struct ceph_object_id r_oid;
163 158
164 char r_oid[CEPH_MAX_OID_NAME_LEN]; /* object name */
165 int r_oid_len;
166 u64 r_snapid; 159 u64 r_snapid;
167 unsigned long r_stamp; /* send OR check time */ 160 unsigned long r_stamp; /* send OR check time */
168 161
diff --git a/include/linux/ceph/osdmap.h b/include/linux/ceph/osdmap.h
index f2679c384625..c85f7d43b861 100644
--- a/include/linux/ceph/osdmap.h
+++ b/include/linux/ceph/osdmap.h
@@ -43,6 +43,18 @@ struct ceph_object_locator {
43 s64 pool; 43 s64 pool;
44}; 44};
45 45
46/*
47 * Maximum supported by kernel client object name length
48 *
49 * (probably outdated: must be >= RBD_MAX_MD_NAME_LEN -- currently 100)
50 */
51#define CEPH_MAX_OID_NAME_LEN 100
52
53struct ceph_object_id {
54 char name[CEPH_MAX_OID_NAME_LEN];
55 int name_len;
56};
57
46struct ceph_pg_mapping { 58struct ceph_pg_mapping {
47 struct rb_node node; 59 struct rb_node node;
48 struct ceph_pg pgid; 60 struct ceph_pg pgid;
@@ -72,6 +84,30 @@ struct ceph_osdmap {
72 struct crush_map *crush; 84 struct crush_map *crush;
73}; 85};
74 86
87static inline void ceph_oid_set_name(struct ceph_object_id *oid,
88 const char *name)
89{
90 int len;
91
92 len = strlen(name);
93 if (len > sizeof(oid->name)) {
94 WARN(1, "ceph_oid_set_name '%s' len %d vs %zu, truncating\n",
95 name, len, sizeof(oid->name));
96 len = sizeof(oid->name);
97 }
98
99 memcpy(oid->name, name, len);
100 oid->name_len = len;
101}
102
103static inline void ceph_oid_copy(struct ceph_object_id *dest,
104 struct ceph_object_id *src)
105{
106 BUG_ON(src->name_len > sizeof(dest->name));
107 memcpy(dest->name, src->name, src->name_len);
108 dest->name_len = src->name_len;
109}
110
75static inline int ceph_osd_is_up(struct ceph_osdmap *map, int osd) 111static inline int ceph_osd_is_up(struct ceph_osdmap *map, int osd)
76{ 112{
77 return (osd < map->max_osd) && (map->osd_state[osd] & CEPH_OSD_UP); 113 return (osd < map->max_osd) && (map->osd_state[osd] & CEPH_OSD_UP);
diff --git a/net/ceph/debugfs.c b/net/ceph/debugfs.c
index 83661cdc0766..1f8562706393 100644
--- a/net/ceph/debugfs.c
+++ b/net/ceph/debugfs.c
@@ -132,7 +132,8 @@ static int osdc_show(struct seq_file *s, void *pp)
132 req->r_osd ? req->r_osd->o_osd : -1, 132 req->r_osd ? req->r_osd->o_osd : -1,
133 req->r_pgid.pool, req->r_pgid.seed); 133 req->r_pgid.pool, req->r_pgid.seed);
134 134
135 seq_printf(s, "%.*s", req->r_oid_len, req->r_oid); 135 seq_printf(s, "%.*s", req->r_oid.name_len,
136 req->r_oid.name);
136 137
137 if (req->r_reassert_version.epoch) 138 if (req->r_reassert_version.epoch)
138 seq_printf(s, "\t%u'%llu", 139 seq_printf(s, "\t%u'%llu",
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index a053e7e4a780..2988d68b24c6 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -765,9 +765,9 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
765 765
766 req->r_oloc.pool = ceph_file_layout_pg_pool(*layout); 766 req->r_oloc.pool = ceph_file_layout_pg_pool(*layout);
767 767
768 snprintf(req->r_oid, sizeof(req->r_oid), "%llx.%08llx", 768 snprintf(req->r_oid.name, sizeof(req->r_oid.name),
769 vino.ino, objnum); 769 "%llx.%08llx", vino.ino, objnum);
770 req->r_oid_len = strlen(req->r_oid); 770 req->r_oid.name_len = strlen(req->r_oid.name);
771 771
772 return req; 772 return req;
773} 773}
@@ -1269,7 +1269,7 @@ static int __map_request(struct ceph_osd_client *osdc,
1269 bool was_paused; 1269 bool was_paused;
1270 1270
1271 dout("map_request %p tid %lld\n", req, req->r_tid); 1271 dout("map_request %p tid %lld\n", req, req->r_tid);
1272 err = ceph_calc_ceph_pg(&pgid, req->r_oid, osdc->osdmap, 1272 err = ceph_calc_ceph_pg(&pgid, req->r_oid.name, osdc->osdmap,
1273 req->r_oloc.pool); 1273 req->r_oloc.pool);
1274 if (err) { 1274 if (err) {
1275 list_move(&req->r_req_lru_item, &osdc->req_notarget); 1275 list_move(&req->r_req_lru_item, &osdc->req_notarget);
@@ -2118,10 +2118,11 @@ void ceph_osdc_build_request(struct ceph_osd_request *req, u64 off,
2118 ceph_encode_32(&p, -1); /* preferred */ 2118 ceph_encode_32(&p, -1); /* preferred */
2119 2119
2120 /* oid */ 2120 /* oid */
2121 ceph_encode_32(&p, req->r_oid_len); 2121 ceph_encode_32(&p, req->r_oid.name_len);
2122 memcpy(p, req->r_oid, req->r_oid_len); 2122 memcpy(p, req->r_oid.name, req->r_oid.name_len);
2123 dout("oid '%.*s' len %d\n", req->r_oid_len, req->r_oid, req->r_oid_len); 2123 dout("oid '%.*s' len %d\n", req->r_oid.name_len,
2124 p += req->r_oid_len; 2124 req->r_oid.name, req->r_oid.name_len);
2125 p += req->r_oid.name_len;
2125 2126
2126 /* ops--can imply data */ 2127 /* ops--can imply data */
2127 ceph_encode_16(&p, (u16)req->r_num_ops); 2128 ceph_encode_16(&p, (u16)req->r_num_ops);