@@ -635,7 +635,7 @@ static inline struct mddev *mddev_get(struct mddev *mddev)
635
635
636
636
static void mddev_delayed_delete (struct work_struct * ws );
637
637
638
- static void mddev_put (struct mddev * mddev )
638
+ void mddev_put (struct mddev * mddev )
639
639
{
640
640
if (!atomic_dec_and_lock (& mddev -> active , & all_mddevs_lock ))
641
641
return ;
@@ -714,24 +714,6 @@ static dev_t mddev_alloc_unit(void)
714
714
return dev ;
715
715
}
716
716
717
- #ifndef MODULE
718
- static struct mddev * mddev_find (dev_t unit )
719
- {
720
- struct mddev * mddev ;
721
-
722
- if (MAJOR (unit ) != MD_MAJOR )
723
- unit &= ~((1 << MdpMinorShift ) - 1 );
724
-
725
- spin_lock (& all_mddevs_lock );
726
- mddev = mddev_find_locked (unit );
727
- if (mddev && !mddev_get (mddev ))
728
- mddev = NULL ;
729
- spin_unlock (& all_mddevs_lock );
730
-
731
- return mddev ;
732
- }
733
- #endif
734
-
735
717
static struct mddev * mddev_alloc (dev_t unit )
736
718
{
737
719
struct mddev * new ;
@@ -5614,7 +5596,7 @@ int mddev_init_writes_pending(struct mddev *mddev)
5614
5596
}
5615
5597
EXPORT_SYMBOL_GPL (mddev_init_writes_pending );
5616
5598
5617
- int md_alloc (dev_t dev , char * name )
5599
+ struct mddev * md_alloc (dev_t dev , char * name )
5618
5600
{
5619
5601
/*
5620
5602
* If dev is zero, name is the name of a device to allocate with
@@ -5706,33 +5688,42 @@ int md_alloc(dev_t dev, char *name)
5706
5688
* different from a normal close on last release now.
5707
5689
*/
5708
5690
mddev -> hold_active = 0 ;
5709
- goto done ;
5691
+ mutex_unlock (& disks_mutex );
5692
+ mddev_put (mddev );
5693
+ return ERR_PTR (error );
5710
5694
}
5711
5695
5712
5696
kobject_uevent (& mddev -> kobj , KOBJ_ADD );
5713
5697
mddev -> sysfs_state = sysfs_get_dirent_safe (mddev -> kobj .sd , "array_state" );
5714
5698
mddev -> sysfs_level = sysfs_get_dirent_safe (mddev -> kobj .sd , "level" );
5715
-
5716
- done :
5717
5699
mutex_unlock (& disks_mutex );
5718
- mddev_put (mddev );
5719
- return error ;
5700
+ return mddev ;
5720
5701
5721
5702
out_put_disk :
5722
5703
put_disk (disk );
5723
5704
out_free_mddev :
5724
5705
mddev_free (mddev );
5725
5706
out_unlock :
5726
5707
mutex_unlock (& disks_mutex );
5727
- return error ;
5708
+ return ERR_PTR (error );
5709
+ }
5710
+
5711
+ static int md_alloc_and_put (dev_t dev , char * name )
5712
+ {
5713
+ struct mddev * mddev = md_alloc (dev , name );
5714
+
5715
+ if (IS_ERR (mddev ))
5716
+ return PTR_ERR (mddev );
5717
+ mddev_put (mddev );
5718
+ return 0 ;
5728
5719
}
5729
5720
5730
5721
static void md_probe (dev_t dev )
5731
5722
{
5732
5723
if (MAJOR (dev ) == MD_MAJOR && MINOR (dev ) >= 512 )
5733
5724
return ;
5734
5725
if (create_on_open )
5735
- md_alloc (dev , NULL );
5726
+ md_alloc_and_put (dev , NULL );
5736
5727
}
5737
5728
5738
5729
static int add_named_array (const char * val , const struct kernel_param * kp )
@@ -5754,12 +5745,12 @@ static int add_named_array(const char *val, const struct kernel_param *kp)
5754
5745
return - E2BIG ;
5755
5746
strscpy (buf , val , len + 1 );
5756
5747
if (strncmp (buf , "md_" , 3 ) == 0 )
5757
- return md_alloc (0 , buf );
5748
+ return md_alloc_and_put (0 , buf );
5758
5749
if (strncmp (buf , "md" , 2 ) == 0 &&
5759
5750
isdigit (buf [2 ]) &&
5760
5751
kstrtoul (buf + 2 , 10 , & devnum ) == 0 &&
5761
5752
devnum <= MINORMASK )
5762
- return md_alloc (MKDEV (MD_MAJOR , devnum ), NULL );
5753
+ return md_alloc_and_put (MKDEV (MD_MAJOR , devnum ), NULL );
5763
5754
5764
5755
return - EINVAL ;
5765
5756
}
@@ -6500,9 +6491,8 @@ static void autorun_devices(int part)
6500
6491
break ;
6501
6492
}
6502
6493
6503
- md_alloc (dev , NULL );
6504
- mddev = mddev_find (dev );
6505
- if (!mddev )
6494
+ mddev = md_alloc (dev , NULL );
6495
+ if (IS_ERR (mddev ))
6506
6496
break ;
6507
6497
6508
6498
if (mddev_lock (mddev ))
0 commit comments