1717#include <linux/seq_file.h>
1818#include <linux/slab.h>
1919#include <linux/kmod.h>
20- #include <linux/kobj_map.h>
2120#include <linux/mutex.h>
2221#include <linux/idr.h>
2322#include <linux/log2.h>
2928static DEFINE_MUTEX (block_class_lock );
3029static struct kobject * block_depr ;
3130
31+ struct bdev_map {
32+ struct bdev_map * next ;
33+ dev_t dev ;
34+ unsigned long range ;
35+ struct module * owner ;
36+ struct kobject * (* probe )(dev_t , int * , void * );
37+ int (* lock )(dev_t , void * );
38+ void * data ;
39+ } * bdev_map [255 ];
40+
3241/* for extended dynamic devt allocation, currently only one major is used */
3342#define NR_EXT_DEVT (1 << MINORBITS)
3443
@@ -520,8 +529,6 @@ void unregister_blkdev(unsigned int major, const char *name)
520529
521530EXPORT_SYMBOL (unregister_blkdev );
522531
523- static struct kobj_map * bdev_map ;
524-
525532/**
526533 * blk_mangle_minor - scatter minor numbers apart
527534 * @minor: minor number to mangle
@@ -648,16 +655,60 @@ void blk_register_region(dev_t devt, unsigned long range, struct module *module,
648655 struct kobject * (* probe )(dev_t , int * , void * ),
649656 int (* lock )(dev_t , void * ), void * data )
650657{
651- kobj_map (bdev_map , devt , range , module , probe , lock , data );
652- }
658+ unsigned n = MAJOR (devt + range - 1 ) - MAJOR (devt ) + 1 ;
659+ unsigned index = MAJOR (devt );
660+ unsigned i ;
661+ struct bdev_map * p ;
662+
663+ n = min (n , 255u );
664+ p = kmalloc_array (n , sizeof (struct bdev_map ), GFP_KERNEL );
665+ if (p == NULL )
666+ return ;
653667
668+ for (i = 0 ; i < n ; i ++ , p ++ ) {
669+ p -> owner = module ;
670+ p -> probe = probe ;
671+ p -> lock = lock ;
672+ p -> dev = devt ;
673+ p -> range = range ;
674+ p -> data = data ;
675+ }
676+
677+ mutex_lock (& block_class_lock );
678+ for (i = 0 , p -= n ; i < n ; i ++ , p ++ , index ++ ) {
679+ struct bdev_map * * s = & bdev_map [index % 255 ];
680+ while (* s && (* s )-> range < range )
681+ s = & (* s )-> next ;
682+ p -> next = * s ;
683+ * s = p ;
684+ }
685+ mutex_unlock (& block_class_lock );
686+ }
654687EXPORT_SYMBOL (blk_register_region );
655688
656689void blk_unregister_region (dev_t devt , unsigned long range )
657690{
658- kobj_unmap (bdev_map , devt , range );
659- }
691+ unsigned n = MAJOR (devt + range - 1 ) - MAJOR (devt ) + 1 ;
692+ unsigned index = MAJOR (devt );
693+ unsigned i ;
694+ struct bdev_map * found = NULL ;
660695
696+ mutex_lock (& block_class_lock );
697+ for (i = 0 ; i < min (n , 255u ); i ++ , index ++ ) {
698+ struct bdev_map * * s ;
699+ for (s = & bdev_map [index % 255 ]; * s ; s = & (* s )-> next ) {
700+ struct bdev_map * p = * s ;
701+ if (p -> dev == devt && p -> range == range ) {
702+ * s = p -> next ;
703+ if (!found )
704+ found = p ;
705+ break ;
706+ }
707+ }
708+ }
709+ mutex_unlock (& block_class_lock );
710+ kfree (found );
711+ }
661712EXPORT_SYMBOL (blk_unregister_region );
662713
663714static struct kobject * exact_match (dev_t devt , int * partno , void * data )
@@ -979,6 +1030,47 @@ static ssize_t disk_badblocks_store(struct device *dev,
9791030 return badblocks_store (disk -> bb , page , len , 0 );
9801031}
9811032
1033+ static struct gendisk * lookup_gendisk (dev_t dev , int * partno )
1034+ {
1035+ struct kobject * kobj ;
1036+ struct bdev_map * p ;
1037+ unsigned long best = ~0UL ;
1038+
1039+ retry :
1040+ mutex_lock (& block_class_lock );
1041+ for (p = bdev_map [MAJOR (dev ) % 255 ]; p ; p = p -> next ) {
1042+ struct kobject * (* probe )(dev_t , int * , void * );
1043+ struct module * owner ;
1044+ void * data ;
1045+
1046+ if (p -> dev > dev || p -> dev + p -> range - 1 < dev )
1047+ continue ;
1048+ if (p -> range - 1 >= best )
1049+ break ;
1050+ if (!try_module_get (p -> owner ))
1051+ continue ;
1052+ owner = p -> owner ;
1053+ data = p -> data ;
1054+ probe = p -> probe ;
1055+ best = p -> range - 1 ;
1056+ * partno = dev - p -> dev ;
1057+ if (p -> lock && p -> lock (dev , data ) < 0 ) {
1058+ module_put (owner );
1059+ continue ;
1060+ }
1061+ mutex_unlock (& block_class_lock );
1062+ kobj = probe (dev , partno , data );
1063+ /* Currently ->owner protects _only_ ->probe() itself. */
1064+ module_put (owner );
1065+ if (kobj )
1066+ return dev_to_disk (kobj_to_dev (kobj ));
1067+ goto retry ;
1068+ }
1069+ mutex_unlock (& block_class_lock );
1070+ return NULL ;
1071+ }
1072+
1073+
9821074/**
9831075 * get_gendisk - get partitioning information for a given device
9841076 * @devt: device to get partitioning information for
@@ -996,11 +1088,7 @@ struct gendisk *get_gendisk(dev_t devt, int *partno)
9961088 might_sleep ();
9971089
9981090 if (MAJOR (devt ) != BLOCK_EXT_MAJOR ) {
999- struct kobject * kobj ;
1000-
1001- kobj = kobj_lookup (bdev_map , devt , partno );
1002- if (kobj )
1003- disk = dev_to_disk (kobj_to_dev (kobj ));
1091+ disk = lookup_gendisk (devt , partno );
10041092 } else {
10051093 struct hd_struct * part ;
10061094
@@ -1213,6 +1301,22 @@ static struct kobject *base_probe(dev_t devt, int *partno, void *data)
12131301 return NULL ;
12141302}
12151303
1304+ static void bdev_map_init (void )
1305+ {
1306+ struct bdev_map * base ;
1307+ int i ;
1308+
1309+ base = kzalloc (sizeof (* base ), GFP_KERNEL );
1310+ if (!base )
1311+ panic ("cannot allocate bdev_map" );
1312+
1313+ base -> dev = 1 ;
1314+ base -> range = ~0 ;
1315+ base -> probe = base_probe ;
1316+ for (i = 0 ; i < 255 ; i ++ )
1317+ bdev_map [i ] = base ;
1318+ }
1319+
12161320static int __init genhd_device_init (void )
12171321{
12181322 int error ;
@@ -1221,7 +1325,7 @@ static int __init genhd_device_init(void)
12211325 error = class_register (& block_class );
12221326 if (unlikely (error ))
12231327 return error ;
1224- bdev_map = kobj_map_init ( base_probe , & block_class_lock );
1328+ bdev_map_init ( );
12251329 blk_dev_init ();
12261330
12271331 register_blkdev (BLOCK_EXT_MAJOR , "blkext" );
0 commit comments