rbd: compression_hint option
authorIlya Dryomov <idryomov@gmail.com>
Fri, 29 May 2020 18:51:23 +0000 (20:51 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 1 Jun 2020 21:32:35 +0000 (23:32 +0200)
Allow hinting to bluestore if the data should/should not be compressed.
The default is to not hint (compression_hint=none).

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Jason Dillaman <dillaman@redhat.com>
drivers/block/rbd.c

index 97e102e..7420648 100644 (file)
@@ -836,6 +836,7 @@ enum {
        Opt_lock_timeout,
        /* int args above */
        Opt_pool_ns,
+       Opt_compression_hint,
        /* string args above */
        Opt_read_only,
        Opt_read_write,
@@ -844,8 +845,23 @@ enum {
        Opt_notrim,
 };
 
+enum {
+       Opt_compression_hint_none,
+       Opt_compression_hint_compressible,
+       Opt_compression_hint_incompressible,
+};
+
+static const struct constant_table rbd_param_compression_hint[] = {
+       {"none",                Opt_compression_hint_none},
+       {"compressible",        Opt_compression_hint_compressible},
+       {"incompressible",      Opt_compression_hint_incompressible},
+       {}
+};
+
 static const struct fs_parameter_spec rbd_parameters[] = {
        fsparam_u32     ("alloc_size",                  Opt_alloc_size),
+       fsparam_enum    ("compression_hint",            Opt_compression_hint,
+                        rbd_param_compression_hint),
        fsparam_flag    ("exclusive",                   Opt_exclusive),
        fsparam_flag    ("lock_on_read",                Opt_lock_on_read),
        fsparam_u32     ("lock_timeout",                Opt_lock_timeout),
@@ -867,6 +883,8 @@ struct rbd_options {
        bool    lock_on_read;
        bool    exclusive;
        bool    trim;
+
+       u32 alloc_hint_flags;  /* CEPH_OSD_OP_ALLOC_HINT_FLAG_* */
 };
 
 #define RBD_QUEUE_DEPTH_DEFAULT        BLKDEV_MAX_RQ
@@ -2254,7 +2272,7 @@ static void __rbd_osd_setup_write_ops(struct ceph_osd_request *osd_req,
                osd_req_op_alloc_hint_init(osd_req, which++,
                                           rbd_dev->layout.object_size,
                                           rbd_dev->layout.object_size,
-                                          0);
+                                          rbd_dev->opts->alloc_hint_flags);
        }
 
        if (rbd_obj_is_entire(obj_req))
@@ -6332,6 +6350,29 @@ static int rbd_parse_param(struct fs_parameter *param,
                pctx->spec->pool_ns = param->string;
                param->string = NULL;
                break;
+       case Opt_compression_hint:
+               switch (result.uint_32) {
+               case Opt_compression_hint_none:
+                       opt->alloc_hint_flags &=
+                           ~(CEPH_OSD_ALLOC_HINT_FLAG_COMPRESSIBLE |
+                             CEPH_OSD_ALLOC_HINT_FLAG_INCOMPRESSIBLE);
+                       break;
+               case Opt_compression_hint_compressible:
+                       opt->alloc_hint_flags |=
+                           CEPH_OSD_ALLOC_HINT_FLAG_COMPRESSIBLE;
+                       opt->alloc_hint_flags &=
+                           ~CEPH_OSD_ALLOC_HINT_FLAG_INCOMPRESSIBLE;
+                       break;
+               case Opt_compression_hint_incompressible:
+                       opt->alloc_hint_flags |=
+                           CEPH_OSD_ALLOC_HINT_FLAG_INCOMPRESSIBLE;
+                       opt->alloc_hint_flags &=
+                           ~CEPH_OSD_ALLOC_HINT_FLAG_COMPRESSIBLE;
+                       break;
+               default:
+                       BUG();
+               }
+               break;
        case Opt_read_only:
                opt->read_only = true;
                break;