Re: [PATCH 08/32] rbd: get rid of img_req->copyup_pages

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 03/16/2018 07:37 AM, Alex Elder wrote:
> From: Ilya Dryomov <idryomov@xxxxxxxxx>
> 
> The initiating object request is the proper owner -- save a bit of
> space.

I'm not really sure why a copy of the the copyup pages was kept
with the parent request.  Anyway, this looks good to me.

Reviewed-by: Alex Elder <elder@xxxxxxxxxx>

> 
> Signed-off-by: Ilya Dryomov <idryomov@xxxxxxxxx>
> ---
>  drivers/block/rbd.c | 43 +++++++++----------------------------------
>  1 file changed, 9 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index aa3f6a6de12c..722422e62b36 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -309,8 +309,6 @@ struct rbd_img_request {
>  		struct request		*rq;		/* block request */
>  		struct rbd_obj_request	*obj_request;	/* obj req initiator */
>  	};
> -	struct page		**copyup_pages;
> -	u32			copyup_page_count;
>  	spinlock_t		completion_lock;/* protects next_completion */
>  	u32			next_completion;
>  	rbd_img_callback_t	callback;
> @@ -1940,6 +1938,9 @@ static void rbd_obj_request_destroy(struct kref *kref)
>  		break;
>  	}
>  
> +	ceph_release_page_vector(obj_request->copyup_pages,
> +				 obj_request->copyup_page_count);
> +
>  	kmem_cache_free(rbd_obj_request_cache, obj_request);
>  }
>  
> @@ -2372,8 +2373,6 @@ rbd_osd_copyup_callback(struct rbd_obj_request *obj_request)
>  {
>  	struct rbd_img_request *img_request;
>  	struct rbd_device *rbd_dev;
> -	struct page **pages;
> -	u32 page_count;
>  
>  	dout("%s: obj %p\n", __func__, obj_request);
>  
> @@ -2386,14 +2385,6 @@ rbd_osd_copyup_callback(struct rbd_obj_request *obj_request)
>  	rbd_dev = img_request->rbd_dev;
>  	rbd_assert(rbd_dev);
>  
> -	pages = obj_request->copyup_pages;
> -	rbd_assert(pages != NULL);
> -	obj_request->copyup_pages = NULL;
> -	page_count = obj_request->copyup_page_count;
> -	rbd_assert(page_count);
> -	obj_request->copyup_page_count = 0;
> -	ceph_release_page_vector(pages, page_count);
> -
>  	/*
>  	 * We want the transfer count to reflect the size of the
>  	 * original write request.  There is no such thing as a
> @@ -2412,9 +2403,7 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
>  	struct rbd_obj_request *orig_request;
>  	struct ceph_osd_request *osd_req;
>  	struct rbd_device *rbd_dev;
> -	struct page **pages;
>  	enum obj_operation_type op_type;
> -	u32 page_count;
>  	int img_result;
>  	u64 parent_length;
>  
> @@ -2422,13 +2411,6 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
>  
>  	/* First get what we need from the image request */
>  
> -	pages = img_request->copyup_pages;
> -	rbd_assert(pages != NULL);
> -	img_request->copyup_pages = NULL;
> -	page_count = img_request->copyup_page_count;
> -	rbd_assert(page_count);
> -	img_request->copyup_page_count = 0;
> -
>  	orig_request = img_request->obj_request;
>  	rbd_assert(orig_request != NULL);
>  	rbd_assert(obj_request_type_valid(orig_request->type));
> @@ -2447,7 +2429,6 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
>  	 * and re-submit the original write request.
>  	 */
>  	if (!rbd_dev->parent_overlap) {
> -		ceph_release_page_vector(pages, page_count);
>  		rbd_obj_request_submit(orig_request);
>  		return;
>  	}
> @@ -2467,14 +2448,12 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
>  		goto out_err;
>  	rbd_osd_req_destroy(orig_request->osd_req);
>  	orig_request->osd_req = osd_req;
> -	orig_request->copyup_pages = pages;
> -	orig_request->copyup_page_count = page_count;
>  
>  	/* Initialize the copyup op */
>  
>  	osd_req_op_cls_init(osd_req, 0, CEPH_OSD_OP_CALL, "rbd", "copyup");
> -	osd_req_op_cls_request_data_pages(osd_req, 0, pages, parent_length, 0,
> -						false, false);
> +	osd_req_op_cls_request_data_pages(osd_req, 0, orig_request->copyup_pages,
> +					  parent_length, 0, false, false);
>  
>  	/* Add the other op(s) */
>  
> @@ -2487,7 +2466,6 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
>  	return;
>  
>  out_err:
> -	ceph_release_page_vector(pages, page_count);
>  	rbd_obj_request_error(orig_request, img_result);
>  }
>  
> @@ -2542,10 +2520,13 @@ static int rbd_img_obj_parent_read_full(struct rbd_obj_request *obj_request)
>  	pages = ceph_alloc_page_vector(page_count, GFP_NOIO);
>  	if (IS_ERR(pages)) {
>  		result = PTR_ERR(pages);
> -		pages = NULL;
>  		goto out_err;
>  	}
>  
> +	rbd_assert(!obj_request->copyup_pages);
> +	obj_request->copyup_pages = pages;
> +	obj_request->copyup_page_count = page_count;
> +
>  	result = -ENOMEM;
>  	parent_request = rbd_parent_request_create(obj_request,
>  						img_offset, length);
> @@ -2556,19 +2537,13 @@ static int rbd_img_obj_parent_read_full(struct rbd_obj_request *obj_request)
>  	if (result)
>  		goto out_err;
>  
> -	parent_request->copyup_pages = pages;
> -	parent_request->copyup_page_count = page_count;
>  	parent_request->callback = rbd_img_obj_parent_read_full_callback;
>  
>  	result = rbd_img_request_submit(parent_request);
>  	if (!result)
>  		return 0;
>  
> -	parent_request->copyup_pages = NULL;
> -	parent_request->copyup_page_count = 0;
>  out_err:
> -	if (pages)
> -		ceph_release_page_vector(pages, page_count);
>  	if (parent_request)
>  		rbd_img_request_put(parent_request);
>  	return result;
> 

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux