drm/amd/display: fix a couple of spelling mistakes
[sfrench/cifs-2.6.git] / block / blk-core.c
index 1bf83a0df0f6bd81933ce0669a6daf4329085c0c..8340f69670d89625a8adc55a24e9c4e547555d7f 100644 (file)
@@ -282,35 +282,6 @@ void blk_set_queue_dying(struct request_queue *q)
 }
 EXPORT_SYMBOL_GPL(blk_set_queue_dying);
 
-/* Unconfigure the I/O scheduler and dissociate from the cgroup controller. */
-void blk_exit_queue(struct request_queue *q)
-{
-       /*
-        * Since the I/O scheduler exit code may access cgroup information,
-        * perform I/O scheduler exit before disassociating from the block
-        * cgroup controller.
-        */
-       if (q->elevator) {
-               ioc_clear_queue(q);
-               elevator_exit(q, q->elevator);
-               q->elevator = NULL;
-       }
-
-       /*
-        * Remove all references to @q from the block cgroup controller before
-        * restoring @q->queue_lock to avoid that restoring this pointer causes
-        * e.g. blkcg_print_blkgs() to crash.
-        */
-       blkcg_exit_queue(q);
-
-       /*
-        * Since the cgroup code may dereference the @q->backing_dev_info
-        * pointer, only decrease its reference count after having removed the
-        * association with the block cgroup controller.
-        */
-       bdi_put(q->backing_dev_info);
-}
-
 /**
  * blk_cleanup_queue - shutdown a request queue
  * @q: request queue to shutdown
@@ -346,17 +317,22 @@ void blk_cleanup_queue(struct request_queue *q)
        del_timer_sync(&q->backing_dev_info->laptop_mode_wb_timer);
        blk_sync_queue(q);
 
-       /*
-        * I/O scheduler exit is only safe after the sysfs scheduler attribute
-        * has been removed.
-        */
-       WARN_ON_ONCE(q->kobj.state_in_sysfs);
-
-       blk_exit_queue(q);
-
        if (queue_is_mq(q))
                blk_mq_exit_queue(q);
 
+       /*
+        * In theory, request pool of sched_tags belongs to request queue.
+        * However, the current implementation requires tag_set for freeing
+        * requests, so free the pool now.
+        *
+        * Queue has become frozen, there can't be any in-queue requests, so
+        * it is safe to free requests now.
+        */
+       mutex_lock(&q->sysfs_lock);
+       if (q->elevator)
+               blk_mq_sched_free_requests(q);
+       mutex_unlock(&q->sysfs_lock);
+
        percpu_ref_exit(&q->q_usage_counter);
 
        /* @q is and will stay empty, shutdown and put */
@@ -994,22 +970,8 @@ blk_qc_t generic_make_request(struct bio *bio)
         * yet.
         */
        struct bio_list bio_list_on_stack[2];
-       blk_mq_req_flags_t flags = 0;
-       struct request_queue *q = bio->bi_disk->queue;
        blk_qc_t ret = BLK_QC_T_NONE;
 
-       if (bio->bi_opf & REQ_NOWAIT)
-               flags = BLK_MQ_REQ_NOWAIT;
-       if (bio_flagged(bio, BIO_QUEUE_ENTERED))
-               blk_queue_enter_live(q);
-       else if (blk_queue_enter(q, flags) < 0) {
-               if (!blk_queue_dying(q) && (bio->bi_opf & REQ_NOWAIT))
-                       bio_wouldblock_error(bio);
-               else
-                       bio_io_error(bio);
-               return ret;
-       }
-
        if (!generic_make_request_checks(bio))
                goto out;
 
@@ -1046,22 +1008,11 @@ blk_qc_t generic_make_request(struct bio *bio)
        bio_list_init(&bio_list_on_stack[0]);
        current->bio_list = bio_list_on_stack;
        do {
-               bool enter_succeeded = true;
-
-               if (unlikely(q != bio->bi_disk->queue)) {
-                       if (q)
-                               blk_queue_exit(q);
-                       q = bio->bi_disk->queue;
-                       flags = 0;
-                       if (bio->bi_opf & REQ_NOWAIT)
-                               flags = BLK_MQ_REQ_NOWAIT;
-                       if (blk_queue_enter(q, flags) < 0) {
-                               enter_succeeded = false;
-                               q = NULL;
-                       }
-               }
+               struct request_queue *q = bio->bi_disk->queue;
+               blk_mq_req_flags_t flags = bio->bi_opf & REQ_NOWAIT ?
+                       BLK_MQ_REQ_NOWAIT : 0;
 
-               if (enter_succeeded) {
+               if (likely(blk_queue_enter(q, flags) == 0)) {
                        struct bio_list lower, same;
 
                        /* Create a fresh bio_list for all subordinate requests */
@@ -1069,6 +1020,8 @@ blk_qc_t generic_make_request(struct bio *bio)
                        bio_list_init(&bio_list_on_stack[0]);
                        ret = q->make_request_fn(q, bio);
 
+                       blk_queue_exit(q);
+
                        /* sort new bios into those for a lower level
                         * and those for the same level
                         */
@@ -1095,8 +1048,6 @@ blk_qc_t generic_make_request(struct bio *bio)
        current->bio_list = NULL; /* deactivate */
 
 out:
-       if (q)
-               blk_queue_exit(q);
        return ret;
 }
 EXPORT_SYMBOL(generic_make_request);
@@ -1200,7 +1151,9 @@ static int blk_cloned_rq_check_limits(struct request_queue *q,
                                      struct request *rq)
 {
        if (blk_rq_sectors(rq) > blk_queue_get_max_sectors(q, req_op(rq))) {
-               printk(KERN_ERR "%s: over max size limit.\n", __func__);
+               printk(KERN_ERR "%s: over max size limit. (%u > %u)\n",
+                       __func__, blk_rq_sectors(rq),
+                       blk_queue_get_max_sectors(q, req_op(rq)));
                return -EIO;
        }
 
@@ -1212,7 +1165,8 @@ static int blk_cloned_rq_check_limits(struct request_queue *q,
         */
        blk_recalc_rq_segments(rq);
        if (rq->nr_phys_segments > queue_max_segments(q)) {
-               printk(KERN_ERR "%s: over max segments limit.\n", __func__);
+               printk(KERN_ERR "%s: over max segments limit. (%hu > %hu)\n",
+                       __func__, rq->nr_phys_segments, queue_max_segments(q));
                return -EIO;
        }