めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Gluster3.2.5のWindows NFSクライアントに関するパッチ

Gluster3.2.5 + Windows Server 2008 R2(NFS Client)の環境でファイル/フォルダが削除できないという問題に遭遇したので、ワークアラウンドのパッチを書きました。

[root@piyodesk glusterfs-3.2.5]# diff -uprN xlators/nfs/server/src/nfs3-helpers.c.orig xlators/nfs/server/src/nfs3-helpers.c
--- xlators/nfs/server/src/nfs3-helpers.c.orig	2012-03-09 07:27:02.979568607 +0900
+++ xlators/nfs/server/src/nfs3-helpers.c	2012-03-09 07:28:01.889112681 +0900
@@ -578,7 +578,7 @@ nfs3_accessbits (int32_t accbits)
                 accresult |= ACCESS3_READ;
 
         if (accbits & POSIX_WRITE)
-                accresult |= (ACCESS3_MODIFY | ACCESS3_EXTEND);
+                accresult |= (ACCESS3_MODIFY | ACCESS3_EXTEND | ACCESS3_DELETE);
 
         /* lookup on directory allowed only in case of execute permission */
         if (accbits & POSIX_EXEC)
@@ -595,7 +595,7 @@ nfs3_request_to_accessbits (int32_t accb
         if (accbits & ACCESS3_READ)
                 acc_request |= POSIX_READ;
 
-        if (accbits & (ACCESS3_MODIFY | ACCESS3_EXTEND))
+        if (accbits & (ACCESS3_MODIFY | ACCESS3_EXTEND | ACCESS3_DELETE))
                 acc_request |= POSIX_WRITE;

説明

本パッチ適用前は、ファイル/フォルダを削除しようとすると、こんな感じのエラーが出ます。

NFSv3では、クライアントがファイルアクセスを行う前に、アクセス権限の確認をサーバに対して行います。ここで必要な権限が得られないと、クライアントは上記のようなエラーを返して実際のアクセス処理は行いません。無事に権限が得られると、実際にアクセス処理を行います。

この時、最初に行われるアクセス権限確認は、実際のNFSサーバ上でのUnix/Linuxとしてのアクセス権限の有無とは独立して行われます。ローカルのUnix/Linuxとしてはアクセス権限があってもNFS経由ではアクセスさせたくない、などのアクセス制御を行うことが目的です。

一般にUnix/LinuxのNFSクライアントでは、ファイル/ディレクトリの削除については、NFSサーバから「ACCESS3_MODIFY」というフラグが返ると、権限があるものと認識します。ところが、WindowsのNFSクライアントでは、「ACCESS3_DELETE」というフラグでファイル/ディレクトリの削除権限の確認を行なうようです。(どちらの実装もNFSv3のRFCとは微妙にずれているので、どちらが正解と言えるものでもなさそうですが。。。)

Gluster3.2.5のNFSサーバは、「ACCESS3_DELETE」フラグを返していないのが前述のエラーの原因のようでしたので、「ACCESS3_MODIFY」とあわせて「ACCESS3_DELETE」も返すようにしたのが上記のパッチです。

Gluster3.2.1あたりは、xlators/nfs/server/src/nfs3-helpers.cの実装が若干違うので、上記のパッチをそのまま適用することはできませんが、本質的には同じ問題ですので、「ACCESS3_DELETE」フラグを返すように修正すればOKなはずです。。。

注意

前掲のパッチは、本ブログの筆者が独自に書いたものですので、ご利用にあたっては自己責任でお願いします。(某社が開発中のGlusterFS関連製品とは、一切関係ありません。同じ問題に対するパッチは入るとおもいますが、これと同じパッチかどうかは分かりません。。。。)

追記(2012/03/31)

Upstreamには同じパッチが入りました。http://review.gluster.com/#change,2872