nginx-0.0.3-2004-04-28-10:14:50 import
diff --git a/src/os/unix/ngx_readv_chain.c b/src/os/unix/ngx_readv_chain.c
index 49bb3ef..86f774a 100644
--- a/src/os/unix/ngx_readv_chain.c
+++ b/src/os/unix/ngx_readv_chain.c
@@ -173,13 +173,16 @@
     do {
         n = readv(c->fd, (struct iovec *) io.elts, io.nelts);
 
-        if (n >= 0) {
-            if (n < size) {
-                rev->ready = 0;
-            }
+        if (n == 0) {
+            rev->ready = 0;
+            rev->eof = 1;
 
-            if (n == 0) {
-                rev->eof = 1;
+            return n;
+
+        } else if (n > 0) {
+
+            if (n < size && !(ngx_event_flags & NGX_HAVE_GREEDY_EVENT)) {
+                rev->ready = 0;
             }
 
             return n;
diff --git a/src/os/unix/ngx_recv.c b/src/os/unix/ngx_recv.c
index 6345350..04b594f 100644
--- a/src/os/unix/ngx_recv.c
+++ b/src/os/unix/ngx_recv.c
@@ -126,13 +126,17 @@
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "recv: fd:%d %d of %d", c->fd, n, size);
 
-        if (n >= 0) {
-            if ((size_t) n < size) {
-                rev->ready = 0;
-            }
+        if (n == 0) {
+            rev->ready = 0;
+            rev->eof = 1;
+            return n;
 
-            if (n == 0) {
-                rev->eof = 1;
+        } else if (n > 0) {
+
+            if ((size_t) n < size
+                && !(ngx_event_flags & NGX_HAVE_GREEDY_EVENT))
+            {
+                rev->ready = 0;
             }
 
             return n;