Date: Tue, 27 Mar 2001 02:18:53 -0800 (PST) From: j.schripsema@kpn.com To: freebsd-gnats-submit@FreeBSD.org Subject: kern/26142: Unlink fails on NFS mounted filesystem Message-ID: <200103271018.f2RAIr213382@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 26142 >Category: kern >Synopsis: Unlink fails on NFS mounted filesystem >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Mar 27 02:30:04 PST 2001 >Closed-Date: >Last-Modified: >Originator: Jakob Schripsema >Release: 4.2-RELEASE >Organization: KPN >Environment: client: FreeBSD nfsclient 4.2-RELEASE FreeBSD 4.2-RELEASE #0: Mon Nov 20 13:02:55 GMT 2000 jkh@bento.FreeBSD.org:/usr/src/sys/compile/GENERIC i386 server: FreeBSD nfsserver 4.2-RELEASE FreeBSD 4.2-RELEASE #0: Mon Nov 20 13:02:55 GMT 2000 jkh@bento.FreeBSD.org:/usr/src/sys/compile/GENERIC i386 >Description: When removing all files in a large NFS mounted directory by calling readdir and unlink repeatedly files get skipped. It seems that this problem is related to problem kern/3381. I ran into this problem when running bonnie++ (www.cooker.com.au/bonnie++) on a NFS mounted filesystem. >How-To-Repeat: Run the attached program on the client. Uncomment the rewinddir call first. ---- snip ----- #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <dirent.h> #define BASEDIR "/FS/testdir" /* NFS mounted */ #define NFILES 1024 main() { create_files(); delete_files(); } create_files() { int i,fd; char buf[2048]; for(i = 0 ; i < NFILES ; i++) { snprintf(buf,2048,"%s/%04d",BASEDIR,i); if ((fd = open(buf,O_CREAT | O_TRUNC | O_WRONLY, 0644)) < 0) { perror(buf); return(-1); } close(fd); } } delete_files() { DIR *dirp; struct dirent *dp; char buf[2048]; if ((dirp = opendir(BASEDIR)) == NULL) { perror("opendir"); return (-1); } while ((dp = readdir(dirp)) != NULL) { if (dp->d_name[0] == '.') continue; snprintf(buf,2048,"%s/%s",BASEDIR,dp->d_name); fprintf(stderr,"%s\n",buf); if (unlink(buf) < 0) { perror(buf); return (-1); } /* Workaround */ /* rewinddir(dirp); */ /* End workaround */ } } >Fix: Call rewinddir after each unlink call. I consider this a workaround, not a fix. >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200103271018.f2RAIr213382>