summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1997-03-31 16:43:16 +0000
committerpeter <peter@FreeBSD.org>1997-03-31 16:43:16 +0000
commit3e63a14f34ec33ecb046158328122a09db58c4d7 (patch)
tree52c98843ab1e298b7a62b6ceba0975a13513c1d6 /sbin
parent1cce6194df5fbb55819ef53aa95268ae54061b13 (diff)
downloadFreeBSD-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.c18
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 */
/*
OpenPOWER on IntegriCloud