[U-Boot] [PATCH v2 09/10] dm: scsi: fix divide-by-0 error in scsi_scan()
Simon Glass
sjg at chromium.org
Sun Apr 9 19:27:50 UTC 2017
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
More information about the U-Boot
mailing list