@@ -635,7 +635,7 @@ static inline struct mddev *mddev_get(struct mddev *mddev)
635635
636636static void mddev_delayed_delete (struct work_struct * ws );
637637
638- static void mddev_put (struct mddev * mddev )
638+ void mddev_put (struct mddev * mddev )
639639{
640640 if (!atomic_dec_and_lock (& mddev -> active , & all_mddevs_lock ))
641641 return ;
@@ -714,24 +714,6 @@ static dev_t mddev_alloc_unit(void)
714714 return dev ;
715715}
716716
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-
735717static struct mddev * mddev_alloc (dev_t unit )
736718{
737719 struct mddev * new ;
@@ -5614,7 +5596,7 @@ int mddev_init_writes_pending(struct mddev *mddev)
56145596}
56155597EXPORT_SYMBOL_GPL (mddev_init_writes_pending );
56165598
5617- int md_alloc (dev_t dev , char * name )
5599+ struct mddev * md_alloc (dev_t dev , char * name )
56185600{
56195601 /*
56205602 * 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)
57065688 * different from a normal close on last release now.
57075689 */
57085690 mddev -> hold_active = 0 ;
5709- goto done ;
5691+ mutex_unlock (& disks_mutex );
5692+ mddev_put (mddev );
5693+ return ERR_PTR (error );
57105694 }
57115695
57125696 kobject_uevent (& mddev -> kobj , KOBJ_ADD );
57135697 mddev -> sysfs_state = sysfs_get_dirent_safe (mddev -> kobj .sd , "array_state" );
57145698 mddev -> sysfs_level = sysfs_get_dirent_safe (mddev -> kobj .sd , "level" );
5715-
5716- done :
57175699 mutex_unlock (& disks_mutex );
5718- mddev_put (mddev );
5719- return error ;
5700+ return mddev ;
57205701
57215702out_put_disk :
57225703 put_disk (disk );
57235704out_free_mddev :
57245705 mddev_free (mddev );
57255706out_unlock :
57265707 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 ;
57285719}
57295720
57305721static void md_probe (dev_t dev )
57315722{
57325723 if (MAJOR (dev ) == MD_MAJOR && MINOR (dev ) >= 512 )
57335724 return ;
57345725 if (create_on_open )
5735- md_alloc (dev , NULL );
5726+ md_alloc_and_put (dev , NULL );
57365727}
57375728
57385729static 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)
57545745 return - E2BIG ;
57555746 strscpy (buf , val , len + 1 );
57565747 if (strncmp (buf , "md_" , 3 ) == 0 )
5757- return md_alloc (0 , buf );
5748+ return md_alloc_and_put (0 , buf );
57585749 if (strncmp (buf , "md" , 2 ) == 0 &&
57595750 isdigit (buf [2 ]) &&
57605751 kstrtoul (buf + 2 , 10 , & devnum ) == 0 &&
57615752 devnum <= MINORMASK )
5762- return md_alloc (MKDEV (MD_MAJOR , devnum ), NULL );
5753+ return md_alloc_and_put (MKDEV (MD_MAJOR , devnum ), NULL );
57635754
57645755 return - EINVAL ;
57655756}
@@ -6500,9 +6491,8 @@ static void autorun_devices(int part)
65006491 break ;
65016492 }
65026493
6503- md_alloc (dev , NULL );
6504- mddev = mddev_find (dev );
6505- if (!mddev )
6494+ mddev = md_alloc (dev , NULL );
6495+ if (IS_ERR (mddev ))
65066496 break ;
65076497
65086498 if (mddev_lock (mddev ))
0 commit comments