aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/faulty.c8
-rw-r--r--drivers/md/linear.c9
-rw-r--r--drivers/md/md.c10
-rw-r--r--drivers/md/md.h2
-rw-r--r--drivers/md/multipath.c10
-rw-r--r--drivers/md/raid0.c12
-rw-r--r--drivers/md/raid1.c14
-rw-r--r--drivers/md/raid10.c8
-rw-r--r--drivers/md/raid5.c12
9 files changed, 35 insertions, 50 deletions
diff --git a/drivers/md/faulty.c b/drivers/md/faulty.c
index e8b4574956c7..1277eb26b58a 100644
--- a/drivers/md/faulty.c
+++ b/drivers/md/faulty.c
@@ -332,13 +332,11 @@ static int run(struct mddev *mddev)
332 return 0; 332 return 0;
333} 333}
334 334
335static int stop(struct mddev *mddev) 335static void faulty_free(struct mddev *mddev, void *priv)
336{ 336{
337 struct faulty_conf *conf = mddev->private; 337 struct faulty_conf *conf = priv;
338 338
339 kfree(conf); 339 kfree(conf);
340 mddev->private = NULL;
341 return 0;
342} 340}
343 341
344static struct md_personality faulty_personality = 342static struct md_personality faulty_personality =
@@ -348,7 +346,7 @@ static struct md_personality faulty_personality =
348 .owner = THIS_MODULE, 346 .owner = THIS_MODULE,
349 .make_request = make_request, 347 .make_request = make_request,
350 .run = run, 348 .run = run,
351 .stop = stop, 349 .free = faulty_free,
352 .status = status, 350 .status = status,
353 .check_reshape = reshape, 351 .check_reshape = reshape,
354 .size = faulty_size, 352 .size = faulty_size,
diff --git a/drivers/md/linear.c b/drivers/md/linear.c
index c201555b9c6c..fa7d577f3d12 100644
--- a/drivers/md/linear.c
+++ b/drivers/md/linear.c
@@ -249,14 +249,11 @@ static int linear_add(struct mddev *mddev, struct md_rdev *rdev)
249 return 0; 249 return 0;
250} 250}
251 251
252static int linear_stop (struct mddev *mddev) 252static void linear_free(struct mddev *mddev, void *priv)
253{ 253{
254 struct linear_conf *conf = mddev->private; 254 struct linear_conf *conf = priv;
255 255
256 kfree(conf); 256 kfree(conf);
257 mddev->private = NULL;
258
259 return 0;
260} 257}
261 258
262static void linear_make_request(struct mddev *mddev, struct bio *bio) 259static void linear_make_request(struct mddev *mddev, struct bio *bio)
@@ -335,7 +332,7 @@ static struct md_personality linear_personality =
335 .owner = THIS_MODULE, 332 .owner = THIS_MODULE,
336 .make_request = linear_make_request, 333 .make_request = linear_make_request,
337 .run = linear_run, 334 .run = linear_run,
338 .stop = linear_stop, 335 .free = linear_free,
339 .status = linear_status, 336 .status = linear_status,
340 .hot_add_disk = linear_add, 337 .hot_add_disk = linear_add,
341 .size = linear_size, 338 .size = linear_size,
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 58f140bef999..2920fd004865 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -293,8 +293,8 @@ static void md_make_request(struct request_queue *q, struct bio *bio)
293/* mddev_suspend makes sure no new requests are submitted 293/* mddev_suspend makes sure no new requests are submitted
294 * to the device, and that any requests that have been submitted 294 * to the device, and that any requests that have been submitted
295 * are completely handled. 295 * are completely handled.
296 * Once ->stop is called and completes, the module will be completely 296 * Once mddev_detach() is called and completes, the module will be
297 * unused. 297 * completely unused.
298 */ 298 */
299void mddev_suspend(struct mddev *mddev) 299void mddev_suspend(struct mddev *mddev)
300{ 300{
@@ -3374,7 +3374,7 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
3374 /* Looks like we have a winner */ 3374 /* Looks like we have a winner */
3375 mddev_suspend(mddev); 3375 mddev_suspend(mddev);
3376 mddev_detach(mddev); 3376 mddev_detach(mddev);
3377 mddev->pers->stop(mddev); 3377 mddev->pers->free(mddev, mddev->private);
3378 3378
3379 if (mddev->pers->sync_request == NULL && 3379 if (mddev->pers->sync_request == NULL &&
3380 pers->sync_request != NULL) { 3380 pers->sync_request != NULL) {
@@ -4940,7 +4940,7 @@ int md_run(struct mddev *mddev)
4940 } 4940 }
4941 if (err) { 4941 if (err) {
4942 mddev_detach(mddev); 4942 mddev_detach(mddev);
4943 mddev->pers->stop(mddev); 4943 mddev->pers->free(mddev, mddev->private);
4944 module_put(mddev->pers->owner); 4944 module_put(mddev->pers->owner);
4945 mddev->pers = NULL; 4945 mddev->pers = NULL;
4946 bitmap_destroy(mddev); 4946 bitmap_destroy(mddev);
@@ -5137,7 +5137,7 @@ static void __md_stop(struct mddev *mddev)
5137{ 5137{
5138 mddev->ready = 0; 5138 mddev->ready = 0;
5139 mddev_detach(mddev); 5139 mddev_detach(mddev);
5140 mddev->pers->stop(mddev); 5140 mddev->pers->free(mddev, mddev->private);
5141 if (mddev->pers->sync_request && mddev->to_remove == NULL) 5141 if (mddev->pers->sync_request && mddev->to_remove == NULL)
5142 mddev->to_remove = &md_redundancy_group; 5142 mddev->to_remove = &md_redundancy_group;
5143 module_put(mddev->pers->owner); 5143 module_put(mddev->pers->owner);
diff --git a/drivers/md/md.h b/drivers/md/md.h
index bee5b852c33f..37e7c17e56a6 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -465,7 +465,7 @@ struct md_personality
465 struct module *owner; 465 struct module *owner;
466 void (*make_request)(struct mddev *mddev, struct bio *bio); 466 void (*make_request)(struct mddev *mddev, struct bio *bio);
467 int (*run)(struct mddev *mddev); 467 int (*run)(struct mddev *mddev);
468 int (*stop)(struct mddev *mddev); 468 void (*free)(struct mddev *mddev, void *priv);
469 void (*status)(struct seq_file *seq, struct mddev *mddev); 469 void (*status)(struct seq_file *seq, struct mddev *mddev);
470 /* error_handler must set ->faulty and clear ->in_sync 470 /* error_handler must set ->faulty and clear ->in_sync
471 * if appropriate, and should abort recovery if needed 471 * if appropriate, and should abort recovery if needed
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c
index 9fe34453835b..ac3ede2bd00e 100644
--- a/drivers/md/multipath.c
+++ b/drivers/md/multipath.c
@@ -399,7 +399,7 @@ static int multipath_run (struct mddev *mddev)
399 /* 399 /*
400 * copy the already verified devices into our private MULTIPATH 400 * copy the already verified devices into our private MULTIPATH
401 * bookkeeping area. [whatever we allocate in multipath_run(), 401 * bookkeeping area. [whatever we allocate in multipath_run(),
402 * should be freed in multipath_stop()] 402 * should be freed in multipath_free()]
403 */ 403 */
404 404
405 conf = kzalloc(sizeof(struct mpconf), GFP_KERNEL); 405 conf = kzalloc(sizeof(struct mpconf), GFP_KERNEL);
@@ -500,15 +500,13 @@ out:
500 return -EIO; 500 return -EIO;
501} 501}
502 502
503static int multipath_stop (struct mddev *mddev) 503static void multipath_free(struct mddev *mddev, void *priv)
504{ 504{
505 struct mpconf *conf = mddev->private; 505 struct mpconf *conf = priv;
506 506
507 mempool_destroy(conf->pool); 507 mempool_destroy(conf->pool);
508 kfree(conf->multipaths); 508 kfree(conf->multipaths);
509 kfree(conf); 509 kfree(conf);
510 mddev->private = NULL;
511 return 0;
512} 510}
513 511
514static struct md_personality multipath_personality = 512static struct md_personality multipath_personality =
@@ -518,7 +516,7 @@ static struct md_personality multipath_personality =
518 .owner = THIS_MODULE, 516 .owner = THIS_MODULE,
519 .make_request = multipath_make_request, 517 .make_request = multipath_make_request,
520 .run = multipath_run, 518 .run = multipath_run,
521 .stop = multipath_stop, 519 .free = multipath_free,
522 .status = multipath_status, 520 .status = multipath_status,
523 .error_handler = multipath_error, 521 .error_handler = multipath_error,
524 .hot_add_disk = multipath_add_disk, 522 .hot_add_disk = multipath_add_disk,
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index 01dfca94b663..a13f738a7b39 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -415,7 +415,7 @@ static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks
415 return array_sectors; 415 return array_sectors;
416} 416}
417 417
418static int raid0_stop(struct mddev *mddev); 418static void raid0_free(struct mddev *mddev, void *priv);
419 419
420static int raid0_run(struct mddev *mddev) 420static int raid0_run(struct mddev *mddev)
421{ 421{
@@ -468,20 +468,18 @@ static int raid0_run(struct mddev *mddev)
468 468
469 ret = md_integrity_register(mddev); 469 ret = md_integrity_register(mddev);
470 if (ret) 470 if (ret)
471 raid0_stop(mddev); 471 raid0_free(mddev, conf);
472 472
473 return ret; 473 return ret;
474} 474}
475 475
476static int raid0_stop(struct mddev *mddev) 476static void raid0_free(struct mddev *mddev, void *priv)
477{ 477{
478 struct r0conf *conf = mddev->private;