"Shawn O. Pearce" <spearce@xxxxxxxxxxx> writes: > "Shawn O. Pearce" <spearce@xxxxxxxxxxx> wrote: >> Bill Lear <rael@xxxxxxxxxx> wrote: >> > Using 1.5.0.1. Can't see what is wrong with this clone... >> ... >> > Indexing 4589 objects. >> > remote: Total 4589 (delta 2209), reused 4589 (delta 2209) >> > 100% (4589/4589) done >> > Resolving 2209 deltas. >> > fatal: cannot pread pack file: Success >> > fatal: index-pack died with error code 128 >> > fetch-pack from '/home/rael/devel/project/.git' failed. >> >> I think the pread() in get_data_from_pack of index-pack is wrong, >> it really should be looping until we fill the buffer in case the >> OS doesn't fully satisfy our read request the first time. The patch looks correct, even if this was not the problem Bill is suffering from. > [PATCH] index-pack: Loop over pread until data loading is complete. > > A filesystem might not be able to completely supply our pread > request in one system call, such as if we are reading data from a > network file system and the requested length is just simply huge. > > Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> > --- > index-pack.c | 10 ++++++++-- > 1 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/index-pack.c b/index-pack.c > index 859ec01..cf81a99 100644 > --- a/index-pack.c > +++ b/index-pack.c > @@ -277,13 +277,19 @@ static void *get_data_from_pack(struct object_entry *obj) > { > unsigned long from = obj[0].offset + obj[0].hdr_size; > unsigned long len = obj[1].offset - from; > + unsigned long rdy = 0; > unsigned char *src, *data; > z_stream stream; > int st; > > src = xmalloc(len); > - if (pread(pack_fd, src, len, from) != len) > - die("cannot pread pack file: %s", strerror(errno)); > + data = src; > + do { > + ssize_t n = pread(pack_fd, data + rdy, len - rdy, from + rdy); > + if (n <= 0) > + die("cannot pread pack file: %s", strerror(errno)); > + rdy += n; > + } while (rdy < len); > data = xmalloc(obj->size); > memset(&stream, 0, sizeof(stream)); > stream.next_out = data; > -- > 1.5.0.2.775.g1a500 > > -- > Shawn. - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html