@@ -2493,34 +2493,6 @@ static void unbind_rdev_from_array(struct md_rdev *rdev)
2493
2493
queue_work (md_rdev_misc_wq , & rdev -> del_work );
2494
2494
}
2495
2495
2496
- /*
2497
- * prevent the device from being mounted, repartitioned or
2498
- * otherwise reused by a RAID array (or any other kernel
2499
- * subsystem), by bd_claiming the device.
2500
- */
2501
- static int lock_rdev (struct md_rdev * rdev , dev_t dev , int shared )
2502
- {
2503
- int err = 0 ;
2504
- struct block_device * bdev ;
2505
-
2506
- bdev = blkdev_get_by_dev (dev , FMODE_READ |FMODE_WRITE |FMODE_EXCL ,
2507
- shared ? (struct md_rdev * )lock_rdev : rdev );
2508
- if (IS_ERR (bdev )) {
2509
- pr_warn ("md: could not open device unknown-block(%u,%u).\n" ,
2510
- MAJOR (dev ), MINOR (dev ));
2511
- return PTR_ERR (bdev );
2512
- }
2513
- rdev -> bdev = bdev ;
2514
- return err ;
2515
- }
2516
-
2517
- static void unlock_rdev (struct md_rdev * rdev )
2518
- {
2519
- struct block_device * bdev = rdev -> bdev ;
2520
- rdev -> bdev = NULL ;
2521
- blkdev_put (bdev , FMODE_READ |FMODE_WRITE |FMODE_EXCL );
2522
- }
2523
-
2524
2496
void md_autodetect_dev (dev_t dev );
2525
2497
2526
2498
static void export_rdev (struct md_rdev * rdev )
@@ -2531,7 +2503,8 @@ static void export_rdev(struct md_rdev *rdev)
2531
2503
if (test_bit (AutoDetected , & rdev -> flags ))
2532
2504
md_autodetect_dev (rdev -> bdev -> bd_dev );
2533
2505
#endif
2534
- unlock_rdev (rdev );
2506
+ blkdev_put (rdev -> bdev , FMODE_READ | FMODE_WRITE | FMODE_EXCL );
2507
+ rdev -> bdev = NULL ;
2535
2508
kobject_put (& rdev -> kobj );
2536
2509
}
2537
2510
@@ -3675,24 +3648,31 @@ EXPORT_SYMBOL_GPL(md_rdev_init);
3675
3648
*/
3676
3649
static struct md_rdev * md_import_device (dev_t newdev , int super_format , int super_minor )
3677
3650
{
3678
- int err ;
3651
+ static struct md_rdev * claim_rdev ; /* just for claiming the bdev */
3679
3652
struct md_rdev * rdev ;
3680
3653
sector_t size ;
3654
+ int err ;
3681
3655
3682
3656
rdev = kzalloc (sizeof (* rdev ), GFP_KERNEL );
3683
3657
if (!rdev )
3684
3658
return ERR_PTR (- ENOMEM );
3685
3659
3686
3660
err = md_rdev_init (rdev );
3687
3661
if (err )
3688
- goto abort_free ;
3662
+ goto out_free_rdev ;
3689
3663
err = alloc_disk_sb (rdev );
3690
3664
if (err )
3691
- goto abort_free ;
3665
+ goto out_clear_rdev ;
3692
3666
3693
- err = lock_rdev (rdev , newdev , super_format == -2 );
3694
- if (err )
3695
- goto abort_free ;
3667
+ rdev -> bdev = blkdev_get_by_dev (newdev ,
3668
+ FMODE_READ | FMODE_WRITE | FMODE_EXCL ,
3669
+ super_format == -2 ? claim_rdev : rdev );
3670
+ if (IS_ERR (rdev -> bdev )) {
3671
+ pr_warn ("md: could not open device unknown-block(%u,%u).\n" ,
3672
+ MAJOR (newdev ), MINOR (newdev ));
3673
+ err = PTR_ERR (rdev -> bdev );
3674
+ goto out_clear_rdev ;
3675
+ }
3696
3676
3697
3677
kobject_init (& rdev -> kobj , & rdev_ktype );
3698
3678
@@ -3701,7 +3681,7 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe
3701
3681
pr_warn ("md: %pg has zero or unknown size, marking faulty!\n" ,
3702
3682
rdev -> bdev );
3703
3683
err = - EINVAL ;
3704
- goto abort_free ;
3684
+ goto out_blkdev_put ;
3705
3685
}
3706
3686
3707
3687
if (super_format >= 0 ) {
@@ -3711,21 +3691,22 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe
3711
3691
pr_warn ("md: %pg does not have a valid v%d.%d superblock, not importing!\n" ,
3712
3692
rdev -> bdev ,
3713
3693
super_format , super_minor );
3714
- goto abort_free ;
3694
+ goto out_blkdev_put ;
3715
3695
}
3716
3696
if (err < 0 ) {
3717
3697
pr_warn ("md: could not read %pg's sb, not importing!\n" ,
3718
3698
rdev -> bdev );
3719
- goto abort_free ;
3699
+ goto out_blkdev_put ;
3720
3700
}
3721
3701
}
3722
3702
3723
3703
return rdev ;
3724
3704
3725
- abort_free :
3726
- if (rdev -> bdev )
3727
- unlock_rdev ( rdev );
3705
+ out_blkdev_put :
3706
+ blkdev_put (rdev -> bdev , FMODE_READ | FMODE_WRITE | FMODE_EXCL );
3707
+ out_clear_rdev :
3728
3708
md_rdev_clear (rdev );
3709
+ out_free_rdev :
3729
3710
kfree (rdev );
3730
3711
return ERR_PTR (err );
3731
3712
}
0 commit comments