| From d15b774c2920d55e3d58275c97fbe3adc3afde38 Mon Sep 17 00:00:00 2001 |
| From: Alasdair G Kergon <agk@redhat.com> |
| Date: Tue, 2 Aug 2011 12:32:01 +0100 |
| Subject: dm: fix idr leak on module removal |
| |
| From: Alasdair G Kergon <agk@redhat.com> |
| |
| commit d15b774c2920d55e3d58275c97fbe3adc3afde38 upstream. |
| |
| Destroy _minor_idr when unloading the core dm module. (Found by kmemleak.) |
| |
| Signed-off-by: Alasdair G Kergon <agk@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/md/dm.c | 10 ++++++++-- |
| 1 file changed, 8 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/md/dm.c |
| +++ b/drivers/md/dm.c |
| @@ -36,6 +36,8 @@ static const char *_name = DM_NAME; |
| static unsigned int major = 0; |
| static unsigned int _major = 0; |
| |
| +static DEFINE_IDR(_minor_idr); |
| + |
| static DEFINE_SPINLOCK(_minor_lock); |
| /* |
| * For bio-based dm. |
| @@ -315,6 +317,12 @@ static void __exit dm_exit(void) |
| |
| while (i--) |
| _exits[i](); |
| + |
| + /* |
| + * Should be empty by this point. |
| + */ |
| + idr_remove_all(&_minor_idr); |
| + idr_destroy(&_minor_idr); |
| } |
| |
| /* |
| @@ -1663,8 +1671,6 @@ static int dm_any_congested(void *conges |
| /*----------------------------------------------------------------- |
| * An IDR is used to keep track of allocated minor numbers. |
| *---------------------------------------------------------------*/ |
| -static DEFINE_IDR(_minor_idr); |
| - |
| static void free_minor(int minor) |
| { |
| spin_lock(&_minor_lock); |