diff --git a/gio/gunixmount.c b/gio/gunixmount.c
index 2bbb91a..f05f86b 100644
--- a/gio/gunixmount.c
+++ b/gio/gunixmount.c
@@ -312,7 +312,14 @@ read:
         goto read;
    }
   else if (status == G_IO_STATUS_EOF)
-    g_string_append_len (data->error_string, buf, bytes_read);
+    {
+     if (data->error_channel_source)
+       {
+         g_source_unref (data->error_channel_source);
+         data->error_channel_source = NULL;
+       }
+      return G_SOURCE_REMOVE;
+    }
   else if (status == G_IO_STATUS_ERROR)
     {
       if (data->error_string->len > 0)
@@ -326,10 +333,10 @@ read:
           g_source_unref (data->error_channel_source);
           data->error_channel_source = NULL;
         }
-      return FALSE;
+      return G_SOURCE_REMOVE;
     }
 
-  return TRUE;
+  return G_SOURCE_CONTINUE;
 }
 
 static gboolean
@@ -338,7 +345,6 @@ eject_unmount_do_cb (gpointer user_data)
   GTask *task = user_data;
   UnmountEjectOp *data = g_task_get_task_data (task);
   GPid child_pid;
-  GSource *child_watch;
   GError *error = NULL;
 
   if (g_task_return_error_if_cancelled (task))
@@ -369,11 +375,7 @@ eject_unmount_do_cb (gpointer user_data)
   data->error_channel_source = g_io_create_watch (data->error_channel, G_IO_IN);
   g_task_attach_source (task, data->error_channel_source,
                         (GSourceFunc) eject_unmount_read_error);
-
-  child_watch = g_child_watch_source_new (child_pid);
-  g_task_attach_source (task, data->error_channel_source,
-                        (GSourceFunc) eject_unmount_cb);
-  g_source_unref (child_watch);
+  g_child_watch_add (child_pid, (GChildWatchFunc) eject_unmount_cb, task);
 
 handle_error:
   if (error != NULL)
