提交 689d6fac 编写于 作者: T Tejun Heo 提交者: Jens Axboe

block: replace @ext_minors with GENHD_FL_EXT_DEVT

With previous changes, it's meaningless to limit the number of
partitions.  Replace @ext_minors with GENHD_FL_EXT_DEVT such that
setting the flag allows the disk to have maximum number of allowed
partitions (only limited by the number of entries in parsed_partitions
as determined by MAX_PART constant).

This kills not-too-pretty alloc_disk_ext[_node]() functions and makes
@minors parameter to alloc_disk[_node]() unnecessary.  The parameter
is left alone to avoid disturbing the users.
Signed-off-by: NTejun Heo <tj@kernel.org>
Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
上级 540eed56
...@@ -1024,18 +1024,9 @@ struct gendisk *alloc_disk(int minors) ...@@ -1024,18 +1024,9 @@ struct gendisk *alloc_disk(int minors)
{ {
return alloc_disk_node(minors, -1); return alloc_disk_node(minors, -1);
} }
EXPORT_SYMBOL(alloc_disk);
struct gendisk *alloc_disk_node(int minors, int node_id) struct gendisk *alloc_disk_node(int minors, int node_id)
{
return alloc_disk_ext_node(minors, 0, node_id);
}
struct gendisk *alloc_disk_ext(int minors, int ext_minors)
{
return alloc_disk_ext_node(minors, ext_minors, -1);
}
struct gendisk *alloc_disk_ext_node(int minors, int ext_minors, int node_id)
{ {
struct gendisk *disk; struct gendisk *disk;
...@@ -1054,7 +1045,6 @@ struct gendisk *alloc_disk_ext_node(int minors, int ext_minors, int node_id) ...@@ -1054,7 +1045,6 @@ struct gendisk *alloc_disk_ext_node(int minors, int ext_minors, int node_id)
disk->part_tbl->part[0] = &disk->part0; disk->part_tbl->part[0] = &disk->part0;
disk->minors = minors; disk->minors = minors;
disk->ext_minors = ext_minors;
rand_initialize_disk(disk); rand_initialize_disk(disk);
disk_to_dev(disk)->class = &block_class; disk_to_dev(disk)->class = &block_class;
disk_to_dev(disk)->type = &disk_type; disk_to_dev(disk)->type = &disk_type;
...@@ -1065,11 +1055,7 @@ struct gendisk *alloc_disk_ext_node(int minors, int ext_minors, int node_id) ...@@ -1065,11 +1055,7 @@ struct gendisk *alloc_disk_ext_node(int minors, int ext_minors, int node_id)
} }
return disk; return disk;
} }
EXPORT_SYMBOL(alloc_disk);
EXPORT_SYMBOL(alloc_disk_node); EXPORT_SYMBOL(alloc_disk_node);
EXPORT_SYMBOL(alloc_disk_ext);
EXPORT_SYMBOL(alloc_disk_ext_node);
struct kobject *get_disk(struct gendisk *disk) struct kobject *get_disk(struct gendisk *disk)
{ {
......
...@@ -41,16 +41,12 @@ ...@@ -41,16 +41,12 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/div64.h> #include <asm/div64.h>
#define IDE_DISK_PARTS (1 << PARTN_BITS)
#if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT) #if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)
#define IDE_DISK_MINORS IDE_DISK_PARTS #define IDE_DISK_MINORS (1 << PARTN_BITS)
#else #else
#define IDE_DISK_MINORS 1 #define IDE_DISK_MINORS 1
#endif #endif
#define IDE_DISK_EXT_MINORS (IDE_DISK_PARTS - IDE_DISK_MINORS)
struct ide_disk_obj { struct ide_disk_obj {
ide_drive_t *drive; ide_drive_t *drive;
ide_driver_t *driver; ide_driver_t *driver;
...@@ -1161,8 +1157,7 @@ static int ide_disk_probe(ide_drive_t *drive) ...@@ -1161,8 +1157,7 @@ static int ide_disk_probe(ide_drive_t *drive)
if (!idkp) if (!idkp)
goto failed; goto failed;
g = alloc_disk_ext_node(IDE_DISK_MINORS, IDE_DISK_EXT_MINORS, g = alloc_disk_node(IDE_DISK_MINORS, hwif_to_node(drive->hwif));
hwif_to_node(drive->hwif));
if (!g) if (!g)
goto out_free_idkp; goto out_free_idkp;
...@@ -1189,9 +1184,10 @@ static int ide_disk_probe(ide_drive_t *drive) ...@@ -1189,9 +1184,10 @@ static int ide_disk_probe(ide_drive_t *drive)
drive->attach = 1; drive->attach = 1;
g->minors = IDE_DISK_MINORS; g->minors = IDE_DISK_MINORS;
g->ext_minors = IDE_DISK_EXT_MINORS;
g->driverfs_dev = &drive->gendev; g->driverfs_dev = &drive->gendev;
g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; g->flags |= GENHD_FL_EXT_DEVT;
if (drive->removable)
g->flags |= GENHD_FL_REMOVABLE;
set_capacity(g, idedisk_capacity(drive)); set_capacity(g, idedisk_capacity(drive));
g->fops = &idedisk_ops; g->fops = &idedisk_ops;
add_disk(g); add_disk(g);
......
...@@ -86,16 +86,12 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_DISK); ...@@ -86,16 +86,12 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_DISK);
MODULE_ALIAS_SCSI_DEVICE(TYPE_MOD); MODULE_ALIAS_SCSI_DEVICE(TYPE_MOD);
MODULE_ALIAS_SCSI_DEVICE(TYPE_RBC); MODULE_ALIAS_SCSI_DEVICE(TYPE_RBC);
#define SD_PARTS 64
#if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT) #if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)
#define SD_MINORS 16 #define SD_MINORS 16
#else #else
#define SD_MINORS 1 #define SD_MINORS 1
#endif #endif
#define SD_EXT_MINORS (SD_PARTS - SD_MINORS)
static int sd_revalidate_disk(struct gendisk *); static int sd_revalidate_disk(struct gendisk *);
static int sd_probe(struct device *); static int sd_probe(struct device *);
static int sd_remove(struct device *); static int sd_remove(struct device *);
...@@ -1811,7 +1807,7 @@ static int sd_probe(struct device *dev) ...@@ -1811,7 +1807,7 @@ static int sd_probe(struct device *dev)
if (!sdkp) if (!sdkp)
goto out; goto out;
gd = alloc_disk_ext(SD_MINORS, SD_EXT_MINORS); gd = alloc_disk(SD_MINORS);
if (!gd) if (!gd)
goto out_free; goto out_free;
...@@ -1856,7 +1852,6 @@ static int sd_probe(struct device *dev) ...@@ -1856,7 +1852,6 @@ static int sd_probe(struct device *dev)
gd->major = sd_major((index & 0xf0) >> 4); gd->major = sd_major((index & 0xf0) >> 4);
gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00); gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00);
gd->minors = SD_MINORS; gd->minors = SD_MINORS;
gd->ext_minors = SD_EXT_MINORS;
gd->fops = &sd_fops; gd->fops = &sd_fops;
if (index < 26) { if (index < 26) {
...@@ -1880,7 +1875,7 @@ static int sd_probe(struct device *dev) ...@@ -1880,7 +1875,7 @@ static int sd_probe(struct device *dev)
blk_queue_prep_rq(sdp->request_queue, sd_prep_fn); blk_queue_prep_rq(sdp->request_queue, sd_prep_fn);
gd->driverfs_dev = &sdp->sdev_gendev; gd->driverfs_dev = &sdp->sdev_gendev;
gd->flags = GENHD_FL_DRIVERFS; gd->flags = GENHD_FL_EXT_DEVT | GENHD_FL_DRIVERFS;
if (sdp->removable) if (sdp->removable)
gd->flags |= GENHD_FL_REMOVABLE; gd->flags |= GENHD_FL_REMOVABLE;
......
...@@ -5,15 +5,13 @@ ...@@ -5,15 +5,13 @@
* add_gd_partition adds a partitions details to the devices partition * add_gd_partition adds a partitions details to the devices partition
* description. * description.
*/ */
enum { MAX_PART = 256 };
struct parsed_partitions { struct parsed_partitions {
char name[BDEVNAME_SIZE]; char name[BDEVNAME_SIZE];
struct { struct {
sector_t from; sector_t from;
sector_t size; sector_t size;
int flags; int flags;
} parts[MAX_PART]; } parts[DISK_MAX_PARTS];
int next; int next;
int limit; int limit;
}; };
......
...@@ -58,6 +58,8 @@ enum { ...@@ -58,6 +58,8 @@ enum {
UNIXWARE_PARTITION = 0x63, /* Same as GNU_HURD and SCO Unix */ UNIXWARE_PARTITION = 0x63, /* Same as GNU_HURD and SCO Unix */
}; };
#define DISK_MAX_PARTS 256
#include <linux/major.h> #include <linux/major.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/smp.h> #include <linux/smp.h>
...@@ -112,6 +114,7 @@ struct hd_struct { ...@@ -112,6 +114,7 @@ struct hd_struct {
#define GENHD_FL_CD 8 #define GENHD_FL_CD 8
#define GENHD_FL_UP 16 #define GENHD_FL_UP 16
#define GENHD_FL_SUPPRESS_PARTITION_INFO 32 #define GENHD_FL_SUPPRESS_PARTITION_INFO 32
#define GENHD_FL_EXT_DEVT 64 /* allow extended devt */
#define BLK_SCSI_MAX_CMDS (256) #define BLK_SCSI_MAX_CMDS (256)
#define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8)) #define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8))
...@@ -129,15 +132,13 @@ struct disk_part_tbl { ...@@ -129,15 +132,13 @@ struct disk_part_tbl {
}; };
struct gendisk { struct gendisk {
/* major, first_minor, minors and ext_minors are input /* major, first_minor and minors are input parameters only,
* parameters only, don't use directly. Use disk_devt() and * don't use directly. Use disk_devt() and disk_max_parts().
* disk_max_parts().
*/ */
int major; /* major number of driver */ int major; /* major number of driver */
int first_minor; int first_minor;
int minors; /* maximum number of minors, =1 for int minors; /* maximum number of minors, =1 for
* disks that can't be partitioned. */ * disks that can't be partitioned. */
int ext_minors; /* number of extended dynamic minors */
char disk_name[32]; /* name of major driver */ char disk_name[32]; /* name of major driver */
...@@ -180,7 +181,9 @@ static inline struct gendisk *part_to_disk(struct hd_struct *part) ...@@ -180,7 +181,9 @@ static inline struct gendisk *part_to_disk(struct hd_struct *part)
static inline int disk_max_parts(struct gendisk *disk) static inline int disk_max_parts(struct gendisk *disk)
{ {
return disk->minors + disk->ext_minors; if (disk->flags & GENHD_FL_EXT_DEVT)
return DISK_MAX_PARTS;
return disk->minors;
} }
static inline bool disk_partitionable(struct gendisk *disk) static inline bool disk_partitionable(struct gendisk *disk)
...@@ -527,9 +530,6 @@ extern void printk_all_partitions(void); ...@@ -527,9 +530,6 @@ extern void printk_all_partitions(void);
extern struct gendisk *alloc_disk_node(int minors, int node_id); extern struct gendisk *alloc_disk_node(int minors, int node_id);
extern struct gendisk *alloc_disk(int minors); extern struct gendisk *alloc_disk(int minors);
extern struct gendisk *alloc_disk_ext_node(int minors, int ext_minrs,
int node_id);
extern struct gendisk *alloc_disk_ext(int minors, int ext_minors);
extern struct kobject *get_disk(struct gendisk *disk); extern struct kobject *get_disk(struct gendisk *disk);
extern void put_disk(struct gendisk *disk); extern void put_disk(struct gendisk *disk);
extern void blk_register_region(dev_t devt, unsigned long range, extern void blk_register_region(dev_t devt, unsigned long range,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册