register int i, nwrite, ret;
char buf[80];
extern int errno;
+ /* This is the normal amount to write at once.
+ It is the size of block that NFS uses. */
+ int writesize = 1 << 13;
int pagesize = getpagesize ();
- char *zeros = (char *) alloca (pagesize);
+ char zeros[1 << 13];
- bzero (zeros, pagesize);
+ bzero (zeros, sizeof (zeros));
for (i = 0; ptr < end;)
{
- /* distance to next multiple of pagesize. */
- nwrite = (((int) ptr + pagesize) & -pagesize) - (int) ptr;
+ /* Distance to next multiple of writesize. */
+ nwrite = (((int) ptr + writesize) & -writesize) - (int) ptr;
/* But not beyond specified end. */
if (nwrite > end - ptr) nwrite = end - ptr;
ret = write (new, ptr, nwrite);
&& errno == EFAULT
#endif
)
- write (new, zeros, nwrite);
+ {
+ /* Write only a page of zeros at once,
+ so that we we don't overshoot the start
+ of the valid memory in the old data segment. */
+ if (nwrite > pagesize)
+ nwrite = pagesize;
+ write (new, zeros, nwrite);
+ }
+#if 0 /* Now that we have can ask `write' to write more than a page,
+ it is legit for write do less than the whole amount specified. */
else if (nwrite != ret)
{
sprintf (buf,
ptr, new, nwrite, ret, errno);
PERROR (buf);
}
+#endif
i += nwrite;
ptr += nwrite;
}