檔案鎖釋出說明

Andy Walker <andy@lysaker.kvaerner.no>

1997年5月12日

1. 新特性?

1.1 損壞的Flock模擬

核心中的舊 flock(2) 模擬在1.3.x系列的核心中被替換為正確的BSD相容的 flock(2) 支援。隨著2.1.x核心系列的釋出,對舊模擬的支援已完全刪除,因此我們無需永遠攜帶此包袱。

這不應該給任何人帶來問題,因為使用2.1.x核心的每個人都應該已將其C庫更新到合適的版本(請參閱檔案“編譯核心的最低要求”。)

1.2 再次允許混合鎖

1.2.1 典型問題 - Sendmail

由於 sendmail 無法使用舊的 flock() 模擬,因此許多 sendmail 安裝使用 fcntl() 而不是 flock()。例如,Slackware 3.0 就是如此。如果 sendmail 配置為重建別名檔案,則會出現一些其他微妙的問題。 Sendmail 嘗試使用 fcntl() 鎖定 aliases.dir 檔案,同時 GDBM 例程嘗試使用 flock() 鎖定此檔案。 在 1.3.96 之前的核心中,這可能導致死鎖,隨著時間的推移或在非常大的郵件負載下,最終會導致核心因死鎖程序而完全鎖定。

1.2.2 解決方案

經過大量的實驗和討論後,我選擇的解決方案是使 flock() 和 fcntl() 鎖彼此忽略。 兩者都可以存在,並且都不會對另一個產生任何影響。

我希望兩種鎖定方式能夠協同工作,但是存在太多的競爭和死鎖情況,以至於當前的解決方案是唯一可行的解決方案。 這使我們處於與 SunOS 4.1.x 和其他一些商業 Unix 相同的位置。 唯一支援協同 flock()/fcntl() 的作業系統是那些使用 fcntl() 模擬 flock() 的作業系統,這帶來了所有隱含的問題。

1.3 作為掛載選項的強制鎖定

在此版本之前,強制鎖定是一個適用於所有已掛載檔案系統的通用配置選項。 這存在許多固有的危險,其中最重要的是能夠透過要求 NFS 伺服器讀取存在強制鎖的檔案來凍結 NFS 伺服器。

該選項已在 Kernel v5.14 中刪除。