summaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2018-01-20 04:30:10 -0500
committerIlya Dryomov <idryomov@gmail.com>2018-04-02 04:12:39 -0400
commit06fbb6993504974db6334a80b6796d6522ad45eb (patch)
treebfabad5eea35dbf7056a92f506b0a63084e5e728 /drivers/block/rbd.c
parentdf6ba7015dd3a64a2e74353d1e7d19871af86f38 (diff)
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 <idryomov@gmail.com> Reviewed-by: Alex Elder <elder@linaro.org>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r--drivers/block/rbd.c15
1 files 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)
2645 struct rbd_device *rbd_dev = obj_request->img_request->rbd_dev; 2645 struct rbd_device *rbd_dev = obj_request->img_request->rbd_dev;
2646 struct rbd_obj_request *stat_request; 2646 struct rbd_obj_request *stat_request;
2647 struct page **pages; 2647 struct page **pages;
2648 u32 page_count;
2649 size_t size;
2650 int ret; 2648 int ret;
2651 2649
2652 stat_request = rbd_obj_request_create(OBJ_REQUEST_PAGES); 2650 stat_request = rbd_obj_request_create(OBJ_REQUEST_NODATA);
2653 if (!stat_request) 2651 if (!stat_request)
2654 return -ENOMEM; 2652 return -ENOMEM;
2655 2653
@@ -2670,22 +2668,19 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request)
2670 * le32 tv_nsec; 2668 * le32 tv_nsec;
2671 * } mtime; 2669 * } mtime;
2672 */ 2670 */
2673 size = sizeof (__le64) + sizeof (__le32) + sizeof (__le32); 2671 pages = ceph_alloc_page_vector(1, GFP_NOIO);
2674 page_count = (u32)calc_pages_for(0, size);
2675 pages = ceph_alloc_page_vector(page_count, GFP_NOIO);
2676 if (IS_ERR(pages)) { 2672 if (IS_ERR(pages)) {
2677 ret = PTR_ERR(pages); 2673 ret = PTR_ERR(pages);
2678 goto fail_stat_request; 2674 goto fail_stat_request;
2679 } 2675 }
2680 2676
2681 osd_req_op_init(stat_request->osd_req, 0, CEPH_OSD_OP_STAT, 0); 2677 osd_req_op_init(stat_request->osd_req, 0, CEPH_OSD_OP_STAT, 0);
2682 osd_req_op_raw_data_in_pages(stat_request->osd_req, 0, pages, size, 0, 2678 osd_req_op_raw_data_in_pages(stat_request->osd_req, 0, pages,
2683 false, false); 2679 8 + sizeof(struct ceph_timespec),
2680 0, false, true);
2684 2681
2685 rbd_obj_request_get(obj_request); 2682 rbd_obj_request_get(obj_request);
2686 stat_request->obj_request = obj_request; 2683 stat_request->obj_request = obj_request;
2687 stat_request->pages = pages;
2688 stat_request->page_count = page_count;
2689 stat_request->callback = rbd_img_obj_exists_callback; 2684 stat_request->callback = rbd_img_obj_exists_callback;
2690 2685
2691 rbd_obj_request_submit(stat_request); 2686 rbd_obj_request_submit(stat_request);