summaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2019-05-14 15:06:07 -0400
committerIlya Dryomov <idryomov@gmail.com>2019-07-08 08:01:44 -0400
commit85b5e6d11898fddfcb2832024f73454d448f76e0 (patch)
tree024ed6ecf2a79fcc3b6d0e84e8d467d40f9046ed /drivers/block
parent0ad5d953548fe336134026b039ad4fd9e6594f16 (diff)
rbd: move OSD request submission into object request state machines
Start eliminating asymmetry where the initial OSD request is allocated and submitted from outside the state machine, making error handling and restarts harder than they could be. This commit deals with submission, a commit that deals with allocation will follow. Note that this commit adds parent chain recursion on the submission side: rbd_img_request_submit rbd_obj_handle_request __rbd_obj_handle_request rbd_obj_handle_read rbd_obj_handle_write_guard rbd_obj_read_from_parent rbd_img_request_submit This will be fixed in the next commit. Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Reviewed-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/rbd.c60
1 files changed, 49 insertions, 11 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 488da877a2bb..9c6be82353c0 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -223,7 +223,8 @@ enum obj_operation_type {
223#define RBD_OBJ_FLAG_COPYUP_ENABLED (1U << 1) 223#define RBD_OBJ_FLAG_COPYUP_ENABLED (1U << 1)
224 224
225enum rbd_obj_read_state { 225enum rbd_obj_read_state {
226 RBD_OBJ_READ_OBJECT = 1, 226 RBD_OBJ_READ_START = 1,
227 RBD_OBJ_READ_OBJECT,
227 RBD_OBJ_READ_PARENT, 228 RBD_OBJ_READ_PARENT,
228}; 229};
229 230
@@ -253,7 +254,8 @@ enum rbd_obj_read_state {
253 * even if there is a parent). 254 * even if there is a parent).
254 */ 255 */
255enum rbd_obj_write_state { 256enum rbd_obj_write_state {
256 RBD_OBJ_WRITE_OBJECT = 1, 257 RBD_OBJ_WRITE_START = 1,
258 RBD_OBJ_WRITE_OBJECT,
257 RBD_OBJ_WRITE_READ_FROM_PARENT, 259 RBD_OBJ_WRITE_READ_FROM_PARENT,
258 RBD_OBJ_WRITE_COPYUP_EMPTY_SNAPC, 260 RBD_OBJ_WRITE_COPYUP_EMPTY_SNAPC,
259 RBD_OBJ_WRITE_COPYUP_OPS, 261 RBD_OBJ_WRITE_COPYUP_OPS,
@@ -284,6 +286,7 @@ struct rbd_obj_request {
284 286
285 struct ceph_osd_request *osd_req; 287 struct ceph_osd_request *osd_req;
286 288
289 struct mutex state_mutex;
287 struct kref kref; 290 struct kref kref;
288}; 291};
289 292
@@ -1560,6 +1563,7 @@ static struct rbd_obj_request *rbd_obj_request_create(void)
1560 return NULL; 1563 return NULL;
1561 1564
1562 ceph_object_extent_init(&obj_request->ex); 1565 ceph_object_extent_init(&obj_request->ex);
1566 mutex_init(&obj_request->state_mutex);
1563 kref_init(&obj_request->kref); 1567 kref_init(&obj_request->kref);
1564 1568
1565 dout("%s %p\n", __func__, obj_request); 1569 dout("%s %p\n", __func__, obj_request);
@@ -1802,7 +1806,7 @@ static int rbd_obj_setup_read(struct rbd_obj_request *obj_req)
1802 rbd_osd_req_setup_data(obj_req, 0); 1806 rbd_osd_req_setup_data(obj_req, 0);
1803 1807
1804 rbd_osd_req_format_read(obj_req); 1808 rbd_osd_req_format_read(obj_req);
1805 obj_req->read_state = RBD_OBJ_READ_OBJECT; 1809 obj_req->read_state = RBD_OBJ_READ_START;
1806 return 0; 1810 return 0;
1807} 1811}
1808 1812
@@ -1885,7 +1889,7 @@ static int rbd_obj_setup_write(struct rbd_obj_request *obj_req)
1885 return ret; 1889 return ret;
1886 } 1890 }
1887 1891
1888 obj_req->write_state = RBD_OBJ_WRITE_OBJECT; 1892 obj_req->write_state = RBD_OBJ_WRITE_START;
1889 __rbd_obj_setup_write(obj_req, which); 1893 __rbd_obj_setup_write(obj_req, which);
1890 return 0; 1894 return 0;
1891} 1895}
@@ -1943,7 +1947,7 @@ static int rbd_obj_setup_discard(struct rbd_obj_request *obj_req)
1943 off, next_off - off, 0, 0); 1947 off, next_off - off, 0, 0);
1944 } 1948 }
1945 1949
1946 obj_req->write_state = RBD_OBJ_WRITE_OBJECT; 1950 obj_req->write_state = RBD_OBJ_WRITE_START;
1947 rbd_osd_req_format_write(obj_req); 1951 rbd_osd_req_format_write(obj_req);
1948 return 0; 1952 return 0;
1949} 1953}
@@ -2022,7 +2026,7 @@ static int rbd_obj_setup_zeroout(struct rbd_obj_request *obj_req)
2022 return ret; 2026 return ret;
2023 } 2027 }
2024 2028
2025 obj_req->write_state = RBD_OBJ_WRITE_OBJECT; 2029 obj_req->write_state = RBD_OBJ_WRITE_START;
2026 __rbd_obj_setup_zeroout(obj_req, which); 2030 __rbd_obj_setup_zeroout(obj_req, which);
2027 return 0; 2031 return 0;
2028} 2032}
@@ -2363,11 +2367,17 @@ static void rbd_img_request_submit(struct rbd_img_request *img_request)
2363 2367
2364 rbd_img_request_get(img_request); 2368 rbd_img_request_get(img_request);
2365 for_each_obj_request(img_request, obj_request) 2369 for_each_obj_request(img_request, obj_request)
2366 rbd_obj_request_submit(obj_request); 2370 rbd_obj_handle_request(obj_request, 0);
2367 2371
2368 rbd_img_request_put(img_request); 2372 rbd_img_request_put(img_request);
2369} 2373}
2370 2374
2375static int rbd_obj_read_object(struct rbd_obj_request *obj_req)
2376{
2377 rbd_obj_request_submit(obj_req);
2378 return 0;
2379}
2380
2371static int rbd_obj_read_from_parent(struct rbd_obj_request *obj_req) 2381static int rbd_obj_read_from_parent(struct rbd_obj_request *obj_req)
2372{ 2382{
2373 struct rbd_img_request *img_req = obj_req->img_request; 2383 struct rbd_img_request *img_req = obj_req->img_request;
@@ -2415,12 +2425,22 @@ static int rbd_obj_read_from_parent(struct rbd_obj_request *obj_req)
2415 return 0; 2425 return 0;
2416} 2426}
2417 2427
2418static bool rbd_obj_handle_read(struct rbd_obj_request *obj_req, int *result) 2428static bool rbd_obj_advance_read(struct rbd_obj_request *obj_req, int *result)
2419{ 2429{
2420 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev; 2430 struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
2421 int ret; 2431 int ret;
2422 2432
2423 switch (obj_req->read_state) { 2433 switch (obj_req->read_state) {
2434 case RBD_OBJ_READ_START:
2435 rbd_assert(!*result);
2436
2437 ret = rbd_obj_read_object(obj_req);
2438 if (ret) {
2439 *result = ret;
2440 return true;
2441 }
2442 obj_req->read_state = RBD_OBJ_READ_OBJECT;
2443 return false;
2424 case RBD_OBJ_READ_OBJECT: 2444 case RBD_OBJ_READ_OBJECT:
2425 if (*result == -ENOENT && rbd_dev->parent_overlap) { 2445 if (*result == -ENOENT && rbd_dev->parent_overlap) {
2426 /* reverse map this object extent onto the parent */ 2446 /* reverse map this object extent onto the parent */
@@ -2464,6 +2484,12 @@ static bool rbd_obj_handle_read(struct rbd_obj_request *obj_req, int *result)
2464 } 2484 }
2465} 2485}
2466 2486
2487static int rbd_obj_write_object(struct rbd_obj_request *obj_req)
2488{
2489 rbd_obj_request_submit(obj_req);
2490 return 0;
2491}
2492
2467/* 2493/*
2468 * copyup_bvecs pages are never highmem pages 2494 * copyup_bvecs pages are never highmem pages
2469 */ 2495 */
@@ -2661,11 +2687,21 @@ static int rbd_obj_handle_write_guard(struct rbd_obj_request *obj_req)
2661 return rbd_obj_read_from_parent(obj_req); 2687 return rbd_obj_read_from_parent(obj_req);
2662} 2688}
2663 2689
2664static bool rbd_obj_handle_write(struct rbd_obj_request *obj_req, int *result) 2690static bool rbd_obj_advance_write(struct rbd_obj_request *obj_req, int *result)
2665{ 2691{
2666 int ret; 2692 int ret;
2667 2693
2668 switch (obj_req->write_state) { 2694 switch (obj_req->write_state) {
2695 case RBD_OBJ_WRITE_START:
2696 rbd_assert(!*result);
2697
2698 ret = rbd_obj_write_object(obj_req);
2699 if (ret) {
2700 *result = ret;
2701 return true;
2702 }
2703 obj_req->write_state = RBD_OBJ_WRITE_OBJECT;
2704 return false;
2669 case RBD_OBJ_WRITE_OBJECT: 2705 case RBD_OBJ_WRITE_OBJECT:
2670 if (*result == -ENOENT) { 2706 if (*result == -ENOENT) {
2671 if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED) { 2707 if (obj_req->flags & RBD_OBJ_FLAG_COPYUP_ENABLED) {
@@ -2722,10 +2758,12 @@ static bool __rbd_obj_handle_request(struct rbd_obj_request *obj_req,
2722 struct rbd_img_request *img_req = obj_req->img_request; 2758 struct rbd_img_request *img_req = obj_req->img_request;
2723 bool done; 2759 bool done;
2724 2760
2761 mutex_lock(&obj_req->state_mutex);
2725 if (!rbd_img_is_write(img_req)) 2762 if (!rbd_img_is_write(img_req))
2726 done = rbd_obj_handle_read(obj_req, result); 2763 done = rbd_obj_advance_read(obj_req, result);
2727 else 2764 else
2728 done = rbd_obj_handle_write(obj_req, result); 2765 done = rbd_obj_advance_write(obj_req, result);
2766 mutex_unlock(&obj_req->state_mutex);
2729 2767
2730 return done; 2768 return done;
2731} 2769}