On Mon, Feb 18, 2019 at 05:11:47PM +0800, Gefei Li wrote: > I am recently testing linux nfs lock with NFS share from a WinServer > 2016. I tried to write a file which has already been locked with fcntl > exclusively, but the response of `write` syscall is neither > `Permission denied`, nor successfully written with file content > changed. Here is several experiments I did: > > The first shell runs c program, calling `fcntl` to lock file > exclusively “fcntl(fd, F_SETLKW, &fl)” > > 2.1 The second shell tried to open with flag O_RDWR, and write a > buffer to the same file, write returned the correct bytes written, but > the file content remained unchanged. You're checking the file content on the server somehow? The client's caching the write--it returns success to the application and then sends the actual write to the server later. Anything else will hurt performance of a lot of applications. > 2.2 The second shell tried to open with flag O_RDWR|O_SYNC, write the > same buffer to the same file, write operation returned EAGAIN > 2.3 The same operation on ext4 file system gives me a expected > behavior the same as advisory lock expressed, successfully written > with file content changed. > > I reviewed NFS 4.1 protocol(RFC 5661 page 185), the nfs server can > determine whether byte range lock can be either mandatory or advisory, > but I think 2.1 and 2.2 gives me some unexpected behavior as these > two.. What’s your idea about this? Can you give me some tips to work > this out? There's also section 10.3.3, but I never understood how that was really supposed to work. It recommends the client turn off caching when mandatory locking is in effect--but the only way it gives the client that mandatory locking is in effect is by seeing an ERR_LOCKED reply to a READ or WRITE, and by that point it's too late. Anyway, as far as I can tell the results you report are what's expected. --b. > Looking forward for your reply. Thanks in advance! > > BTW, my linux kernel version is 4.15.0, linux release: ubuntu 16.04 > from Azure marketplace, my nfs-common version is > "nfs-common/xenial-updates,now 1:1.2.8-9ubuntu12.1 amd64" from ubuntu > apt repo. > > Thanks, > Gefei