diff options
author | Damien Le Moal <damien.lemoal@opensource.wdc.com> | 2022-06-01 08:25:44 +0200 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2022-06-02 04:36:44 +0200 |
commit | 30c4fdc3dcdd1f08876300711778d8b680d54b36 (patch) | |
tree | 1075a97cfb29ba2d2b3de28577adcde8d00a82dd /drivers/scsi/sd.c | |
parent | scsi: sd: Fix potential NULL pointer dereference (diff) | |
download | linux-30c4fdc3dcdd1f08876300711778d8b680d54b36.tar.xz linux-30c4fdc3dcdd1f08876300711778d8b680d54b36.zip |
scsi: sd_zbc: Prevent zone information memory leak
Make sure to always free a scsi disk zone information, even for regular
disks. This ensures that there is no memory leak, even in the case of a
zoned disk changing type to a regular disk (e.g. with a reformat using the
FORMAT WITH PRESET command or other vendor proprietary command).
To do this, rename sd_zbc_clear_zone_info() to sd_zbc_free_zone_info() and
remove sd_zbc_release_disk(). A call to sd_zbc_free_zone_info() is added to
sd_zbc_read_zones() for drives for which sd_is_zoned() returns
false. Furthermore, sd_zbc_free_zone_info() code make s sure that the sdkp
rev_mutex is never used while not being initialized by gating the cleanup
code with a a check on the zone_wp_update_buf field as it is never NULL
when rev_mutex has been initialized.
Link: https://lore.kernel.org/r/20220601062544.905141-3-damien.lemoal@opensource.wdc.com
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 856024c6852c..03e1379a44e8 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -3580,7 +3580,7 @@ static void scsi_disk_release(struct device *dev) struct scsi_disk *sdkp = to_scsi_disk(dev); ida_free(&sd_index_ida, sdkp->index); - sd_zbc_release_disk(sdkp); + sd_zbc_free_zone_info(sdkp); put_device(&sdkp->device->sdev_gendev); free_opal_dev(sdkp->opal_dev); |