打开O_CREAT | 在Linux上的NFS的O_EXCL?

当在Linux 2.6内核和NFSv3中open("fname", O_CREAT|O_EXCL)有效? 目前的规范open(2)系统调用文档( http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html )说,一切都很好:

  - O_EXCL - ... On NFS, O_EXCL is only supported when using NFSv3 or later on kernel 2.6 or later. In NFS environments where O_EXCL support is not provided, programs that rely on it for performing locking tasks will contain a race condition. Portable programs that want to perform atomic file locking using a lockfile, and need to avoid reliance on NFS support for O_EXCL, can ... 

这看起来好像所有的2.6内核都可以,但是2.6.0版本的手册页更新日志 (ca late kernel 2.6.23)开始显示有效性,并且在上一年内networking上充斥着用户诟病这一使用的网页或两个。 我想在RHEL 5(2.6.18)系统上使用这个设置,但是当它真的变得安全的时候,我不能确定它。 有没有人有一个明确的答案?

显然,NFS家伙声称NFSv3和Linux 2.6.5上的任何东西都可以。

http://nfs.sourceforge.net/#faq_d10

  • D10。 我试图使用flock()/ BSD锁来锁定多个客户端上使用的文件,但文件被损坏。 怎么来的?
    • A. flock()/ BSD锁仅在本地2.6.12之前的Linux NFS客户机上运行。 使用fcntl()/ POSIX锁来确保文件锁对其他客户端可见。
    • 这里有一些序列化访问NFS文件的方法。
      • 使用fcntl()/ POSIX锁定API。 这种类型的锁定通过NLM协议或通过NFSv4提供跨多个客户端的字节范围锁定。
      • 使用一个单独的锁定文件,并创建它的硬链接。 请参阅creat(2)手册页的O_EXCL部分中的说明。
    • 值得注意的是,在早期的2.6内核之前,O_EXCL在Linux NFS客户端上创建的并不是原子的。 不要使用O_EXCL在多个NFS客户端之间创建和期望原子行为,除非您运行的内核比2.6.5更新。