Merge branch 'stable-4.12' of git://git.infradead.org/users/pcmoore/audit
[linux-2.6-microblaze.git] / block / blk-wbt.c
index ffa80e1..17676f4 100644 (file)
@@ -653,22 +653,37 @@ void wbt_set_write_cache(struct rq_wb *rwb, bool write_cache_on)
                rwb->wc = write_cache_on;
 }
 
- /*
- * Disable wbt, if enabled by default. Only called from CFQ, if we have
- * cgroups enabled
+/*
+ * Disable wbt, if enabled by default. Only called from CFQ.
  */
 void wbt_disable_default(struct request_queue *q)
 {
        struct rq_wb *rwb = q->rq_wb;
 
-       if (rwb && rwb->enable_state == WBT_STATE_ON_DEFAULT) {
-               blk_stat_remove_callback(q, rwb->cb);
-               rwb->win_nsec = rwb->min_lat_nsec = 0;
-               wbt_update_limits(rwb);
-       }
+       if (rwb && rwb->enable_state == WBT_STATE_ON_DEFAULT)
+               wbt_exit(q);
 }
 EXPORT_SYMBOL_GPL(wbt_disable_default);
 
+/*
+ * Enable wbt if defaults are configured that way
+ */
+void wbt_enable_default(struct request_queue *q)
+{
+       /* Throttling already enabled? */
+       if (q->rq_wb)
+               return;
+
+       /* Queue not registered? Maybe shutting down... */
+       if (!test_bit(QUEUE_FLAG_REGISTERED, &q->queue_flags))
+               return;
+
+       if ((q->mq_ops && IS_ENABLED(CONFIG_BLK_WBT_MQ)) ||
+           (q->request_fn && IS_ENABLED(CONFIG_BLK_WBT_SQ)))
+               wbt_init(q);
+}
+EXPORT_SYMBOL_GPL(wbt_enable_default);
+
 u64 wbt_default_latency_nsec(struct request_queue *q)
 {
        /*
@@ -681,6 +696,11 @@ u64 wbt_default_latency_nsec(struct request_queue *q)
                return 75000000ULL;
 }
 
+static int wbt_data_dir(const struct request *rq)
+{
+       return rq_data_dir(rq);
+}
+
 int wbt_init(struct request_queue *q)
 {
        struct rq_wb *rwb;
@@ -692,7 +712,7 @@ int wbt_init(struct request_queue *q)
        if (!rwb)
                return -ENOMEM;
 
-       rwb->cb = blk_stat_alloc_callback(wb_timer_fn, blk_stat_rq_ddir, 2, rwb);
+       rwb->cb = blk_stat_alloc_callback(wb_timer_fn, wbt_data_dir, 2, rwb);
        if (!rwb->cb) {
                kfree(rwb);
                return -ENOMEM;