[PATCH] md:Fix mem leak about rdev->badblocks.page.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


>From 7cc5b99748a5505d94d6e67ba4e639e341f0a00a Mon Sep 17 00:00:00 2001
From: majianpeng <majianpeng@xxxxxxxxx>
Date: Wed, 11 Apr 2012 15:44:55 +0800
Subject: [PATCH] md:Fix mem leak about rdev->badblocks.page. When exec
 md_import_device(),alloc badblocks.page.But met error when
 exec bind_rdev_to_array().So exec export_rdev().But
 export_rdev() did not free badblocks.page.

This may occur in those functions:
1:add_new_disk()
2:new_dev_store()

Reported by kmemleak:
unreferenced object 0xffff88008223d668 (size 4096):
  comm "mdadm", pid 9497, jiffies 4295848888 (age 21898.212s)
  hex dump (first 32 bytes):
    6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
    6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
  backtrace:
    [<ffffffff81695ec1>] kmemleak_alloc+0x21/0x50
    [<ffffffff811180fd>] kmem_cache_alloc_trace+0xad/0x1b0
    [<ffffffffa0003b78>] md_rdev_init+0xd8/0x130 [md_mod]
    [<ffffffffa0007e28>] md_import_device+0x58/0x2a0 [md_mod]
    [<ffffffffa001199e>] add_new_disk+0x178/0x49d [md_mod]
    [<ffffffffa000d78e>] md_ioctl+0xb8e/0x11f0 [md_mod]
    [<ffffffff8127aa18>] blkdev_ioctl+0xd8/0x790
    [<ffffffff8115416b>] block_ioctl+0x3b/0x40
    [<ffffffff81131cc6>] do_vfs_ioctl+0x96/0x550
    [<ffffffff81132211>] sys_ioctl+0x91/0xa0
    [<ffffffff816bc9a2>] system_call_fastpath+0x16/0x1b
    [<ffffffffffffffff>] 0xffffffffffffffff

Signed-off-by: majianpeng <majianpeng@xxxxxxxxx>
---
 drivers/md/md.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index b572e1e..e07c60c 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -813,6 +813,7 @@ static void free_disk_sb(struct md_rdev * rdev)
 		put_page(rdev->bb_page);
 		rdev->bb_page = NULL;
 	}
+
 }
 
 
@@ -2161,6 +2162,10 @@ static void export_rdev(struct md_rdev * rdev)
 	if (test_bit(AutoDetected, &rdev->flags))
 		md_autodetect_dev(rdev->bdev->bd_dev);
 #endif
+	if (rdev->badblocks.page) {
+		kfree(rdev->badblocks.page);
+		rdev->badblocks.page = NULL;
+	}
 	unlock_rdev(rdev);
 	kobject_put(&rdev->kobj);
 }
-- 
1.7.5.4

 				
--------------
majianpeng
2012-04-11

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ATA RAID]     [Linux SCSI Target Infrastructure]     [Managing RAID on Linux]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device-Mapper]     [Kernel]     [Linux Books]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Photos]     [Yosemite Photos]     [Yosemite News]     [AMD 64]     [Linux Networking]

Add to Google Powered by Linux