On Sat, Oct 08, 2005 at 09:11:03AM -0700, Linus Torvalds wrote:
>=20
> On Fri, 7 Oct 2005, Alex Riesen wrote:
> >=20
> > Make read_cache copy the index into memory, to improve portability on
> > other OS's which have mmap too, tend to use it less commonly.
>=20
> I really think that you should just get rid of the mmap.
>=20
> As it is, you're just slowing the code down on sane architectures. That'=
s=20
> not good.
>=20
> So I'd suggest something like this instead.
>=20
> Totally untested, of course.
>=20
> Linus
Slightly adjusted diff below so it compiles ;) (Note: only the second
die() un hunk #1 was changed.)
Best,
Elfyn
----
diff --git a/read-cache.c b/read-cache.c
--- a/read-cache.c
+++ b/read-cache.c
@@ -454,13 +454,39 @@ static int verify_hdr(struct cache_heade
return 0;
}
=20
+static void *map_index_file(int fd, size_t size)
+{
+ void *map;
+#ifdef NO_MMAP
+ map =3D malloc(size);
+ if (!map)
+ die("Unable to allocate index file mapping");
+ if (read(fd, map, size) !=3D size)
+ die("Unable to read %z bytes from index", size);
+#else
+ map =3D mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
+ if (map =3D=3D MAP_FAILED)
+ die("index file mmap failed (%s)", strerror(errno));
+#endif
+ return map;
+}
+
+static void unmap_index_file(void *map, size_t size)
+{
+#ifdef NO_MMAP
+ free(map);
+#else
+ munmap(map, size);
+#endif
+}
+
int read_cache(void)
{
int fd, i;
struct stat st;
unsigned long size, offset;
- void *map;
struct cache_header *hdr;
+ void *map;
=20
errno =3D EBUSY;
if (active_cache)
@@ -475,16 +501,15 @@ int read_cache(void)
}
=20
size =3D 0; // avoid gcc warning
- map =3D MAP_FAILED;
- if (!fstat(fd, &st)) {
- size =3D st.st_size;
- errno =3D EINVAL;
- if (size >=3D sizeof(struct cache_header) + 20)
- map =3D mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
- }
+ if (fstat(fd, &st))
+ die("unable to fstat index file");
+
+ size =3D st.st_size;
+ errno =3D EINVAL;
+ if (size < sizeof(struct cache_header) + 20)
+ goto corrupt;
+ map =3D map_index_file(fd, size);
close(fd);
- if (map =3D=3D MAP_FAILED)
- die("index file mmap failed (%s)", strerror(errno));
=20
hdr =3D map;
if (verify_hdr(hdr, size) < 0)
@@ -503,8 +528,9 @@ int read_cache(void)
return active_nr;
=20
unmap:
- munmap(map, size);
+ unmap_index_file(map, size);
errno =3D EINVAL;
+corrupt:
die("index file corrupt");
}
--=20
Elfyn McBratney
Gentoo Developer/Perl Team Lead
beu/irc.freenode.net http://dev.gentoo.org/~beu/
+------------O.o--------------------- http://dev.gentoo.org/~beu/pubkey.asc
PGP Key ID: 0x69DF17AD
PGP Key Fingerprint:
DBD3 B756 ED58 B1B4 47B9 B3BD 8D41 E597 69DF 17AD
| Glauber de Oliveira Costa | [PATCH 5/25] [PATCH] native versions for system.h functions |
| Paul Menage | Re: [RFC][PATCH 6/7] Account for the number of tasks within container |
| Tejun Heo | [PATCHSET] CUSE: implement CUSE |
| Al Boldi | Re: CFS review |
git: | |
| Ken Pratt | pack operation is thrashing my server |
| Linus Torvalds | Re: git and time |
| Michael Witten | Re: Proposed git mv behavioral change |
| Johannes Schindelin | Re: I'm a total push-over.. |
| GVG GVG | ssh_exchange_identification: Connection closed by remote host |
| Bertram Scharpf | First install: Grub doesn't find partitions |
| Chris Bullock | OpenBSD isakmpd and pf vs Cisco PIX or ASA |
| Axton | Re: rouge IPs / user |
| hooanon05 | [PATCH 62/67] aufs magic sysrq handler |
| David Howells | [PATCH 06/17] BLOCK: Move bdev_cache_init() declaration to headerfile [try #2] |
| Miklos Szeredi | [PATCH] update ctime and mtime for mmaped write |
| Linus Torvalds | Re: silent semantic changes with reiser4 |
