On Thu, 15 Nov 2012 16:46:54 +0800 majianpeng <majianpeng@xxxxxxxxx> wrote: > Because dm-raid call md_stop to clear up,but md_stop can't clear up completely. > So add a new func to do. > > Jianpeng Ma (3): > md:Add a func 'dm_md_stop' for dm-raid to clear up md resource. > dm: When stoping dm-raid, it call dm_md_stop rather than md_stop to > do clear-up work. > md: Remove EXPORT_SYMBOL_GPL(md_stop). > > drivers/md/dm-raid.c | 4 ++-- > drivers/md/md.c | 10 +++++++++- > drivers/md/md.h | 1 + > 3 files changed, 12 insertions(+), 3 deletions(-) > You don't really need 3 patches for this one little change. I've applied the following. Thanks for the report. NeilBrown From 4ba69e1a88480249918ed2df8be0896be6ba7952 Mon Sep 17 00:00:00 2001 From: NeilBrown <neilb@xxxxxxx> Date: Mon, 19 Nov 2012 10:47:48 +1100 Subject: [PATCH] md: make sure everything is freed when dm-raid stops an array. md_stop() would stop an array, but not free various attached data structures. For internal arrays, these are freed later in do_md_stop() or mddev_put(), but they don't apply for dm-raid arrays. So get md_stop() to free them, and only all it from dm-raid. For internal arrays we now call __md_stop. Reported-by: majianpeng <majianpeng@xxxxxxxxx> Signed-off-by: NeilBrown <neilb@xxxxxxx> diff --git a/drivers/md/md.c b/drivers/md/md.c index 98e1484..71df3c2 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -5294,7 +5294,7 @@ void md_stop_writes(struct mddev *mddev) } EXPORT_SYMBOL_GPL(md_stop_writes); -void md_stop(struct mddev *mddev) +void __md_stop(struct mddev *mddev) { mddev->ready = 0; mddev->pers->stop(mddev); @@ -5304,6 +5304,18 @@ void md_stop(struct mddev *mddev) mddev->pers = NULL; clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); } + +void md_stop(struct mddev *mddev) +{ + /* stop the array and free an attached data structures. + * This is called from dm-raid + */ + __md_stop(mddev); + bitmap_destroy(mddev); + if (mddev->bio_set) + bioset_free(mddev->bio_set); +} + EXPORT_SYMBOL_GPL(md_stop); static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) @@ -5364,7 +5376,7 @@ static int do_md_stop(struct mddev * mddev, int mode, set_disk_ro(disk, 0); __md_stop_writes(mddev); - md_stop(mddev); + __md_stop(mddev); mddev->queue->merge_bvec_fn = NULL; mddev->queue->backing_dev_info.congested_fn = NULL;
Attachment:
signature.asc
Description: PGP signature
-- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel