Date: Fri, 24 Jan 1997 17:57:03 -0800 (PST) From: dunc@netcom.com To: freebsd-gnats-submit@freebsd.org Subject: kern/2573: mmap on nfs mounted file hangs system Message-ID: <199701250157.RAA09644@freefall.freebsd.org> Resent-Message-ID: <199701250200.SAA09892@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 2573
>Category: kern
>Synopsis: mmap on nfs mounted file hangs system
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Jan 24 18:00:01 PST 1997
>Last-Modified:
>Originator: Kevet Duncombe
>Organization:
Filoli Information Systems
>Release: FreeBSD 2.1.5-RELEASE
>Environment:
FreeBSD falcon.filoli.com 2.1.5-RELEASE FreeBSD 2.1.5-RELEASE #2: Mon Jan 13 17:05:44 PST 1997
>Description:
I create a file, mmap it, then use that as the buffer for a read;
when the read is done, I msync, munmap, and have my bytes copied
to disk. If I create the file on a local disk, it runs fine and
a cat of the file shows all the expected data. When I create it
in my nfs mounted home directory, though, the system locks up.
Since I don't have X installed I mostly work via rsh from a Next
box nearby. All those rsh sessions freeze; so does the top left
running on the console. Attempts to rsh or telnet to it connect
but immediately hang. Ping works, and Alt-F? switches among the
virtual consoles, but those are the only signs of life as far as
I can see. Reset is the only escape I've found.
I stripped the code to a short example. For what it's worth, I
also tried it on a Sun and had no problem, so I'm pretty sure it
is the FreeBSD end and not the server end that's acting up.
>How-To-Repeat:
1) compile the following program
2) run it to create file "deleteme"
3) cat deleteme
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#ifdef __FreeBSD__
#include <err.h>
#else
void
err(int ret,char *msg)
{
fprintf(stderr,"%s: %s\n",msg,strerror(errno));
exit(ret);
}
#endif
void
main()
{
char *filebuf;
char zero = 0;
int filelen = 603; /* not magic as far as I know */
int src = open("/dev/zero",O_RDONLY);
int dst = open("deleteme",O_CREAT|O_TRUNC|O_RDWR,0644);
if (src == -1)
err(1,"can't open input file");
if (dst == -1)
err(1,"can't open output file");
if (lseek(dst,filelen-1,SEEK_SET) == -1)
err(1,"can't seek output file to filelen");
if (write(dst,&zero,1) != 1)
err(1,"can't extend output file to filelen");
filebuf = mmap(0,filelen,PROT_READ|PROT_WRITE,MAP_SHARED,dst,0);
if ((long)filebuf == -1)
err(1,"can't mmap file");
/*
if (close(dst) == -1)
err(1,"can't close output file");
*/
if (read(src,filebuf,filelen) != filelen)
err(1,"error reading file from jukeomatic");
if (msync((caddr_t)filebuf,filelen,0) == -1)
err(1,"can't msync mmap'd output file");
if (munmap((caddr_t)filebuf,filelen) == -1)
err(1,"can't munmap mmap'd output file");
}
>Fix:
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199701250157.RAA09644>
