• Masato Suzuki's avatar
    scsi: sd_zbc: Fix sd_zbc_report_zones() buffer allocation · 515ce606
    Masato Suzuki authored
    The function sd_zbc_do_report_zones() issues a REPORT ZONES command with a
    buffer size calculated based on the number of zones requested by the
    caller. This value should however not exceed the capabilities of the
    hardware maximum command size, that is, should not exceed the
    max_hw_sectors limit of the device. This problem leads to failures of
    report zones commands when re-validating disks with some SAS HBAs.
    
    Fix this by limiting a report zone command buffer size to the minimum of
    the device max_hw_sectors and calculated value based on the requested
    number of zones. This does not change the semantic of the report_zones file
    operation as report zones can always return less zone reports than
    requested. Short reports are handled using a loop execution of the
    report_zones file operation in the function blk_report_zones().
    
    [Damien]
    Before patch 'e76239a3 ("block: add a report_zones method")', report
    zones buffer allocation was limited to max_sectors when allocated in
    blk_report_zones(). This however does not consider the actual format of the
    device reply which is interface dependent.  Limiting the allocation based
    on the size of the expected reply format rather than the size of the array
    of generic sturct blkzone passed by blk_report_zones() makes more sense.
    
    Fixes: e76239a3 ("block: add a report_zones method")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarMasato Suzuki <masato.suzuki@wdc.com>
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    515ce606
sd_zbc.c 13.1 KB