@@ -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