открыть O_CREAT | O_EXCL на NFS в Linux?

Когда в ядре 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.23) начинает указывать срок действия четыре года после запуска 2.6.0, и в Интернете полно пользователей форумов, осуждающих такое использование в течение последнего года или двух. Я хотел бы использовать эту настройку в системах RHEL 5 (2.6.18), но я не мог определить, когда она действительно стала безопасной. У кого-нибудь есть однозначный ответ?


person Jeff    schedule 04.08.2010    source источник
comment
Есть ли где-нибудь вопрос по программированию?   -  person Gabe    schedule 04.08.2010
comment
Я имел в виду именно это в первом предложении. Поскольку люди могут задавать вопросы о таких вещах, как std::fstream::fstream(char const *, ios_base::openmode) в стандартной библиотеке C ++, я надеялся, что стандартная библиотека C была открытой игрой, даже в отношении параметров, не относящихся к POSIX.   -  person Jeff    schedule 04.08.2010
comment
Сопроводительный текст был существенно сокращен для большей ясности, если это было изначальной проблемой.   -  person Jeff    schedule 04.08.2010
comment
Закрывает оффтоп совершенно не так. Как безопасно использовать файлы блокировки по NFS - это определенно вопрос программирования.   -  person caf    schedule 05.08.2010


Ответы (1)


Судя по всему, разработчики NFS утверждают, что все, начиная с NFSv3 и Linux 2.6.5, подходит.

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

  • D10. I'm trying to use flock()/BSD locks to lock files used on multiple clients, but the files become corrupted. How come?
    • A. flock()/BSD locks act only locally on Linux NFS clients prior to 2.6.12. Use fcntl()/POSIX locks to ensure that file locks are visible to other clients.
    • Here are some ways to serialize access to an NFS file.
      • Use the fcntl()/POSIX locking API. This type of locking provides byte-range locking across multiple clients via the NLM protocol, or via NFSv4.
      • Используйте отдельный файл блокировки и создайте на него жесткие ссылки. См. Описание в разделе O_EXCL на странице руководства по creat (2).
    • Стоит отметить, что до ранних ядер 2.6, создание O_EXCL не было атомарным на клиентах Linux NFS. Не используйте O_EXCL для создания и ожидайте атомарного поведения среди нескольких клиентов NFS, если вы не используете ядро ​​новее, чем 2.6.5.
    • ...
person Jeff    schedule 04.08.2010