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 677cad5e3bf910241afff855ef729cbe70035d68)
@@ -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);
 }
 
Index: uspace/lib/c/include/io/chardev_srv.h
===================================================================
--- uspace/lib/c/include/io/chardev_srv.h	(revision 19ea61d4d9f3c1ab64d2df09da1ad3f2772d554f)
+++ uspace/lib/c/include/io/chardev_srv.h	(revision 677cad5e3bf910241afff855ef729cbe70035d68)
@@ -59,6 +59,6 @@
 	int (*open)(chardev_srvs_t *, chardev_srv_t *);
 	int (*close)(chardev_srv_t *);
-	int (*read)(chardev_srv_t *, void *, size_t);
-	int (*write)(chardev_srv_t *, const void *, size_t);
+	int (*read)(chardev_srv_t *, void *, size_t, size_t *);
+	int (*write)(chardev_srv_t *, const void *, size_t, size_t *);
 };
 
