Commit 4fa2f327 authored by NeilBrown's avatar NeilBrown

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: default avatarmajianpeng <majianpeng@gmail.com>
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 545c8795
...@@ -816,6 +816,8 @@ void md_rdev_clear(struct md_rdev *rdev) ...@@ -816,6 +816,8 @@ void md_rdev_clear(struct md_rdev *rdev)
put_page(rdev->bb_page); put_page(rdev->bb_page);
rdev->bb_page = NULL; rdev->bb_page = NULL;
} }
kfree(rdev->badblocks.page);
rdev->badblocks.page = NULL;
} }
EXPORT_SYMBOL_GPL(md_rdev_clear); EXPORT_SYMBOL_GPL(md_rdev_clear);
...@@ -2191,9 +2193,7 @@ static void unbind_rdev_from_array(struct md_rdev * rdev) ...@@ -2191,9 +2193,7 @@ static void unbind_rdev_from_array(struct md_rdev * rdev)
sysfs_remove_link(&rdev->kobj, "block"); sysfs_remove_link(&rdev->kobj, "block");
sysfs_put(rdev->sysfs_state); sysfs_put(rdev->sysfs_state);
rdev->sysfs_state = NULL; rdev->sysfs_state = NULL;
kfree(rdev->badblocks.page);
rdev->badblocks.count = 0; rdev->badblocks.count = 0;
rdev->badblocks.page = NULL;
/* We need to delay this, otherwise we can deadlock when /* We need to delay this, otherwise we can deadlock when
* writing to 'remove' to "dev/state". We also need * writing to 'remove' to "dev/state". We also need
* to delay it due to rcu usage. * to delay it due to rcu usage.
...@@ -3325,7 +3325,6 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe ...@@ -3325,7 +3325,6 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe
if (rdev->bdev) if (rdev->bdev)
unlock_rdev(rdev); unlock_rdev(rdev);
md_rdev_clear(rdev); md_rdev_clear(rdev);
kfree(rdev->badblocks.page);
kfree(rdev); kfree(rdev);
return ERR_PTR(err); return ERR_PTR(err);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment