diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2018-01-20 04:30:10 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2018-04-02 04:12:39 -0400 |
commit | 06fbb6993504974db6334a80b6796d6522ad45eb (patch) | |
tree | bfabad5eea35dbf7056a92f506b0a63084e5e728 /drivers/block/rbd.c | |
parent | df6ba7015dd3a64a2e74353d1e7d19871af86f38 (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.c | 15 |
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); |