Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libceph: change ceph_osdc_call() to take page vector for response

This will be used for loading object map. rbd_obj_read_sync() isn't
suitable because object map must be accessed through class methods.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
Reviewed-by: Jeff Layton <jlayton@kernel.org>

+11 -11
+4 -4
drivers/block/rbd.c
··· 4076 4076 4077 4077 ret = ceph_osdc_call(osdc, oid, oloc, RBD_DRV_NAME, method_name, 4078 4078 CEPH_OSD_FLAG_READ, req_page, outbound_size, 4079 - reply_page, &inbound_size); 4079 + &reply_page, &inbound_size); 4080 4080 if (!ret) { 4081 4081 memcpy(inbound, page_address(reply_page), inbound_size); 4082 4082 ret = inbound_size; ··· 5102 5102 5103 5103 ret = ceph_osdc_call(osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc, 5104 5104 "rbd", "parent_get", CEPH_OSD_FLAG_READ, 5105 - req_page, sizeof(u64), reply_page, &reply_len); 5105 + req_page, sizeof(u64), &reply_page, &reply_len); 5106 5106 if (ret) 5107 5107 return ret == -EOPNOTSUPP ? 1 : ret; 5108 5108 ··· 5114 5114 5115 5115 ret = ceph_osdc_call(osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc, 5116 5116 "rbd", "parent_overlap_get", CEPH_OSD_FLAG_READ, 5117 - req_page, sizeof(u64), reply_page, &reply_len); 5117 + req_page, sizeof(u64), &reply_page, &reply_len); 5118 5118 if (ret) 5119 5119 return ret; 5120 5120 ··· 5145 5145 5146 5146 ret = ceph_osdc_call(osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc, 5147 5147 "rbd", "get_parent", CEPH_OSD_FLAG_READ, 5148 - req_page, sizeof(u64), reply_page, &reply_len); 5148 + req_page, sizeof(u64), &reply_page, &reply_len); 5149 5149 if (ret) 5150 5150 return ret; 5151 5151
+1 -1
include/linux/ceph/osd_client.h
··· 497 497 const char *class, const char *method, 498 498 unsigned int flags, 499 499 struct page *req_page, size_t req_len, 500 - struct page *resp_page, size_t *resp_len); 500 + struct page **resp_pages, size_t *resp_len); 501 501 502 502 extern int ceph_osdc_readpages(struct ceph_osd_client *osdc, 503 503 struct ceph_vino vino,
+1 -1
net/ceph/cls_lock_client.c
··· 363 363 dout("%s lock_name %s\n", __func__, lock_name); 364 364 ret = ceph_osdc_call(osdc, oid, oloc, "lock", "get_info", 365 365 CEPH_OSD_FLAG_READ, get_info_op_page, 366 - get_info_op_buf_size, reply_page, &reply_len); 366 + get_info_op_buf_size, &reply_page, &reply_len); 367 367 368 368 dout("%s: status %d\n", __func__, ret); 369 369 if (ret >= 0) {
+5 -5
net/ceph/osd_client.c
··· 5050 5050 const char *class, const char *method, 5051 5051 unsigned int flags, 5052 5052 struct page *req_page, size_t req_len, 5053 - struct page *resp_page, size_t *resp_len) 5053 + struct page **resp_pages, size_t *resp_len) 5054 5054 { 5055 5055 struct ceph_osd_request *req; 5056 5056 int ret; 5057 5057 5058 - if (req_len > PAGE_SIZE || (resp_page && *resp_len > PAGE_SIZE)) 5058 + if (req_len > PAGE_SIZE) 5059 5059 return -E2BIG; 5060 5060 5061 5061 req = ceph_osdc_alloc_request(osdc, NULL, 1, false, GFP_NOIO); ··· 5073 5073 if (req_page) 5074 5074 osd_req_op_cls_request_data_pages(req, 0, &req_page, req_len, 5075 5075 0, false, false); 5076 - if (resp_page) 5077 - osd_req_op_cls_response_data_pages(req, 0, &resp_page, 5076 + if (resp_pages) 5077 + osd_req_op_cls_response_data_pages(req, 0, resp_pages, 5078 5078 *resp_len, 0, false, false); 5079 5079 5080 5080 ret = ceph_osdc_alloc_messages(req, GFP_NOIO); ··· 5085 5085 ret = ceph_osdc_wait_request(osdc, req); 5086 5086 if (ret >= 0) { 5087 5087 ret = req->r_ops[0].rval; 5088 - if (resp_page) 5088 + if (resp_pages) 5089 5089 *resp_len = req->r_ops[0].outdata_len; 5090 5090 } 5091 5091