diff --git a/hyper-v.changes b/hyper-v.changes
index 9b39c73..efa5e6d 100644
--- a/hyper-v.changes
+++ b/hyper-v.changes
@@ -1,3 +1,11 @@
+-------------------------------------------------------------------
+Wed Dec 17 09:06:33 UTC 2014 - ohering@suse.de
+
+- Start hv_kvp_daemon after network-online.target (bnc#910353)
+- ignore ENOBUFS and ENOMEM in the KVP daemon
+- vssdaemon: skip all filesystems mounted readonly (bnc#909864)
+- vssdaemon: report freeze errors
+
 -------------------------------------------------------------------
 Tue Nov 25 17:46:30 UTC 2014 - ohering@suse.de
 
diff --git a/hyper-v.spec b/hyper-v.spec
index 7955d28..85c5d51 100644
--- a/hyper-v.spec
+++ b/hyper-v.spec
@@ -129,15 +129,17 @@ cat > ${d}/%{hv_kvp_daemon}.service <<EOF
 # started via %{_udevrulesdir}/%{hv_kvp_daemon}.rules
 [Unit]
 Description=Hyper-V KVP Daemon
+# During startup the current hostname is cached, so start very late
+Requires=network-online.target
+After=network-online.target
 ConditionVirtualization=microsoft
 
 [Service]
 Environment="PATH=%{helper_dir}/bin:/usr/sbin:/usr/bin:/sbin:/bin"
-Type=forking
 # Restart appears to work, but its unsupported
 # Reboot required until kernel-user protocol is fixed
 ExecStartPre=/usr/bin/mkdir /run/%{hv_kvp_daemon}
-ExecStart=${bindir}/%{hv_kvp_daemon}
+ExecStart=${bindir}/%{hv_kvp_daemon} --no-daemon
 ExecReload=/usr/bin/false
 Restart=no
 
@@ -152,11 +154,10 @@ Description=Hyper-V VSS Daemon
 ConditionVirtualization=microsoft
 
 [Service]
-Type=forking
 # Restart appears to work, but its unsupported
 # Reboot required until kernel-user protocol is fixed
 ExecStartPre=/usr/bin/mkdir /run/%{hv_vss_daemon}
-ExecStart=${bindir}/%{hv_vss_daemon}
+ExecStart=${bindir}/%{hv_vss_daemon} --no-daemon
 ExecReload=/usr/bin/false
 Restart=no
 
@@ -171,8 +172,7 @@ Description=Hyper-V host to guest file copy daemon
 ConditionVirtualization=microsoft
 
 [Service]
-Type=forking
-ExecStart=${bindir}/%{hv_fcopy_daemon}
+ExecStart=${bindir}/%{hv_fcopy_daemon} --no-daemon
 
 [Install]
 WantedBy=default.target
diff --git a/hyper-v.tools.hv.hv_kvp_daemon.c b/hyper-v.tools.hv.hv_kvp_daemon.c
index b5f5336..7f70579 100644
--- a/hyper-v.tools.hv.hv_kvp_daemon.c
+++ b/hyper-v.tools.hv.hv_kvp_daemon.c
@@ -1561,8 +1561,15 @@ int main(int argc, char *argv[])
 				addr_p, &addr_l);
 
 		if (len < 0) {
+			int saved_errno = errno;
 			syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s",
 					addr.nl_pid, errno, strerror(errno));
+
+			if (saved_errno == ENOBUFS) {
+				syslog(LOG_ERR, "receive error: ignored");
+				continue;
+			}
+
 			close(fd);
 			return -1;
 		}
@@ -1765,8 +1772,15 @@ kvp_done:
 
 		len = netlink_send(fd, incoming_cn_msg);
 		if (len < 0) {
+			int saved_errno = errno;
 			syslog(LOG_ERR, "net_link send failed; error: %d %s", errno,
 					strerror(errno));
+
+			if (saved_errno == ENOMEM || saved_errno == ENOBUFS) {
+				syslog(LOG_ERR, "send error: ignored");
+				continue;
+			}
+
 			exit(EXIT_FAILURE);
 		}
 	}
diff --git a/hyper-v.tools.hv.hv_vss_daemon.c b/hyper-v.tools.hv.hv_vss_daemon.c
index 95fb3dc..fe380c7 100644
--- a/hyper-v.tools.hv.hv_vss_daemon.c
+++ b/hyper-v.tools.hv.hv_vss_daemon.c
@@ -83,7 +83,7 @@ static int vss_operate(int operation)
 	FILE *mounts;
 	struct mntent *ent;
 	unsigned int cmd;
-	int error = 0, root_seen = 0;
+	int error = 0, root_seen = 0, save_errno = 0;
 
 	switch (operation) {
 	case VSS_OP_FREEZE:
@@ -103,7 +103,7 @@ static int vss_operate(int operation)
 	while ((ent = getmntent(mounts))) {
 		if (strncmp(ent->mnt_fsname, match, strlen(match)))
 			continue;
-		if (strcmp(ent->mnt_type, "iso9660") == 0)
+		if (hasmntopt(ent, MNTOPT_RO) != NULL)
 			continue;
 		if (strcmp(ent->mnt_type, "vfat") == 0)
 			continue;
@@ -115,7 +115,6 @@ static int vss_operate(int operation)
 		if (error && operation == VSS_OP_FREEZE)
 			goto err;
 	}
-	endmntent(mounts);
 
 	if (root_seen) {
 		error |= vss_do_freeze("/", cmd);
@@ -123,10 +122,19 @@ static int vss_operate(int operation)
 			goto err;
 	}
 
-	return error;
+	goto out;
 err:
-	endmntent(mounts);
+	save_errno = errno;
 	vss_operate(VSS_OP_THAW);
+	/* Call syslog after we thaw all filesystems */
+	if (ent)
+		syslog(LOG_ERR, "FREEZE of %s failed; error:%d %s",
+		       ent->mnt_dir, save_errno, strerror(save_errno));
+	else
+		syslog(LOG_ERR, "FREEZE of / failed; error:%d %s", save_errno,
+		       strerror(save_errno));
+out:
+	endmntent(mounts);
 	return error;
 }