Skip to content

Commit 26f887e

Browse files
committed
libceph, rbd, ceph: move ceph_osdc_alloc_messages() calls
The current requirement is that ceph_osdc_alloc_messages() should be called after oid and oloc are known. In preparation for preallocating message data items, move ceph_osdc_alloc_messages() further down, so that it is called when OSD op codes are known. Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
1 parent 39e58c3 commit 26f887e

File tree

3 files changed

+38
-29
lines changed

3 files changed

+38
-29
lines changed

drivers/block/rbd.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,9 +1500,6 @@ rbd_osd_req_create(struct rbd_obj_request *obj_req, unsigned int num_ops)
15001500
rbd_dev->header.object_prefix, obj_req->ex.oe_objno))
15011501
goto err_req;
15021502

1503-
if (ceph_osdc_alloc_messages(req, GFP_NOIO))
1504-
goto err_req;
1505-
15061503
return req;
15071504

15081505
err_req:
@@ -1945,6 +1942,10 @@ static int __rbd_img_fill_request(struct rbd_img_request *img_req)
19451942
}
19461943
if (ret)
19471944
return ret;
1945+
1946+
ret = ceph_osdc_alloc_messages(obj_req->osd_req, GFP_NOIO);
1947+
if (ret)
1948+
return ret;
19481949
}
19491950

19501951
return 0;
@@ -2404,6 +2405,10 @@ static int rbd_obj_issue_copyup(struct rbd_obj_request *obj_req, u32 bytes)
24042405
rbd_assert(0);
24052406
}
24062407

2408+
ret = ceph_osdc_alloc_messages(obj_req->osd_req, GFP_NOIO);
2409+
if (ret)
2410+
return ret;
2411+
24072412
rbd_obj_request_submit(obj_req);
24082413
return 0;
24092414
}
@@ -3783,10 +3788,6 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
37833788
ceph_oloc_copy(&req->r_base_oloc, oloc);
37843789
req->r_flags = CEPH_OSD_FLAG_READ;
37853790

3786-
ret = ceph_osdc_alloc_messages(req, GFP_KERNEL);
3787-
if (ret)
3788-
goto out_req;
3789-
37903791
pages = ceph_alloc_page_vector(num_pages, GFP_KERNEL);
37913792
if (IS_ERR(pages)) {
37923793
ret = PTR_ERR(pages);
@@ -3797,6 +3798,10 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
37973798
osd_req_op_extent_osd_data_pages(req, 0, pages, buf_len, 0, false,
37983799
true);
37993800

3801+
ret = ceph_osdc_alloc_messages(req, GFP_KERNEL);
3802+
if (ret)
3803+
goto out_req;
3804+
38003805
ceph_osdc_start_request(osdc, req, false);
38013806
ret = ceph_osdc_wait_request(osdc, req);
38023807
if (ret >= 0)

fs/ceph/file.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -870,18 +870,18 @@ static void ceph_aio_retry_work(struct work_struct *work)
870870
ceph_oloc_copy(&req->r_base_oloc, &orig_req->r_base_oloc);
871871
ceph_oid_copy(&req->r_base_oid, &orig_req->r_base_oid);
872872

873+
req->r_ops[0] = orig_req->r_ops[0];
874+
875+
req->r_mtime = aio_req->mtime;
876+
req->r_data_offset = req->r_ops[0].extent.offset;
877+
873878
ret = ceph_osdc_alloc_messages(req, GFP_NOFS);
874879
if (ret) {
875880
ceph_osdc_put_request(req);
876881
req = orig_req;
877882
goto out;
878883
}
879884

880-
req->r_ops[0] = orig_req->r_ops[0];
881-
882-
req->r_mtime = aio_req->mtime;
883-
req->r_data_offset = req->r_ops[0].extent.offset;
884-
885885
ceph_osdc_put_request(orig_req);
886886

887887
req->r_callback = ceph_aio_complete_req;

net/ceph/osd_client.c

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4483,12 +4483,6 @@ alloc_linger_request(struct ceph_osd_linger_request *lreq)
44834483

44844484
ceph_oid_copy(&req->r_base_oid, &lreq->t.base_oid);
44854485
ceph_oloc_copy(&req->r_base_oloc, &lreq->t.base_oloc);
4486-
4487-
if (ceph_osdc_alloc_messages(req, GFP_NOIO)) {
4488-
ceph_osdc_put_request(req);
4489-
return NULL;
4490-
}
4491-
44924486
return req;
44934487
}
44944488

@@ -4506,6 +4500,12 @@ alloc_watch_request(struct ceph_osd_linger_request *lreq, u8 watch_opcode)
45064500
* filled in by linger_submit().
45074501
*/
45084502
osd_req_op_watch_init(req, 0, 0, watch_opcode);
4503+
4504+
if (ceph_osdc_alloc_messages(req, GFP_NOIO)) {
4505+
ceph_osdc_put_request(req);
4506+
return NULL;
4507+
}
4508+
45094509
return req;
45104510
}
45114511

@@ -4656,12 +4656,12 @@ int ceph_osdc_notify_ack(struct ceph_osd_client *osdc,
46564656
ceph_oloc_copy(&req->r_base_oloc, oloc);
46574657
req->r_flags = CEPH_OSD_FLAG_READ;
46584658

4659-
ret = ceph_osdc_alloc_messages(req, GFP_NOIO);
4659+
ret = osd_req_op_notify_ack_init(req, 0, notify_id, cookie, payload,
4660+
payload_len);
46604661
if (ret)
46614662
goto out_put_req;
46624663

4663-
ret = osd_req_op_notify_ack_init(req, 0, notify_id, cookie, payload,
4664-
payload_len);
4664+
ret = ceph_osdc_alloc_messages(req, GFP_NOIO);
46654665
if (ret)
46664666
goto out_put_req;
46674667

@@ -4766,6 +4766,10 @@ int ceph_osdc_notify(struct ceph_osd_client *osdc,
47664766
response_data),
47674767
pages, PAGE_SIZE, 0, false, true);
47684768

4769+
ret = ceph_osdc_alloc_messages(lreq->reg_req, GFP_NOIO);
4770+
if (ret)
4771+
goto out_put_lreq;
4772+
47694773
linger_submit(lreq);
47704774
ret = linger_reg_commit_wait(lreq);
47714775
if (!ret)
@@ -4892,10 +4896,6 @@ int ceph_osdc_list_watchers(struct ceph_osd_client *osdc,
48924896
ceph_oloc_copy(&req->r_base_oloc, oloc);
48934897
req->r_flags = CEPH_OSD_FLAG_READ;
48944898

4895-
ret = ceph_osdc_alloc_messages(req, GFP_NOIO);
4896-
if (ret)
4897-
goto out_put_req;
4898-
48994899
pages = ceph_alloc_page_vector(1, GFP_NOIO);
49004900
if (IS_ERR(pages)) {
49014901
ret = PTR_ERR(pages);
@@ -4907,6 +4907,10 @@ int ceph_osdc_list_watchers(struct ceph_osd_client *osdc,
49074907
response_data),
49084908
pages, PAGE_SIZE, 0, false, true);
49094909

4910+
ret = ceph_osdc_alloc_messages(req, GFP_NOIO);
4911+
if (ret)
4912+
goto out_put_req;
4913+
49104914
ceph_osdc_start_request(osdc, req, false);
49114915
ret = ceph_osdc_wait_request(osdc, req);
49124916
if (ret >= 0) {
@@ -4969,10 +4973,6 @@ int ceph_osdc_call(struct ceph_osd_client *osdc,
49694973
ceph_oloc_copy(&req->r_base_oloc, oloc);
49704974
req->r_flags = flags;
49714975

4972-
ret = ceph_osdc_alloc_messages(req, GFP_NOIO);
4973-
if (ret)
4974-
goto out_put_req;
4975-
49764976
ret = osd_req_op_cls_init(req, 0, class, method);
49774977
if (ret)
49784978
goto out_put_req;
@@ -4984,6 +4984,10 @@ int ceph_osdc_call(struct ceph_osd_client *osdc,
49844984
osd_req_op_cls_response_data_pages(req, 0, &resp_page,
49854985
*resp_len, 0, false, false);
49864986

4987+
ret = ceph_osdc_alloc_messages(req, GFP_NOIO);
4988+
if (ret)
4989+
goto out_put_req;
4990+
49874991
ceph_osdc_start_request(osdc, req, false);
49884992
ret = ceph_osdc_wait_request(osdc, req);
49894993
if (ret >= 0) {

0 commit comments

Comments
 (0)