提交 a90bb0c1 编写于 作者: I Ilya Dryomov

rbd: store and use obj_request->object_no

object_no can be trivially formatted into an object name.  We already
store object names in OSD requests with special care to avoid dynamic
allocations for short names.  Storing a name in obj_request, obtained
as below (!), is a waste and will be removed in the next commit.

    name = kmem_cache_alloc(rbd_segment_name_cache, ...);
    snprintf(name, ...);
    obj_request->object_name = kstrdup(name);
    kmem_cache_free(rbd_segment_name_cache, name);
    ...
    ceph_oid_aprintf(..., "%s", obj_request->object_name);
Signed-off-by: NIlya Dryomov <idryomov@gmail.com>
Reviewed-by: NJason Dillaman <dillaman@redhat.com>
上级 223768d0
...@@ -232,6 +232,7 @@ enum obj_req_flags { ...@@ -232,6 +232,7 @@ enum obj_req_flags {
struct rbd_obj_request { struct rbd_obj_request {
const char *object_name; const char *object_name;
u64 object_no;
u64 offset; /* object start byte */ u64 offset; /* object start byte */
u64 length; /* bytes from offset */ u64 length; /* bytes from offset */
unsigned long flags; unsigned long flags;
...@@ -1629,8 +1630,8 @@ static void rbd_obj_request_submit(struct rbd_obj_request *obj_request) ...@@ -1629,8 +1630,8 @@ static void rbd_obj_request_submit(struct rbd_obj_request *obj_request)
{ {
struct ceph_osd_request *osd_req = obj_request->osd_req; struct ceph_osd_request *osd_req = obj_request->osd_req;
dout("%s %p \"%s\" %llu~%llu osd_req %p\n", __func__, dout("%s %p object_no %016llx %llu~%llu osd_req %p\n", __func__,
obj_request, obj_request->object_name, obj_request->offset, obj_request, obj_request->object_no, obj_request->offset,
obj_request->length, osd_req); obj_request->length, osd_req);
if (obj_request_img_data_test(obj_request)) { if (obj_request_img_data_test(obj_request)) {
WARN_ON(obj_request->callback != rbd_img_obj_callback); WARN_ON(obj_request->callback != rbd_img_obj_callback);
...@@ -1925,8 +1926,8 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req) ...@@ -1925,8 +1926,8 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req)
rbd_osd_call_callback(obj_request); rbd_osd_call_callback(obj_request);
break; break;
default: default:
rbd_warn(NULL, "%s: unsupported op %hu", rbd_warn(NULL, "unexpected OSD op: object_no %016llx opcode %d",
obj_request->object_name, (unsigned short) opcode); obj_request->object_no, opcode);
break; break;
} }
...@@ -1958,6 +1959,8 @@ __rbd_osd_req_create(struct rbd_device *rbd_dev, ...@@ -1958,6 +1959,8 @@ __rbd_osd_req_create(struct rbd_device *rbd_dev,
{ {
struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
struct ceph_osd_request *req; struct ceph_osd_request *req;
const char *name_format = rbd_dev->image_format == 1 ?
RBD_V1_DATA_FORMAT : RBD_V2_DATA_FORMAT;
req = ceph_osdc_alloc_request(osdc, snapc, num_ops, false, GFP_NOIO); req = ceph_osdc_alloc_request(osdc, snapc, num_ops, false, GFP_NOIO);
if (!req) if (!req)
...@@ -1968,8 +1971,8 @@ __rbd_osd_req_create(struct rbd_device *rbd_dev, ...@@ -1968,8 +1971,8 @@ __rbd_osd_req_create(struct rbd_device *rbd_dev,
req->r_priv = obj_request; req->r_priv = obj_request;
req->r_base_oloc.pool = rbd_dev->layout.pool_id; req->r_base_oloc.pool = rbd_dev->layout.pool_id;
if (ceph_oid_aprintf(&req->r_base_oid, GFP_NOIO, "%s", if (ceph_oid_aprintf(&req->r_base_oid, GFP_NOIO, name_format,
obj_request->object_name)) rbd_dev->header.object_prefix, obj_request->object_no))
goto err_req; goto err_req;
if (ceph_osdc_alloc_messages(req, GFP_NOIO)) if (ceph_osdc_alloc_messages(req, GFP_NOIO))
...@@ -2488,6 +2491,7 @@ static int rbd_img_request_fill(struct rbd_img_request *img_request, ...@@ -2488,6 +2491,7 @@ static int rbd_img_request_fill(struct rbd_img_request *img_request,
while (resid) { while (resid) {
struct ceph_osd_request *osd_req; struct ceph_osd_request *osd_req;
const char *object_name; const char *object_name;
u64 object_no = img_offset >> rbd_dev->header.obj_order;
u64 offset = rbd_segment_offset(rbd_dev, img_offset); u64 offset = rbd_segment_offset(rbd_dev, img_offset);
u64 length = rbd_segment_length(rbd_dev, img_offset, resid); u64 length = rbd_segment_length(rbd_dev, img_offset, resid);
...@@ -2500,6 +2504,7 @@ static int rbd_img_request_fill(struct rbd_img_request *img_request, ...@@ -2500,6 +2504,7 @@ static int rbd_img_request_fill(struct rbd_img_request *img_request,
if (!obj_request) if (!obj_request)
goto out_unwind; goto out_unwind;
obj_request->object_no = object_no;
obj_request->offset = offset; obj_request->offset = offset;
obj_request->length = length; obj_request->length = length;
...@@ -2846,6 +2851,8 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request) ...@@ -2846,6 +2851,8 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request)
if (!stat_request) if (!stat_request)
return -ENOMEM; return -ENOMEM;
stat_request->object_no = obj_request->object_no;
stat_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, stat_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1,
stat_request); stat_request);
if (!stat_request->osd_req) { if (!stat_request->osd_req) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册