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
This commit is contained in:
parent
0e1cf9a328
commit
4af9705ceb
@ -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 */
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user