Skip to content

Commit

Permalink
rbd: setallochint only if object doesn't exist
Browse files Browse the repository at this point in the history
setallochint is really only useful on object creation.  Continue
hinting unconditionally if object map cannot be used.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
  • Loading branch information
idryomov committed Jul 8, 2019
1 parent 22e8bd5 commit 8b5bec5
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions drivers/block/rbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2365,9 +2365,12 @@ static void __rbd_osd_setup_write_ops(struct ceph_osd_request *osd_req,
struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
u16 opcode;

osd_req_op_alloc_hint_init(osd_req, which++,
rbd_dev->layout.object_size,
rbd_dev->layout.object_size);
if (!use_object_map(rbd_dev) ||
!(obj_req->flags & RBD_OBJ_FLAG_MAY_EXIST)) {
osd_req_op_alloc_hint_init(osd_req, which++,
rbd_dev->layout.object_size,
rbd_dev->layout.object_size);
}

if (rbd_obj_is_entire(obj_req))
opcode = CEPH_OSD_OP_WRITEFULL;
Expand Down Expand Up @@ -2510,9 +2513,15 @@ static int rbd_obj_init_zeroout(struct rbd_obj_request *obj_req)

static int count_write_ops(struct rbd_obj_request *obj_req)
{
switch (obj_req->img_request->op_type) {
struct rbd_img_request *img_req = obj_req->img_request;

switch (img_req->op_type) {
case OBJ_OP_WRITE:
return 2; /* setallochint + write/writefull */
if (!use_object_map(img_req->rbd_dev) ||
!(obj_req->flags & RBD_OBJ_FLAG_MAY_EXIST))
return 2; /* setallochint + write/writefull */

return 1; /* write/writefull */
case OBJ_OP_DISCARD:
return 1; /* delete/truncate/zero */
case OBJ_OP_ZEROOUT:
Expand Down

0 comments on commit 8b5bec5

Please sign in to comment.