qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [PATCH] block: use drained section in bdrv_close


From: Max Reitz
Subject: Re: [Qemu-block] [PATCH] block: use drained section in bdrv_close
Date: Wed, 23 Dec 2015 23:17:54 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0

On 23.12.2015 22:55, Paolo Bonzini wrote:
> 
>> On 23.12.2015 11:48, Paolo Bonzini wrote:
>>> bdrv_close is used when ejecting a medium.
>>
>> Is it still? Other than it maybe being indirectly called through
>> bdrv_delete(), it shouldn't be.
> 
> Yes, through blk_remove_bs -> bdrv_unref -> bdrv_delete.

OK, I was asking because bdrv_close() was invoked directly by the
ejection code until recently and thought that maybe you were referring
to that, and that there might have been a way for I/O to spill to the
new medium if one issued a change command.

>>>                                             Use a drained section to ensure
>>> that all I/O goes to either the old medium or the bitbucket.
>>
>> Since the BDS will be deleted after bdrv_close() has been called, where
>> else would the I/O go now?
> 
> The ioeventfd could be processed during bs->drv->bdrv_close.  For
> example I/O could be submitted while qcow2_close's qcow2_cache_flush
> yields, and the result would probably be corrupted metadata.

Ah, OK, so you meant “Either all or no I/O should go to the medium”, I
thought it was about the fact that I/O might go somewhere else than the
old medium or /dev/null (e.g. the new medium in case of a change).

That makes more sense now, thanks! :-)

Applied to my block tree:

https://github.com/XanClic/qemu/commits/block

Max

> 
> Paolo
> 
>> Max
>>
>>> Signed-off-by: Paolo Bonzini <address@hidden>
>>> ---
>>>  block.c | 4 +++-
>>>  1 file changed, 3 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/block.c b/block.c
>>> index 411edbf..01655de 100644
>>> --- a/block.c
>>> +++ b/block.c
>>> @@ -2154,9 +2154,10 @@ void bdrv_close(BlockDriverState *bs)
>>>          bdrv_io_limits_disable(bs);
>>>      }
>>>  
>>> -    bdrv_drain(bs); /* complete I/O */
>>> +    bdrv_drained_begin(bs); /* complete I/O */
>>>      bdrv_flush(bs);
>>>      bdrv_drain(bs); /* in case flush left pending I/O */
>>> +
>>>      notifier_list_notify(&bs->close_notifiers, bs);
>>>  
>>>      if (bs->blk) {
>>> @@ -2206,6 +2207,7 @@ void bdrv_close(BlockDriverState *bs)
>>>          g_free(ban);
>>>      }
>>>      QLIST_INIT(&bs->aio_notifiers);
>>> +    bdrv_drained_end(bs);
>>>  }
>>>  
>>>  void bdrv_close_all(void)
>>>
>>
>>
>>


Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]