@@ -81,8 +81,6 @@ static const char *action_name[NR_SYNC_ACTIONS] = {
8181
8282static DEFINE_XARRAY (md_submodule );
8383
84- /* pers_list is a list of registered personalities protected by pers_lock. */
85- static LIST_HEAD (pers_list );
8684static DEFINE_SPINLOCK (pers_lock );
8785
8886static const struct kobj_type md_ktype ;
@@ -893,18 +891,21 @@ EXPORT_SYMBOL_GPL(md_find_rdev_rcu);
893891static struct md_personality * get_pers (int level , char * clevel )
894892{
895893 struct md_personality * ret = NULL ;
896- struct md_personality * pers ;
894+ struct md_submodule_head * head ;
895+ unsigned long i ;
897896
898- spin_lock (& pers_lock );
899- list_for_each_entry (pers , & pers_list , list ) {
900- if ((level != LEVEL_NONE && pers -> level == level ) ||
901- !strcmp (pers -> name , clevel )) {
902- if (try_module_get (pers -> owner ))
903- ret = pers ;
897+ xa_lock (& md_submodule );
898+ xa_for_each (& md_submodule , i , head ) {
899+ if (head -> type != MD_PERSONALITY )
900+ continue ;
901+ if ((level != LEVEL_NONE && head -> id == level ) ||
902+ !strcmp (head -> name , clevel )) {
903+ if (try_module_get (head -> owner ))
904+ ret = (void * )head ;
904905 break ;
905906 }
906907 }
907- spin_unlock ( & pers_lock );
908+ xa_unlock ( & md_submodule );
908909
909910 if (!ret ) {
910911 if (level != LEVEL_NONE )
@@ -920,7 +921,7 @@ static struct md_personality *get_pers(int level, char *clevel)
920921
921922static void put_pers (struct md_personality * pers )
922923{
923- module_put (pers -> owner );
924+ module_put (pers -> head . owner );
924925}
925926
926927/* return the offset of the super block in 512byte sectors */
@@ -1203,7 +1204,7 @@ int md_check_no_bitmap(struct mddev *mddev)
12031204 if (!mddev -> bitmap_info .file && !mddev -> bitmap_info .offset )
12041205 return 0 ;
12051206 pr_warn ("%s: bitmaps are not supported for %s\n" ,
1206- mdname (mddev ), mddev -> pers -> name );
1207+ mdname (mddev ), mddev -> pers -> head . name );
12071208 return 1 ;
12081209}
12091210EXPORT_SYMBOL (md_check_no_bitmap );
@@ -3883,7 +3884,7 @@ level_show(struct mddev *mddev, char *page)
38833884 spin_lock (& mddev -> lock );
38843885 p = mddev -> pers ;
38853886 if (p )
3886- ret = sprintf (page , "%s\n" , p -> name );
3887+ ret = sprintf (page , "%s\n" , p -> head . name );
38873888 else if (mddev -> clevel [0 ])
38883889 ret = sprintf (page , "%s\n" , mddev -> clevel );
38893890 else if (mddev -> level != LEVEL_NONE )
@@ -3940,7 +3941,7 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
39403941 rv = - EINVAL ;
39413942 if (!mddev -> pers -> quiesce ) {
39423943 pr_warn ("md: %s: %s does not support online personality change\n" ,
3943- mdname (mddev ), mddev -> pers -> name );
3944+ mdname (mddev ), mddev -> pers -> head . name );
39443945 goto out_unlock ;
39453946 }
39463947
@@ -4003,7 +4004,7 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
40034004 oldpriv = mddev -> private ;
40044005 mddev -> pers = pers ;
40054006 mddev -> private = priv ;
4006- strscpy (mddev -> clevel , pers -> name , sizeof (mddev -> clevel ));
4007+ strscpy (mddev -> clevel , pers -> head . name , sizeof (mddev -> clevel ));
40074008 mddev -> level = mddev -> new_level ;
40084009 mddev -> layout = mddev -> new_layout ;
40094010 mddev -> chunk_sectors = mddev -> new_chunk_sectors ;
@@ -5603,7 +5604,7 @@ __ATTR(fail_last_dev, S_IRUGO | S_IWUSR, fail_last_dev_show,
56035604
56045605static ssize_t serialize_policy_show (struct mddev * mddev , char * page )
56055606{
5606- if (mddev -> pers == NULL || (mddev -> pers -> level != 1 ))
5607+ if (mddev -> pers == NULL || (mddev -> pers -> head . id != ID_RAID1 ))
56075608 return sprintf (page , "n/a\n" );
56085609 else
56095610 return sprintf (page , "%d\n" , mddev -> serialize_policy );
@@ -5629,7 +5630,7 @@ serialize_policy_store(struct mddev *mddev, const char *buf, size_t len)
56295630 err = mddev_suspend_and_lock (mddev );
56305631 if (err )
56315632 return err ;
5632- if (mddev -> pers == NULL || (mddev -> pers -> level != 1 )) {
5633+ if (mddev -> pers == NULL || (mddev -> pers -> head . id != ID_RAID1 )) {
56335634 pr_err ("md: serialize_policy is only effective for raid1\n" );
56345635 err = - EINVAL ;
56355636 goto unlock ;
@@ -6120,11 +6121,11 @@ int md_run(struct mddev *mddev)
61206121 err = - EINVAL ;
61216122 goto abort ;
61226123 }
6123- if (mddev -> level != pers -> level ) {
6124- mddev -> level = pers -> level ;
6125- mddev -> new_level = pers -> level ;
6124+ if (mddev -> level != pers -> head . id ) {
6125+ mddev -> level = pers -> head . id ;
6126+ mddev -> new_level = pers -> head . id ;
61266127 }
6127- strscpy (mddev -> clevel , pers -> name , sizeof (mddev -> clevel ));
6128+ strscpy (mddev -> clevel , pers -> head . name , sizeof (mddev -> clevel ));
61286129
61296130 if (mddev -> reshape_position != MaxSector &&
61306131 pers -> start_reshape == NULL ) {
@@ -8134,7 +8135,8 @@ void md_error(struct mddev *mddev, struct md_rdev *rdev)
81348135 return ;
81358136 mddev -> pers -> error_handler (mddev , rdev );
81368137
8137- if (mddev -> pers -> level == 0 || mddev -> pers -> level == LEVEL_LINEAR )
8138+ if (mddev -> pers -> head .id == ID_RAID0 ||
8139+ mddev -> pers -> head .id == ID_LINEAR )
81388140 return ;
81398141
81408142 if (mddev -> degraded && !test_bit (MD_BROKEN , & mddev -> flags ))
@@ -8172,14 +8174,17 @@ static void status_unused(struct seq_file *seq)
81728174
81738175static void status_personalities (struct seq_file * seq )
81748176{
8175- struct md_personality * pers ;
8177+ struct md_submodule_head * head ;
8178+ unsigned long i ;
81768179
81778180 seq_puts (seq , "Personalities : " );
8178- spin_lock (& pers_lock );
8179- list_for_each_entry (pers , & pers_list , list )
8180- seq_printf (seq , "[%s] " , pers -> name );
81818181
8182- spin_unlock (& pers_lock );
8182+ xa_lock (& md_submodule );
8183+ xa_for_each (& md_submodule , i , head )
8184+ if (head -> type == MD_PERSONALITY )
8185+ seq_printf (seq , "[%s] " , head -> name );
8186+ xa_unlock (& md_submodule );
8187+
81838188 seq_puts (seq , "\n" );
81848189}
81858190
@@ -8402,7 +8407,7 @@ static int md_seq_show(struct seq_file *seq, void *v)
84028407 seq_printf (seq , " (read-only)" );
84038408 if (mddev -> ro == MD_AUTO_READ )
84048409 seq_printf (seq , " (auto-read-only)" );
8405- seq_printf (seq , " %s" , mddev -> pers -> name );
8410+ seq_printf (seq , " %s" , mddev -> pers -> head . name );
84068411 } else {
84078412 seq_printf (seq , "inactive" );
84088413 }
@@ -8536,27 +8541,6 @@ void unregister_md_submodule(struct md_submodule_head *msh)
85368541}
85378542EXPORT_SYMBOL_GPL (unregister_md_submodule );
85388543
8539- int register_md_personality (struct md_personality * p )
8540- {
8541- pr_debug ("md: %s personality registered for level %d\n" ,
8542- p -> name , p -> level );
8543- spin_lock (& pers_lock );
8544- list_add_tail (& p -> list , & pers_list );
8545- spin_unlock (& pers_lock );
8546- return 0 ;
8547- }
8548- EXPORT_SYMBOL (register_md_personality );
8549-
8550- int unregister_md_personality (struct md_personality * p )
8551- {
8552- pr_debug ("md: %s personality unregistered\n" , p -> name );
8553- spin_lock (& pers_lock );
8554- list_del_init (& p -> list );
8555- spin_unlock (& pers_lock );
8556- return 0 ;
8557- }
8558- EXPORT_SYMBOL (unregister_md_personality );
8559-
85608544int register_md_cluster_operations (const struct md_cluster_operations * ops ,
85618545 struct module * module )
85628546{
0 commit comments