Index: uspace/lib/c/generic/io/chardev_srv.c
===================================================================
--- uspace/lib/c/generic/io/chardev_srv.c	(revision 19ea61d4d9f3c1ab64d2df09da1ad3f2772d554f)
+++ uspace/lib/c/generic/io/chardev_srv.c	(revision 57914494f0017d0618e3eaa16f2ae9c2fd1baefd)
@@ -48,4 +48,5 @@
 	void *buf;
 	size_t size;
+	size_t nread;
 	int rc;
 	ipc_callid_t rcallid;
@@ -70,6 +71,6 @@
 	}
 
-	rc = srv->srvs->ops->read(srv, buf, size);
-	if (rc < 0) {
+	rc = srv->srvs->ops->read(srv, buf, size, &nread);
+	if (rc != EOK && nread == 0) {
 		async_answer_0(rcallid, rc);
 		async_answer_0(callid, rc);
@@ -78,8 +79,8 @@
 	}
 
-	async_data_read_finalize(rcallid, buf, size);
+	async_data_read_finalize(rcallid, buf, nread);
 
 	free(buf);
-	async_answer_2(callid, EOK, EOK, rc /* nread */);
+	async_answer_2(callid, EOK, rc, nread);
 }
 
@@ -89,4 +90,5 @@
 	void *data;
 	size_t size;
+	size_t nwr;
 	int rc;
 
@@ -102,10 +104,12 @@
 	}
 
-	rc = srv->srvs->ops->write(srv, data, size);
+	rc = srv->srvs->ops->write(srv, data, size, &nwr);
 	free(data);
-	if (rc < 0)
+	if (rc != EOK && nwr == 0) {
 		async_answer_0(callid, rc);
+		return;
+	}
 
-	async_answer_2(callid, EOK, EOK, rc /* nwritten */);
+	async_answer_2(callid, EOK, rc, nwr);
 }
 
