OSDN Git Service

block: remove GENHD_FL_EXT_DEVT
authorChristoph Hellwig <hch@lst.de>
Mon, 22 Nov 2021 13:06:22 +0000 (14:06 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 29 Nov 2021 13:38:35 +0000 (06:38 -0700)
All modern drivers can support extra partitions using the extended
dev_t.  In fact except for the ioctl method drivers never even see
partitions in normal operation.

So remove the GENHD_FL_EXT_DEVT and allow extra partitions for all
block devices that do support partitions, and require those that
do not support partitions to explicit disallow them using
GENHD_FL_NO_PART.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20211122130625.1136848-12-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
27 files changed:
block/genhd.c
block/partitions/core.c
drivers/block/amiflop.c
drivers/block/ataflop.c
drivers/block/brd.c
drivers/block/drbd/drbd_main.c
drivers/block/floppy.c
drivers/block/loop.c
drivers/block/null_blk/main.c
drivers/block/paride/pcd.c
drivers/block/paride/pf.c
drivers/block/pktcdvd.c
drivers/block/ps3vram.c
drivers/block/rbd.c
drivers/block/swim.c
drivers/block/swim3.c
drivers/block/virtio_blk.c
drivers/block/z2ram.c
drivers/block/zram/zram_drv.c
drivers/cdrom/gdrom.c
drivers/md/dm.c
drivers/md/md.c
drivers/mmc/core/block.c
drivers/mtd/ubi/block.c
drivers/scsi/sd.c
drivers/scsi/sr.c
include/linux/genhd.h

index 50a843e..6286325 100644 (file)
@@ -376,7 +376,7 @@ int disk_scan_partitions(struct gendisk *disk, fmode_t mode)
 {
        struct block_device *bdev;
 
-       if (!disk_part_scan_enabled(disk))
+       if (disk->flags & GENHD_FL_NO_PART)
                return -EINVAL;
        if (disk->open_partitions)
                return -EBUSY;
@@ -438,7 +438,6 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
                        return ret;
                disk->major = BLOCK_EXT_MAJOR;
                disk->first_minor = ret;
-               disk->flags |= GENHD_FL_EXT_DEVT;
        }
 
        ret = disk_alloc_events(disk);
@@ -872,7 +871,8 @@ static ssize_t disk_ext_range_show(struct device *dev,
 {
        struct gendisk *disk = dev_to_disk(dev);
 
-       return sprintf(buf, "%d\n", disk_max_parts(disk));
+       return sprintf(buf, "%d\n",
+               (disk->flags & GENHD_FL_NO_PART) ? 1 : DISK_MAX_PARTS);
 }
 
 static ssize_t disk_removable_show(struct device *dev,
index 520292f..c2a1635 100644 (file)
@@ -98,13 +98,12 @@ static void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors)
 static struct parsed_partitions *allocate_partitions(struct gendisk *hd)
 {
        struct parsed_partitions *state;
-       int nr;
+       int nr = DISK_MAX_PARTS;
 
        state = kzalloc(sizeof(*state), GFP_KERNEL);
        if (!state)
                return NULL;
 
-       nr = disk_max_parts(hd);
        state->parts = vzalloc(array_size(nr, sizeof(state->parts[0])));
        if (!state->parts) {
                kfree(state);
@@ -326,7 +325,7 @@ static struct block_device *add_partition(struct gendisk *disk, int partno,
 
        lockdep_assert_held(&disk->open_mutex);
 
-       if (partno >= disk_max_parts(disk))
+       if (partno >= DISK_MAX_PARTS)
                return ERR_PTR(-EINVAL);
 
        /*
@@ -604,7 +603,7 @@ static int blk_add_partitions(struct gendisk *disk)
        struct parsed_partitions *state;
        int ret = -EAGAIN, p;
 
-       if (!disk_part_scan_enabled(disk))
+       if (disk->flags & GENHD_FL_NO_PART)
                return 0;
 
        state = check_partition(disk);
@@ -687,7 +686,7 @@ rescan:
         * userspace for this particular setup.
         */
        if (invalidate) {
-               if (disk_part_scan_enabled(disk) ||
+               if (!(disk->flags & GENHD_FL_NO_PART) ||
                    !(disk->flags & GENHD_FL_REMOVABLE))
                        set_capacity(disk, 0);
        }
index bf5c124..1eec511 100644 (file)
@@ -1790,6 +1790,7 @@ static int fd_alloc_disk(int drive, int system)
        disk->first_minor = drive + system;
        disk->minors = 1;
        disk->fops = &floppy_fops;
+       disk->flags |= GENHD_FL_NO_PART;
        disk->events = DISK_EVENT_MEDIA_CHANGE;
        if (system)
                sprintf(disk->disk_name, "fd%d_msdos", drive);
index bf769e6..f3ff9ba 100644 (file)
@@ -2000,6 +2000,7 @@ static int ataflop_alloc_disk(unsigned int drive, unsigned int type)
        disk->minors = 1;
        sprintf(disk->disk_name, "fd%d", drive);
        disk->fops = &floppy_fops;
+       disk->flags |= GENHD_FL_NO_PART;
        disk->events = DISK_EVENT_MEDIA_CHANGE;
        disk->private_data = &unit[drive];
        set_capacity(disk, MAX_DISK_SIZE * 2);
index a896ee1..8fe2e42 100644 (file)
@@ -405,7 +405,6 @@ static int brd_alloc(int i)
        disk->minors            = max_part;
        disk->fops              = &brd_fops;
        disk->private_data      = brd;
-       disk->flags             = GENHD_FL_EXT_DEVT;
        strlcpy(disk->disk_name, buf, DISK_NAME_LEN);
        set_capacity(disk, rd_size * 2);
        
index 53ba2dd..07b3c60 100644 (file)
@@ -2734,6 +2734,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
        disk->first_minor = minor;
        disk->minors = 1;
        disk->fops = &drbd_ops;
+       disk->flags |= GENHD_FL_NO_PART;
        sprintf(disk->disk_name, "drbd%d", minor);
        disk->private_data = device;
 
index c4267da..7f0a60c 100644 (file)
@@ -4503,6 +4503,7 @@ static int floppy_alloc_disk(unsigned int drive, unsigned int type)
        disk->first_minor = TOMINOR(drive) | (type << 2);
        disk->minors = 1;
        disk->fops = &floppy_fops;
+       disk->flags |= GENHD_FL_NO_PART;
        disk->events = DISK_EVENT_MEDIA_CHANGE;
        if (type)
                sprintf(disk->disk_name, "fd%d_type%d", drive, type);
index 7219d98..0954ea8 100644 (file)
@@ -2033,7 +2033,6 @@ static int loop_add(int i)
         */
        if (!part_shift)
                disk->flags |= GENHD_FL_NO_PART;
-       disk->flags |= GENHD_FL_EXT_DEVT;
        atomic_set(&lo->lo_refcnt, 0);
        mutex_init(&lo->lo_mutex);
        lo->lo_number           = i;
index eb17def..54f7d49 100644 (file)
@@ -1850,7 +1850,6 @@ static int null_gendisk_register(struct nullb *nullb)
 
        set_capacity(disk, size);
 
-       disk->flags |= GENHD_FL_EXT_DEVT;
        disk->major             = null_major;
        disk->first_minor       = nullb->index;
        disk->minors            = 1;
index 430ee80..255fd3d 100644 (file)
@@ -928,6 +928,7 @@ static int pcd_init_unit(struct pcd_unit *cd, bool autoprobe, int port,
        disk->minors = 1;
        strcpy(disk->disk_name, cd->name);      /* umm... */
        disk->fops = &pcd_bdops;
+       disk->flags |= GENHD_FL_NO_PART;
        disk->events = DISK_EVENT_MEDIA_CHANGE;
        disk->event_flags = DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE;
 
index bf8d0ef..b84a644 100644 (file)
@@ -942,6 +942,7 @@ static int __init pf_init_unit(struct pf_unit *pf, bool autoprobe, int port,
        disk->minors = 1;
        strcpy(disk->disk_name, pf->name);
        disk->fops = &pf_fops;
+       disk->flags |= GENHD_FL_NO_PART;
        disk->events = DISK_EVENT_MEDIA_CHANGE;
        disk->private_data = pf;
 
index b53f648..3af0499 100644 (file)
@@ -2719,7 +2719,7 @@ static int pkt_setup_dev(dev_t dev, dev_t* pkt_dev)
        disk->first_minor = idx;
        disk->minors = 1;
        disk->fops = &pktcdvd_ops;
-       disk->flags = GENHD_FL_REMOVABLE;
+       disk->flags = GENHD_FL_REMOVABLE | GENHD_FL_NO_PART;
        strcpy(disk->disk_name, pd->name);
        disk->private_data = pd;
 
index c187664..4f90819 100644 (file)
@@ -742,6 +742,7 @@ static int ps3vram_probe(struct ps3_system_bus_device *dev)
        priv->gendisk = gendisk;
        gendisk->major = ps3vram_major;
        gendisk->minors = 1;
+       gendisk->flags |= GENHD_FL_NO_PART;
        gendisk->fops = &ps3vram_fops;
        gendisk->private_data = dev;
        strlcpy(gendisk->disk_name, DEVICE_NAME, sizeof(gendisk->disk_name));
index 953fa13..8f140da 100644 (file)
@@ -4924,12 +4924,10 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
                 rbd_dev->dev_id);
        disk->major = rbd_dev->major;
        disk->first_minor = rbd_dev->minor;
-       if (single_major) {
+       if (single_major)
                disk->minors = (1 << RBD_SINGLE_MAJOR_PART_SHIFT);
-               disk->flags |= GENHD_FL_EXT_DEVT;
-       } else {
+       else
                disk->minors = RBD_MINORS_PER_MAJOR;
-       }
        disk->fops = &rbd_bd_ops;
        disk->private_data = rbd_dev;
 
index 821594c..fef65a1 100644 (file)
@@ -840,6 +840,7 @@ static int swim_floppy_init(struct swim_priv *swd)
                swd->unit[drive].disk->minors = 1;
                sprintf(swd->unit[drive].disk->disk_name, "fd%d", drive);
                swd->unit[drive].disk->fops = &floppy_fops;
+               swd->unit[drive].disk->flags |= GENHD_FL_NO_PART;
                swd->unit[drive].disk->events = DISK_EVENT_MEDIA_CHANGE;
                swd->unit[drive].disk->private_data = &swd->unit[drive];
                set_capacity(swd->unit[drive].disk, 2880);
index 4b91c9a..6c39f2c 100644 (file)
@@ -1227,7 +1227,7 @@ static int swim3_attach(struct macio_dev *mdev,
        disk->fops = &floppy_fops;
        disk->private_data = fs;
        disk->events = DISK_EVENT_MEDIA_CHANGE;
-       disk->flags |= GENHD_FL_REMOVABLE;
+       disk->flags |= GENHD_FL_REMOVABLE | GENHD_FL_NO_PART;
        sprintf(disk->disk_name, "fd%d", floppy_count);
        set_capacity(disk, 2880);
        rc = add_disk(disk);
index 6ae3877..cfa303f 100644 (file)
@@ -843,7 +843,6 @@ static int virtblk_probe(struct virtio_device *vdev)
        vblk->disk->minors = 1 << PART_BITS;
        vblk->disk->private_data = vblk;
        vblk->disk->fops = &virtblk_fops;
-       vblk->disk->flags |= GENHD_FL_EXT_DEVT;
        vblk->index = index;
 
        /* configure queue flush support */
index ccc52c9..7a6ed83 100644 (file)
@@ -327,6 +327,7 @@ static int z2ram_register_disk(int minor)
        disk->major = Z2RAM_MAJOR;
        disk->first_minor = minor;
        disk->minors = 1;
+       disk->flags |= GENHD_FL_NO_PART;
        disk->fops = &z2_fops;
        if (minor)
                sprintf(disk->disk_name, "z2ram%d", minor);
index 2507112..f6da529 100644 (file)
@@ -1947,6 +1947,7 @@ static int zram_add(void)
        zram->disk->major = zram_major;
        zram->disk->first_minor = device_id;
        zram->disk->minors = 1;
+       zram->disk->flags |= GENHD_FL_NO_PART;
        zram->disk->fops = &zram_devops;
        zram->disk->private_data = zram;
        snprintf(zram->disk->disk_name, 16, "zram%d", device_id);
index d50cc1f..faead41 100644 (file)
@@ -719,6 +719,7 @@ static void probe_gdrom_setupdisk(void)
        gd.disk->major = gdrom_major;
        gd.disk->first_minor = 1;
        gd.disk->minors = 1;
+       gd.disk->flags |= GENHD_FL_NO_PART;
        strcpy(gd.disk->disk_name, GDROM_DEV_NAME);
 }
 
index 662742a..280918c 100644 (file)
@@ -1778,6 +1778,7 @@ static struct mapped_device *alloc_dev(int minor)
        md->disk->major = _major;
        md->disk->first_minor = minor;
        md->disk->minors = 1;
+       md->disk->flags |= GENHD_FL_NO_PART;
        md->disk->fops = &dm_blk_dops;
        md->disk->queue = md->queue;
        md->disk->private_data = md;
index 5111ed9..7fbf6f0 100644 (file)
@@ -5707,11 +5707,6 @@ static int md_alloc(dev_t dev, char *name)
        mddev->queue = disk->queue;
        blk_set_stacking_limits(&mddev->queue->limits);
        blk_queue_write_cache(mddev->queue, true, true);
-       /* Allow extended partitions.  This makes the
-        * 'mdp' device redundant, but we can't really
-        * remove it now.
-        */
-       disk->flags |= GENHD_FL_EXT_DEVT;
        disk->events |= DISK_EVENT_MEDIA_CHANGE;
        mddev->gendisk = disk;
        error = add_disk(disk);
index 2dd93d4..5e09605 100644 (file)
@@ -2395,7 +2395,6 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
        md->disk->private_data = md;
        md->parent = parent;
        set_disk_ro(md->disk, md->read_only || default_ro);
-       md->disk->flags = GENHD_FL_EXT_DEVT;
        if (area_type & (MMC_BLK_DATA_AREA_RPMB | MMC_BLK_DATA_AREA_BOOT))
                md->disk->flags |= GENHD_FL_NO_PART;
 
index 302426a..a78fdf3 100644 (file)
@@ -430,6 +430,7 @@ int ubiblock_create(struct ubi_volume_info *vi)
                ret = -ENODEV;
                goto out_cleanup_disk;
        }
+       gd->flags |= GENHD_FL_NO_PART;
        gd->private_data = dev;
        sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id);
        set_capacity(gd, disk_capacity);
index 65875a5..bba1f5d 100644 (file)
@@ -3566,7 +3566,6 @@ static int sd_probe(struct device *dev)
 
        sd_revalidate_disk(gd);
 
-       gd->flags = GENHD_FL_EXT_DEVT;
        if (sdp->removable) {
                gd->flags |= GENHD_FL_REMOVABLE;
                gd->events |= DISK_EVENT_MEDIA_CHANGE;
index 6646797..cf09338 100644 (file)
@@ -684,6 +684,7 @@ static int sr_probe(struct device *dev)
        disk->minors = 1;
        sprintf(disk->disk_name, "sr%d", minor);
        disk->fops = &sr_bdops;
+       disk->flags |= GENHD_FL_NO_PART;
        disk->events = DISK_EVENT_MEDIA_CHANGE | DISK_EVENT_EJECT_REQUEST;
        disk->event_flags = DISK_EVENT_FLAG_POLL | DISK_EVENT_FLAG_UEVENT |
                                DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE;
index 64a2f33..b8ced80 100644 (file)
@@ -46,11 +46,6 @@ struct partition_meta_info {
  * Must not be set for devices which are removed entirely when the
  * media is removed.
  *
- * ``GENHD_FL_EXT_DEVT`` (0x0040): the driver supports extended
- * dynamic ``dev_t``, i.e. it wants extended device numbers
- * (``BLOCK_EXT_MAJOR``).
- * This affects the maximum number of partitions.
- *
  * ``GENHD_FL_NO_PART`` (0x0200): partition support is disabled.
  * The kernel will not scan for partitions from add_disk, and users
  * can't add partitions manually.
@@ -64,7 +59,6 @@ struct partition_meta_info {
 #define GENHD_FL_REMOVABLE                     0x0001
 /* 2 is unused (used to be GENHD_FL_DRIVERFS) */
 /* 4 is unused (used to be GENHD_FL_MEDIA_CHANGE_NOTIFY) */
-#define GENHD_FL_EXT_DEVT                      0x0040
 #define GENHD_FL_NO_PART                       0x0200
 #define GENHD_FL_HIDDEN                                0x0400
 
@@ -94,13 +88,13 @@ struct blk_integrity {
 };
 
 struct gendisk {
-       /* major, first_minor and minors are input parameters only,
-        * don't use directly.  Use disk_devt() and disk_max_parts().
+       /*
+        * major/first_minor/minors should not be set by any new driver, the
+        * block core will take care of allocating them automatically.
         */
-       int major;                      /* major number of driver */
+       int major;
        int first_minor;
-       int minors;                     /* maximum number of minors, =1 for
-                                         * disks that can't be partitioned. */
+       int minors;
 
        char disk_name[DISK_NAME_LEN];  /* name of major driver */
 
@@ -164,18 +158,6 @@ static inline bool disk_live(struct gendisk *disk)
 #define disk_to_cdi(disk)      NULL
 #endif
 
-static inline int disk_max_parts(struct gendisk *disk)
-{
-       if (disk->flags & GENHD_FL_EXT_DEVT)
-               return DISK_MAX_PARTS;
-       return disk->minors;
-}
-
-static inline bool disk_part_scan_enabled(struct gendisk *disk)
-{
-       return disk_max_parts(disk) > 1 && !(disk->flags & GENHD_FL_NO_PART);
-}
-
 static inline dev_t disk_devt(struct gendisk *disk)
 {
        return MKDEV(disk->major, disk->first_minor);