> On 19 Jan 2018, at 4:32 pm, Carlos Cardenas <cardena...@gmail.com> wrote: > > Howdy. > > Attached is a patch to fix handling images > 4GB support in Linux. I > confused image size vs blocks to determine when to send UINT32_MAX > and trigger a READ_CAPACITY_16. > > Identified by mlarkin@ > > Comments? Ok?
ok. after this you should make another fix though: READ CAPACITY 10 and 16 should return the last addressable block, not than the number of blocks. in other words you need to take 1 from n_blocks before processing it for scsi. a good exapmle of this is http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/dev/ic/nvme.c#rev1.55 and http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/dev/ic/nvme.c.diff?r1=1.54&r2=1.55 dlg > > +--+ > Carlos > Index: vioscsi.c > =================================================================== > RCS file: /home/los/cvs/src/usr.sbin/vmd/vioscsi.c,v > retrieving revision 1.3 > diff -u -p -a -u -r1.3 vioscsi.c > --- vioscsi.c 16 Jan 2018 06:10:45 -0000 1.3 > +++ vioscsi.c 19 Jan 2018 06:26:14 -0000 > @@ -637,12 +637,12 @@ vioscsi_handle_read_capacity(struct vios > __func__, dev->sz, dev->n_blocks); > > /* > - * determine if size of iso image > UINT32_MAX > + * determine if num blocks of iso image > UINT32_MAX > * if it is, set addr to UINT32_MAX (0xffffffff) > * indicating to hosts that READ_CAPACITY_16 should > * be called to retrieve the full size > */ > - if (dev->sz >= UINT32_MAX) { > + if (dev->n_blocks >= UINT32_MAX) { > _lto4b(UINT32_MAX, r_cap_data->addr); > _lto4b(VIOSCSI_BLOCK_SIZE_CDROM, r_cap_data->length); > log_warnx("%s: ISO sz %lld is bigger than " > @@ -1603,7 +1603,7 @@ vioscsi_handle_get_config(struct vioscsi > config_random_read_desc->feature_code); > config_random_read_desc->byte3 = CONFIG_RANDOM_READ_BYTE3; > config_random_read_desc->length = CONFIG_RANDOM_READ_LENGTH; > - if (dev->sz >= UINT32_MAX) > + if (dev->n_blocks >= UINT32_MAX) > _lto4b(UINT32_MAX, config_random_read_desc->block_size); > else > _lto4b(dev->n_blocks - 1, config_random_read_desc->block_size);