diff mbox

iscsi: fix assertion in is_sector_request_lun_aligned

Message ID 1466414680-18383-1-git-send-email-pl@kamp.de
State New
Headers show

Commit Message

Peter Lieven June 20, 2016, 9:24 a.m. UTC
Commit 94d047a added an assertion the the request alignment check.
This introduced 2 issues:
 a) A off-by-one error since a request of BDRV_REQUEST_MAX_SECTORS
    is actually allowed.
 b) The bdrv_get_block_status call in the read path to check the allocation
    status requests up to INT_MAX sectors which triggers the assertion.

Fixes: 94d047a35bf663e28f8fef137544d8ea78165add
Signed-off-by: Peter Lieven <pl@kamp.de>
---
 block/iscsi.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Eric Blake June 20, 2016, 4:47 p.m. UTC | #1
On 06/20/2016 03:24 AM, Peter Lieven wrote:
> Commit 94d047a added an assertion the the request alignment check.
> This introduced 2 issues:
>  a) A off-by-one error since a request of BDRV_REQUEST_MAX_SECTORS
>     is actually allowed.
>  b) The bdrv_get_block_status call in the read path to check the allocation
>     status requests up to INT_MAX sectors which triggers the assertion.
> 
> Fixes: 94d047a35bf663e28f8fef137544d8ea78165add
> Signed-off-by: Peter Lieven <pl@kamp.de>
> ---
>  block/iscsi.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

> diff --git a/block/iscsi.c b/block/iscsi.c
> index 7e78ade..9bb5ff6 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -417,7 +417,7 @@ static bool is_byte_request_lun_aligned(int64_t offset, int count,
>  static bool is_sector_request_lun_aligned(int64_t sector_num, int nb_sectors,
>                                            IscsiLun *iscsilun)
>  {
> -    assert(nb_sectors < BDRV_REQUEST_MAX_SECTORS);
> +    assert(nb_sectors <= BDRV_REQUEST_MAX_SECTORS);
>      return is_byte_request_lun_aligned(sector_num << BDRV_SECTOR_BITS,
>                                         nb_sectors << BDRV_SECTOR_BITS,
>                                         iscsilun);
> @@ -661,7 +661,8 @@ static int coroutine_fn iscsi_co_readv(BlockDriverState *bs,
>          int64_t ret;
>          int pnum;
>          BlockDriverState *file;
> -        ret = iscsi_co_get_block_status(bs, sector_num, INT_MAX, &pnum, &file);
> +        ret = iscsi_co_get_block_status(bs, sector_num,
> +                                        BDRV_REQUEST_MAX_SECTORS, &pnum, &file);
>          if (ret < 0) {
>              return ret;
>          }
>
Paolo Bonzini June 23, 2016, 3:50 p.m. UTC | #2
On 20/06/2016 11:24, Peter Lieven wrote:
> Commit 94d047a added an assertion the the request alignment check.
> This introduced 2 issues:
>  a) A off-by-one error since a request of BDRV_REQUEST_MAX_SECTORS
>     is actually allowed.
>  b) The bdrv_get_block_status call in the read path to check the allocation
>     status requests up to INT_MAX sectors which triggers the assertion.
> 
> Fixes: 94d047a35bf663e28f8fef137544d8ea78165add
> Signed-off-by: Peter Lieven <pl@kamp.de>
> ---
>  block/iscsi.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/block/iscsi.c b/block/iscsi.c
> index 7e78ade..9bb5ff6 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -417,7 +417,7 @@ static bool is_byte_request_lun_aligned(int64_t offset, int count,
>  static bool is_sector_request_lun_aligned(int64_t sector_num, int nb_sectors,
>                                            IscsiLun *iscsilun)
>  {
> -    assert(nb_sectors < BDRV_REQUEST_MAX_SECTORS);
> +    assert(nb_sectors <= BDRV_REQUEST_MAX_SECTORS);
>      return is_byte_request_lun_aligned(sector_num << BDRV_SECTOR_BITS,
>                                         nb_sectors << BDRV_SECTOR_BITS,
>                                         iscsilun);
> @@ -661,7 +661,8 @@ static int coroutine_fn iscsi_co_readv(BlockDriverState *bs,
>          int64_t ret;
>          int pnum;
>          BlockDriverState *file;
> -        ret = iscsi_co_get_block_status(bs, sector_num, INT_MAX, &pnum, &file);
> +        ret = iscsi_co_get_block_status(bs, sector_num,
> +                                        BDRV_REQUEST_MAX_SECTORS, &pnum, &file);
>          if (ret < 0) {
>              return ret;
>          }
> 

Hi, I've queued this patch.  Can you rebase the allocation map patch on
top of master + this one?

Thanks,

Paolo
Peter Lieven June 23, 2016, 4:19 p.m. UTC | #3
Am 23.06.2016 um 17:50 schrieb Paolo Bonzini:
> On 20/06/2016 11:24, Peter Lieven wrote:
>> Commit 94d047a added an assertion the the request alignment check.
>> This introduced 2 issues:
>>   a) A off-by-one error since a request of BDRV_REQUEST_MAX_SECTORS
>>      is actually allowed.
>>   b) The bdrv_get_block_status call in the read path to check the allocation
>>      status requests up to INT_MAX sectors which triggers the assertion.
>>
>> Fixes: 94d047a35bf663e28f8fef137544d8ea78165add
>> Signed-off-by: Peter Lieven <pl@kamp.de>
>> ---
>>   block/iscsi.c | 5 +++--
>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/block/iscsi.c b/block/iscsi.c
>> index 7e78ade..9bb5ff6 100644
>> --- a/block/iscsi.c
>> +++ b/block/iscsi.c
>> @@ -417,7 +417,7 @@ static bool is_byte_request_lun_aligned(int64_t offset, int count,
>>   static bool is_sector_request_lun_aligned(int64_t sector_num, int nb_sectors,
>>                                             IscsiLun *iscsilun)
>>   {
>> -    assert(nb_sectors < BDRV_REQUEST_MAX_SECTORS);
>> +    assert(nb_sectors <= BDRV_REQUEST_MAX_SECTORS);
>>       return is_byte_request_lun_aligned(sector_num << BDRV_SECTOR_BITS,
>>                                          nb_sectors << BDRV_SECTOR_BITS,
>>                                          iscsilun);
>> @@ -661,7 +661,8 @@ static int coroutine_fn iscsi_co_readv(BlockDriverState *bs,
>>           int64_t ret;
>>           int pnum;
>>           BlockDriverState *file;
>> -        ret = iscsi_co_get_block_status(bs, sector_num, INT_MAX, &pnum, &file);
>> +        ret = iscsi_co_get_block_status(bs, sector_num,
>> +                                        BDRV_REQUEST_MAX_SECTORS, &pnum, &file);
>>           if (ret < 0) {
>>               return ret;
>>           }
>>
> Hi, I've queued this patch.  Can you rebase the allocation map patch on
> top of master + this one?

will do.

Peter
diff mbox

Patch

diff --git a/block/iscsi.c b/block/iscsi.c
index 7e78ade..9bb5ff6 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -417,7 +417,7 @@  static bool is_byte_request_lun_aligned(int64_t offset, int count,
 static bool is_sector_request_lun_aligned(int64_t sector_num, int nb_sectors,
                                           IscsiLun *iscsilun)
 {
-    assert(nb_sectors < BDRV_REQUEST_MAX_SECTORS);
+    assert(nb_sectors <= BDRV_REQUEST_MAX_SECTORS);
     return is_byte_request_lun_aligned(sector_num << BDRV_SECTOR_BITS,
                                        nb_sectors << BDRV_SECTOR_BITS,
                                        iscsilun);
@@ -661,7 +661,8 @@  static int coroutine_fn iscsi_co_readv(BlockDriverState *bs,
         int64_t ret;
         int pnum;
         BlockDriverState *file;
-        ret = iscsi_co_get_block_status(bs, sector_num, INT_MAX, &pnum, &file);
+        ret = iscsi_co_get_block_status(bs, sector_num,
+                                        BDRV_REQUEST_MAX_SECTORS, &pnum, &file);
         if (ret < 0) {
             return ret;
         }