|
@@ -523,6 +523,7 @@ void rbd_warn(struct rbd_device *rbd_dev, const char *fmt, ...)
|
|
|
# define rbd_assert(expr) ((void) 0)
|
|
|
#endif /* !RBD_DEBUG */
|
|
|
|
|
|
+static void rbd_osd_copyup_callback(struct rbd_obj_request *obj_request);
|
|
|
static int rbd_img_obj_request_submit(struct rbd_obj_request *obj_request);
|
|
|
static void rbd_img_parent_read(struct rbd_obj_request *obj_request);
|
|
|
static void rbd_dev_remove_parent(struct rbd_device *rbd_dev);
|
|
@@ -1818,6 +1819,16 @@ static void rbd_osd_stat_callback(struct rbd_obj_request *obj_request)
|
|
|
obj_request_done_set(obj_request);
|
|
|
}
|
|
|
|
|
|
+static void rbd_osd_call_callback(struct rbd_obj_request *obj_request)
|
|
|
+{
|
|
|
+ dout("%s: obj %p\n", __func__, obj_request);
|
|
|
+
|
|
|
+ if (obj_request_img_data_test(obj_request))
|
|
|
+ rbd_osd_copyup_callback(obj_request);
|
|
|
+ else
|
|
|
+ obj_request_done_set(obj_request);
|
|
|
+}
|
|
|
+
|
|
|
static void rbd_osd_req_callback(struct ceph_osd_request *osd_req,
|
|
|
struct ceph_msg *msg)
|
|
|
{
|
|
@@ -1866,6 +1877,8 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req,
|
|
|
rbd_osd_discard_callback(obj_request);
|
|
|
break;
|
|
|
case CEPH_OSD_OP_CALL:
|
|
|
+ rbd_osd_call_callback(obj_request);
|
|
|
+ break;
|
|
|
case CEPH_OSD_OP_NOTIFY_ACK:
|
|
|
case CEPH_OSD_OP_WATCH:
|
|
|
rbd_osd_trivial_callback(obj_request);
|
|
@@ -2530,13 +2543,15 @@ out_unwind:
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-rbd_img_obj_copyup_callback(struct rbd_obj_request *obj_request)
|
|
|
+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);
|
|
|
+
|
|
|
rbd_assert(obj_request->type == OBJ_REQUEST_BIO ||
|
|
|
obj_request->type == OBJ_REQUEST_NODATA);
|
|
|
rbd_assert(obj_request_img_data_test(obj_request));
|
|
@@ -2563,9 +2578,7 @@ rbd_img_obj_copyup_callback(struct rbd_obj_request *obj_request)
|
|
|
if (!obj_request->result)
|
|
|
obj_request->xferred = obj_request->length;
|
|
|
|
|
|
- /* Finish up with the normal image object callback */
|
|
|
-
|
|
|
- rbd_img_obj_callback(obj_request);
|
|
|
+ obj_request_done_set(obj_request);
|
|
|
}
|
|
|
|
|
|
static void
|
|
@@ -2650,7 +2663,6 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
|
|
|
|
|
|
/* All set, send it off. */
|
|
|
|
|
|
- orig_request->callback = rbd_img_obj_copyup_callback;
|
|
|
osdc = &rbd_dev->rbd_client->client->osdc;
|
|
|
img_result = rbd_obj_request_submit(osdc, orig_request);
|
|
|
if (!img_result)
|