#include "blk-cgroup.h"
 #include "blk-ioprio.h"
 #include "blk-throttle.h"
-#include "blk-rq-qos.h"
 
 /*
  * blkcg_pol_mutex protects blkcg_policy[] and policy [de]activation.
        if (ret)
                goto err_ioprio_exit;
 
-       ret = blk_iolatency_init(disk);
-       if (ret)
-               goto err_throtl_exit;
-
        return 0;
 
-err_throtl_exit:
-       blk_throtl_exit(disk);
 err_ioprio_exit:
        blk_ioprio_exit(disk);
 err_destroy_all:
 void blkcg_exit_disk(struct gendisk *disk)
 {
        blkg_destroy_all(disk);
-       rq_qos_exit(disk->queue);
        blk_throtl_exit(disk);
 }
 
 
        }
 }
 
-int blk_iolatency_init(struct gendisk *disk)
+static int blk_iolatency_init(struct gendisk *disk)
 {
        struct blk_iolatency *blkiolat;
        int ret;
        }
 }
 
+static int blk_iolatency_try_init(struct blkg_conf_ctx *ctx)
+{
+       static DEFINE_MUTEX(init_mutex);
+       int ret;
+
+       ret = blkg_conf_open_bdev(ctx);
+       if (ret)
+               return ret;
+
+       /*
+        * blk_iolatency_init() may fail after rq_qos_add() succeeds which can
+        * confuse iolat_rq_qos() test. Make the test and init atomic.
+        */
+       mutex_lock(&init_mutex);
+
+       if (!iolat_rq_qos(ctx->bdev->bd_queue))
+               ret = blk_iolatency_init(ctx->bdev->bd_disk);
+
+       mutex_unlock(&init_mutex);
+
+       return ret;
+}
+
 static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf,
                             size_t nbytes, loff_t off)
 {
 
        blkg_conf_init(&ctx, buf);
 
+       ret = blk_iolatency_try_init(&ctx);
+       if (ret)
+               goto out;
+
        ret = blkg_conf_prep(blkcg, &blkcg_policy_iolatency, &ctx);
        if (ret)
                goto out;
 
        return bio;
 }
 
-#ifdef CONFIG_BLK_CGROUP_IOLATENCY
-int blk_iolatency_init(struct gendisk *disk);
-#else
-static inline int blk_iolatency_init(struct gendisk *disk) { return 0; };
-#endif
-
 #ifdef CONFIG_BLK_DEV_ZONED
 void disk_free_zone_bitmaps(struct gendisk *disk);
 void disk_clear_zone_settings(struct gendisk *disk);