<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>