|
@@ -242,6 +242,7 @@ EXPORT_SYMBOL_GPL(disk_map_sector_rcu);
|
|
|
* Can be deleted altogether. Later.
|
|
|
*
|
|
|
*/
|
|
|
+#define BLKDEV_MAJOR_HASH_SIZE 255
|
|
|
static struct blk_major_name {
|
|
|
struct blk_major_name *next;
|
|
|
int major;
|
|
@@ -259,12 +260,11 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
|
|
|
{
|
|
|
struct blk_major_name *dp;
|
|
|
|
|
|
- if (offset < BLKDEV_MAJOR_HASH_SIZE) {
|
|
|
- mutex_lock(&block_class_lock);
|
|
|
- for (dp = major_names[offset]; dp; dp = dp->next)
|
|
|
+ mutex_lock(&block_class_lock);
|
|
|
+ for (dp = major_names[major_to_index(offset)]; dp; dp = dp->next)
|
|
|
+ if (dp->major == offset)
|
|
|
seq_printf(seqf, "%3d %s\n", dp->major, dp->name);
|
|
|
- mutex_unlock(&block_class_lock);
|
|
|
- }
|
|
|
+ mutex_unlock(&block_class_lock);
|
|
|
}
|
|
|
#endif /* CONFIG_PROC_FS */
|
|
|
|
|
@@ -309,6 +309,14 @@ int register_blkdev(unsigned int major, const char *name)
|
|
|
ret = major;
|
|
|
}
|
|
|
|
|
|
+ if (major >= BLKDEV_MAJOR_MAX) {
|
|
|
+ pr_err("register_blkdev: major requested (%d) is greater than the maximum (%d) for %s\n",
|
|
|
+ major, BLKDEV_MAJOR_MAX, name);
|
|
|
+
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
p = kmalloc(sizeof(struct blk_major_name), GFP_KERNEL);
|
|
|
if (p == NULL) {
|
|
|
ret = -ENOMEM;
|