link() not increasing link count on NFS server

Adam McDougall mcdouga9 at egr.msu.edu
Wed Nov 14 23:43:00 PST 2007


Hi, lately I've been trying to work out some NFS multiple access issues relating 
to the Dovecot IMAP server software.  One symptom seems to be an unusual behavior 
of FreeBSD NFS clients that I cannot reproduce with Linux or Solaris NFS clients.  
Basically, Timo (cc'ed) came up with a small test case that seems to indicate 
sometimes a link() call can succeed while the link count of the file will not 
increase.  If this is ran on two FreeBSD clients from the same NFS directory, you 
will occasionally see "link() succeeded, but link count=1".  I've tried both a 
Netapp and a FreeBSD NFS server.  I've tried FreeBSD 7_RELENG clients as well as 
FreeBSD 6.2-stable from this summer.  I've ran it on 32bit and 64bit clients.  
I've turned rpc.lockd on and off, tried tcp vs. udp mounts, nothing so far seems 
to make a difference, except perhaps FreeBSD 7.0 seems to produce the error less 
often.  If one of the processes is ran on a non-FreeBSD NFS cliemt, only the 
FreeBSD NFS client gives the link error.  Anyone have any input?  Thanks.


How to reproduce (local binary is fine too, may be required if different arch):
------------------

cp locktest.c /nfsserver
cd /nfsserver
gcc locktest.c -o locktest -Wall -g

On host 1:
cd /nfsserver
./locktest temp1

On host 2: (easiest to reproduce when starting just a few seconds after 1)
cd /nfsserver
./locktest temp2


Typical output (timing may vary):
----------------------------------

Host 1:

> /tmp/locktest temp1
5 successes
15 successes
unlink(): No such file or directory         (not a problem indication, happens
19 successes                                 when second process starts)
20 successes
link() succeeded, but link count=1
20 successes
link() succeeded, but link count=1
20 successes
33 successes
33 successes
link() succeeded, but link count=1
33 successes
45 successes
link() succeeded, but link count=1
45 successes
45 successes
link() succeeded, but link count=1
^C

Host 2:

> /tmp/locktest temp2
6 successes
15 successes
25 successes
38 successes
39 successes
50 successes
59 successes
link() succeeded, but link count=1
59 successes
69 successes
79 successes
91 successes
99 successes
109 successes
^C



More information about the freebsd-current mailing list