rbd: define inbound data size for method ops
authorAlex Elder <elder@inktank.com>
Fri, 5 Apr 2013 06:27:11 +0000 (01:27 -0500)
committerSage Weil <sage@inktank.com>
Thu, 2 May 2013 04:18:04 +0000 (21:18 -0700)
When rbd creates an object request containing an object method call
operation it is passing 0 for the size.  I originally thought this
was because the length was not needed for method calls, but I think
it really should be supplied, to describe how much space is
available to receive response data.  So provide the supplied length.

This resolves:
    http://tracker.ceph.com/issues/4659

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
drivers/block/rbd.c

index e95a92e..afbc9f6 100644 (file)
@@ -1840,12 +1840,11 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
        int ret;
 
        /*
-        * Method calls are ultimately read operations but they
-        * don't involve object data (so no offset or length).
-        * The result should placed into the inbound buffer
-        * provided.  They also supply outbound data--parameters for
-        * the object method.  Currently if this is present it will
-        * be a snapshot id.
+        * Method calls are ultimately read operations.  The result
+        * should placed into the inbound buffer provided.  They
+        * also supply outbound data--parameters for the object
+        * method.  Currently if this is present it will be a
+        * snapshot id.
         */
        page_count = (u32) calc_pages_for(0, inbound_size);
        pages = ceph_alloc_page_vector(page_count, GFP_KERNEL);
@@ -1853,7 +1852,7 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
                return PTR_ERR(pages);
 
        ret = -ENOMEM;
-       obj_request = rbd_obj_request_create(object_name, 0, 0,
+       obj_request = rbd_obj_request_create(object_name, 0, inbound_size,
                                                        OBJ_REQUEST_PAGES);
        if (!obj_request)
                goto out;