From: NeilBrown Date: Tue, 22 May 2012 03:55:01 +0000 (+1000) Subject: md: move freeing of badblocks.page into md_rdev_clear X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=4fa2f327681808f653711e14203a42cf4644bda0;p=GitHub%2Fmt8127%2Fandroid_kernel_alcatel_ttab.git md: move freeing of badblocks.page into md_rdev_clear This ensures that it is always freed - there were case where we failed to free the page. Reported-by: majianpeng Signed-off-by: NeilBrown --- diff --git a/drivers/md/md.c b/drivers/md/md.c index d557e557ff8f..ac99616f48d4 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -816,6 +816,8 @@ void md_rdev_clear(struct md_rdev *rdev) put_page(rdev->bb_page); rdev->bb_page = NULL; } + kfree(rdev->badblocks.page); + rdev->badblocks.page = NULL; } EXPORT_SYMBOL_GPL(md_rdev_clear); @@ -2191,9 +2193,7 @@ static void unbind_rdev_from_array(struct md_rdev * rdev) sysfs_remove_link(&rdev->kobj, "block"); sysfs_put(rdev->sysfs_state); rdev->sysfs_state = NULL; - kfree(rdev->badblocks.page); rdev->badblocks.count = 0; - rdev->badblocks.page = NULL; /* We need to delay this, otherwise we can deadlock when * writing to 'remove' to "dev/state". We also need * to delay it due to rcu usage. @@ -3325,7 +3325,6 @@ abort_free: if (rdev->bdev) unlock_rdev(rdev); md_rdev_clear(rdev); - kfree(rdev->badblocks.page); kfree(rdev); return ERR_PTR(err); }