Skip to content

Commit

Permalink
[PATCH] rework reserved major handling
Browse files Browse the repository at this point in the history
Several people have reported failures in dynamic major device number handling
due to the recent changes in there to avoid handing out the local/experimental
majors.

Rolf reports that this is due to a gcc-4.1.0 bug.

The patch refactors that code a lot in an attempt to provoke the compiler into
behaving.

Cc: Rolf Eike Beer <eike-kernel@sf-tec.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
akpm00 authored and Linus Torvalds committed Feb 21, 2007
1 parent f4fa27c commit b446b60
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 13 deletions.
9 changes: 2 additions & 7 deletions block/genhd.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/genhd.h>
#include <linux/kdev_t.h>
#include <linux/kernel.h>
#include <linux/blkdev.h>
#include <linux/init.h>
Expand Down Expand Up @@ -61,13 +62,7 @@ int register_blkdev(unsigned int major, const char *name)
/* temporary */
if (major == 0) {
for (index = ARRAY_SIZE(major_names)-1; index > 0; index--) {
/*
* Disallow the LANANA-assigned LOCAL/EXPERIMENTAL
* majors
*/
if ((60 <= index && index <= 63) ||
(120 <= index && index <= 127) ||
(240 <= index && index <= 254))
if (is_lanana_major(index))
continue;
if (major_names[index] == NULL)
break;
Expand Down
14 changes: 14 additions & 0 deletions drivers/base/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,20 @@
int (*platform_notify)(struct device * dev) = NULL;
int (*platform_notify_remove)(struct device * dev) = NULL;

/*
* Detect the LANANA-assigned LOCAL/EXPERIMENTAL majors
*/
bool is_lanana_major(unsigned int major)
{
if (major >= 60 && major <= 63)
return 1;
if (major >= 120 && major <= 127)
return 1;
if (major >= 240 && major <= 254)
return 1;
return 0;
}

/*
* sysfs bindings for devices.
*/
Expand Down
8 changes: 2 additions & 6 deletions fs/char_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include <linux/init.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/slab.h>
#include <linux/string.h>

Expand Down Expand Up @@ -108,12 +109,7 @@ __register_chrdev_region(unsigned int major, unsigned int baseminor,
/* temporary */
if (major == 0) {
for (i = ARRAY_SIZE(chrdevs)-1; i > 0; i--) {
/*
* Disallow the LANANA-assigned LOCAL/EXPERIMENTAL
* majors
*/
if ((60 <= i && i <= 63) || (120 <= i && i <= 127) ||
(240 <= i && i <= 254))
if (is_lanana_major(i))
continue;
if (chrdevs[i] == NULL)
break;
Expand Down
1 change: 1 addition & 0 deletions include/linux/kdev_t.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ static inline unsigned sysv_minor(u32 dev)
return dev & 0x3ffff;
}

bool is_lanana_major(unsigned int major);

#else /* __KERNEL__ */

Expand Down

0 comments on commit b446b60

Please sign in to comment.