tmpfs のバグのうち、未解決の symlink のバグについて、
modload により解決することができましたので、そのソースを公開します。
これは、以下の手順で現象が起きる tmpfs の symlink のバグを
解決するものです。
(/tmp is mounted as tmpfs)
$ cd /tmp
$ mkdir aaa
$ chmod -w aaa
$ cd aaa
$ ln -s bbb ccc # should be symbolic-link (not hard-link)
panic: kmem_free: block already free
なお、tmpfs には、他に fifo の hardlink のバグ
というものもあり、これについては、SunOS4.1.3 用の public patch の、
100507-06 を当てると直ります。(SunOS4.1.4 用はなぜかありませんので、
SunOS4.1.3 用をあえて当てるしかありません)
SunOS4.1.4 の symlink のバグは、vn_symlink() で、書き込み不可の
ディレクトリに symlink を作成しようとすると、本来なら
Permission denied となるべきところが、kmem の malloc/free で
辻褄が合わなくなり、panic するというものです。
そこでこの vn_symlink() を wrap して、修正コードを入れてやることに
しました。
そのための方法ですが、次のようにしました。
vn_mkdir() では、書き込み不可のディレクトリに対してディレクトリを
作ろうとすると、ちゃんと Permission denied となることがわかっています。
そこで、これを利用し、vn_symlink() が呼ばれたら、その symlink 名でまず
vn_mkdir() を呼び出して、仮にディレクトリとして作成してみて、
もしそれが書き込み不可で失敗した場合には、vn_symlink() を呼ばず、
そのままエラーコードを持ってリターンします。そして、ディレクトリ作成に
成功した場合は、vn_rmdir() を行なって仮のディレクトリを始末して
後は通常通り vn_symlink() を行なう・・という方法を考えました。
SunOS4.1.4 を御使用の方は是非 modload して御使用いただき、
動作レポート等いただければ幸いです。
また、もっと良い方法その他のアドバイス等ありましたらよろしくお願いします。
こちらでは sun4c 上で動作を確認しています。
sun4m の場合は、コンパイルの前に #define sun4m 付近を修正して下さい。
gcc でのコンパイルを考慮して、sun4c と __sun4c__ の両方を
#define しています。
${CC} -O2 -c tmpfs-symlink-fix.c
modload tmpfs-symlink-fix.o
とします。
このプログラム作成にあたり、tmpfs の fifo hardlink のバグを
修正するための 8lgm_tmpfs.c という名前で知られているプログラムを
参考にしました。
|