Skip to content

Commit 3d44e1d

Browse files
YuKuai-huaweiYu Kuai
authored andcommitted
md: switch personalities to use md_submodule_head
Remove the global list 'pers_list', and switch to use md_submodule_head, which is managed by xarry. Prepare to unify registration and unregistration for all sub modules. Link: https://lore.kernel.org/linux-raid/[email protected] Signed-off-by: Yu Kuai <[email protected]>
1 parent d3beb7c commit 3d44e1d

File tree

7 files changed

+130
-106
lines changed

7 files changed

+130
-106
lines changed

drivers/md/md-linear.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66

77
#include <linux/blkdev.h>
8-
#include <linux/raid/md_u.h>
98
#include <linux/seq_file.h>
109
#include <linux/module.h>
1110
#include <linux/slab.h>
@@ -320,9 +319,13 @@ static void linear_quiesce(struct mddev *mddev, int state)
320319
}
321320

322321
static struct md_personality linear_personality = {
323-
.name = "linear",
324-
.level = LEVEL_LINEAR,
325-
.owner = THIS_MODULE,
322+
.head = {
323+
.type = MD_PERSONALITY,
324+
.id = ID_LINEAR,
325+
.name = "linear",
326+
.owner = THIS_MODULE,
327+
},
328+
326329
.make_request = linear_make_request,
327330
.run = linear_run,
328331
.free = linear_free,
@@ -335,12 +338,12 @@ static struct md_personality linear_personality = {
335338

336339
static int __init linear_init(void)
337340
{
338-
return register_md_personality(&linear_personality);
341+
return register_md_submodule(&linear_personality.head);
339342
}
340343

341344
static void linear_exit(void)
342345
{
343-
unregister_md_personality(&linear_personality);
346+
unregister_md_submodule(&linear_personality.head);
344347
}
345348

346349
module_init(linear_init);

drivers/md/md.c

Lines changed: 33 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,6 @@ static const char *action_name[NR_SYNC_ACTIONS] = {
8181

8282
static DEFINE_XARRAY(md_submodule);
8383

84-
/* pers_list is a list of registered personalities protected by pers_lock. */
85-
static LIST_HEAD(pers_list);
8684
static DEFINE_SPINLOCK(pers_lock);
8785

8886
static const struct kobj_type md_ktype;
@@ -893,18 +891,21 @@ EXPORT_SYMBOL_GPL(md_find_rdev_rcu);
893891
static 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

921922
static 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
}
12091210
EXPORT_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

56045605
static 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

81738175
static 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
}
85378542
EXPORT_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-
85608544
int register_md_cluster_operations(const struct md_cluster_operations *ops,
85618545
struct module *module)
85628546
{

drivers/md/md.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -726,10 +726,7 @@ static inline void md_sync_acct_bio(struct bio *bio, unsigned long nr_sectors)
726726
struct md_personality
727727
{
728728
struct md_submodule_head head;
729-
char *name;
730-
int level;
731-
struct list_head list;
732-
struct module *owner;
729+
733730
bool __must_check (*make_request)(struct mddev *mddev, struct bio *bio);
734731
/*
735732
* start up works that do NOT require md_thread. tasks that
@@ -873,8 +870,6 @@ static inline void safe_put_page(struct page *p)
873870
int register_md_submodule(struct md_submodule_head *msh);
874871
void unregister_md_submodule(struct md_submodule_head *msh);
875872

876-
extern int register_md_personality(struct md_personality *p);
877-
extern int unregister_md_personality(struct md_personality *p);
878873
extern struct md_thread *md_register_thread(
879874
void (*run)(struct md_thread *thread),
880875
struct mddev *mddev,

drivers/md/raid0.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -811,9 +811,13 @@ static void raid0_quiesce(struct mddev *mddev, int quiesce)
811811

812812
static struct md_personality raid0_personality=
813813
{
814-
.name = "raid0",
815-
.level = 0,
816-
.owner = THIS_MODULE,
814+
.head = {
815+
.type = MD_PERSONALITY,
816+
.id = ID_RAID0,
817+
.name = "raid0",
818+
.owner = THIS_MODULE,
819+
},
820+
817821
.make_request = raid0_make_request,
818822
.run = raid0_run,
819823
.free = raid0_free,
@@ -824,14 +828,14 @@ static struct md_personality raid0_personality=
824828
.error_handler = raid0_error,
825829
};
826830

827-
static int __init raid0_init (void)
831+
static int __init raid0_init(void)
828832
{
829-
return register_md_personality (&raid0_personality);
833+
return register_md_submodule(&raid0_personality.head);
830834
}
831835

832-
static void raid0_exit (void)
836+
static void __exit raid0_exit(void)
833837
{
834-
unregister_md_personality (&raid0_personality);
838+
unregister_md_submodule(&raid0_personality.head);
835839
}
836840

837841
module_init(raid0_init);

drivers/md/raid1.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3500,9 +3500,13 @@ static void *raid1_takeover(struct mddev *mddev)
35003500

35013501
static struct md_personality raid1_personality =
35023502
{
3503-
.name = "raid1",
3504-
.level = 1,
3505-
.owner = THIS_MODULE,
3503+
.head = {
3504+
.type = MD_PERSONALITY,
3505+
.id = ID_RAID1,
3506+
.name = "raid1",
3507+
.owner = THIS_MODULE,
3508+
},
3509+
35063510
.make_request = raid1_make_request,
35073511
.run = raid1_run,
35083512
.free = raid1_free,
@@ -3519,18 +3523,18 @@ static struct md_personality raid1_personality =
35193523
.takeover = raid1_takeover,
35203524
};
35213525

3522-
static int __init raid_init(void)
3526+
static int __init raid1_init(void)
35233527
{
3524-
return register_md_personality(&raid1_personality);
3528+
return register_md_submodule(&raid1_personality.head);
35253529
}
35263530

3527-
static void raid_exit(void)
3531+
static void __exit raid1_exit(void)
35283532
{
3529-
unregister_md_personality(&raid1_personality);
3533+
unregister_md_submodule(&raid1_personality.head);
35303534
}
35313535

3532-
module_init(raid_init);
3533-
module_exit(raid_exit);
3536+
module_init(raid1_init);
3537+
module_exit(raid1_exit);
35343538
MODULE_LICENSE("GPL");
35353539
MODULE_DESCRIPTION("RAID1 (mirroring) personality for MD");
35363540
MODULE_ALIAS("md-personality-3"); /* RAID1 */

drivers/md/raid10.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5126,9 +5126,13 @@ static void raid10_finish_reshape(struct mddev *mddev)
51265126

51275127
static struct md_personality raid10_personality =
51285128
{
5129-
.name = "raid10",
5130-
.level = 10,
5131-
.owner = THIS_MODULE,
5129+
.head = {
5130+
.type = MD_PERSONALITY,
5131+
.id = ID_RAID10,
5132+
.name = "raid10",
5133+
.owner = THIS_MODULE,
5134+
},
5135+
51325136
.make_request = raid10_make_request,
51335137
.run = raid10_run,
51345138
.free = raid10_free,
@@ -5148,18 +5152,18 @@ static struct md_personality raid10_personality =
51485152
.update_reshape_pos = raid10_update_reshape_pos,
51495153
};
51505154

5151-
static int __init raid_init(void)
5155+
static int __init raid10_init(void)
51525156
{
5153-
return register_md_personality(&raid10_personality);
5157+
return register_md_submodule(&raid10_personality.head);
51545158
}
51555159

5156-
static void raid_exit(void)
5160+
static void __exit raid10_exit(void)
51575161
{
5158-
unregister_md_personality(&raid10_personality);
5162+
unregister_md_submodule(&raid10_personality.head);
51595163
}
51605164

5161-
module_init(raid_init);
5162-
module_exit(raid_exit);
5165+
module_init(raid10_init);
5166+
module_exit(raid10_exit);
51635167
MODULE_LICENSE("GPL");
51645168
MODULE_DESCRIPTION("RAID10 (striped mirror) personality for MD");
51655169
MODULE_ALIAS("md-personality-9"); /* RAID10 */

0 commit comments

Comments
 (0)