On 05/25/2016 07:34 AM, Kevin Wolf wrote: > Am 25.05.2016 um 00:25 hat Eric Blake geschrieben: >> Another step on our continuing quest to switch to byte-based >> interfaces. >> >> As this is the first byte-based iscsi interface, convert >> is_request_lun_aligned() into two versions, one for sectors >> and one for bytes. >> >> Signed-off-by: Eric Blake <[email protected]> >> --- >> block/iscsi.c | 53 +++++++++++++++++++++++++++++++---------------------- >> 1 file changed, 31 insertions(+), 22 deletions(-) >>
>> +static bool is_sector_request_lun_aligned(int64_t sector_num, int
>> nb_sectors,
>> + IscsiLun *iscsilun)
>> +{
>> + return is_byte_request_lun_aligned(sector_num << BDRV_SECTOR_BITS,
>> + nb_sectors << BDRV_SECTOR_BITS,
>> + iscsilun);
>> }
>
> You're switching from (nb_sectors * BDRV_SECTOR_SIZE) to (nb_sectors <<
> BDRV_SECTOR_BITS). The difference is that the former is a 64 bit
> calculation because BDRV_SECTOR_BITS is unsigned long long, whereas the
> latter is a 32 bit calculation.
>
> Fortunately, it seems to me that all input values come directly from the
> block layer which already limits requests to BDRV_REQUEST_MAX_SECTORS.
> So we should be safe from overflows here.
Still, it won't hurt to add an assert.
>> @@ -978,7 +985,7 @@ coroutine_fn iscsi_co_write_zeroes(BlockDriverState *bs,
>> int64_t sector_num,
>> uint32_t nb_blocks;
>> bool use_16_for_ws = iscsilun->use_16_for_rw;
>>
>> - if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
>> + if (!is_byte_request_lun_aligned(offset, count, iscsilun)) {
>> return -EINVAL;
>> }
>
> Should this become -ENOTSUP so that emulation can take over rather than
> failing the request?
It's still -EINVAL on unaligned write requests; then again, the block
layer guarantees that it will honor bs->request_alignment for write
requests, even on RMW for write-zeroes fallbacks. So switching to
-ENOTSUP makes sense.
>
> We should probably also always set bs->bl.pwrite_zeroes_alignment, with
> a fallback to iscsilun->block_size if we don't have iscsilun->lbp.lbpws.
> But that's a separate patch.
Yes, added as a separate patch.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
