Merge tag 'pull-bd_flags-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-block.git] / block / blk-core.c
index 1076336dd62076fb40e81fc8c8583eb762ef9f5e..ea44b13af9afee5c5a38c0800814adaee7cca681 100644 (file)
@@ -442,6 +442,8 @@ struct request_queue *blk_alloc_queue(struct queue_limits *lim, int node_id)
        init_waitqueue_head(&q->mq_freeze_wq);
        mutex_init(&q->mq_freeze_lock);
 
+       blkg_init_queue(q);
+
        /*
         * Init percpu_ref in atomic mode so that it's faster to shutdown.
         * See blk_register_queue() for details.
@@ -591,8 +593,7 @@ static inline blk_status_t blk_check_zone_append(struct request_queue *q,
                return BLK_STS_NOTSUPP;
 
        /* The bio sector must point to the start of a sequential zone */
-       if (!bdev_is_zone_start(bio->bi_bdev, bio->bi_iter.bi_sector) ||
-           !bio_zone_is_seq(bio))
+       if (!bdev_is_zone_start(bio->bi_bdev, bio->bi_iter.bi_sector))
                return BLK_STS_IOERR;
 
        /*
@@ -604,7 +605,7 @@ static inline blk_status_t blk_check_zone_append(struct request_queue *q,
                return BLK_STS_IOERR;
 
        /* Make sure the BIO is small enough and will not get split */
-       if (nr_sectors > q->limits.max_zone_append_sectors)
+       if (nr_sectors > queue_max_zone_append_sectors(q))
                return BLK_STS_IOERR;
 
        bio->bi_opf |= REQ_NOMERGE;
@@ -649,11 +650,13 @@ static void __submit_bio(struct bio *bio)
 static void __submit_bio_noacct(struct bio *bio)
 {
        struct bio_list bio_list_on_stack[2];
+       struct blk_plug plug;
 
        BUG_ON(bio->bi_next);
 
        bio_list_init(&bio_list_on_stack[0]);
        current->bio_list = bio_list_on_stack;
+       blk_start_plug(&plug);
 
        do {
                struct request_queue *q = bdev_get_queue(bio->bi_bdev);
@@ -687,19 +690,23 @@ static void __submit_bio_noacct(struct bio *bio)
                bio_list_merge(&bio_list_on_stack[0], &bio_list_on_stack[1]);
        } while ((bio = bio_list_pop(&bio_list_on_stack[0])));
 
+       blk_finish_plug(&plug);
        current->bio_list = NULL;
 }
 
 static void __submit_bio_noacct_mq(struct bio *bio)
 {
        struct bio_list bio_list[2] = { };
+       struct blk_plug plug;
 
        current->bio_list = bio_list;
+       blk_start_plug(&plug);
 
        do {
                __submit_bio(bio);
        } while ((bio = bio_list_pop(&bio_list[0])));
 
+       blk_finish_plug(&plug);
        current->bio_list = NULL;
 }
 
@@ -911,12 +918,6 @@ int bio_poll(struct bio *bio, struct io_comp_batch *iob, unsigned int flags)
            !test_bit(QUEUE_FLAG_POLL, &q->queue_flags))
                return 0;
 
-       /*
-        * As the requests that require a zone lock are not plugged in the
-        * first place, directly accessing the plug instead of using
-        * blk_mq_plug() should not have any consequences during flushing for
-        * zoned devices.
-        */
        blk_flush_plug(current->plug, false);
 
        /*
@@ -988,10 +989,11 @@ void update_io_ticks(struct block_device *part, unsigned long now, bool end)
        unsigned long stamp;
 again:
        stamp = READ_ONCE(part->bd_stamp);
-       if (unlikely(time_after(now, stamp))) {
-               if (likely(try_cmpxchg(&part->bd_stamp, &stamp, now)))
-                       __part_stat_add(part, io_ticks, end ? now - stamp : 1);
-       }
+       if (unlikely(time_after(now, stamp)) &&
+           likely(try_cmpxchg(&part->bd_stamp, &stamp, now)) &&
+           (end || part_in_flight(part)))
+               __part_stat_add(part, io_ticks, now - stamp);
+
        if (bdev_is_partition(part)) {
                part = bdev_whole(part);
                goto again;
@@ -1198,6 +1200,7 @@ void __blk_flush_plug(struct blk_plug *plug, bool from_schedule)
        if (unlikely(!rq_list_empty(plug->cached_rq)))
                blk_mq_free_plug_rqs(plug);
 
+       plug->cur_ktime = 0;
        current->flags &= ~PF_BLOCK_TS;
 }