@@ -183,6 +183,7 @@ static struct blk_major_name {
183183	void  (* probe )(dev_t  devt );
184184} * major_names [BLKDEV_MAJOR_HASH_SIZE ];
185185static  DEFINE_MUTEX (major_names_lock );
186+ static  DEFINE_SPINLOCK (major_names_spinlock );
186187
187188/* index in the above - for now: assume no multimajor ranges */ 
188189static  inline  int  major_to_index (unsigned  major )
@@ -195,11 +196,11 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
195196{
196197	struct  blk_major_name  * dp ;
197198
198- 	mutex_lock ( & major_names_lock );
199+ 	spin_lock ( & major_names_spinlock );
199200	for  (dp  =  major_names [major_to_index (offset )]; dp ; dp  =  dp -> next )
200201		if  (dp -> major  ==  offset )
201202			seq_printf (seqf , "%3d %s\n" , dp -> major , dp -> name );
202- 	mutex_unlock ( & major_names_lock );
203+ 	spin_unlock ( & major_names_spinlock );
203204}
204205#endif  /* CONFIG_PROC_FS */ 
205206
@@ -271,6 +272,7 @@ int __register_blkdev(unsigned int major, const char *name,
271272	p -> next  =  NULL ;
272273	index  =  major_to_index (major );
273274
275+ 	spin_lock (& major_names_spinlock );
274276	for  (n  =  & major_names [index ]; * n ; n  =  & (* n )-> next ) {
275277		if  ((* n )-> major  ==  major )
276278			break ;
@@ -279,6 +281,7 @@ int __register_blkdev(unsigned int major, const char *name,
279281		* n  =  p ;
280282	else 
281283		ret  =  - EBUSY ;
284+ 	spin_unlock (& major_names_spinlock );
282285
283286	if  (ret  <  0 ) {
284287		printk ("register_blkdev: cannot get major %u for %s\n" ,
@@ -298,6 +301,7 @@ void unregister_blkdev(unsigned int major, const char *name)
298301	int  index  =  major_to_index (major );
299302
300303	mutex_lock (& major_names_lock );
304+ 	spin_lock (& major_names_spinlock );
301305	for  (n  =  & major_names [index ]; * n ; n  =  & (* n )-> next )
302306		if  ((* n )-> major  ==  major )
303307			break ;
@@ -307,6 +311,7 @@ void unregister_blkdev(unsigned int major, const char *name)
307311		p  =  * n ;
308312		* n  =  p -> next ;
309313	}
314+ 	spin_unlock (& major_names_spinlock );
310315	mutex_unlock (& major_names_lock );
311316	kfree (p );
312317}
0 commit comments