On Fri, 30 Nov 2012 05:21:05 -0500 (EST) CAI Qian <[email protected]> wrote:
> 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 <[email protected]> > Signed-off-by: NeilBrown <[email protected]> > > Upstream-ID: 5eff3c439d3478ba9e8ba5f8c0aaf6e6fadb6e58 > Stable-trees: 3.6.x > Signed-off-by: CAI Qian <[email protected]> > > diff --git a/drivers/md/md.c.orig b/drivers/md/md.c > index c7b000f..50e203e 100644 > --- a/drivers/md/md.c.orig > +++ b/drivers/md/md.c > @@ -5290,7 +5290,7 @@ void md_stop_writes(struct mddev *mddev) > } > EXPORT_SYMBOL_GPL(md_stop_writes); > > -void md_stop(struct mddev *mddev) > +static void __md_stop(struct mddev *mddev) > { > mddev->ready = 0; > mddev->pers->stop(mddev); > @@ -5300,6 +5300,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) > @@ -5360,7 +5372,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; > I wasn't going to submit this to -stable as it is just a minor memory leak. No crash, no data corruption. Up to Greg if he takes it I guess. NeilBrown
signature.asc
Description: PGP signature
