libceph: rados pool namespace support
Add pool namesapce pointer to struct ceph_file_layout and struct ceph_object_locator. Pool namespace is used by when mapping object to PG, it's also used when composing OSD request. The namespace pointer in struct ceph_file_layout is RCU protected. So libceph can read namespace without taking lock. Signed-off-by: Yan, Zheng <zyan@redhat.com> [idryomov@gmail.com: ceph_oloc_destroy(), misc minor changes] Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
@@ -1510,6 +1510,24 @@ bad:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
void ceph_oloc_copy(struct ceph_object_locator *dest,
|
||||
const struct ceph_object_locator *src)
|
||||
{
|
||||
WARN_ON(!ceph_oloc_empty(dest));
|
||||
WARN_ON(dest->pool_ns); /* empty() only covers ->pool */
|
||||
|
||||
dest->pool = src->pool;
|
||||
if (src->pool_ns)
|
||||
dest->pool_ns = ceph_get_string(src->pool_ns);
|
||||
}
|
||||
EXPORT_SYMBOL(ceph_oloc_copy);
|
||||
|
||||
void ceph_oloc_destroy(struct ceph_object_locator *oloc)
|
||||
{
|
||||
ceph_put_string(oloc->pool_ns);
|
||||
}
|
||||
EXPORT_SYMBOL(ceph_oloc_destroy);
|
||||
|
||||
void ceph_oid_copy(struct ceph_object_id *dest,
|
||||
const struct ceph_object_id *src)
|
||||
{
|
||||
@@ -1844,12 +1862,34 @@ int ceph_object_locator_to_pg(struct ceph_osdmap *osdmap,
|
||||
if (!pi)
|
||||
return -ENOENT;
|
||||
|
||||
raw_pgid->pool = oloc->pool;
|
||||
raw_pgid->seed = ceph_str_hash(pi->object_hash, oid->name,
|
||||
oid->name_len);
|
||||
if (!oloc->pool_ns) {
|
||||
raw_pgid->pool = oloc->pool;
|
||||
raw_pgid->seed = ceph_str_hash(pi->object_hash, oid->name,
|
||||
oid->name_len);
|
||||
dout("%s %s -> raw_pgid %llu.%x\n", __func__, oid->name,
|
||||
raw_pgid->pool, raw_pgid->seed);
|
||||
} else {
|
||||
char stack_buf[256];
|
||||
char *buf = stack_buf;
|
||||
int nsl = oloc->pool_ns->len;
|
||||
size_t total = nsl + 1 + oid->name_len;
|
||||
|
||||
dout("%s %s -> raw_pgid %llu.%x\n", __func__, oid->name,
|
||||
raw_pgid->pool, raw_pgid->seed);
|
||||
if (total > sizeof(stack_buf)) {
|
||||
buf = kmalloc(total, GFP_NOIO);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(buf, oloc->pool_ns->str, nsl);
|
||||
buf[nsl] = '\037';
|
||||
memcpy(buf + nsl + 1, oid->name, oid->name_len);
|
||||
raw_pgid->pool = oloc->pool;
|
||||
raw_pgid->seed = ceph_str_hash(pi->object_hash, buf, total);
|
||||
if (buf != stack_buf)
|
||||
kfree(buf);
|
||||
dout("%s %s ns %.*s -> raw_pgid %llu.%x\n", __func__,
|
||||
oid->name, nsl, oloc->pool_ns->str,
|
||||
raw_pgid->pool, raw_pgid->seed);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ceph_object_locator_to_pg);
|
||||
|
Reference in New Issue
Block a user