> On Sep 6, 2021, at 9:06 AM, Naohiro Aota <naohiro.aota@xxxxxxx> wrote: > > Reporting zones on a SCSI device sometimes fail with the following error. > > [76248.516390] ata16.00: invalid transfer count 131328 > [76248.523618] sd 15:0:0:0: [sda] REPORT ZONES start lba 536870912 failed > > The error (from drivers/ata/libata-scsi.c ata_scsi_zbc_in_xlat()) > indicates that buffer size is not aligned to SECTOR_SIZE. > > This happens when the __vmalloc() failed. Consider we are reporting 4096 > zones, then we will have "bufsize = roundup((4096 + 1) * 64, > SECTOR_SIZE)" = (513 * 512) = 262656. Then, __vmalloc() failure halven > the bufsize to 131328, which is no longer aligned to SECTOR_SIZE. > > Use rounddown() to ensure the size is always aligned to SECTOR_SIZE and > fix the comment as well. > > Fixes: 23a50861adda ("scsi: sd_zbc: Cleanup sd_zbc_alloc_report_buffer()") > Cc: stable@xxxxxxxxxxxxxxx # 5.5+ > Signed-off-by: Naohiro Aota <naohiro.aota@xxxxxxx> > --- > drivers/scsi/sd_zbc.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c > index 186b5ff52c3a..ea8b3f6ee5cd 100644 > --- a/drivers/scsi/sd_zbc.c > +++ b/drivers/scsi/sd_zbc.c > @@ -154,8 +154,8 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp, > > /* > * Report zone buffer size should be at most 64B times the number of > - * zones requested plus the 64B reply header, but should be at least > - * SECTOR_SIZE for ATA devices. > + * zones requested plus the 64B reply header, but should be aligned > + * to SECTOR_SIZE for ATA devices. > * Make sure that this size does not exceed the hardware capabilities. > * Furthermore, since the report zone command cannot be split, make > * sure that the allocated buffer can always be mapped by limiting the > @@ -174,7 +174,7 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp, > *buflen = bufsize; > return buf; > } > - bufsize >>= 1; > + bufsize = rounddown(bufsize >> 1, SECTOR_SIZE); > } > > return NULL; > -- > 2.33.0 > Makes sense. Reviewed-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx> -- Himanshu Madhani Oracle Linux Engineering