rbd: setallochint only if object doesn't exist
authorIlya Dryomov <idryomov@gmail.com>
Wed, 19 Jun 2019 13:45:27 +0000 (15:45 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 8 Jul 2019 12:01:45 +0000 (14:01 +0200)
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>
drivers/block/rbd.c

index 0df9166..a3d49fb 100644 (file)
@@ -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;
@@ -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: