Am 27.04.2022 um 13:40 hat Hanna Reitz geschrieben: > qcow2_co_invalidate_cache() closes and opens the qcow2 file, by calling > qcow2_close() and qcow2_do_open(). These two functions must thus be > usable from both a global-state and an I/O context. > > As they are, they are not safe to call in an I/O context, because they > use bdrv_unref_child() and bdrv_open_child() to close/open the data_file > child, respectively, both of which are global-state functions. When > used from qcow2_co_invalidate_cache(), we do not need to close/open the > data_file child, though (we do not do this for bs->file or bs->backing > either), and so we should skip it in the qcow2_co_invalidate_cache() > path. > > To do so, add a parameter to qcow2_do_open() and qcow2_close() to make > them skip handling s->data_file, and have qcow2_co_invalidate_cache() > exempt it from the memset() on the BDRVQcow2State. > > (Note that the QED driver similarly closes/opens the QED image by > invoking bdrv_qed_close()+bdrv_qed_do_open(), but both functions seem > safe to use in an I/O context.) > > Fixes: https://gitlab.com/qemu-project/qemu/-/issues/945 > Signed-off-by: Hanna Reitz <hre...@redhat.com>
This feels a bit like a hack, and we'll have to change it again if we ever want to allow changing the data_file with reopen. But it should do the job for now. Kevin