mirror of https://gitee.com/openkylin/linux.git
dm era: Fix bitset memory leaks
Deallocate the memory allocated for the in-core bitsets when destroying
the target and in error paths.
Fixes: eec40579d8
("dm: add era target")
Cc: stable@vger.kernel.org # v3.15+
Signed-off-by: Nikos Tsironis <ntsironis@arrikto.com>
Reviewed-by: Ming-Hung Tsai <mtsai@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
c8e846ff93
commit
904e6b2666
|
@ -47,6 +47,7 @@ struct writeset {
|
||||||
static void writeset_free(struct writeset *ws)
|
static void writeset_free(struct writeset *ws)
|
||||||
{
|
{
|
||||||
vfree(ws->bits);
|
vfree(ws->bits);
|
||||||
|
ws->bits = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int setup_on_disk_bitset(struct dm_disk_bitset *info,
|
static int setup_on_disk_bitset(struct dm_disk_bitset *info,
|
||||||
|
@ -811,6 +812,8 @@ static struct era_metadata *metadata_open(struct block_device *bdev,
|
||||||
|
|
||||||
static void metadata_close(struct era_metadata *md)
|
static void metadata_close(struct era_metadata *md)
|
||||||
{
|
{
|
||||||
|
writeset_free(&md->writesets[0]);
|
||||||
|
writeset_free(&md->writesets[1]);
|
||||||
destroy_persistent_data_objects(md);
|
destroy_persistent_data_objects(md);
|
||||||
kfree(md);
|
kfree(md);
|
||||||
}
|
}
|
||||||
|
@ -848,6 +851,7 @@ static int metadata_resize(struct era_metadata *md, void *arg)
|
||||||
r = writeset_alloc(&md->writesets[1], *new_size);
|
r = writeset_alloc(&md->writesets[1], *new_size);
|
||||||
if (r) {
|
if (r) {
|
||||||
DMERR("%s: writeset_alloc failed for writeset 1", __func__);
|
DMERR("%s: writeset_alloc failed for writeset 1", __func__);
|
||||||
|
writeset_free(&md->writesets[0]);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -858,6 +862,8 @@ static int metadata_resize(struct era_metadata *md, void *arg)
|
||||||
&value, &md->era_array_root);
|
&value, &md->era_array_root);
|
||||||
if (r) {
|
if (r) {
|
||||||
DMERR("%s: dm_array_resize failed", __func__);
|
DMERR("%s: dm_array_resize failed", __func__);
|
||||||
|
writeset_free(&md->writesets[0]);
|
||||||
|
writeset_free(&md->writesets[1]);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue