block: remove DISK_PITER_REVERSE
authorChristoph Hellwig <hch@lst.de>
Sun, 24 Jan 2021 10:02:40 +0000 (11:02 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 25 Jan 2021 01:17:20 +0000 (18:17 -0700)
There is good reason to iterate backwards when deleting all partitions in
del_gendisk, just like we don't in blk_drop_partitions.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/genhd.c
include/linux/genhd.h

index 7094612c7510a849ab02ebdb6ebe9e6c6ae48e0a..1832add5c73849f65208393221fc185aa50e9ada 100644 (file)
@@ -184,24 +184,13 @@ static struct block_device *__disk_get_part(struct gendisk *disk, int partno)
 void disk_part_iter_init(struct disk_part_iter *piter, struct gendisk *disk,
                          unsigned int flags)
 {
-       struct disk_part_tbl *ptbl;
-
-       rcu_read_lock();
-       ptbl = rcu_dereference(disk->part_tbl);
-
        piter->disk = disk;
        piter->part = NULL;
-
-       if (flags & DISK_PITER_REVERSE)
-               piter->idx = ptbl->len - 1;
-       else if (flags & (DISK_PITER_INCL_PART0 | DISK_PITER_INCL_EMPTY_PART0))
+       if (flags & (DISK_PITER_INCL_PART0 | DISK_PITER_INCL_EMPTY_PART0))
                piter->idx = 0;
        else
                piter->idx = 1;
-
        piter->flags = flags;
-
-       rcu_read_unlock();
 }
 
 /**
@@ -216,7 +205,6 @@ void disk_part_iter_init(struct disk_part_iter *piter, struct gendisk *disk,
 struct block_device *disk_part_iter_next(struct disk_part_iter *piter)
 {
        struct disk_part_tbl *ptbl;
-       int inc, end;
 
        /* put the last partition */
        disk_part_iter_exit(piter);
@@ -225,21 +213,8 @@ struct block_device *disk_part_iter_next(struct disk_part_iter *piter)
        rcu_read_lock();
        ptbl = rcu_dereference(piter->disk->part_tbl);
 
-       /* determine iteration parameters */
-       if (piter->flags & DISK_PITER_REVERSE) {
-               inc = -1;
-               if (piter->flags & (DISK_PITER_INCL_PART0 |
-                                   DISK_PITER_INCL_EMPTY_PART0))
-                       end = -1;
-               else
-                       end = 0;
-       } else {
-               inc = 1;
-               end = ptbl->len;
-       }
-
        /* iterate to the next partition */
-       for (; piter->idx != end; piter->idx += inc) {
+       for (; piter->idx != ptbl->len; piter->idx += 1) {
                struct block_device *part;
 
                part = rcu_dereference(ptbl->part[piter->idx]);
@@ -257,7 +232,10 @@ struct block_device *disk_part_iter_next(struct disk_part_iter *piter)
                        continue;
                }
 
-               piter->idx += inc;
+               piter->part = bdgrab(part);
+               if (!piter->part)
+                       continue;
+               piter->idx += 1;
                break;
        }
 
@@ -781,8 +759,7 @@ void del_gendisk(struct gendisk *disk)
        down_write(&bdev_lookup_sem);
 
        /* invalidate stuff */
-       disk_part_iter_init(&piter, disk,
-                            DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE);
+       disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY);
        while ((part = disk_part_iter_next(&piter))) {
                invalidate_partition(part);
                delete_partition(part);
index 670eaef0e87622b905c3085ad4030d90d00494f5..51609133c9a34796ef30ca9ffdad50028b262a61 100644 (file)
@@ -218,7 +218,6 @@ void disk_uevent(struct gendisk *disk, enum kobject_action action);
 /*
  * Smarter partition iterator without context limits.
  */
-#define DISK_PITER_REVERSE     (1 << 0) /* iterate in the reverse direction */
 #define DISK_PITER_INCL_EMPTY  (1 << 1) /* include 0-sized parts */
 #define DISK_PITER_INCL_PART0  (1 << 2) /* include partition 0 */
 #define DISK_PITER_INCL_EMPTY_PART0 (1 << 3) /* include empty partition 0 */