Hatena::Groupfilesystem

fs_n314

2008-04-11

どこでモジュール利用カウントが増減するか

| 17:13 |  どこでモジュール利用カウントが増減するか - fs_n314 を含むブックマーク はてなブックマーク -  どこでモジュール利用カウントが増減するか - fs_n314

インクリメントは sget() → get_filesystem() で。

デクリメントは put_filesystem() だが、これはどこから呼ばれるのか。

drop_super() ではないっぽい。


調べた結果、deactivate_super() から呼ばれていた。


ここでの問題点は、sget()は通常、ファイルシステム関数から呼び出すのに対し、deactivate_super() は VFS__mntput() から呼ばれるという点。

で、deactivate_super() はファイルシステム側でどういう時に使うのかと言うと、マウント時の sget() 成功後に何らかのエラーマウント失敗を返す場合、エラー後処理として呼んでいる。


要するに二回以上 sget() した場合は アンマウント時に deactive_super() を呼ばなければいけない。

しかし、それだとVFSの設計に合わない。と思う。2回以上も sget() を呼んではいけない。ファイルシステムを複数扱う場合は sget() 相当の処理(compire, fill, ...)を作って代わりに使うのが良さそう。




しかし・・まだマウントされていない他のファイルシステム情報を使いたい場合、やはりsget()を2回呼ぶのが楽ではある。

独自にやる場合は全ての関数の修正が必要?


deactivate_super()を書く一行上には up_write() を忘れずに記述する。

トラックバック - http://filesystem.g.hatena.ne.jp/n314/20080411

2008-02-29

一般的なファイルシステムとnfsはマウントオプションデータが違う

| 16:58 |  一般的なファイルシステムとnfsはマウントオプションデータが違う - fs_n314 を含むブックマーク はてなブックマーク -  一般的なファイルシステムとnfsはマウントオプションデータが違う - fs_n314

util-linuxのmount.cやnfsmount.cを眺めていて分かったこと。

一般的なファイルシステムでは

mount -t hogefs -o hogeops=1 src dir

この場合の hogeops=1 がファイルシステム側の所謂 void *raw_data に渡される。

これは単純に

char *data = raw_data;

というように利用する。


nfsの場合は、mountコマンドの中でrpcを発行してそこで得たデータを構造体に格納し、それをマウントオプションとしてファイルシステムに渡している。

だからファイルシステム側では

struct nfs_mount_data *data = raw_data;

となる。


つまり、nfsのようなことをしたくなったら、mountコマンドの修正が必要、または独自にマウントを行う(マウントオプション構造体を生成する)プログラムが必要となる。

トラックバック - http://filesystem.g.hatena.ne.jp/n314/20080229
日記の検索