[U-Boot] [PATCH v2 09/10] dm: scsi: fix divide-by-0 error in scsi_scan()
Simon Glass
sjg at chromium.org
Sat Apr 15 16:07:31 UTC 2017
On 9 April 2017 at 13:27, Simon Glass <sjg at chromium.org> wrote:
> Hi,
>
> On 7 April 2017 at 05:42, Jean-Jacques Hiblot <jjhiblot at ti.com> wrote:
>> With DM_SCSI enabled, blk_create_devicef() is called with blkz = 0, leading
>> to a divide-by-0 exception.
>> scsi_detect_dev() can be used to get the required parameters (block size
>> and number of blocks) from the drive before calling blk_create_devicef().
>>
>> Signed-off-by: Jean-Jacques Hiblot <jjhiblot at ti.com>
>> ---
>> common/scsi.c | 35 ++++++++++++++++++++++++++---------
>> 1 file changed, 26 insertions(+), 9 deletions(-)
>
> Reviewed-by: Simon Glass <sjg at chromium.org>
>
> Please see below.
>
>>
>> diff --git a/common/scsi.c b/common/scsi.c
>> index 972ef338..d37222c 100644
>> --- a/common/scsi.c
>> +++ b/common/scsi.c
>> @@ -580,9 +580,19 @@ int scsi_scan(int mode)
>> for (lun = 0; lun < plat->max_lun; lun++) {
>> struct udevice *bdev; /* block device */
>> /* block device description */
>> + struct blk_desc _bd;
>> struct blk_desc *bdesc;
>> char str[10];
>>
>> + scsi_init_dev_desc_priv(&_bd);
>> + ret = scsi_detect_dev(i, lun, &_bd);
>> + if (ret)
>> + /*
>> + * no device detected?
>> + * check the next lun.
>> + */
>> + continue;
>> +
>> /*
>> * Create only one block device and do detection
>> * to make sure that there won't be a lot of
>> @@ -590,20 +600,27 @@ int scsi_scan(int mode)
>> */
>> snprintf(str, sizeof(str), "id%dlun%d", i, lun);
>> ret = blk_create_devicef(dev, "scsi_blk",
>> - str, IF_TYPE_SCSI,
>> - -1, 0, 0, &bdev);
>> + str, IF_TYPE_SCSI,
>> + -1,
>> + _bd.blksz,
>> + _bd.blksz * _bd.lba,
>> + &bdev);
>> if (ret) {
>> debug("Can't create device\n");
>> return ret;
>> }
>> - bdesc = dev_get_uclass_platdata(bdev);
>>
>> - scsi_init_dev_desc_priv(bdesc);
>> - ret = scsi_detect_dev(i, lun, bdesc);
>> - if (ret) {
>> - device_unbind(bdev);
>> - continue;
>> - }
>> + bdesc = dev_get_uclass_platdata(bdev);
>> + bdesc->target = i;
>> + bdesc->lun = lun;
>> + bdesc->removable = _bd.removable;
>> + bdesc->type = _bd.type;
>> + memcpy(&bdesc->vendor, &_bd.vendor,
>> + sizeof(_bd.vendor));
>> + memcpy(&bdesc->product, &_bd.product,
>> + sizeof(_bd.product));
>> + memcpy(&bdesc->revision, &_bd.revision,
>> + sizeof(_bd.revision));
>
> Can you please move this block (inside the double for loops) into a
> separate function? It is getting too long. A follow-up patch is fine
> since you have already done this.
>
>> part_init(bdesc);
>>
>> if (mode == 1) {
>> --
>> 1.9.1
>>
>
> Regards,
> Simon
Applied to u-boot-dm, thanks!
More information about the U-Boot
mailing list