dm zoned: free dmz->ddev array in dmz_put_zoned_devices

commit 9850ccd5dd upstream.

Commit 4dba12881f ("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:
Fedor Pchelkin 2023-09-20 13:51:16 +03:00 коммит произвёл Greg Kroah-Hartman
Родитель 8781fe259d
Коммит 18a839064f
1 изменённых файлов: 7 добавлений и 8 удалений

Просмотреть файл

@ -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);