]> git.baikalelectronics.ru Git - kernel.git/commitdiff
dm zoned: free dmz->ddev array in dmz_put_zoned_devices
authorFedor Pchelkin <pchelkin@ispras.ru>
Wed, 20 Sep 2023 10:51:16 +0000 (13:51 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Oct 2023 20:00:44 +0000 (22:00 +0200)
commit 9850ccd5dd88075b2b7fd28d96299d5535f58cc5 upstream.

Commit 4dba12881f88 ("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: 4dba12881f88 ("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>
drivers/md/dm-zoned-target.c

index 95b132b52f332376a8d4504c5be500c60917ffe2..4abe1e2f8ad8163c4b2403a3bfbb649fc2d29f5c 100644 (file)
@@ -748,17 +748,16 @@ err:
 /*
  * 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;
        int i;
 
-       for (i = 0; i < dmz->nr_ddevs; i++) {
-               if (dmz->ddev[i]) {
+       for (i = 0; i < dmz->nr_ddevs; i++)
+               if (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)
@@ -948,7 +947,7 @@ err_bio:
 err_meta:
        dmz_dtr_metadata(dmz->metadata);
 err_dev:
-       dmz_put_zoned_device(ti);
+       dmz_put_zoned_devices(ti);
 err:
        kfree(dmz->dev);
        kfree(dmz);
@@ -978,7 +977,7 @@ static void dmz_dtr(struct dm_target *ti)
 
        bioset_exit(&dmz->bio_set);
 
-       dmz_put_zoned_device(ti);
+       dmz_put_zoned_devices(ti);
 
        mutex_destroy(&dmz->chunk_lock);