@@ -383,6 +383,7 @@ static struct blk_major_name {
383383 void (* probe )(dev_t devt );
384384} * major_names [BLKDEV_MAJOR_HASH_SIZE ];
385385static DEFINE_MUTEX (major_names_lock );
386+ static DEFINE_SPINLOCK (major_names_spinlock );
386387
387388/* index in the above - for now: assume no multimajor ranges */
388389static inline int major_to_index (unsigned major )
@@ -395,11 +396,11 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
395396{
396397 struct blk_major_name * dp ;
397398
398- mutex_lock ( & major_names_lock );
399+ spin_lock ( & major_names_spinlock );
399400 for (dp = major_names [major_to_index (offset )]; dp ; dp = dp -> next )
400401 if (dp -> major == offset )
401402 seq_printf (seqf , "%3d %s\n" , dp -> major , dp -> name );
402- mutex_unlock ( & major_names_lock );
403+ spin_unlock ( & major_names_spinlock );
403404}
404405#endif /* CONFIG_PROC_FS */
405406
@@ -471,6 +472,7 @@ int __register_blkdev(unsigned int major, const char *name,
471472 p -> next = NULL ;
472473 index = major_to_index (major );
473474
475+ spin_lock (& major_names_spinlock );
474476 for (n = & major_names [index ]; * n ; n = & (* n )-> next ) {
475477 if ((* n )-> major == major )
476478 break ;
@@ -479,6 +481,7 @@ int __register_blkdev(unsigned int major, const char *name,
479481 * n = p ;
480482 else
481483 ret = - EBUSY ;
484+ spin_unlock (& major_names_spinlock );
482485
483486 if (ret < 0 ) {
484487 printk ("register_blkdev: cannot get major %u for %s\n" ,
@@ -498,6 +501,7 @@ void unregister_blkdev(unsigned int major, const char *name)
498501 int index = major_to_index (major );
499502
500503 mutex_lock (& major_names_lock );
504+ spin_lock (& major_names_spinlock );
501505 for (n = & major_names [index ]; * n ; n = & (* n )-> next )
502506 if ((* n )-> major == major )
503507 break ;
@@ -507,6 +511,7 @@ void unregister_blkdev(unsigned int major, const char *name)
507511 p = * n ;
508512 * n = p -> next ;
509513 }
514+ spin_unlock (& major_names_spinlock );
510515 mutex_unlock (& major_names_lock );
511516 kfree (p );
512517}
0 commit comments