diff options
author | Christoph Hellwig <hch@lst.de> | 2021-04-06 08:22:58 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-04-08 10:24:36 -0600 |
commit | e30691237bc1e055c55b0fe256ed7fc1a4ee1122 (patch) | |
tree | 118eab003b58e22a70076fbcdc33e60db380ab97 | |
parent | 6c4541a8bb94a1cccca55ee53c866eb72bf279cf (diff) | |
download | linux-stable-e30691237bc1e055c55b0fe256ed7fc1a4ee1122.tar.gz linux-stable-e30691237bc1e055c55b0fe256ed7fc1a4ee1122.tar.bz2 linux-stable-e30691237bc1e055c55b0fe256ed7fc1a4ee1122.zip |
block: simplify partition_overlaps
Just use xa_for_each to iterate over the partitions as there is no need
to grab a reference to each partition.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210406062303.811835-8-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | block/partitions/core.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/block/partitions/core.c b/block/partitions/core.c index 927144d4e59d..0f8454b93c6e 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -420,21 +420,21 @@ out_put: static bool partition_overlaps(struct gendisk *disk, sector_t start, sector_t length, int skip_partno) { - struct disk_part_iter piter; struct block_device *part; bool overlap = false; + unsigned long idx; - disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY); - while ((part = disk_part_iter_next(&piter))) { - if (part->bd_partno == skip_partno || - start >= part->bd_start_sect + bdev_nr_sectors(part) || - start + length <= part->bd_start_sect) - continue; - overlap = true; - break; + rcu_read_lock(); + xa_for_each_start(&disk->part_tbl, idx, part, 1) { + if (part->bd_partno != skip_partno && + start < part->bd_start_sect + bdev_nr_sectors(part) && + start + length > part->bd_start_sect) { + overlap = true; + break; + } } + rcu_read_unlock(); - disk_part_iter_exit(&piter); return overlap; } |