<div id="geary-body" dir="auto"><div>Yes. The situation can be easily reproduced by the patch below. We have noticed it usually happen on some thin clients (without the patch). Also, I can reproduce it on my desktop (latest version of Arch linux, ryzen 1600x) with debug build of qemu, spice-gtk, and usbredir with <i>remote-viewer --spice-debug </i>and gdb attached(also without the patch). Step to produce the situation: </div><div><br></div><div>1. launch a virtual machine, and redirect a USB mass storage device (or something else) to it</div><div>2. run <i>udevadmin monitor </i></div><div>3. poweroff your virtual machine by running <i>poweroff</i> in your virtual machine</div><div><br></div><div>The udevadmin won't tell you there is an ADD uevent for your USB device if the situation is produced. Host operating system won't do a driver probe automatically without an ADD uevent, and you should do a replug to work with the device.</div><div><br></div><div>diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c</div><div>index 0cc5630..2c27825 100644</div><div>--- a/src/channel-usbredir.c</div><div>+++ b/src/channel-usbredir.c</div><div>@@ -128,6 +128,7 @@ static void _channel_reset_finish(SpiceUsbredirChannel *channel)</div><div> </div><div> spice_usbredir_channel_lock(channel);</div><div> </div><div>+ sleep(1);</div><div> usbredirhost_close(priv->host);</div><div> priv->host = NULL;</div><div> </div><div><br></div></div><div id="geary-quote" dir="auto"><br>On Fri, May 11, 2018 at 12:27 AM, Jonathon Jongsma <jjongsma@redhat.com> wrote:<br><blockquote type="cite"><div class="plaintext" style="white-space: pre-wrap;">On Mon, 2018-05-07 at 17:02 +0800, Qiu Wenbo wrote:
<blockquote> This reverts commit 9fbf679453d8dbfe797a738cb536136599d7adab.
In some cases, remote-viewer will exit before the async function run
in
another thread finish and USB devices redirected to the VM will not
"pop up" to
operation system. For example, a USB disk should be auto mounted
when remote-viewer exit.
</blockquote>
Do you have a reliable way to reproduce this situation?
<blockquote>
Signed-off-by: Qiu Wenbo <<a href="mailto:qiuwenbo@kylinos.com.cn">qiuwenbo@kylinos.com.cn</a>>
---
src/channel-usbredir.c | 48 ++++++--------------------------------
----
1 file changed, 7 insertions(+), 41 deletions(-)
diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c
index 0cc5630..34c4679 100644
--- a/src/channel-usbredir.c
+++ b/src/channel-usbredir.c
@@ -121,54 +121,20 @@ static void
spice_usbredir_channel_init(SpiceUsbredirChannel *channel)
}
#ifdef USE_USBREDIR
-
-static void _channel_reset_finish(SpiceUsbredirChannel *channel)
-{
- SpiceUsbredirChannelPrivate *priv = channel->priv;
-
- spice_usbredir_channel_lock(channel);
-
- usbredirhost_close(priv->host);
- priv->host = NULL;
-
- /* Call set_context to re-create the host */
- spice_usbredir_channel_set_context(channel, priv->context);
-
- spice_usbredir_channel_unlock(channel);
-}
-
-static void _channel_reset_cb(GObject *gobject,
- GAsyncResult *result,
- gpointer user_data)
-{
- SpiceChannel *spice_channel = SPICE_CHANNEL(gobject);
- SpiceUsbredirChannel *channel =
SPICE_USBREDIR_CHANNEL(spice_channel);
- gboolean migrating = GPOINTER_TO_UINT(user_data);
- GError *err = NULL;
-
- _channel_reset_finish(channel);
-
- SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)-
>channel_reset(spice_channel, migrating);
-
- spice_usbredir_channel_disconnect_device_finish(channel, result,
&err);
- g_object_unref(result);
-}
-
static void spice_usbredir_channel_reset(SpiceChannel *c, gboolean
migrating)
{
SpiceUsbredirChannel *channel = SPICE_USBREDIR_CHANNEL(c);
SpiceUsbredirChannelPrivate *priv = channel->priv;
if (priv->host) {
- if (priv->state == STATE_CONNECTED) {
- spice_usbredir_channel_disconnect_device_async(channel,
NULL,
- _channel_reset_cb, GUINT_TO_POINTER(migrating));
- } else {
- _channel_reset_finish(channel);
- }
- } else {
- SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)-
>channel_reset(c, migrating);
+ if (priv->state == STATE_CONNECTED)
+ spice_usbredir_channel_disconnect_device(channel);
+ usbredirhost_close(priv->host);
+ priv->host = NULL;
+ /* Call set_context to re-create the host */
+ spice_usbredir_channel_set_context(channel, priv->context);
}
+ SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)-
>channel_reset(c, migrating);
}
#endif
</blockquote>
</div></blockquote></div>