libceph: move away from global osd_req_flags
[linux-2.6-microblaze.git] / drivers / block / rbd.c
index 67d65ac..4f61e92 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
@@ -1433,8 +1451,10 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req)
 static void rbd_osd_format_read(struct ceph_osd_request *osd_req)
 {
        struct rbd_obj_request *obj_request = osd_req->r_priv;
+       struct rbd_device *rbd_dev = obj_request->img_request->rbd_dev;
+       struct ceph_options *opt = rbd_dev->rbd_client->client->options;
 
-       osd_req->r_flags = CEPH_OSD_FLAG_READ;
+       osd_req->r_flags = CEPH_OSD_FLAG_READ | opt->read_from_replica;
        osd_req->r_snapid = obj_request->img_request->snap_id;
 }
 
@@ -2253,7 +2273,8 @@ static void __rbd_osd_setup_write_ops(struct ceph_osd_request *osd_req,
            !(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);
+                                          rbd_dev->layout.object_size,
+                                          rbd_dev->opts->alloc_hint_flags);
        }
 
        if (rbd_obj_is_entire(obj_req))
@@ -6331,6 +6352,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;