Thread (40 messages) flat view 40 messages, 6 authors, 2016-06-15

Re: [PATCH 08/11] streaming_write_entry(): support files with holes

From: Thiago Farina <hidden>
Date: 2016-06-15 22:51:15

On Sun, May 15, 2011 at 9:30 PM, Junio C Hamano [off-list ref] wrote:
quoted hunk ↗ jump to hunk
One typical use of a large binary file is to hold a sparse on-disk hash
table with a lot of holes. Help preserving the holes with lseek().

Signed-off-by: Junio C Hamano <redacted>
---
 entry.c |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)
diff --git a/entry.c b/entry.c
index 7733a6b..d50e388 100644
--- a/entry.c
+++ b/entry.c
@@ -123,6 +123,7 @@ static int streaming_write_entry(struct cache_entry *ce, char *path,
       enum object_type type;
       unsigned long sz;
       int result = -1;
+       ssize_t kept = 0;
       int fd = -1;

       st = open_istream(ce->sha1, &type, &sz);
@@ -137,17 +138,32 @@ static int streaming_write_entry(struct cache_entry *ce, char *path,
       for (;;) {
               char buf[10240];
-               ssize_t wrote;
+               ssize_t wrote, holeto;
               ssize_t readlen = read_istream(st, buf, sizeof(buf));

               if (!readlen)
                       break;
+               for (holeto = 0; holeto < readlen; holeto++)
+                       if (buf[holeto])
+                               break;
+               if (readlen == holeto) {
+                       kept += holeto;
+                       continue;
+               }

+               if (kept && lseek(fd, kept, SEEK_CUR) == (off_t) -1)
+                       goto close_and_exit;
+               else
+                       kept = 0;
               wrote = write_in_full(fd, buf, readlen);

               if (wrote != readlen)
                       goto close_and_exit;
       }
+       if (kept &&
+           ((  lseek(fd, kept - 1, SEEK_CUR) == (off_t) -1)
There is an extra whitespace after ((
+            || write(fd, "", 1) != 1))
+               goto close_and_exit;
       *fstat_done = fstat_output(fd, state, statbuf);

 close_and_exit:
--
1.7.5.1.365.g32b65

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help