summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorDouglas Fuller <dfuller@redhat.com>2015-06-17 14:49:45 -0400
committerIlya Dryomov <idryomov@gmail.com>2016-08-24 17:49:15 -0400
commit428a715811fe74e8a8f09b830c8d3b5245096f8d (patch)
treef71c664112b5513b29bf6b3395333a778096f3b8 /net
parenta4ed38d7a180f184a6e7aedd09db9ca4b1e6a71c (diff)
libceph: add ceph_osdc_call() single-page helper
Add a convenience function to osd_client to send Ceph OSD 'class' ops. The interface assumes that the request and reply data each consist of single pages. Signed-off-by: Douglas Fuller <dfuller@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Reviewed-by: Mike Christie <mchristi@redhat.com> Reviewed-by: Alex Elder <elder@linaro.org>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/osd_client.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index dd51ec8ce97f..fbc6b7090c65 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -4027,6 +4027,57 @@ void ceph_osdc_maybe_request_map(struct ceph_osd_client *osdc)
4027EXPORT_SYMBOL(ceph_osdc_maybe_request_map); 4027EXPORT_SYMBOL(ceph_osdc_maybe_request_map);
4028 4028
4029/* 4029/*
4030 * Execute an OSD class method on an object.
4031 *
4032 * @flags: CEPH_OSD_FLAG_*
4033 * @resp_len: out param for reply length
4034 */
4035int ceph_osdc_call(struct ceph_osd_client *osdc,
4036 struct ceph_object_id *oid,
4037 struct ceph_object_locator *oloc,
4038 const char *class, const char *method,
4039 unsigned int flags,
4040 struct page *req_page, size_t req_len,
4041 struct page *resp_page, size_t *resp_len)
4042{
4043 struct ceph_osd_request *req;
4044 int ret;
4045
4046 req = ceph_osdc_alloc_request(osdc, NULL, 1, false, GFP_NOIO);
4047 if (!req)
4048 return -ENOMEM;
4049
4050 ceph_oid_copy(&req->r_base_oid, oid);
4051 ceph_oloc_copy(&req->r_base_oloc, oloc);
4052 req->r_flags = flags;
4053
4054 ret = ceph_osdc_alloc_messages(req, GFP_NOIO);
4055 if (ret)
4056 goto out_put_req;
4057
4058 osd_req_op_cls_init(req, 0, CEPH_OSD_OP_CALL, class, method);
4059 if (req_page)
4060 osd_req_op_cls_request_data_pages(req, 0, &req_page, req_len,
4061 0, false, false);
4062 if (resp_page)
4063 osd_req_op_cls_response_data_pages(req, 0, &resp_page,
4064 PAGE_SIZE, 0, false, false);
4065
4066 ceph_osdc_start_request(osdc, req, false);
4067 ret = ceph_osdc_wait_request(osdc, req);
4068 if (ret >= 0) {
4069 ret = req->r_ops[0].rval;
4070 if (resp_page)
4071 *resp_len = req->r_ops[0].outdata_len;
4072 }
4073
4074out_put_req:
4075 ceph_osdc_put_request(req);
4076 return ret;
4077}
4078EXPORT_SYMBOL(ceph_osdc_call);
4079
4080/*
4030 * init, shutdown 4081 * init, shutdown
4031 */ 4082 */
4032int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client) 4083int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)