• Masato Suzuki's avatar
    sd: Fix REQ_OP_ZONE_REPORT completion handling · 8d9aa36c
    Masato Suzuki authored
    
    ZBC/ZAC report zones command may return less bytes than requested if the
    number of matching zones for the report request is small. However, unlike
    read or write commands, the remainder of incomplete report zones commands
    cannot be automatically requested by the block layer: the start sector of
    the next report cannot be known, and the report reply may not be 512B
    aligned for SAS drives (a report zone reply size is always a multiple of
    64B). The regular request completion code executing bio_advance() and
    restart of the command remainder part currently causes invalid zone
    descriptor data to be reported to the caller if the report zone size is
    smaller than 512B (a case that can happen easily for a report of the last
    zones of a SAS drive for example).
    
    Since blkdev_report_zones() handles report zone command processing in a
    loop until completion (no more zones are being reported), we can safely
    avoid that the block layer performs an incorrect bio_advance() call and
    restart of the remainder of incomplete report zone BIOs. To do so, always
    indicate a full completion of REQ_OP_ZONE_REPORT by setting good_bytes to
    the request buffer size and by setting the command resid to 0. This does
    not affect the post processing of the report zone reply done by
    sd_zbc_complete() since the reply header indicates the number of zones
    reported.
    
    Fixes: 89d94756 ("sd: Implement support for ZBC devices")
    Cc: <stable@vger.kernel.org> # 4.19
    Cc: <stable@vger.kernel.org> # 4.14
    Signed-off-by: default avatarMasato Suzuki <masato.suzuki@wdc.com>
    Reviewed-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
    Acked-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    8d9aa36c
sd.c 101 KB