20.05.2019 12:27, Kevin Wolf wrote:
> Am 17.05.2019 um 12:22 hat Vladimir Sementsov-Ogievskiy geschrieben:
>> 16.05.2019 22:03, John Snow wrote:
>>> On 5/16/19 6:12 AM, Vladimir Sementsov-Ogievskiy wrote:
>>>> But, on the other, hand, if we have implicitly-filtered node on target, we 
>>>> were doing wrong thing anyway,
>>>> as dirty_bitmap_load_header don't skip implicit nodes.
>>>>
>>>>> +    for (bs = bdrv_next_all_states(NULL); bs; bs = 
>>>>> bdrv_next_all_states(bs)) {
>>>>
>>>> As I understand, difference with bdrv_next_node is that we don't skip 
>>>> unnamed nodes [...]
>>>>
>>>
>>> The difference is that we iterate over states that aren't roots of
>>> trees; so not just unnamed nodes but rather intermediate nodes as well
>>> as nodes not attached to a storage device.
>>>
>>> bdrv_next says: `Iterates over all top-level BlockDriverStates, i.e.
>>> BDSs that are owned by the monitor or attached to a BlockBackend`
>>>
>>> So this loop is going to iterate over *everything*, not just top-level
>>> nodes. This lets me skip the tree-crawling loop that didn't work quite
>>> right.
>>
>> I meant not bdrv_next but bdrv_next_node, which iterates through graph 
>> nodes..
>> What is real difference between graph_bdrv_states and all_bdrv_states ?
> 
> I don't think there is any relevant difference any more since commit
> 15489c769b9 ('block: auto-generated node-names'). We can only see a
> difference if a BDS was created, but never opened. This means either
> that we are still in the process of opening an image or that we have a
> bug somewhere.
> 
> Maybe we should remove graph_bdrv_states and replace all of its uses
> with the more obviously correct all_bdrv_states (if we are sure that
> all users aren't called between creating and opening a BDS).
> 
>> Node is inserted to graph_bdrv_states in bdrv_assign_node_name(), and to
>> all_bdrv_states in bdrv_new().
>>
>> Three calls to bdrv_new:
>>
>> bdrv_new_open_driver, calls bdrv_new and then bdrv_open_driver, which calls 
>> bdrv_assign_node_name,
>> and if it fails new created node is released.
>>
>> bdrv_open_inherit
>>      bdrv_new
>>      ..
>>      bdrv_open_common
>>         bdrv_open_driver
>>             bdrv_assign_node_name
>>
>>
>> iscsi_co_create_opts
>>      bdrv_new
>>
>>      ... hmm.. looks like it a kind of temporary unnamed bs
>>
>> So, now, I'm not sure. Possibly we'd better use bdrv_next_node().
> 
> I wonder if the iscsi one can't be replaced with bdrv_new_open_driver().
> Manually building a half-opened BDS like it does currently looks
> suspicious.
> 
>> Kevin introduced all_bdrv_states in 0f12264e7a4145 , to use in drain instead 
>> of
>> bdrv_next... But I don't understand, why he didn't use graph_bdrv_states and
>> corresponding bdrv_next_node(), which is only skips some temporary or 
>> under-constuction
>> nodes..
> 
> I probably just didn't realise that graph_bdrv_states exists and is
> effectively the same. I knew that all_bdrv_states contains what I want,
> so I just wanted to access that.
> 
> But if anonymous BDSes did actually still exist, drain would want to
> wait for those as well, so it's the more natural choice anyway.
> 
> Kevin
> 

Thank you for clarification. Then, my r-b still stand here, and fixing/refacting
graph_nodes vs all_states should be a separate thing.

Reviewed-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com>

-- 
Best regards,
Vladimir

Reply via email to