diff --git a/src/io.c b/src/io.c
index 3b8ebb22624c75c352be683aa9e51b7c2c1e2c76..d75450007b04d4dcd0234860c2f3fd9c4c34fd6e 100644
--- a/src/io.c
+++ b/src/io.c
@@ -324,8 +324,8 @@ static void write_callback(struct lsh_fd *fd)
       case EAGAIN:
 	break;
       case EPIPE:
-	werror("Broken pipe\n");
-	close_fd(fd, CLOSE_WRITE_FAILED);
+	debug("io.c: Broken pipe.\n");
+	close_fd(fd, CLOSE_BROKEN_PIPE);
 	break;
       default:
 	werror("io.c: write failed, %s\n", strerror(errno));
@@ -649,7 +649,7 @@ static void prepare_write(struct lsh_fd *fd)
 
   if (! (fd->want_write = write_buffer_pre_write(self->buffer))
       && self->buffer->closed)
-    kill_fd(fd);
+    close_fd(fd, CLOSE_EOF);
 }
   
 struct abstract_write *io_read_write(struct io_backend *b,
diff --git a/src/io.h b/src/io.h
index f53b4b0bdbf0d0a0350a76ad5cf961c699ee920c..3a971fc76143163e9d865683699ef8d703ac6edc 100644
--- a/src/io.h
+++ b/src/io.h
@@ -50,7 +50,9 @@
 
 /* Close callbacks are called with a reason as argument. */
 
-/* End of file while reading */
+/* End of file while reading.
+ * Or when a closed write_buffer has been flushed successfully. */
+/* FIXME: Should we use separate codes for these two events? */
 #define CLOSE_EOF 1
 
 /* EPIPE when writing */