Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] rd: memory leak on rd_init() failure

If RAM disk driver initialization fails due to blk_alloc_queue() faulure, the
gendisk structs stored in rd_disks[] will not be freed completely.

This patch resolves that memory leak case by doing alloc_disk() and
blk_alloc_queue() at the same time.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Akinobu Mita and committed by
Linus Torvalds
ea6f94df 3864c489

+6 -6
+6 -6
drivers/block/rd.c
··· 432 432 rd_disks[i] = alloc_disk(1); 433 433 if (!rd_disks[i]) 434 434 goto out; 435 + 436 + rd_queue[i] = blk_alloc_queue(GFP_KERNEL); 437 + if (!rd_queue[i]) { 438 + put_disk(rd_disks[i]); 439 + goto out; 440 + } 435 441 } 436 442 437 443 if (register_blkdev(RAMDISK_MAJOR, "ramdisk")) { ··· 447 441 448 442 for (i = 0; i < CONFIG_BLK_DEV_RAM_COUNT; i++) { 449 443 struct gendisk *disk = rd_disks[i]; 450 - 451 - rd_queue[i] = blk_alloc_queue(GFP_KERNEL); 452 - if (!rd_queue[i]) 453 - goto out_queue; 454 444 455 445 blk_queue_make_request(rd_queue[i], &rd_make_request); 456 446 blk_queue_hardsect_size(rd_queue[i], rd_blocksize); ··· 468 466 CONFIG_BLK_DEV_RAM_COUNT, rd_size, rd_blocksize); 469 467 470 468 return 0; 471 - out_queue: 472 - unregister_blkdev(RAMDISK_MAJOR, "ramdisk"); 473 469 out: 474 470 while (i--) { 475 471 put_disk(rd_disks[i]);