dm zoned: free dmz->ddev array in dmz_put_zoned_devices
commit9850ccd5dd
upstream. Commit4dba12881f
("dm zoned: support arbitrary number of devices") made the pointers to additional zoned devices to be stored in a dynamically allocated dmz->ddev array. However, this array is not freed. Rename dmz_put_zoned_device to dmz_put_zoned_devices and fix it to free the dmz->ddev array when cleaning up zoned device information. Remove NULL assignment for all dmz->ddev elements and just free the dmz->ddev array instead. Found by Linux Verification Center (linuxtesting.org). Fixes:4dba12881f
("dm zoned: support arbitrary number of devices") Cc: stable@vger.kernel.org Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru> Signed-off-by: Mike Snitzer <snitzer@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
8781fe259d
Коммит
18a839064f
|
@ -750,17 +750,16 @@ err:
|
||||||
/*
|
/*
|
||||||
* Cleanup zoned device information.
|
* Cleanup zoned device information.
|
||||||
*/
|
*/
|
||||||
static void dmz_put_zoned_device(struct dm_target *ti)
|
static void dmz_put_zoned_devices(struct dm_target *ti)
|
||||||
{
|
{
|
||||||
struct dmz_target *dmz = ti->private;
|
struct dmz_target *dmz = ti->private;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < dmz->nr_ddevs; i++) {
|
for (i = 0; i < dmz->nr_ddevs; i++)
|
||||||
if (dmz->ddev[i]) {
|
if (dmz->ddev[i])
|
||||||
dm_put_device(ti, dmz->ddev[i]);
|
dm_put_device(ti, dmz->ddev[i]);
|
||||||
dmz->ddev[i] = NULL;
|
|
||||||
}
|
kfree(dmz->ddev);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dmz_fixup_devices(struct dm_target *ti)
|
static int dmz_fixup_devices(struct dm_target *ti)
|
||||||
|
@ -951,7 +950,7 @@ err_bio:
|
||||||
err_meta:
|
err_meta:
|
||||||
dmz_dtr_metadata(dmz->metadata);
|
dmz_dtr_metadata(dmz->metadata);
|
||||||
err_dev:
|
err_dev:
|
||||||
dmz_put_zoned_device(ti);
|
dmz_put_zoned_devices(ti);
|
||||||
err:
|
err:
|
||||||
kfree(dmz->dev);
|
kfree(dmz->dev);
|
||||||
kfree(dmz);
|
kfree(dmz);
|
||||||
|
@ -982,7 +981,7 @@ static void dmz_dtr(struct dm_target *ti)
|
||||||
|
|
||||||
bioset_exit(&dmz->bio_set);
|
bioset_exit(&dmz->bio_set);
|
||||||
|
|
||||||
dmz_put_zoned_device(ti);
|
dmz_put_zoned_devices(ti);
|
||||||
|
|
||||||
mutex_destroy(&dmz->chunk_lock);
|
mutex_destroy(&dmz->chunk_lock);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче