ひらメソド

マクロを書くかどうか悩み中。

結局

書いた。lookup_bdev() をこつこつ掘り中。

i_mode

先頭 4bits の bitmap 的には

  • 0001:FIFO
  • 0010:キャラクタデバイス
  • 0100:ディレクトリ
  • 0110:ブロックデバイス
  • 1000:通常のファイル
  • 1010:シンボリックリンク
  • 1100:ソケット

という形になるはず。
で、S_ISBLK なマクロを作ってて気がついたんですが、スデに存在してた (とほほ

以下のエラーチェック

	if (nd.mnt->mnt_flags & MNT_NODEV)
		goto fail;

上記 nameidata オブジェクトの nd な変数は path_lookup() で設定される形。nameidata 構造体の mnt 属性は vfsmount オブジェクトでその mnt_flags 属性は mount のオプションで設定できるとの事。マクロの定義は include/linux/mount.h にて以下。

#define MNT_NOSUID	1
#define MNT_NODEV	2
#define MNT_NOEXEC	4

3rd Edition によれば

ファイルシステムのデバイスファイルへのアクセスを禁止

とある。これって mount の nodev オプションなのかなぁ。。
man によれば

  • nodev
  • noexec
  • nosuid

あたりになるのか。たしかにアクセス禁止であれば EACCES ですな。結構なイキオイで投入してる気がしますがそうでもないのか。

とりあえず

lookup_bdev() から bd_acquire() を呼び出す部分までなんとかなりました。続きは明日、という事で。