Commit 3413efa8 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull bdev flags update from Al Viro:
 "Compactifying bdev flags.

  We can easily have up to 24 flags with sane atomicity, _without_
  pushing anything out of the first cacheline of struct block_device"

* tag 'pull-bd_flags-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  bdev: move ->bd_make_it_fail to ->__bd_flags
  bdev: move ->bd_ro_warned to ->__bd_flags
  bdev: move ->bd_has_subit_bio to ->__bd_flags
  bdev: move ->bd_write_holder into ->__bd_flags
  bdev: move ->bd_read_only to ->__bd_flags
  bdev: infrastructure for flags
  wrapper for access to ->bd_partno
  Use bdev_is_paritition() instead of open-coding it
parents 2a8120d7 811ba89a
Loading
Loading
Loading
Loading
+8 −9
Original line number Diff line number Diff line
@@ -422,13 +422,11 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
	mutex_init(&bdev->bd_fsfreeze_mutex);
	spin_lock_init(&bdev->bd_size_lock);
	mutex_init(&bdev->bd_holder_lock);
	bdev->bd_partno = partno;
	atomic_set(&bdev->__bd_flags, partno);
	bdev->bd_mapping = &inode->i_data;
	bdev->bd_queue = disk->queue;
	if (partno)
		bdev->bd_has_submit_bio = disk->part0->bd_has_submit_bio;
	else
		bdev->bd_has_submit_bio = false;
	if (partno && bdev_test_flag(disk->part0, BD_HAS_SUBMIT_BIO))
		bdev_set_flag(bdev, BD_HAS_SUBMIT_BIO);
	bdev->bd_stats = alloc_percpu(struct disk_stats);
	if (!bdev->bd_stats) {
		iput(inode);
@@ -642,7 +640,7 @@ static void bd_end_claim(struct block_device *bdev, void *holder)
		bdev->bd_holder = NULL;
		bdev->bd_holder_ops = NULL;
		mutex_unlock(&bdev->bd_holder_lock);
		if (bdev->bd_write_holder)
		if (bdev_test_flag(bdev, BD_WRITE_HOLDER))
			unblock = true;
	}
	if (!whole->bd_holders)
@@ -655,7 +653,7 @@ static void bd_end_claim(struct block_device *bdev, void *holder)
	 */
	if (unblock) {
		disk_unblock_events(bdev->bd_disk);
		bdev->bd_write_holder = false;
		bdev_clear_flag(bdev, BD_WRITE_HOLDER);
	}
}

@@ -922,9 +920,10 @@ int bdev_open(struct block_device *bdev, blk_mode_t mode, void *holder,
		 * writeable reference is too fragile given the way @mode is
		 * used in blkdev_get/put().
		 */
		if ((mode & BLK_OPEN_WRITE) && !bdev->bd_write_holder &&
		if ((mode & BLK_OPEN_WRITE) &&
		    !bdev_test_flag(bdev, BD_WRITE_HOLDER) &&
		    (disk->event_flags & DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE)) {
			bdev->bd_write_holder = true;
			bdev_set_flag(bdev, BD_WRITE_HOLDER);
			unblock_events = false;
		}
	}
+10 −7
Original line number Diff line number Diff line
@@ -496,7 +496,8 @@ __setup("fail_make_request=", setup_fail_make_request);

bool should_fail_request(struct block_device *part, unsigned int bytes)
{
	return part->bd_make_it_fail && should_fail(&fail_make_request, bytes);
	return bdev_test_flag(part, BD_MAKE_IT_FAIL) &&
	       should_fail(&fail_make_request, bytes);
}

static int __init fail_make_request_debugfs(void)
@@ -516,10 +517,11 @@ static inline void bio_check_ro(struct bio *bio)
		if (op_is_flush(bio->bi_opf) && !bio_sectors(bio))
			return;

		if (bio->bi_bdev->bd_ro_warned)
		if (bdev_test_flag(bio->bi_bdev, BD_RO_WARNED))
			return;

		bio->bi_bdev->bd_ro_warned = true;
		bdev_set_flag(bio->bi_bdev, BD_RO_WARNED);

		/*
		 * Use ioctl to set underlying disk of raid/dm to read-only
		 * will trigger this.
@@ -616,7 +618,7 @@ static void __submit_bio(struct bio *bio)
	if (unlikely(!blk_crypto_bio_prep(&bio)))
		return;

	if (!bio->bi_bdev->bd_has_submit_bio) {
	if (!bdev_test_flag(bio->bi_bdev, BD_HAS_SUBMIT_BIO)) {
		blk_mq_submit_bio(bio);
	} else if (likely(bio_queue_enter(bio) == 0)) {
		struct gendisk *disk = bio->bi_bdev->bd_disk;
@@ -730,7 +732,7 @@ void submit_bio_noacct_nocheck(struct bio *bio)
	 */
	if (current->bio_list)
		bio_list_add(&current->bio_list[0], bio);
	else if (!bio->bi_bdev->bd_has_submit_bio)
	else if (!bdev_test_flag(bio->bi_bdev, BD_HAS_SUBMIT_BIO))
		__submit_bio_noacct_mq(bio);
	else
		__submit_bio_noacct(bio);
@@ -766,7 +768,8 @@ void submit_bio_noacct(struct bio *bio)
	if (!bio_flagged(bio, BIO_REMAPPED)) {
		if (unlikely(bio_check_eod(bio)))
			goto end_io;
		if (bdev->bd_partno && unlikely(blk_partition_remap(bio)))
		if (bdev_is_partition(bdev) &&
		    unlikely(blk_partition_remap(bio)))
			goto end_io;
	}

@@ -991,7 +994,7 @@ void update_io_ticks(struct block_device *part, unsigned long now, bool end)
	    (end || part_in_flight(part)))
		__part_stat_add(part, io_ticks, now - stamp);

	if (part->bd_partno) {
	if (bdev_is_partition(part)) {
		part = bdev_whole(part);
		goto again;
	}
+1 −1
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ static bool blk_mq_check_inflight(struct request *rq, void *priv)
	struct mq_inflight *mi = priv;

	if (rq->part && blk_do_io_stat(rq) &&
	    (!mi->part->bd_partno || rq->part == mi->part) &&
	    (!bdev_is_partition(mi->part) || rq->part == mi->part) &&
	    blk_mq_rq_state(rq) == MQ_RQ_IN_FLIGHT)
		mi->inflight[rq_data_dir(rq)]++;

+2 −2
Original line number Diff line number Diff line
@@ -1257,7 +1257,7 @@ void blk_zone_write_plug_bio_endio(struct bio *bio)
	 * is not called. So we need to schedule execution of the next
	 * plugged BIO here.
	 */
	if (bio->bi_bdev->bd_has_submit_bio)
	if (bdev_test_flag(bio->bi_bdev, BD_HAS_SUBMIT_BIO))
		disk_zone_wplug_unplug_bio(disk, zwplug);

	/* Drop the reference we took when entering this function. */
@@ -1326,7 +1326,7 @@ static void blk_zone_wplug_bio_work(struct work_struct *work)
	 * path for BIO-based devices will not do that. So drop this extra
	 * reference here.
	 */
	if (bdev->bd_has_submit_bio)
	if (bdev_test_flag(bdev, BD_HAS_SUBMIT_BIO))
		blk_queue_exit(bdev->bd_disk->queue);

put_zwplug:
+1 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ static int __init devt_from_partuuid(const char *uuid_str, dev_t *devt)
		 * to the partition number found by UUID.
		 */
		*devt = part_devt(dev_to_disk(dev),
				  dev_to_bdev(dev)->bd_partno + offset);
				  bdev_partno(dev_to_bdev(dev)) + offset);
	} else {
		*devt = dev->devt;
	}
Loading