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>