From 06fbb6993504974db6334a80b6796d6522ad45eb Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Sat, 20 Jan 2018 10:30:10 +0100 Subject: [PATCH] rbd: don't (ab)use obj_req->pages for stat requests obj_req->pages is for provided data buffers. stat requests are internal and should be NODATA. Signed-off-by: Ilya Dryomov Reviewed-by: Alex Elder --- drivers/block/rbd.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 8b9047369ab9..aa3f6a6de12c 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -2645,11 +2645,9 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request) struct rbd_device *rbd_dev = obj_request->img_request->rbd_dev; struct rbd_obj_request *stat_request; struct page **pages; - u32 page_count; - size_t size; int ret; - stat_request = rbd_obj_request_create(OBJ_REQUEST_PAGES); + stat_request = rbd_obj_request_create(OBJ_REQUEST_NODATA); if (!stat_request) return -ENOMEM; @@ -2670,22 +2668,19 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request) * le32 tv_nsec; * } mtime; */ - size = sizeof (__le64) + sizeof (__le32) + sizeof (__le32); - page_count = (u32)calc_pages_for(0, size); - pages = ceph_alloc_page_vector(page_count, GFP_NOIO); + pages = ceph_alloc_page_vector(1, GFP_NOIO); if (IS_ERR(pages)) { ret = PTR_ERR(pages); goto fail_stat_request; } osd_req_op_init(stat_request->osd_req, 0, CEPH_OSD_OP_STAT, 0); - osd_req_op_raw_data_in_pages(stat_request->osd_req, 0, pages, size, 0, - false, false); + osd_req_op_raw_data_in_pages(stat_request->osd_req, 0, pages, + 8 + sizeof(struct ceph_timespec), + 0, false, true); rbd_obj_request_get(obj_request); stat_request->obj_request = obj_request; - stat_request->pages = pages; - stat_request->page_count = page_count; stat_request->callback = rbd_img_obj_exists_callback; rbd_obj_request_submit(stat_request);