aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-02-06 14:11:38 -0500
committerAlex Elder <elder@inktank.com>2013-02-19 20:14:05 -0500
commit23ed6e13b320b33decb516cbe66e71b132df488d (patch)
tree0e1cf9b6a06f1c5bd7ef3b2b8d40c566e607ef12
parent1ceae7ef0fd00c965a2257c6e9eb497ca91f01c7 (diff)
rbd: ignore result of ceph_copy_from_page_vector()
The result of ceph_copy_from_page_vector() is simply the length argument it is provided. This is called by rbd_obj_method_sync(), which returns the result if it's non-negative. But we always either ignore or overwrite that return value. So explicitly ignore what's returned by the copy function, and have rbd_obj_method_sync() always return either a negative errno or 0. We also return the result of ceph_copy_from_page_vector() in rbd_obj_read_sync(). There we still want to return the number of bytes transferred, but we can use the value we already have in hand rather than what ceph_copy_from_page_vector() provides. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r--drivers/block/rbd.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 93369a1a08e1..c259b4089e95 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1889,7 +1889,8 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
1889 ret = obj_request->result; 1889 ret = obj_request->result;
1890 if (ret < 0) 1890 if (ret < 0)
1891 goto out; 1891 goto out;
1892 ret = ceph_copy_from_page_vector(pages, inbound, 0, 1892 ret = 0;
1893 (void) ceph_copy_from_page_vector(pages, inbound, 0,
1893 obj_request->xferred); 1894 obj_request->xferred);
1894 if (version) 1895 if (version)
1895 *version = obj_request->version; 1896 *version = obj_request->version;
@@ -2088,7 +2089,9 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
2088 2089
2089 rbd_assert(obj_request->xferred <= (u64) SIZE_MAX); 2090 rbd_assert(obj_request->xferred <= (u64) SIZE_MAX);
2090 size = (size_t) obj_request->xferred; 2091 size = (size_t) obj_request->xferred;
2091 ret = ceph_copy_from_page_vector(pages, buf, 0, size); 2092 (void) ceph_copy_from_page_vector(pages, buf, 0, size);
2093 rbd_assert(size <= (size_t) INT_MAX);
2094 ret = (int) size;
2092 if (version) 2095 if (version)
2093 *version = obj_request->version; 2096 *version = obj_request->version;
2094out: 2097out:
@@ -2141,7 +2144,6 @@ rbd_dev_v1_header_read(struct rbd_device *rbd_dev, u64 *version)
2141 ret = rbd_obj_read_sync(rbd_dev, rbd_dev->header_name, 2144 ret = rbd_obj_read_sync(rbd_dev, rbd_dev->header_name,
2142 0, size, 2145 0, size,
2143 (char *) ondisk, version); 2146 (char *) ondisk, version);
2144
2145 if (ret < 0) 2147 if (ret < 0)
2146 goto out_err; 2148 goto out_err;
2147 if (WARN_ON((size_t) ret < size)) { 2149 if (WARN_ON((size_t) ret < size)) {
@@ -2803,7 +2805,6 @@ static int rbd_dev_v2_object_prefix(struct rbd_device *rbd_dev)
2803 dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret); 2805 dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret);
2804 if (ret < 0) 2806 if (ret < 0)
2805 goto out; 2807 goto out;
2806 ret = 0; /* rbd_obj_method_sync() can return positive */
2807 2808
2808 p = reply_buf; 2809 p = reply_buf;
2809 rbd_dev->header.object_prefix = ceph_extract_encoded_string(&p, 2810 rbd_dev->header.object_prefix = ceph_extract_encoded_string(&p,
@@ -3742,7 +3743,6 @@ static int rbd_dev_image_id(struct rbd_device *rbd_dev)
3742 dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret); 3743 dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret);
3743 if (ret < 0) 3744 if (ret < 0)
3744 goto out; 3745 goto out;
3745 ret = 0; /* rbd_obj_method_sync() can return positive */
3746 3746
3747 p = response; 3747 p = response;
3748 rbd_dev->spec->image_id = ceph_extract_encoded_string(&p, 3748 rbd_dev->spec->image_id = ceph_extract_encoded_string(&p,