diff mbox

[05/10] block/json: Add bdrv_co_get_block_status()

Message ID 1393860533-2063-6-git-send-email-mreitz@redhat.com
State New
Headers show

Commit Message

Max Reitz March 3, 2014, 3:28 p.m. UTC
Implement this function in the same way as raw_bsd does: Acknowledge
that this is a passthrough driver (always return BDRV_BLOCK_OFFSET_VALID
and BDRV_BLOCK_DATA and derive the offset directly from the sector
index) and add BDRV_BLOCK_RAW to the returned value.

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 block/json.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Benoît Canet March 5, 2014, 4:11 p.m. UTC | #1
The Monday 03 Mar 2014 à 16:28:48 (+0100), Max Reitz wrote :
> Implement this function in the same way as raw_bsd does: Acknowledge
> that this is a passthrough driver (always return BDRV_BLOCK_OFFSET_VALID
> and BDRV_BLOCK_DATA and derive the offset directly from the sector
> index) and add BDRV_BLOCK_RAW to the returned value.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  block/json.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/block/json.c b/block/json.c
> index a2f4691..7392802 100644
> --- a/block/json.c
> +++ b/block/json.c
> @@ -113,6 +113,14 @@ static coroutine_fn int json_co_write_zeroes(BlockDriverState *bs,
>      return bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
>  }
>  
> +static coroutine_fn int64_t json_co_get_block_status(BlockDriverState *bs,
> +                                                     int64_t sector_num,
> +                                                     int nb_sectors, int *pnum)
> +{
> +    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA |
> +           (sector_num << BDRV_SECTOR_BITS);
> +}

I don't understand what is the selling point of this method instead of calling
bdrv_co_get_block_status on bs->file.
Some information risk to be lost and it does look like magic.

Best regards

Benoît

> +
>  static void json_invalidate_cache(BlockDriverState *bs)
>  {
>      return bdrv_invalidate_cache(bs->file);
> @@ -159,6 +167,7 @@ static BlockDriver bdrv_json = {
>      .bdrv_aio_discard           = json_aio_discard,
>  
>      .bdrv_co_write_zeroes       = json_co_write_zeroes,
> +    .bdrv_co_get_block_status   = json_co_get_block_status,
>  
>      .bdrv_invalidate_cache      = json_invalidate_cache,
>  
> -- 
> 1.9.0
> 
>
Max Reitz March 5, 2014, 8:10 p.m. UTC | #2
On 05.03.2014 17:11, Benoît Canet wrote:
> The Monday 03 Mar 2014 à 16:28:48 (+0100), Max Reitz wrote :
>> Implement this function in the same way as raw_bsd does: Acknowledge
>> that this is a passthrough driver (always return BDRV_BLOCK_OFFSET_VALID
>> and BDRV_BLOCK_DATA and derive the offset directly from the sector
>> index) and add BDRV_BLOCK_RAW to the returned value.
>>
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>> ---
>>   block/json.c | 9 +++++++++
>>   1 file changed, 9 insertions(+)
>>
>> diff --git a/block/json.c b/block/json.c
>> index a2f4691..7392802 100644
>> --- a/block/json.c
>> +++ b/block/json.c
>> @@ -113,6 +113,14 @@ static coroutine_fn int json_co_write_zeroes(BlockDriverState *bs,
>>       return bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
>>   }
>>   
>> +static coroutine_fn int64_t json_co_get_block_status(BlockDriverState *bs,
>> +                                                     int64_t sector_num,
>> +                                                     int nb_sectors, int *pnum)
>> +{
>> +    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA |
>> +           (sector_num << BDRV_SECTOR_BITS);
>> +}
> I don't understand what is the selling point of this method instead of calling
> bdrv_co_get_block_status on bs->file.
> Some information risk to be lost and it does look like magic.

This is the same what "raw" does. It just is more meaningful: This way, 
this function does not pretend to provide the blocks itself but instead 
tells the truth; that is, the blocks are provided by an underlying BDS 
(bs->file).

I wasn't really sure what to do myself. Generally, this driver is 
actually meant to pretend that it provides the blocks itself. On the 
other hand, I tried to imitate the behavior or "raw", since this is 
something I can hope to be approximately correct. Also, as I've said 
before, the value returned here is in fact at least technically correct.


Max

> Best regards
>
> Benoît
>
>> +
>>   static void json_invalidate_cache(BlockDriverState *bs)
>>   {
>>       return bdrv_invalidate_cache(bs->file);
>> @@ -159,6 +167,7 @@ static BlockDriver bdrv_json = {
>>       .bdrv_aio_discard           = json_aio_discard,
>>   
>>       .bdrv_co_write_zeroes       = json_co_write_zeroes,
>> +    .bdrv_co_get_block_status   = json_co_get_block_status,
>>   
>>       .bdrv_invalidate_cache      = json_invalidate_cache,
>>   
>> -- 
>> 1.9.0
>>
>>
Benoît Canet March 5, 2014, 8:41 p.m. UTC | #3
The Wednesday 05 Mar 2014 à 21:10:03 (+0100), Max Reitz wrote :
> On 05.03.2014 17:11, Benoît Canet wrote:
> >The Monday 03 Mar 2014 à 16:28:48 (+0100), Max Reitz wrote :
> >>Implement this function in the same way as raw_bsd does: Acknowledge
> >>that this is a passthrough driver (always return BDRV_BLOCK_OFFSET_VALID
> >>and BDRV_BLOCK_DATA and derive the offset directly from the sector
> >>index) and add BDRV_BLOCK_RAW to the returned value.
> >>
> >>Signed-off-by: Max Reitz <mreitz@redhat.com>
> >>---
> >>  block/json.c | 9 +++++++++
> >>  1 file changed, 9 insertions(+)
> >>
> >>diff --git a/block/json.c b/block/json.c
> >>index a2f4691..7392802 100644
> >>--- a/block/json.c
> >>+++ b/block/json.c
> >>@@ -113,6 +113,14 @@ static coroutine_fn int json_co_write_zeroes(BlockDriverState *bs,
> >>      return bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
> >>  }
> >>+static coroutine_fn int64_t json_co_get_block_status(BlockDriverState *bs,
> >>+                                                     int64_t sector_num,
> >>+                                                     int nb_sectors, int *pnum)
> >>+{
> >>+    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA |
> >>+           (sector_num << BDRV_SECTOR_BITS);
> >>+}
> >I don't understand what is the selling point of this method instead of calling
> >bdrv_co_get_block_status on bs->file.
> >Some information risk to be lost and it does look like magic.
> 
> This is the same what "raw" does. It just is more meaningful: This
> way, this function does not pretend to provide the blocks itself but
> instead tells the truth; that is, the blocks are provided by an
> underlying BDS (bs->file).
> 
> I wasn't really sure what to do myself. Generally, this driver is
> actually meant to pretend that it provides the blocks itself. On the
> other hand, I tried to imitate the behavior or "raw", since this is
> something I can hope to be approximately correct. Also, as I've said
> before, the value returned here is in fact at least technically
> correct.

The raw_bsd driver have an additional *pnum = nb_sectors; at the begining of the
function. Did you left it on purpose ?

Best regards

Benoît 
> 
> 
> Max
> 
> >Best regards
> >
> >Benoît
> >
> >>+
> >>  static void json_invalidate_cache(BlockDriverState *bs)
> >>  {
> >>      return bdrv_invalidate_cache(bs->file);
> >>@@ -159,6 +167,7 @@ static BlockDriver bdrv_json = {
> >>      .bdrv_aio_discard           = json_aio_discard,
> >>      .bdrv_co_write_zeroes       = json_co_write_zeroes,
> >>+    .bdrv_co_get_block_status   = json_co_get_block_status,
> >>      .bdrv_invalidate_cache      = json_invalidate_cache,
> >>-- 
> >>1.9.0
> >>
> >>
>
Max Reitz March 5, 2014, 8:44 p.m. UTC | #4
On 05.03.2014 21:41, Benoît Canet wrote:
> The Wednesday 05 Mar 2014 à 21:10:03 (+0100), Max Reitz wrote :
>> On 05.03.2014 17:11, Benoît Canet wrote:
>>> The Monday 03 Mar 2014 à 16:28:48 (+0100), Max Reitz wrote :
>>>> Implement this function in the same way as raw_bsd does: Acknowledge
>>>> that this is a passthrough driver (always return BDRV_BLOCK_OFFSET_VALID
>>>> and BDRV_BLOCK_DATA and derive the offset directly from the sector
>>>> index) and add BDRV_BLOCK_RAW to the returned value.
>>>>
>>>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>>>> ---
>>>>   block/json.c | 9 +++++++++
>>>>   1 file changed, 9 insertions(+)
>>>>
>>>> diff --git a/block/json.c b/block/json.c
>>>> index a2f4691..7392802 100644
>>>> --- a/block/json.c
>>>> +++ b/block/json.c
>>>> @@ -113,6 +113,14 @@ static coroutine_fn int json_co_write_zeroes(BlockDriverState *bs,
>>>>       return bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
>>>>   }
>>>> +static coroutine_fn int64_t json_co_get_block_status(BlockDriverState *bs,
>>>> +                                                     int64_t sector_num,
>>>> +                                                     int nb_sectors, int *pnum)
>>>> +{
>>>> +    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA |
>>>> +           (sector_num << BDRV_SECTOR_BITS);
>>>> +}
>>> I don't understand what is the selling point of this method instead of calling
>>> bdrv_co_get_block_status on bs->file.
>>> Some information risk to be lost and it does look like magic.
>> This is the same what "raw" does. It just is more meaningful: This
>> way, this function does not pretend to provide the blocks itself but
>> instead tells the truth; that is, the blocks are provided by an
>> underlying BDS (bs->file).
>>
>> I wasn't really sure what to do myself. Generally, this driver is
>> actually meant to pretend that it provides the blocks itself. On the
>> other hand, I tried to imitate the behavior or "raw", since this is
>> something I can hope to be approximately correct. Also, as I've said
>> before, the value returned here is in fact at least technically
>> correct.
> The raw_bsd driver have an additional *pnum = nb_sectors; at the begining of the
> function. Did you left it on purpose ?

Oops, no, I did not. Okay, if I even fail at copying code, the argument 
about "raw" being at least probably correct isn't worth anything here, I 
guess. ;-)

Max

> Best regards
>
> Benoît
>>
>> Max
>>
>>> Best regards
>>>
>>> Benoît
>>>
>>>> +
>>>>   static void json_invalidate_cache(BlockDriverState *bs)
>>>>   {
>>>>       return bdrv_invalidate_cache(bs->file);
>>>> @@ -159,6 +167,7 @@ static BlockDriver bdrv_json = {
>>>>       .bdrv_aio_discard           = json_aio_discard,
>>>>       .bdrv_co_write_zeroes       = json_co_write_zeroes,
>>>> +    .bdrv_co_get_block_status   = json_co_get_block_status,
>>>>       .bdrv_invalidate_cache      = json_invalidate_cache,
>>>> -- 
>>>> 1.9.0
>>>>
>>>>
Benoît Canet March 5, 2014, 11:22 p.m. UTC | #5
The Wednesday 05 Mar 2014 à 21:44:57 (+0100), Max Reitz wrote :
> On 05.03.2014 21:41, Benoît Canet wrote:
> >The Wednesday 05 Mar 2014 à 21:10:03 (+0100), Max Reitz wrote :
> >>On 05.03.2014 17:11, Benoît Canet wrote:
> >>>The Monday 03 Mar 2014 à 16:28:48 (+0100), Max Reitz wrote :
> >>>>Implement this function in the same way as raw_bsd does: Acknowledge
> >>>>that this is a passthrough driver (always return BDRV_BLOCK_OFFSET_VALID
> >>>>and BDRV_BLOCK_DATA and derive the offset directly from the sector
> >>>>index) and add BDRV_BLOCK_RAW to the returned value.
> >>>>
> >>>>Signed-off-by: Max Reitz <mreitz@redhat.com>
> >>>>---
> >>>>  block/json.c | 9 +++++++++
> >>>>  1 file changed, 9 insertions(+)
> >>>>
> >>>>diff --git a/block/json.c b/block/json.c
> >>>>index a2f4691..7392802 100644
> >>>>--- a/block/json.c
> >>>>+++ b/block/json.c
> >>>>@@ -113,6 +113,14 @@ static coroutine_fn int json_co_write_zeroes(BlockDriverState *bs,
> >>>>      return bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
> >>>>  }
> >>>>+static coroutine_fn int64_t json_co_get_block_status(BlockDriverState *bs,
> >>>>+                                                     int64_t sector_num,
> >>>>+                                                     int nb_sectors, int *pnum)
> >>>>+{
> >>>>+    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA |
> >>>>+           (sector_num << BDRV_SECTOR_BITS);
> >>>>+}
> >>>I don't understand what is the selling point of this method instead of calling
> >>>bdrv_co_get_block_status on bs->file.
> >>>Some information risk to be lost and it does look like magic.
> >>This is the same what "raw" does. It just is more meaningful: This
> >>way, this function does not pretend to provide the blocks itself but
> >>instead tells the truth; that is, the blocks are provided by an
> >>underlying BDS (bs->file).
> >>
> >>I wasn't really sure what to do myself. Generally, this driver is
> >>actually meant to pretend that it provides the blocks itself. On the
> >>other hand, I tried to imitate the behavior or "raw", since this is
> >>something I can hope to be approximately correct. Also, as I've said
> >>before, the value returned here is in fact at least technically
> >>correct.
> >The raw_bsd driver have an additional *pnum = nb_sectors; at the begining of the
> >function. Did you left it on purpose ?
> 
> Oops, no, I did not. Okay, if I even fail at copying code, the
> argument about "raw" being at least probably correct isn't worth
> anything here, I guess. ;-)

In fact I wonder i posix_raw act this way because one of the BDRV it does wrap
have simply no clue on how to answer to this request.

Best regards

Benoît

> 
> Max
> 
> >Best regards
> >
> >Benoît
> >>
> >>Max
> >>
> >>>Best regards
> >>>
> >>>Benoît
> >>>
> >>>>+
> >>>>  static void json_invalidate_cache(BlockDriverState *bs)
> >>>>  {
> >>>>      return bdrv_invalidate_cache(bs->file);
> >>>>@@ -159,6 +167,7 @@ static BlockDriver bdrv_json = {
> >>>>      .bdrv_aio_discard           = json_aio_discard,
> >>>>      .bdrv_co_write_zeroes       = json_co_write_zeroes,
> >>>>+    .bdrv_co_get_block_status   = json_co_get_block_status,
> >>>>      .bdrv_invalidate_cache      = json_invalidate_cache,
> >>>>-- 
> >>>>1.9.0
> >>>>
> >>>>
>
Max Reitz March 6, 2014, 8:01 p.m. UTC | #6
On 06.03.2014 00:22, Benoît Canet wrote:
> The Wednesday 05 Mar 2014 à 21:44:57 (+0100), Max Reitz wrote :
>> On 05.03.2014 21:41, Benoît Canet wrote:
>>> The Wednesday 05 Mar 2014 à 21:10:03 (+0100), Max Reitz wrote :
>>>> On 05.03.2014 17:11, Benoît Canet wrote:
>>>>> The Monday 03 Mar 2014 à 16:28:48 (+0100), Max Reitz wrote :
>>>>>> Implement this function in the same way as raw_bsd does: Acknowledge
>>>>>> that this is a passthrough driver (always return BDRV_BLOCK_OFFSET_VALID
>>>>>> and BDRV_BLOCK_DATA and derive the offset directly from the sector
>>>>>> index) and add BDRV_BLOCK_RAW to the returned value.
>>>>>>
>>>>>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>>>>>> ---
>>>>>>   block/json.c | 9 +++++++++
>>>>>>   1 file changed, 9 insertions(+)
>>>>>>
>>>>>> diff --git a/block/json.c b/block/json.c
>>>>>> index a2f4691..7392802 100644
>>>>>> --- a/block/json.c
>>>>>> +++ b/block/json.c
>>>>>> @@ -113,6 +113,14 @@ static coroutine_fn int json_co_write_zeroes(BlockDriverState *bs,
>>>>>>       return bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
>>>>>>   }
>>>>>> +static coroutine_fn int64_t json_co_get_block_status(BlockDriverState *bs,
>>>>>> +                                                     int64_t sector_num,
>>>>>> +                                                     int nb_sectors, int *pnum)
>>>>>> +{
>>>>>> +    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA |
>>>>>> +           (sector_num << BDRV_SECTOR_BITS);
>>>>>> +}
>>>>> I don't understand what is the selling point of this method instead of calling
>>>>> bdrv_co_get_block_status on bs->file.
>>>>> Some information risk to be lost and it does look like magic.
>>>> This is the same what "raw" does. It just is more meaningful: This
>>>> way, this function does not pretend to provide the blocks itself but
>>>> instead tells the truth; that is, the blocks are provided by an
>>>> underlying BDS (bs->file).
>>>>
>>>> I wasn't really sure what to do myself. Generally, this driver is
>>>> actually meant to pretend that it provides the blocks itself. On the
>>>> other hand, I tried to imitate the behavior or "raw", since this is
>>>> something I can hope to be approximately correct. Also, as I've said
>>>> before, the value returned here is in fact at least technically
>>>> correct.
>>> The raw_bsd driver have an additional *pnum = nb_sectors; at the begining of the
>>> function. Did you left it on purpose ?
>> Oops, no, I did not. Okay, if I even fail at copying code, the
>> argument about "raw" being at least probably correct isn't worth
>> anything here, I guess. ;-)
> In fact I wonder i posix_raw act this way because one of the BDRV it does wrap
> have simply no clue on how to answer to this request.

If you take a look at bdrv_co_get_block_status() in block.c, you'll see 
that BDRV_BLOCK_RAW actually results in a recursive call to 
bdrv_get_block_status().


Max

> Best regards
>
> Benoît
>
>> Max
>>
>>> Best regards
>>>
>>> Benoît
>>>> Max
>>>>
>>>>> Best regards
>>>>>
>>>>> Benoît
>>>>>
>>>>>> +
>>>>>>   static void json_invalidate_cache(BlockDriverState *bs)
>>>>>>   {
>>>>>>       return bdrv_invalidate_cache(bs->file);
>>>>>> @@ -159,6 +167,7 @@ static BlockDriver bdrv_json = {
>>>>>>       .bdrv_aio_discard           = json_aio_discard,
>>>>>>       .bdrv_co_write_zeroes       = json_co_write_zeroes,
>>>>>> +    .bdrv_co_get_block_status   = json_co_get_block_status,
>>>>>>       .bdrv_invalidate_cache      = json_invalidate_cache,
>>>>>> -- 
>>>>>> 1.9.0
>>>>>>
>>>>>>
diff mbox

Patch

diff --git a/block/json.c b/block/json.c
index a2f4691..7392802 100644
--- a/block/json.c
+++ b/block/json.c
@@ -113,6 +113,14 @@  static coroutine_fn int json_co_write_zeroes(BlockDriverState *bs,
     return bdrv_co_write_zeroes(bs, sector_num, nb_sectors, flags);
 }
 
+static coroutine_fn int64_t json_co_get_block_status(BlockDriverState *bs,
+                                                     int64_t sector_num,
+                                                     int nb_sectors, int *pnum)
+{
+    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA |
+           (sector_num << BDRV_SECTOR_BITS);
+}
+
 static void json_invalidate_cache(BlockDriverState *bs)
 {
     return bdrv_invalidate_cache(bs->file);
@@ -159,6 +167,7 @@  static BlockDriver bdrv_json = {
     .bdrv_aio_discard           = json_aio_discard,
 
     .bdrv_co_write_zeroes       = json_co_write_zeroes,
+    .bdrv_co_get_block_status   = json_co_get_block_status,
 
     .bdrv_invalidate_cache      = json_invalidate_cache,