device driver (3)

とりあえず、な確認。排他制御なソレ

static int yamanetoshi_open(struct inode *inode, struct file *file)
{
        printk("yamanetoshi_open\n");
        printk(" MINOR(inode->i_rdev): %d\n", MINOR(inode->i_rdev));

		if(0 == MINOR(inode->i_rdev) % 2) {
			if(0 == write_open) {
				write_open++;
			} else {
				return -EAGAIN;
			}
		} else {
			if(0 == read_open) {
				read_open++;
			} else {
				return -EAGAIN;
			}
		}
        return 0;
}

をちょろちょろ確認。-EAGAIN を戻したら errno に EAGAIN (11) がセットされているのも確認。むむむむ的。
一応属性を以下なカンジにしてて

$ ls -l fifo*
c-w--w--w- 1 root root 130, 100 2008-08-24 23:11 fifo100130
crw-r--r-- 1 root root 130, 101 2008-08-24 23:11 fifo101130
$

例えば fifo100130 を "r" で fopen したら NULL を戻すのも確認。ちなみに上記な手続きに制御が渡っていない模様。権限が無い場合はそれ以前のレイヤでチェックが入っているのだろうな、と。具体的には fs/open.c の sys_open() から呼び出される fs/namei.c の open_namei() あたりと類推 (根拠は Linux カーネル解読室の 277p)。
昨晩のエントリな TODO によれば次は read/write ですな。続きがあるかどうかは微妙。

メモ

なんか kernel/kfifo.c とゆーナニを見つけてしまったんですが ...
# やっぱ自分で実装、がナニですよね (を