xattr on jffs2

メモリリークの問題も解決したため、一連のパッチをgitツリーにpushする。

今回の修正点は以下の通り。


  1. DELETE MARKERの書き込みを、inodeからxattrを削除する時だけにする。

  2. 上記修正によって顕在化したメモリリークの問題を修正。

  3. jffs2_xattr_datum構造体のrefcntメンバをatomic_tに変更。

  4. Copyright表記の間違い修正。

  5. Kconfigで、NAND-Flashサポートと排他的に利用となっている設定を共存可能とした。

  6. その他 mtd-2.6 ツリーから pull したので、コードベースは2.6.17に変更。


修正点(1)は、対応するinodeやxattrの存在しないxattr_refがメディア上に存在していても、次回マウント時には無視されるために明示的にDELETE MARKERを書き込む必要がないというもの。jffs2で対応するディレクトリエントリが存在しない場合にinodeが無視される(sys_unlink時の処理)のと同様ですな。

修正点(2)は、ここ最近悩まされていた問題。例の、既に死んだinodeに関連付けられたxattr_refを解放しない場合の問題の対応です。

修正点(3)は、xattr_datumのrefcntを参照する場合にxattr_semセマフォを獲得できない場合があるために、これをatomic_t型で定義し直してアトミック操作で参照できるようにするもの。CRCエラーを検出した場合にだけ通るパスだが、こういったところで問題が発生すると非常に厄介なので事前の対策必須。

修正点(4)は、2006年に書いたコードのCopyright表示が2006になっていたというもの。安易なコピペ禁止w

最後の修正点は、DELETE MARKERを使った実装ベースに変わったことによって、NAND型Flashにも対応できるようになったことでfs/Kconfigの設定を一部変更した。mtd-2.6.git に入っている xattr 機能はversion.5ベースなので、XOR型Flashを前提にしたコーディングだったのだが、私の jffs2-xattr-2.6.git ツリーではそれを止めている(version.6ベース)。Linusのツリーにpullされる際にDavid Woodhouse氏が入れた変更だが、今回の修正で必要なくなったはず。

ちなみに、NAND型/XOR型で違うのはWrite Bufferingを行うかどうかということ。version.5以前はノードを消去する際に無効ビットでそこを上書きしていたが、NAND-Flashでは今アクティブな領域以外への書き込みは禁止される。このため、ノードを消去するために別の方法(バージョンによる管理)を使う必要があった。


で、これで一段落つくといいんだけどねー