--- sendfile.c.orig	2012-08-07 00:01:17.579120458 -0700
+++ sendfile.c	2012-08-07 00:41:04.423187852 -0700
@@ -88,21 +88,24 @@ ssize_t uwsgi_do_sendfile(int sockfd, in
 	return sf_len;
 
 #elif defined(__linux__) || defined(__sun__)
-	int sf_ret;
+	size_t sf_total = 0;
+	size_t tosend;
 
 	if (async > 1) {
-		sf_ret = sendfile(sockfd, filefd, pos, chunk);
+		tosend = chunk;
+	} else {
+		tosend = filesize;
 	}
-	else {
-		sf_ret = sendfile(sockfd, filefd, pos, filesize);
+	while (sf_total < tosend) {
+		ssize_t sf_ret = sendfile(sockfd, filefd, pos, tosend - sf_total);
+		if (sf_ret < 0) {
+			uwsgi_error("sendfile()");
+			return 0;
+		}
+		sf_total += sf_ret;
 	}
 
-	if (sf_ret < 0) {
-		uwsgi_error("sendfile()");
-		return 0;
-	}
-
-	return sf_ret;
+	return sf_total;
 #else
 	static size_t nosf_buf_size = 0;
 	static char *nosf_buf;
