@@ -362,7 +362,6 @@ __setup("ramdisk_size=", ramdisk_size);
362
362
* (should share code eventually).
363
363
*/
364
364
static LIST_HEAD (brd_devices );
365
- static DEFINE_MUTEX (brd_devices_mutex );
366
365
static struct dentry * brd_debugfs_dir ;
367
366
368
367
static int brd_alloc (int i )
@@ -372,21 +371,14 @@ static int brd_alloc(int i)
372
371
char buf [DISK_NAME_LEN ];
373
372
int err = - ENOMEM ;
374
373
375
- mutex_lock (& brd_devices_mutex );
376
- list_for_each_entry (brd , & brd_devices , brd_list ) {
377
- if (brd -> brd_number == i ) {
378
- mutex_unlock (& brd_devices_mutex );
374
+ list_for_each_entry (brd , & brd_devices , brd_list )
375
+ if (brd -> brd_number == i )
379
376
return - EEXIST ;
380
- }
381
- }
382
377
brd = kzalloc (sizeof (* brd ), GFP_KERNEL );
383
- if (!brd ) {
384
- mutex_unlock (& brd_devices_mutex );
378
+ if (!brd )
385
379
return - ENOMEM ;
386
- }
387
380
brd -> brd_number = i ;
388
381
list_add_tail (& brd -> brd_list , & brd_devices );
389
- mutex_unlock (& brd_devices_mutex );
390
382
391
383
spin_lock_init (& brd -> brd_lock );
392
384
INIT_RADIX_TREE (& brd -> brd_pages , GFP_ATOMIC );
@@ -429,9 +421,7 @@ static int brd_alloc(int i)
429
421
out_cleanup_disk :
430
422
blk_cleanup_disk (disk );
431
423
out_free_dev :
432
- mutex_lock (& brd_devices_mutex );
433
424
list_del (& brd -> brd_list );
434
- mutex_unlock (& brd_devices_mutex );
435
425
kfree (brd );
436
426
return err ;
437
427
}
@@ -441,15 +431,19 @@ static void brd_probe(dev_t dev)
441
431
brd_alloc (MINOR (dev ) / max_part );
442
432
}
443
433
444
- static void brd_del_one ( struct brd_device * brd )
434
+ static void brd_cleanup ( void )
445
435
{
446
- del_gendisk (brd -> brd_disk );
447
- blk_cleanup_disk (brd -> brd_disk );
448
- brd_free_pages (brd );
449
- mutex_lock (& brd_devices_mutex );
450
- list_del (& brd -> brd_list );
451
- mutex_unlock (& brd_devices_mutex );
452
- kfree (brd );
436
+ struct brd_device * brd , * next ;
437
+
438
+ debugfs_remove_recursive (brd_debugfs_dir );
439
+
440
+ list_for_each_entry_safe (brd , next , & brd_devices , brd_list ) {
441
+ del_gendisk (brd -> brd_disk );
442
+ blk_cleanup_disk (brd -> brd_disk );
443
+ brd_free_pages (brd );
444
+ list_del (& brd -> brd_list );
445
+ kfree (brd );
446
+ }
453
447
}
454
448
455
449
static inline void brd_check_and_reset_par (void )
@@ -473,9 +467,18 @@ static inline void brd_check_and_reset_par(void)
473
467
474
468
static int __init brd_init (void )
475
469
{
476
- struct brd_device * brd , * next ;
477
470
int err , i ;
478
471
472
+ brd_check_and_reset_par ();
473
+
474
+ brd_debugfs_dir = debugfs_create_dir ("ramdisk_pages" , NULL );
475
+
476
+ for (i = 0 ; i < rd_nr ; i ++ ) {
477
+ err = brd_alloc (i );
478
+ if (err )
479
+ goto out_free ;
480
+ }
481
+
479
482
/*
480
483
* brd module now has a feature to instantiate underlying device
481
484
* structure on-demand, provided that there is an access dev node.
@@ -491,42 +494,26 @@ static int __init brd_init(void)
491
494
* dynamically.
492
495
*/
493
496
494
- if (__register_blkdev (RAMDISK_MAJOR , "ramdisk" , brd_probe ))
495
- return - EIO ;
496
-
497
- brd_check_and_reset_par ();
498
-
499
- brd_debugfs_dir = debugfs_create_dir ("ramdisk_pages" , NULL );
500
-
501
- for (i = 0 ; i < rd_nr ; i ++ ) {
502
- err = brd_alloc (i );
503
- if (err )
504
- goto out_free ;
497
+ if (__register_blkdev (RAMDISK_MAJOR , "ramdisk" , brd_probe )) {
498
+ err = - EIO ;
499
+ goto out_free ;
505
500
}
506
501
507
502
pr_info ("brd: module loaded\n" );
508
503
return 0 ;
509
504
510
505
out_free :
511
- unregister_blkdev (RAMDISK_MAJOR , "ramdisk" );
512
- debugfs_remove_recursive (brd_debugfs_dir );
513
-
514
- list_for_each_entry_safe (brd , next , & brd_devices , brd_list )
515
- brd_del_one (brd );
506
+ brd_cleanup ();
516
507
517
508
pr_info ("brd: module NOT loaded !!!\n" );
518
509
return err ;
519
510
}
520
511
521
512
static void __exit brd_exit (void )
522
513
{
523
- struct brd_device * brd , * next ;
524
514
525
515
unregister_blkdev (RAMDISK_MAJOR , "ramdisk" );
526
- debugfs_remove_recursive (brd_debugfs_dir );
527
-
528
- list_for_each_entry_safe (brd , next , & brd_devices , brd_list )
529
- brd_del_one (brd );
516
+ brd_cleanup ();
530
517
531
518
pr_info ("brd: module unloaded\n" );
532
519
}
0 commit comments