Message ID | 20121119104953.359f60ed@notabene.brown (mailing list archive) |
---|---|
State | Deferred, archived |
Headers | show |
>On Thu, 15 Nov 2012 16:46:54 +0800 majianpeng <majianpeng@gmail.com> 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@suse.de> >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@gmail.com> >Signed-off-by: NeilBrown <neilb@suse.de> > >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; > > Thanks! Jianpeng -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
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;