|
@@ -1264,6 +1264,32 @@ static bool obj_request_done_test(struct rbd_obj_request *obj_request)
|
|
|
return atomic_read(&obj_request->done) != 0;
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+rbd_img_obj_request_read_callback(struct rbd_obj_request *obj_request)
|
|
|
+{
|
|
|
+ dout("%s: obj %p img %p result %d %llu/%llu\n", __func__,
|
|
|
+ obj_request, obj_request->img_request, obj_request->result,
|
|
|
+ obj_request->xferred, obj_request->length);
|
|
|
+ /*
|
|
|
+ * ENOENT means a hole in the image. We zero-fill the
|
|
|
+ * entire length of the request. A short read also implies
|
|
|
+ * zero-fill to the end of the request. Either way we
|
|
|
+ * update the xferred count to indicate the whole request
|
|
|
+ * was satisfied.
|
|
|
+ */
|
|
|
+ BUG_ON(obj_request->type != OBJ_REQUEST_BIO);
|
|
|
+ if (obj_request->result == -ENOENT) {
|
|
|
+ zero_bio_chain(obj_request->bio_list, 0);
|
|
|
+ obj_request->result = 0;
|
|
|
+ obj_request->xferred = obj_request->length;
|
|
|
+ } else if (obj_request->xferred < obj_request->length &&
|
|
|
+ !obj_request->result) {
|
|
|
+ zero_bio_chain(obj_request->bio_list, obj_request->xferred);
|
|
|
+ obj_request->xferred = obj_request->length;
|
|
|
+ }
|
|
|
+ obj_request_done_set(obj_request);
|
|
|
+}
|
|
|
+
|
|
|
static void rbd_obj_request_complete(struct rbd_obj_request *obj_request)
|
|
|
{
|
|
|
dout("%s: obj %p cb %p\n", __func__, obj_request,
|
|
@@ -1284,23 +1310,10 @@ static void rbd_osd_read_callback(struct rbd_obj_request *obj_request)
|
|
|
{
|
|
|
dout("%s: obj %p result %d %llu/%llu\n", __func__, obj_request,
|
|
|
obj_request->result, obj_request->xferred, obj_request->length);
|
|
|
- /*
|
|
|
- * ENOENT means a hole in the object. We zero-fill the
|
|
|
- * entire length of the request. A short read also implies
|
|
|
- * zero-fill to the end of the request. Either way we
|
|
|
- * update the xferred count to indicate the whole request
|
|
|
- * was satisfied.
|
|
|
- */
|
|
|
- if (obj_request->result == -ENOENT) {
|
|
|
- zero_bio_chain(obj_request->bio_list, 0);
|
|
|
- obj_request->result = 0;
|
|
|
- obj_request->xferred = obj_request->length;
|
|
|
- } else if (obj_request->xferred < obj_request->length &&
|
|
|
- !obj_request->result) {
|
|
|
- zero_bio_chain(obj_request->bio_list, obj_request->xferred);
|
|
|
- obj_request->xferred = obj_request->length;
|
|
|
- }
|
|
|
- obj_request_done_set(obj_request);
|
|
|
+ if (obj_request->img_request)
|
|
|
+ rbd_img_obj_request_read_callback(obj_request);
|
|
|
+ else
|
|
|
+ obj_request_done_set(obj_request);
|
|
|
}
|
|
|
|
|
|
static void rbd_osd_write_callback(struct rbd_obj_request *obj_request)
|