Hatena::ブログ(Diary)

めもめも

2012-03-09

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;


説明

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

f:id:enakai00:20120309073514p:image:w360


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


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


一般にUnix/LinuxNFSクライアントでは、ファイル/ディレクトリの削除については、NFSサーバから「ACCESS3_MODIFY」というフラグが返ると、権限があるものと認識します。ところが、WindowsNFSクライアントでは、「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

村上 守村上 守 2012/03/29 18:05 こんな感じで3.2.1用も作ってみました。

diff -rc glusterfs-3.2.1/xlators/nfs/server/src/nfs3-helpers.c glusterfs-3.2.1.cleria/xlators/nfs/server/src/nfs3-helpers.c
*** glusterfs-3.2.1/xlators/nfs/server/src/nfs3-helpers.c 2011-06-11 01:59:07.000000000 +0900
--- glusterfs-3.2.1.cleria/xlators/nfs/server/src/nfs3-helpers.c 2012-03-29 17:25:01.279753701 +0900
***************
*** 587,592 ****
--- 587,594 ----
/* ACCESS3_DELETE is ignored for now since that requires
* knowing the permissions on the parent directory.
*/
+ if (IA_PROT_WUSR (prot) && (request & ACCESS3_DELETE)) /* Tentative patch for Windows NFS client */
+ accresult |= ACCESS3_DELETE; /* Patched by mamoru.murakami@ntt.com */

if (request & ACCESS3_EXECUTE)
if (IA_PROT_XUSR (prot) && (!IA_ISDIR (type)))
***************
*** 617,622 ****
--- 619,626 ----
/* ACCESS3_DELETE is ignored for now since that requires
* knowing the permissions on the parent directory.
*/
+ if (IA_PROT_WGRP (prot) && (request & ACCESS3_DELETE)) /* Tentative patch for Windows NFS client */
+ accresult |= ACCESS3_DELETE; /* Patched by mamoru.murakami@ntt.com */

if (request & ACCESS3_EXECUTE)
if (IA_PROT_XGRP (prot) && (!IA_ISDIR (type)))
***************
*** 647,652 ****
--- 651,658 ----
/* ACCESS3_DELETE is ignored for now since that requires
* knowing the permissions on the parent directory.
*/
+ if (IA_PROT_WOTH (prot) && (request & ACCESS3_DELETE)) /* Tentative patch for Windows NFS client */
+ accresult |= ACCESS3_DELETE; /* Patched by mamoru.murakami@ntt.com */

if (request & ACCESS3_EXECUTE)
if (IA_PROT_XOTH (prot) && (!IA_ISDIR (type)))
***************
*** 677,682 ****
--- 683,690 ----
/* ACCESS3_DELETE is ignored for now since that requires
* knowing the permissions on the parent directory.
*/
+ if (request & ACCESS3_DELETE) /* Tentative patch for Windows NFS client */
+ accresult |= ACCESS3_DELETE; /* Patched by mamoru.murakami@ntt.com */

if (request & ACCESS3_EXECUTE)
if ((IA_PROT_XOTH (prot) || IA_PROT_XUSR (prot) ||

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/enakai00/20120309/1331247250