|
[PATCH] md - 3 of 3 - Convert md personalities to new module interface: msg#00131linux.raid
### Comments for ChangeSet Thanks to Angus Sawyer <angus.sawyer@xxxxxxxxxxxxx> and Daniel McNeil <daniel@xxxxxxxx> ----------- Diffstat output ------------ ./drivers/md/linear.c | 6 +----- ./drivers/md/md.c | 30 ++++++++++++++++++++++-------- ./drivers/md/multipath.c | 5 +---- ./drivers/md/raid0.c | 5 +---- ./drivers/md/raid1.c | 5 +---- ./drivers/md/raid5.c | 6 +----- ./include/linux/raid/md_k.h | 1 + 7 files changed, 28 insertions(+), 30 deletions(-) diff ./drivers/md/linear.c~current~ ./drivers/md/linear.c --- ./drivers/md/linear.c~current~ 2003-03-26 10:55:20.000000000 +1100 +++ ./drivers/md/linear.c 2003-03-26 10:37:28.000000000 +1100 @@ -79,8 +79,6 @@ static int linear_run (mddev_t *mddev) unsigned int curr_offset; struct list_head *tmp; - MOD_INC_USE_COUNT; - conf = kmalloc (sizeof (*conf), GFP_KERNEL); if (!conf) goto out; @@ -167,7 +165,6 @@ static int linear_run (mddev_t *mddev) out: if (conf) kfree(conf); - MOD_DEC_USE_COUNT; return 1; } @@ -178,8 +175,6 @@ static int linear_stop (mddev_t *mddev) kfree(conf->hash_table); kfree(conf); - MOD_DEC_USE_COUNT; - return 0; } @@ -246,6 +241,7 @@ static void linear_status (struct seq_fi static mdk_personality_t linear_personality= { .name = "linear", + .owner = THIS_MODULE, .make_request = linear_make_request, .run = linear_run, .stop = linear_stop, diff ./drivers/md/md.c~current~ ./drivers/md/md.c --- ./drivers/md/md.c~current~ 2003-03-26 10:55:20.000000000 +1100 +++ ./drivers/md/md.c 2003-03-26 10:56:07.000000000 +1100 @@ -64,6 +64,7 @@ static void autostart_arrays (void); #endif static mdk_personality_t *pers[MAX_PERSONALITY]; +static spinlock_t pers_lock = SPIN_LOCK_UNLOCKED; /* * Current RAID-1,4,5 parallel reconstruction 'guaranteed speed limit' @@ -1648,20 +1649,14 @@ static int do_md_run(mddev_t * mddev) return -EINVAL; } +#ifdef CONFIG_KMOD if (!pers[pnum]) { -#ifdef CONFIG_KMOD char module_name[80]; sprintf (module_name, "md-personality-%d", pnum); request_module (module_name); - if (!pers[pnum]) -#endif - { - printk(KERN_ERR "md: personality %d is not loaded!\n", - pnum); - return -EINVAL; - } } +#endif if (device_size_calculation(mddev)) return -EINVAL; @@ -1695,7 +1690,17 @@ static int do_md_run(mddev_t * mddev) disk = disks[mdidx(mddev)]; if (!disk) return -ENOMEM; + + spin_lock(&pers_lock); + if (!pers[pnum] || !try_module_get(pers[pnum]->owner)) { + spin_unlock(&pers_lock); + printk(KERN_ERR "md: personality %d is not loaded!\n", + pnum); + return -EINVAL; + } + mddev->pers = pers[pnum]; + spin_unlock(&pers_lock); blk_queue_make_request(&mddev->queue, mddev->pers->make_request); printk("%s: setting max_sectors to %d, segment boundary to %d\n", @@ -1710,6 +1715,7 @@ static int do_md_run(mddev_t * mddev) if (err) { printk(KERN_ERR "md: pers->run() failed ...\n"); mddev->pers = NULL; + module_put(mddev->pers->owner); return -EINVAL; } atomic_set(&mddev->writes_pending,0); @@ -1800,6 +1806,7 @@ static int do_md_stop(mddev_t * mddev, i set_disk_ro(disk, 1); goto out; } + module_put(mddev->pers->owner); mddev->pers = NULL; if (mddev->ro) mddev->ro = 0; @@ -3006,10 +3013,12 @@ static int md_seq_show(struct seq_file * if (v == (void*)1) { seq_printf(seq, "Personalities : "); + spin_lock(&pers_lock); for (i = 0; i < MAX_PERSONALITY; i++) if (pers[i]) seq_printf(seq, "[%s] ", pers[i]->name); + spin_unlock(&pers_lock); seq_printf(seq, "\n"); return 0; } @@ -3093,13 +3102,16 @@ int register_md_personality(int pnum, md return -EINVAL; } + spin_lock(&pers_lock); if (pers[pnum]) { + spin_unlock(&pers_lock); MD_BUG(); return -EBUSY; } pers[pnum] = p; printk(KERN_INFO "md: %s personality registered as nr %d\n", p->name, pnum); + spin_unlock(&pers_lock); return 0; } @@ -3111,7 +3123,9 @@ int unregister_md_personality(int pnum) } printk(KERN_INFO "md: %s personality unregistered\n", pers[pnum]->name); + spin_lock(&pers_lock); pers[pnum] = NULL; + spin_unlock(&pers_lock); return 0; } diff ./drivers/md/multipath.c~current~ ./drivers/md/multipath.c --- ./drivers/md/multipath.c~current~ 2003-03-26 10:55:20.000000000 +1100 +++ ./drivers/md/multipath.c 2003-03-26 10:37:52.000000000 +1100 @@ -365,8 +365,6 @@ static int multipath_run (mddev_t *mddev mdk_rdev_t *rdev; struct list_head *tmp; - MOD_INC_USE_COUNT; - if (mddev->level != LEVEL_MULTIPATH) { printk("multipath: md%d: raid level not set to multipath IO (%d)\n", mdidx(mddev), mddev->level); @@ -448,7 +446,6 @@ out_free_conf: kfree(conf); mddev->private = NULL; out: - MOD_DEC_USE_COUNT; return -EIO; } @@ -461,13 +458,13 @@ static int multipath_stop (mddev_t *mdde mempool_destroy(conf->pool); kfree(conf); mddev->private = NULL; - MOD_DEC_USE_COUNT; return 0; } static mdk_personality_t multipath_personality= { .name = "multipath", + .owner = THIS_MODULE, .make_request = multipath_make_request, .run = multipath_run, .stop = multipath_stop, diff ./drivers/md/raid0.c~current~ ./drivers/md/raid0.c --- ./drivers/md/raid0.c~current~ 2003-03-26 10:55:20.000000000 +1100 +++ ./drivers/md/raid0.c 2003-03-26 10:37:28.000000000 +1100 @@ -197,8 +197,6 @@ static int raid0_run (mddev_t *mddev) s64 size; raid0_conf_t *conf; - MOD_INC_USE_COUNT; - conf = vmalloc(sizeof (raid0_conf_t)); if (!conf) goto out; @@ -275,7 +273,6 @@ out_free_conf: vfree(conf); mddev->private = NULL; out: - MOD_DEC_USE_COUNT; return 1; } @@ -290,7 +287,6 @@ static int raid0_stop (mddev_t *mddev) vfree (conf); mddev->private = NULL; - MOD_DEC_USE_COUNT; return 0; } @@ -424,6 +420,7 @@ static void raid0_status (struct seq_fil static mdk_personality_t raid0_personality= { .name = "raid0", + .owner = THIS_MODULE, .make_request = raid0_make_request, .run = raid0_run, .stop = raid0_stop, diff ./drivers/md/raid1.c~current~ ./drivers/md/raid1.c --- ./drivers/md/raid1.c~current~ 2003-03-26 10:55:20.000000000 +1100 +++ ./drivers/md/raid1.c 2003-03-26 10:37:59.000000000 +1100 @@ -1061,8 +1061,6 @@ static int run(mddev_t *mddev) mdk_rdev_t *rdev; struct list_head *tmp; - MOD_INC_USE_COUNT; - if (mddev->level != 1) { printk("raid1: md%d: raid level not set to mirroring (%d)\n", mdidx(mddev), mddev->level); @@ -1166,7 +1164,6 @@ out_free_conf: kfree(conf); mddev->private = NULL; out: - MOD_DEC_USE_COUNT; return -EIO; } @@ -1180,13 +1177,13 @@ static int stop(mddev_t *mddev) mempool_destroy(conf->r1bio_pool); kfree(conf); mddev->private = NULL; - MOD_DEC_USE_COUNT; return 0; } static mdk_personality_t raid1_personality = { .name = "raid1", + .owner = THIS_MODULE, .make_request = make_request, .run = run, .stop = stop, diff ./drivers/md/raid5.c~current~ ./drivers/md/raid5.c --- ./drivers/md/raid5.c~current~ 2003-03-26 10:55:20.000000000 +1100 +++ ./drivers/md/raid5.c 2003-03-26 10:37:28.000000000 +1100 @@ -1433,11 +1433,8 @@ static int run (mddev_t *mddev) struct disk_info *disk; struct list_head *tmp; - MOD_INC_USE_COUNT; - if (mddev->level != 5 && mddev->level != 4) { printk("raid5: md%d: raid level not set to 4/5 (%d)\n", mdidx(mddev), mddev->level); - MOD_DEC_USE_COUNT; return -EIO; } @@ -1563,7 +1560,6 @@ abort: } mddev->private = NULL; printk(KERN_ALERT "raid5: failed to run raid set md%d\n", mdidx(mddev)); - MOD_DEC_USE_COUNT; return -EIO; } @@ -1579,7 +1575,6 @@ static int stop (mddev_t *mddev) free_pages((unsigned long) conf->stripe_hashtbl, HASH_PAGES_ORDER); kfree(conf); mddev->private = NULL; - MOD_DEC_USE_COUNT; return 0; } @@ -1735,6 +1730,7 @@ static int raid5_add_disk(mddev_t *mddev static mdk_personality_t raid5_personality= { .name = "raid5", + .owner = THIS_MODULE, .make_request = make_request, .run = run, .stop = stop, diff ./include/linux/raid/md_k.h~current~ ./include/linux/raid/md_k.h --- ./include/linux/raid/md_k.h~current~ 2003-03-26 10:55:20.000000000 +1100 +++ ./include/linux/raid/md_k.h 2003-03-26 10:37:28.000000000 +1100 @@ -254,6 +254,7 @@ struct mddev_s struct mdk_personality_s { char *name; + struct module *owner; int (*make_request)(request_queue_t *q, struct bio *bio); int (*run)(mddev_t *mddev); int (*stop)(mddev_t *mddev); - To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | [PATCH] md - 1 of 3 - md/linear oops fix: 00131, NeilBrown |
|---|---|
| Next by Date: | Re: 3ware bad write speed.: 00131, Stephan van Hienen |
| Previous by Thread: | [PATCH] md - 1 of 3 - md/linear oops fixi: 00131, NeilBrown |
| Next by Thread: | chunk-size: 00131, Farkas Levente |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |