diff mbox

[Qemu-block] Clean Block Driver Shutdown

Message ID 02ff8cd2-3061-ca10-8235-c2295de58562@kamp.de (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Lieven Oct. 17, 2017, 11:49 a.m. UTC
Am 17.10.2017 um 13:46 schrieb Kevin Wolf:
> Am 17.10.2017 um 12:33 hat Peter Lieven geschrieben:
>> I noticed that Qemu quits at several points with an exit() if the
>> supplied parameters in the commandline are incorrect. This at some
>> stages happens after there have already been connections to storage
>> backends established.
> Maybe we need to come to the conclusion that exit() is always wrong,
> even during the initialisation.
>
>> These connections are not cleanly shut down in this case. For posix
>> file backends that doesn't matter, but for other backends this leads
>> to errors. E.g. iSCSI Targets log an aborted iSCSI connection due to
>> tcp reset.
>>
>> I wonder what is the best way to fix this. A simply call to
>> bdrv_close_all() in an atexit handler seems to work.  But is this a
>> good solution? Maybe register this handler only until the VM starts.
>> Or do we need an atexit handler in each block driver that requires a
>> clean shutdown?
> No, definitely not code in every single block driver. We need to make
> sure to properly clean up what has been started.
>
> An atexit handler is probably relatively easy. I think it would be
> cleaner to have proper error paths even in main(), like in every other
> function. I'm not sure if this would be reasonably easy to achieve,
> though.

A clean error path would obviously be a good idea. However,
the following seems to work:

Peter
diff mbox

Patch

diff --git a/vl.c b/vl.c
index 0723835..bed512c 100644
--- a/vl.c
+++ b/vl.c
@@ -3197,6 +3197,7 @@  int main(int argc, char **argv, char **envp)
      nb_nics = 0;

      bdrv_init_with_whitelist();
+    atexit(bdrv_close_all);

      autostart = 1;