static int blk_iocost_init(struct gendisk *disk)
 {
-       struct request_queue *q = disk->queue;
        struct ioc *ioc;
-       struct rq_qos *rqos;
        int i, cpu, ret;
 
        ioc = kzalloc(sizeof(*ioc), GFP_KERNEL);
                local64_set(&ccs->rq_wait_ns, 0);
        }
 
-       rqos = &ioc->rqos;
-       rqos->id = RQ_QOS_COST;
-       rqos->ops = &ioc_rqos_ops;
-       rqos->q = q;
-
        spin_lock_init(&ioc->lock);
        timer_setup(&ioc->timer, ioc_timer_fn, 0);
        INIT_LIST_HEAD(&ioc->active_iocgs);
         * called before policy activation completion, can't assume that the
         * target bio has an iocg associated and need to test for NULL iocg.
         */
-       ret = rq_qos_add(q, rqos);
+       ret = rq_qos_add(&ioc->rqos, disk, RQ_QOS_COST, &ioc_rqos_ops);
        if (ret)
                goto err_free_ioc;
 
-       ret = blkcg_activate_policy(q, &blkcg_policy_iocost);
+       ret = blkcg_activate_policy(disk->queue, &blkcg_policy_iocost);
        if (ret)
                goto err_del_qos;
        return 0;
 
 err_del_qos:
-       rq_qos_del(q, rqos);
+       rq_qos_del(&ioc->rqos);
 err_free_ioc:
        free_percpu(ioc->pcpu_stat);
        kfree(ioc);
 
 
 int blk_iolatency_init(struct gendisk *disk)
 {
-       struct request_queue *q = disk->queue;
        struct blk_iolatency *blkiolat;
-       struct rq_qos *rqos;
        int ret;
 
        blkiolat = kzalloc(sizeof(*blkiolat), GFP_KERNEL);
        if (!blkiolat)
                return -ENOMEM;
 
-       rqos = &blkiolat->rqos;
-       rqos->id = RQ_QOS_LATENCY;
-       rqos->ops = &blkcg_iolatency_ops;
-       rqos->q = q;
-
-       ret = rq_qos_add(q, rqos);
+       ret = rq_qos_add(&blkiolat->rqos, disk, RQ_QOS_LATENCY,
+                        &blkcg_iolatency_ops);
        if (ret)
                goto err_free;
-       ret = blkcg_activate_policy(q, &blkcg_policy_iolatency);
+       ret = blkcg_activate_policy(disk->queue, &blkcg_policy_iolatency);
        if (ret)
                goto err_qos_del;
 
        return 0;
 
 err_qos_del:
-       rq_qos_del(q, rqos);
+       rq_qos_del(&blkiolat->rqos);
 err_free:
        kfree(blkiolat);
        return ret;
 
        }
 }
 
-int rq_qos_add(struct request_queue *q, struct rq_qos *rqos)
+int rq_qos_add(struct rq_qos *rqos, struct gendisk *disk, enum rq_qos_id id,
+               struct rq_qos_ops *ops)
 {
+       struct request_queue *q = disk->queue;
+
+       rqos->q = q;
+       rqos->id = id;
+       rqos->ops = ops;
+
        /*
         * No IO can be in-flight when adding rqos, so freeze queue, which
         * is fine since we only support rq_qos for blk-mq queue.
        spin_unlock_irq(&q->queue_lock);
        blk_mq_unfreeze_queue(q);
        return -EBUSY;
-
 }
 
-void rq_qos_del(struct request_queue *q, struct rq_qos *rqos)
+void rq_qos_del(struct rq_qos *rqos)
 {
+       struct request_queue *q = rqos->q;
        struct rq_qos **cur;
 
        /*
 
        init_waitqueue_head(&rq_wait->wait);
 }
 
-int rq_qos_add(struct request_queue *q, struct rq_qos *rqos);
-void rq_qos_del(struct request_queue *q, struct rq_qos *rqos);
+int rq_qos_add(struct rq_qos *rqos, struct gendisk *disk, enum rq_qos_id id,
+               struct rq_qos_ops *ops);
+void rq_qos_del(struct rq_qos *rqos);
 
 typedef bool (acquire_inflight_cb_t)(struct rq_wait *rqw, void *private_data);
 typedef void (cleanup_cb_t)(struct rq_wait *rqw, void *private_data);
 
        for (i = 0; i < WBT_NUM_RWQ; i++)
                rq_wait_init(&rwb->rq_wait[i]);
 
-       rwb->rqos.id = RQ_QOS_WBT;
-       rwb->rqos.ops = &wbt_rqos_ops;
-       rwb->rqos.q = q;
        rwb->last_comp = rwb->last_issue = jiffies;
        rwb->win_nsec = RWB_WINDOW_NSEC;
        rwb->enable_state = WBT_STATE_ON_DEFAULT;
        /*
         * Assign rwb and add the stats callback.
         */
-       ret = rq_qos_add(q, &rwb->rqos);
+       ret = rq_qos_add(&rwb->rqos, disk, RQ_QOS_WBT, &wbt_rqos_ops);
        if (ret)
                goto err_free;