diff mbox

[2/3] block: fix race in bdrv_co_discard with drive-mirror

Message ID 1466060287-31514-3-git-send-email-den@openvz.org
State New
Headers show

Commit Message

Denis V. Lunev June 16, 2016, 6:58 a.m. UTC
Actually we must set dirty bitmap dirty after we have written all our
zeroes for correct processing in drive mirror code. In the other case
we can face not zeroes in this dirty area there in mirror_iteration.

Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Vladimir Sementsov-Ogievskiy<vsementsov@virtuozzo.com>
CC: Stefan Hajnoczi <stefanha@redhat.com>
CC: Fam Zheng <famz@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Max Reitz <mreitz@redhat.com>
---
 block/io.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Fam Zheng June 16, 2016, 7:38 a.m. UTC | #1
On Thu, 06/16 09:58, Denis V. Lunev wrote:
> Actually we must set dirty bitmap dirty after we have written all our
> zeroes for correct processing in drive mirror code. In the other case
> we can face not zeroes in this dirty area there in mirror_iteration.
> 
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Vladimir Sementsov-Ogievskiy<vsementsov@virtuozzo.com>
> CC: Stefan Hajnoczi <stefanha@redhat.com>
> CC: Fam Zheng <famz@redhat.com>
> CC: Kevin Wolf <kwolf@redhat.com>
> CC: Max Reitz <mreitz@redhat.com>
> ---
>  block/io.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/block/io.c b/block/io.c
> index b51f681..513bd99 100644
> --- a/block/io.c
> +++ b/block/io.c
> @@ -2265,7 +2265,6 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
>  
>      tracked_request_begin(&req, bs, NULL, sector_num << BDRV_SECTOR_BITS,
>                            nb_sectors << BDRV_SECTOR_BITS, BDRV_TRACKED_DISCARD);
> -    bdrv_set_dirty(bs, sector_num, nb_sectors);
>  
>      max_discard = MIN_NON_ZERO(bs->bl.max_discard, BDRV_REQUEST_MAX_SECTORS);
>      while (nb_sectors > 0) {
> @@ -2314,6 +2313,8 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
>      }
>      ret = 0;
>  out:
> +    bdrv_set_dirty(bs, req.offset << BDRV_SECTOR_BITS,
> +                   req.bytes << BDRV_SECTOR_BITS);
>      tracked_request_end(&req);
>      return ret;
>  }
> -- 
> 2.5.0
> 

Reviewed-by: Fam Zheng <famz@redhat.com>
Vladimir Sementsov-Ogievskiy June 16, 2016, 9:34 a.m. UTC | #2
On 16.06.2016 09:58, Denis V. Lunev wrote:
> Actually we must set dirty bitmap dirty after we have written all our
> zeroes for correct processing in drive mirror code. In the other case
> we can face not zeroes in this dirty area there in mirror_iteration.
>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Vladimir Sementsov-Ogievskiy<vsementsov@virtuozzo.com>
> CC: Stefan Hajnoczi <stefanha@redhat.com>
> CC: Fam Zheng <famz@redhat.com>
> CC: Kevin Wolf <kwolf@redhat.com>
> CC: Max Reitz <mreitz@redhat.com>
> ---
>   block/io.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/block/io.c b/block/io.c
> index b51f681..513bd99 100644
> --- a/block/io.c
> +++ b/block/io.c
> @@ -2265,7 +2265,6 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
>   
>       tracked_request_begin(&req, bs, NULL, sector_num << BDRV_SECTOR_BITS,
>                             nb_sectors << BDRV_SECTOR_BITS, BDRV_TRACKED_DISCARD);
> -    bdrv_set_dirty(bs, sector_num, nb_sectors);
>   
>       max_discard = MIN_NON_ZERO(bs->bl.max_discard, BDRV_REQUEST_MAX_SECTORS);
>       while (nb_sectors > 0) {
> @@ -2314,6 +2313,8 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
>       }
>       ret = 0;
>   out:
> +    bdrv_set_dirty(bs, req.offset << BDRV_SECTOR_BITS,
  s/<</>>/
> +                   req.bytes << BDRV_SECTOR_BITS);
and here
>       tracked_request_end(&req);
>       return ret;
>   }
Denis V. Lunev June 16, 2016, 9:39 a.m. UTC | #3
On 06/16/2016 12:34 PM, Vladimir Sementsov-Ogievskiy wrote:
> On 16.06.2016 09:58, Denis V. Lunev wrote:
>> Actually we must set dirty bitmap dirty after we have written all our
>> zeroes for correct processing in drive mirror code. In the other case
>> we can face not zeroes in this dirty area there in mirror_iteration.
>>
>> Signed-off-by: Denis V. Lunev <den@openvz.org>
>> CC: Vladimir Sementsov-Ogievskiy<vsementsov@virtuozzo.com>
>> CC: Stefan Hajnoczi <stefanha@redhat.com>
>> CC: Fam Zheng <famz@redhat.com>
>> CC: Kevin Wolf <kwolf@redhat.com>
>> CC: Max Reitz <mreitz@redhat.com>
>> ---
>>   block/io.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/block/io.c b/block/io.c
>> index b51f681..513bd99 100644
>> --- a/block/io.c
>> +++ b/block/io.c
>> @@ -2265,7 +2265,6 @@ int coroutine_fn 
>> bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
>>         tracked_request_begin(&req, bs, NULL, sector_num << 
>> BDRV_SECTOR_BITS,
>>                             nb_sectors << BDRV_SECTOR_BITS, 
>> BDRV_TRACKED_DISCARD);
>> -    bdrv_set_dirty(bs, sector_num, nb_sectors);
>>         max_discard = MIN_NON_ZERO(bs->bl.max_discard, 
>> BDRV_REQUEST_MAX_SECTORS);
>>       while (nb_sectors > 0) {
>> @@ -2314,6 +2313,8 @@ int coroutine_fn 
>> bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
>>       }
>>       ret = 0;
>>   out:
>> +    bdrv_set_dirty(bs, req.offset << BDRV_SECTOR_BITS,
>  s/<</>>/
>> +                   req.bytes << BDRV_SECTOR_BITS);
> and here
>>       tracked_request_end(&req);
>>       return ret;
>>   }
>
>
very nice, thanks ;)
diff mbox

Patch

diff --git a/block/io.c b/block/io.c
index b51f681..513bd99 100644
--- a/block/io.c
+++ b/block/io.c
@@ -2265,7 +2265,6 @@  int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
 
     tracked_request_begin(&req, bs, NULL, sector_num << BDRV_SECTOR_BITS,
                           nb_sectors << BDRV_SECTOR_BITS, BDRV_TRACKED_DISCARD);
-    bdrv_set_dirty(bs, sector_num, nb_sectors);
 
     max_discard = MIN_NON_ZERO(bs->bl.max_discard, BDRV_REQUEST_MAX_SECTORS);
     while (nb_sectors > 0) {
@@ -2314,6 +2313,8 @@  int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
     }
     ret = 0;
 out:
+    bdrv_set_dirty(bs, req.offset << BDRV_SECTOR_BITS,
+                   req.bytes << BDRV_SECTOR_BITS);
     tracked_request_end(&req);
     return ret;
 }