diff options
author | peter <peter@FreeBSD.org> | 1997-03-31 16:43:16 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1997-03-31 16:43:16 +0000 |
commit | 3e63a14f34ec33ecb046158328122a09db58c4d7 (patch) | |
tree | 52c98843ab1e298b7a62b6ceba0975a13513c1d6 /sbin | |
parent | 1cce6194df5fbb55819ef53aa95268ae54061b13 (diff) | |
download | FreeBSD-src-3e63a14f34ec33ecb046158328122a09db58c4d7.zip FreeBSD-src-3e63a14f34ec33ecb046158328122a09db58c4d7.tar.gz |
Fix the mount_mfs case from the last cleanup. The code was (ab)using
it's internal malloc() implementation to try and avoid overstepping it's
resource limits (yuk!). Remain using libc's malloc(), but check the
resource limits right before trying to malloc the ramdisk space and leave
some spare memory for libc. In Andrey's words, the internal malloc
was "true evil".. Among it's sins is it's ability to allocate less memory
than asked for and still return success. stdio would just love that. :-)
Reviewed by: ache
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/newfs/mkfs.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c index 1dbc3a5..0c6c1d7 100644 --- a/sbin/newfs/mkfs.c +++ b/sbin/newfs/mkfs.c @@ -206,7 +206,10 @@ mkfs(pp, fsys, fi, fo) } close(fd); } else { - if (fssize * sectorsize > memleft) +#ifndef STANDALONE + get_memleft(); +#endif + if (fssize * sectorsize > (memleft - 16384)) fssize = (memleft - 16384) / sectorsize; if ((membase = malloc(fssize * sectorsize)) == 0) { perror("malloc"); @@ -1210,6 +1213,19 @@ raise_data_limit() perror("setrlimit"); } +get_memleft() +{ + char *base; + static u_long pgsz, i; + struct rlimit rlp; + + base = sbrk(0); + pgsz = getpagesize() - 1; + i = ((u_long)(base + pgsz) &~ pgsz); + if (getrlimit(RLIMIT_DATA, &rlp) < 0) + perror("getrlimit"); + memleft = rlp.rlim_cur - (u_long)base - i; +} #endif /* STANDALONE */ /* |