Am 14.05.25 um 18:36 schrieb Kevin Wolf:
> Am 08.05.2025 um 16:09 hat Fiona Ebner geschrieben:
>> @@ -4368,6 +4368,7 @@ bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
>> BlockDriverState *bs,
>> bool keep_old_opts)
>> {
>> assert(bs != NULL);
>> + assert(qatomic_read(&bs->quiesce_counter) > 0);
>
> BlockDriverState.quiesce_counter isn't accessed with atomics elsewhere.
> Did you confuse it with BlockBackend.quiesce_counter?
No, but I saw that it is modified via qatomic_fetch_inc/dec(). And those
modifications are in bdrv_do_drained_begin/end() which are
IO_OR_GS_CODE(). So isn't it more correct to read via atomics here?
The documentation in include/block/block_int-common.h for struct
BlockDriverState also states:
> /* Accessed with atomic ops. */
> int quiesce_counter;
Should I rather add a patch to have the other readers use atomics too?
>> @@ -4522,6 +4516,14 @@ BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue
>> *bs_queue,
>> QDict *options, bool keep_old_opts)
>> {
>> GLOBAL_STATE_CODE();
>> +
>> + if (bs_queue == NULL) {
>> + /*
>> + * paired with bdrv_drain_all_end() in bdrv_reopen_queue_free().
>> + */
>> + bdrv_drain_all_begin();
>
> Having this comment is a good idea. It fits on a single line, though.
Ack.
>
>> + }
>> +
>> GRAPH_RDLOCK_GUARD_MAINLOOP();
>>
>> return bdrv_reopen_queue_child(bs_queue, bs, options, NULL, 0, false,
>> @@ -4534,12 +4536,16 @@ void bdrv_reopen_queue_free(BlockReopenQueue
>> *bs_queue)
>> if (bs_queue) {
>> BlockReopenQueueEntry *bs_entry, *next;
>> QTAILQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
>> - bdrv_drained_end(bs_entry->state.bs);
>> qobject_unref(bs_entry->state.explicit_options);
>> qobject_unref(bs_entry->state.options);
>> g_free(bs_entry);
>> }
>> g_free(bs_queue);
>> +
>> + /*
>> + * paired with bdrv_drain_all_begin() in bdrv_reopen_queue().
>> + */
>> + bdrv_drain_all_end();
>
> This could be a single line comment, too.
Ack.
Best Regards,
Fiona