diff options
author | Douglas Fuller <dfuller@redhat.com> | 2015-06-17 14:49:45 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2016-08-24 17:49:15 -0400 |
commit | 428a715811fe74e8a8f09b830c8d3b5245096f8d (patch) | |
tree | f71c664112b5513b29bf6b3395333a778096f3b8 /net | |
parent | a4ed38d7a180f184a6e7aedd09db9ca4b1e6a71c (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.c | 51 |
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) | |||
4027 | EXPORT_SYMBOL(ceph_osdc_maybe_request_map); | 4027 | EXPORT_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 | */ | ||
4035 | int 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 | |||
4074 | out_put_req: | ||
4075 | ceph_osdc_put_request(req); | ||
4076 | return ret; | ||
4077 | } | ||
4078 | EXPORT_SYMBOL(ceph_osdc_call); | ||
4079 | |||
4080 | /* | ||
4030 | * init, shutdown | 4081 | * init, shutdown |
4031 | */ | 4082 | */ |
4032 | int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client) | 4083 | int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client) |