Date: Tue, 20 May 1997 16:24:03 +0000 From: Kachun Lee <kachun@zippo.com> To: dfr@nlsystems.com (Doug Rabson) Cc: freebsd-stable@freebsd.org Subject: Re: can anyone confirm my NFS/VM problem? Message-ID: <3.0.1.32.19970520162403.007167ec@dopey.pathlink.com>
next in thread | raw e-mail | index | archive | help
> Well I think I have a fix. It was bloody painful too. There were some > extremely ugly problems associated with NFS' use of b_validoff and > b_validend. I attempted to fix them but it still feels pretty fragile > although it does pass Ghristoph's test case. I am wondering if you would look into another problem related to NFS/MMAP. Accessing a mmap NFS file when the file is deleted from the server will result with following error: May 20 16:02:02 lacy /kernel: vnode_pager_getpages: I/O read error May 20 16:02:02 lacy /kernel: vm_fault: pager input (probably hardware) error, P ID 522 failure I applied the above patch to the lastest 22-releng and it did not fix this problem. I wrote a simple C program to duplicate the problem. It will open and mmap a file, read it, then wait for a key and read it again. So the file can be deleted between keys. BTW, I normally need to wait for 5+ minutes after the file is deleted before I can see the error message. Best regards PS: The NFSV3 diroff memory leak is resolved... thanks again. -------------------------------------------- #include <sys/types.h> #include <sys/mman.h> #include <sys/stat.h> #include <sys/uio.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <string.h> main(int ac, char **av) { int c; while(ac-- > 1) { ++av; int fdin = open(*av, O_RDONLY); if(fdin < 0) { fprintf(stderr,"Cannot open %s\n", *av); continue; } struct stat sb; if(fstat(fdin, &sb) < 0) { fprintf(stderr,"Cannot stat %s\n", *av); close(fdin); continue; } char * pmap = mmap(0, sb.st_size, PROT_READ, MAP_SHARED, fdin, 0); if(((int)pmap) < 0) { perror("Cannot map file"); close(fdin); continue; } for(c=0;c>=0;) { write(1, pmap, sb.st_size); while((c=getchar()) >= 0) if(c == '\n') break; extern int errno; if(fstat(fdin, &sb) < 0) fprintf(stderr, "fstat error: %s\n", strerror(errno)); } close(fdin); munmap(pmap, sb.st_size); } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3.0.1.32.19970520162403.007167ec>