// サキサカさん,前回の放送ですが,微妙に視聴者からの反響があったようですよ // うれしいね.まじめに記事を書くよりも2chをコピペした方がブクマが付くこんな世の中だから // それはこのブログの常ですよ.筆者に文才が無いのが悲しいところです.まぁ,もう少しだけ続けてみましょうか // ギークなネカマにでもなって PHP の記事でも書いた方がコメント付きそうだけどね // それを言っちゃおしまいですよ.コメント付かなくても気を落とさずにがんばりましょう struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev)// さて,iノードを作る関数なんですが { // iはinternetじゃなくてindexの略ですからね struct inode * inode = new_inode(sb); // そういうボケはどうでもいいんだけど // 「ファイルシステム」って雰囲気は満点だね if (inode) { // 無事にiノードが確保できたら… inode->i_mode = mode; // モードとか所有者とか管理情報をセットするんだな inode->i_uid = current->fsuid; // モードというのはアクセス権 xrw/xrw/xrw の他に… inode->i_gid = current->fsgid; // ファイルの種類も含むね inode->i_blksize = PAGE_CACHE_SIZE; // キャッシュサイズと同じ単位でメモリは確保,と inode->i_blocks = 0; // 今回はブロックとかはないからね. inode->i_mapping->a_ops = &ramfs_aops; // おっとオペレーション構造体が… inode->i_mapping->backing_dev_info = &ramfs_backing_dev_info; // これはさっき作ってた構造体だね inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; // 作った時間をセットと switch (mode & S_IFMT) { // S_IFMT で,モードからファイル形式だけを取り出す default: // S_IFREG(通常ファイル)/S_IFDIR(ディレクトリ) init_special_inode(inode, mode, dev); // S_IFLNK(シンボリックリンク)とか,そゆやつだ break; // default が頭にあるってのは,なんか変わってますね case S_IFREG: // 通常のファイルだったら… inode->i_op = &ramfs_file_inode_operations; // おっと,またオペレーション構造体が出てきましたよ inode->i_fop = &ramfs_file_operations; // ramfs_aops もそうだったけど,どこらへんで宣言 break; // されてるんだろうなぁ.internal.h には宣言だけだよ case S_IFDIR: // ディレクトリの場合は,と inode->i_op = &ramfs_dir_inode_operations; // ここらへんは先行宣言されてますねぇ inode->i_fop = &simple_dir_operations; // 後ほど実体が定義されますので,お楽しみですね // このコメントは… /* directory inodes start off with i_nlink == 2 (for "." entry) */ // ディレクトリは必ず自分自身 . と親 .. を先頭に含むんだね inode->i_nlink++; // なるほど,だからリンク数が2から始まると break; // そそ case S_IFLNK: // シンボリックリンクの場合は inode->i_op = &page_symlink_inode_operations; // 専用のオペレーション構造体を登録と break; // なんとなくパターンが見えてきましたね } // でも,オペレーション構造体が気になるよね } // 確かに. return inode; // iノードも無事に返ったことですし } // それでは聞いてみましょう,現場のヤブナカさーん ? /*******************************************************************************************************************/ //*はいはい,ヤブナカです. //*現在 /usr/src/linux-source-2.6.18/fs/ramfs/file-mmu.c に来ております. const struct address_space_operations ramfs_aops = { //*ささっ,カメラさんもっとこっち寄って .readpage = simple_readpage, //*モモナイさん,サキサカさん,見えてますかー ? .prepare_write = simple_prepare_write, // おお,狙い通り.しっかり .commit_write = simple_commit_write // 謎だった構造体の定義が見えてますよ ! }; // なるほどね //*どうやら見た感じ,どれも汎用のオペレーション const struct file_operations ramfs_file_operations = { //*をそのまま流用している感じですね .read = generic_file_read, // ほんとだね .write = generic_file_write, // となるとサキサカさん .mmap = generic_file_mmap, // 最後まで見てみないとなんともいえないけど .fsync = simple_sync_file, // 特に変わったことはしてないみたいですね .sendfile = generic_file_sendfile, // そんな感じだね .llseek = generic_file_llseek, // ではこれからは }; // inode.c だけに集中してれば良さそうだね. // お,そろそろ終わりが見えてきたようですよ struct inode_operations ramfs_file_inode_operations = { //*ハァハァ,こっちこっち.カメラさん急いで ! .getattr = simple_getattr, //*ふう.どうやらこれで最後見たいですね }; // ヤブカワさん,お疲れさまでした ! // はい,ありがとうございました.ひとまずスタジオにお返ししま〜す /*******************************************************************************************************************/ // はい,現場のヤブカワさんでした. // 落ち着いたところで,いったんCMです
|