        Virtual File System(VFS) γ
        ԡRichard Gooch <rgooch@atnf.csiro.au>
        ܸ <cz8cb01@linux.or.jp>
                  ܹ <hng@ps.ksky.ne.jp>
            ֤ <miura@blue.gr.jp>
                  Ƿ <dica@eurus.dti.ne.jp>
                  濭 <takei@webmasters.gr.jp>
                  Ӥ <kgh12351@nifty.ne.jp>
                  帶 <mizuhara@acm.org>
                  ܽߤ <morimoto@xantia.citroen.org>
                  ʿ <takavoid@palette.plala.or.jp>
                  ƣ <gotom@debian.or.jp>
          
                  5-JUL-1999


ʸǤΤ«                                           <section>
==================

ʸǤϳƥΥȥαüˡʸ "<section>" 
ޤƥ֥αüˤ "<subsection>" ޤʸ
ʸ򸡺䤹뤿ˤޤ

ʸθܤ
http://www.atnf.csiro.au/~rgooch/linux/docs/vfs.txt 
饤Ǥޤ

VFS Ȥϡ                                                   <section>
==========

Virtual File System (⤷ Virtual Filesystem Switch) Ȥϥͥ
Υեȥ쥤ǡ桼֤ǤΥץˡե륷ƥ
Υ󥿡ե󶡤ޤޤͥŪǰ󶡤ޤ
ˤꡢۤʤäΥե륷ƥब¸Ǥޤ

ưδñ                                             <section>
================

ΥǤϾܺ٤ˡɤΤ褦ưΤñ
ޤޤ桼֤Υץबե򥪡ץ󤷤ݤ
ΤˤɤΤ褦˥ե륷ƥबݡȤ
뤫ɤΤ褦˥ޥȤ뤫¾λ鸫ޤ

եΥץ                                        <subsection>
------------------

VFS  open(2), stat(2), chmod(2) ƱͤΥƥॳƤ
Υѥ̾ VFS ǥ쥯ȥꥨȥꥭå (dentry 
塢뤤 "dcache") 򸡺뤿˻Ȥޤϡѥ
̾ (ե̾)  dentry Ѵ뤿Ρ®λ
ߤ󶡤Ƥޤ

ġ dentry ̾ inode ؤΥݥ󥿤äƤޤinode ϥǥ
¸ߤ̾Υե (ǡ񤭤Ȥ˺̤
եΤ)ǥ쥯ȥꡢFIFO ʤɤɽƤޤdentry 
RAM ¸ߤǥˤ¸ޤ - dentry ϥѥեޥ󥹤
夲뤿¸ߤƤޤinode ϥǥ¸ߤƤޤ
ɬפ˱ RAM ɤ߹ޤޤѹиǥǥؽᤵ
ޤRAM ¸ߤ inode  VFS inode ǡdentry Υݥ󥿤
ƤΤϤǤĤ inode ʣ dentry ؤȤ⤢
ޤ (ϡɥ󥯤Ƥ)

dcache ϥեΤγѤȤʤ뤳ȤտޤƤޤLinus Ȥ
äơ޿ͤȾϡեΤ夹뽼ʬʿ
dentry  RAM ˹碌뤳ȤǤޤ󡣤Ǥ dcache Ͼ­
⤷ޤ󡣥ѥ̾ dentry ˲褹뤿ˤ VFS 
dentry ɬפ뤫⤷ޤinode Ϻ줿˥
ɤޤ inode 򸡺뤳ȤˤԤʤޤ

(̾ϥǥɤ߹ޤ)inode 򸡺ˤϡVFS Ͽƥǥ쥯
ȥ inode ꤷ lookup() ؿƤӤɬפޤδؿ inode
¸ߤե륷ƥμ˱ΤѰդƤޤ
ĤƤϸǾܤҤ٤ޤ

VFS ɬפ dentry(Ĥޤ inode) ƤޤСե
open(2) ꡢinode ξ stat(2) ǼФȤäʤȤ
٤ƤǤ褦ˤʤޤstat(2) ưñǤ - VFS 
dentry  inode 򸫤ơĤΥǡ桼֤
ޤ

ե򥪡ץ󤹤ˤ¾ɬפȤʤޤ - file ¤ (
ϥեǥץΥͥ¦μǤ) γݤǤ
줿 file ¤Τ dentry ӥեطδؿؤݥ
ǽޤ inode ξ󤫤ޤƼ
open() ؿƤФޤ顢ե륷ƥ˱ǽԤ
ȤǤޤǤ餳 VFS ˤäƹԤʤ롢⤦Ĥ
ưȤȤ狼Ǥ礦

file ¤ΤϳƥץȤΥեǥץơ֥سǼ
ޤ

(桼֤Υץब) եɤ߽񤭤䥯 (Ӥ¾
δϢ VFS ) ¹Ԥݤˤϡ桼֤¸ߤեǥ
ץͳ (ͥ¦) Ŭڤ file ¤Τˤ
줫¹ԤɬפȤʤ file ¤ΤδؿƤӽФޤ

ե뤬ץ󤵤Ƥ֤Ϥä dentry  "open"() ˤʤ
ƤޤĤޤꤳ VFS inode ȤȤ̣Ƥޤ

Ƥ VFS ƥॳ (Ĥޤ open(2), stat(2), read(2), write(2),
chmod(2) ʤ) ϥץƥȤƤӤޤΥ
ƥॳϡͥåޤäԤʤäƤʤ֤ǸƤӤ
ȤȤդƤ̤ΥץåΥץե륷
ƥɥ饤ФΥɤƱʬƱ˼¹ԤǽȤ
ȤǤǤ鶦ͭ꥽إŬڤʥåԤ
ݸɬפޤ

ե륷ƥϿȥޥ                          <subsection>
--------------------------------

ͥǿե륷ƥ򥵥ݡȤ硢ɬפʤȤ
register_filesystem() ƤӽФǤΥե륷ƥμ
Ƥ빽¤ (struct file_system_type) Ϥȡͥ
äƤ륵ݡȤե륷ƥɽɲäޤ

% cat /proc/filesystems

¹ԤСߥƥѤǤե륷ƥɽǤޤ

ե־Υǥ쥯ȥ˥֥åǥХޥȤ褦Ȥ
ȡVFS ϤΥե륷ƥͭŬڤʴؿƤӽФޤޥ
ݥȤ dentry ϡޥȤ줿ե륷ƥΥ롼Ȥ
inode ؤ褦˹ޤ

ơܺ٤򸫤Ƥޤ礦

struct file_system_type                                      <section>
=======================

Ǥϥե륷ƥԤʤޤͥ 2.1.99 ʹߤǤϡ
Τ褦Ƥޤ

struct file_system_type {
    const char *name;
    int fs_flags;
    struct super_block *(*read_super) (struct super_block *, void *, int);
    struct file_system_type * next;
};

  name: "ext2", "iso9660", "msdos" Ȥäե륷ƥ̾
    

  fs_flags: ʥե饰 (Ĥޤ FS_REQUIRES_DEV, FS_NO_DCACHE ʤ)

  read_super: Υե륷ƥο󥹥󥹤ޥȤ줿
    ˸ƤӽФؿ

  next: VFS ǻ - NULL ˽Ƥ


read_super() ؿˤϼΰޤ

  struct super_block *sb: ѡ֥åι¤ΤǤVFS ϰʬ
    ޤ󤫤顢Ĥ read_super() ؿǽɬפ
    ޤ

  void *data: ǤդΥޥȥץǡ̾ ASCII ʸǤ

  int silent: 顼򤹤뤫ɤ
  
read_super() ؿϥѡ֥åǻꤵƤ֥åǥХˡ
δؿݡȤƤե륷ƥब뤫ɤĴ٤ʤ
ʤޤread_super() ؿϽȥѡ֥åؤΥ
󥿤򡢼Ԥ NULL ֤ޤ

read_super() ؿꤹ롢superblock ¤ΤκǤⶽ̣Ф
"s_op" Ǥϥե륷ƥƤ빽¤
"struct super_operations" ؤΥݥ󥿤Ǥ

struct super_operations                                      <section>
=======================

Ǥ VFS ե륷ƥΥѡ֥åɤΤ褦ˤư
Ƥ뤫Ƥޤͥ 2.1.99 ʹߤǤϼΤ褦
ޤ

struct super_operations {
    void (*read_inode) (struct inode *);
    void (*write_inode) (struct inode *, int);
    void (*put_inode) (struct inode *);
    void (*delete_inode) (struct inode *);
    int (*notify_change) (struct dentry *, struct iattr *);
    void (*put_super) (struct super_block *);
    void (*write_super) (struct super_block *);
    int (*statfs) (struct super_block *, struct statfs *, int);
    int (*remount_fs) (struct super_block *, int *, char *);
    void (*clear_inode) (struct inode *);
};

ä˵ҤƤơƤδؿϲΥå̵֤ǸƤӽ
ޤĤޤۤȤɤδؿϰ˽Ԥ (block) ǤȤ
ȤǤƤδؿϥץƥȤΤߤƤӽФޤ (Ĥޤ
ߥϥɥܥȥϡդϸƤӽФޤ)

  read_inode: δؿϥޥȤ줿ե륷ƥफ inode
    ɤ߹ि˸ƤӽФޤ"struct inode"  "i_ino" Ф
    VFS ˤäɤ߹ inode ؤ褦˽ޤ¾Υ
    ФˤϤδؿޤ

  write_inode: δؿ VFS  inode ǥ˽񤭽Фɬפ
    ˸ƤӽФޤܤΰϽ񤭹ߤƱ뤫ɤ
    ꤷޤ٤ƤΥե륷ƥबΥե饰åȤ
    ¤ޤ
     
  put_inode: VFS inode  inode å夫˸ƤӽФ
    ޤδؿμǤ (optional) Ǥ 

  delete_inode: VFS  inode ˸ƤӽФޤ

  notify_change: VFS inode °Ѥä˸ƤӽФޤNULL 
    ˤ VFS  write_inode() ؿƤӽФޤϥͥ
    ֤ǸƤӽФޤ

  put_super: VFS ѡ֥å (ĤޤꥢޥȻ)
    ˸ƤӽФޤϥѡ֥åå֤ǸƤӽФ
    ޤ

  write_super: VFS ѡ֥åǥ˽񤭽Фɬפ
    ƤӽФޤδؿμǤ (optional) Ǥ 

  statfs: VFS ե륷ƥ׾ɬפȤ˸ƤӽФ
    ϥͥå֤ǸƤӽФޤ

  remount_fs: ե륷ƥबƥޥȤ˸ƤӽФޤ
    ϥͥå֤ǸƤӽФޤ

  clear_inode: VFS  inode 򥯥ꥢ˸ƤӽФޤδؿ
    Ǥ (optional) Ǥ

read_inode() ؿǤ "i_op" եɤꤷʤФʤޤ󡣤
ϳ inode Ǽ¹Ԥؿؤ "struct inode_operations" ؤΥ
󥿤Ǥ

struct inode_operations                                      <section>
=======================

Ǥ VFS ե륷ƥ inode 򰷤ˡˤĤƤ
ޤͥ 2.1.99 ʹߤǤϼΤ褦Ƥޤ

struct inode_operations {
    struct file_operations * default_file_ops;
    int (*create) (struct inode *,struct dentry *,int);
    int (*lookup) (struct inode *,struct dentry *);
    int (*link) (struct dentry *,struct inode *,struct dentry *);
    int (*unlink) (struct inode *,struct dentry *);
    int (*symlink) (struct inode *,struct dentry *,const char *);
    int (*mkdir) (struct inode *,struct dentry *,int);
    int (*rmdir) (struct inode *,struct dentry *);
    int (*mknod) (struct inode *,struct dentry *,int,int);
    int (*rename) (struct inode *, struct dentry *,
            struct inode *, struct dentry *);
    int (*readlink) (struct dentry *, char *,int);
    struct dentry * (*follow_link) (struct dentry *, struct dentry *);
    int (*readpage) (struct file *, struct page *);
    int (*writepage) (struct file *, struct page *);
    int (*bmap) (struct inode *,int);
    void (*truncate) (struct inode *);
    int (*permission) (struct inode *, int);
    int (*smap) (struct inode *,int);
    int (*updatepage) (struct file *, struct page *, const char *,
                unsigned long, unsigned int, int);
    int (*revalidate) (struct dentry *);
};

δؿä˵ҤƤơåʤǸƤӽФޤ

  default_file_ops: ϥեΥץȡץ󤷤ե
    ˡƤ "struct file_operations" ؤΥݥ󥿤Ǥ

  create: open(2)  creat(2) ƥॳˤäƸƤӽФޤ
    Υե򥵥ݡȤΤɬפȤʤޤ dentry 
     inode ϴޤޤƤʤǤ礦 (Ĥޤ negative dentry ΤϤ
    )餯ǡdentry ȿ줿 inode ꤷ
    d_instantiate() ƤӽФϤǤ

  lookup: VFS ƥǥ쥯ȥ inode 򸡺ɬפ˸Ƥӽ
    ޤõ̾ dentry 椫鸫ĤޤδؿϸĤ
     inode  dentry Ͽ뤿 d_add() ƤӽФɬפ
    ޤ inode ¤Τ "i_count" եɤ䤵ʤФʤ
    󡣤̾ inode ¸ߤʤˤ NULL  inode  dentry
    ɬפޤ ( negative dentry ȸƤФޤ)
    롼󤫤饨顼ɤ֤硢˥顼ȯ
    ɬפޤʤ creat(2), mknod(2), mkdir(2) ʤ
    ΥƥॳǤ inode ˼ԤƤޤޤdentry δؿ
    ˽ͤߤ dentry  "d_dop" եɤ
    ɬפޤ -  "dentry_operations" ¤ΤؤΥݥ󥿤Ǥ
    δؿϥǥ쥯ȥ inode Υޥեꤷ֤ǸƤӽФ
    ޤ

  link: link(2) ƥॳˤäƸƤӽФޤϡɥ󥯤
    ݡȤΤɬפǤcreate() ؿƱ餯
    d_instantiate() ƤӽФɬפϤǤ

  unlink: unlink(2) ƥॳˤäƸƤӽФޤinode κ
    򥵥ݡȤΤɬפǤ

  symlink: symlink(2) ƥॳˤäƸƤӽФޤܥ
    󥯤򥵥ݡȤΤɬפǤcreate() ؿƱ
    餯 d_instantiate() ƤӽФɬפϤǤ

  mkdir: mkdir(2) ƥॳˤäƸƤӽФޤ֥ǥ쥯
    κ򥵥ݡȤΤɬפǤcreate() ؿƱ
    餯 d_instantiate() ƤӽФɬפϤǤ
    
  rmdir: rmdir(2) ƥॳˤäƸƤӽФޤ֥ǥ쥯
    κ򥵥ݡȤΤɬפǤ

  mknod: mknod(2) ƥॳˤäơǥХ (饯⤷
    ϥ֥å) inode ̾դѥ (FIFO)åȤʤɤ
    ˸ƤӽФޤμ inode κ򥵥ݡȤ
    ΤɬפǤcreate() ؿƱ餯 d_instantiate() 
    ƤӽФɬפϤǤ

  readlink: readlink(2) ƥॳˤäƸƤӽФޤܥ
    󥯤ɤ߹ߤ򥵥ݡȤΤɬפǤ

  follow_link: VFS ˤꡢܥå󥯤򤿤ɤäƤ줬ؤƤ
     inode ˸ƤӽФޤܥå󥯤򥵥ݡ
    ȤΤɬפǤ

struct file_operations                                       <section>
======================

Ǥ VFS ץ󤵤줿ե򰷤ˡˤĤƤޤ
ͥ 2.1.99 ʹߤǤϼΤ褦Ƥޤ

struct file_operations {
    loff_t (*llseek) (struct file *, loff_t, int);
    ssize_t (*read) (struct file *, char *, size_t, loff_t *);
    ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
    int (*readdir) (struct file *, void *, filldir_t);
    unsigned int (*poll) (struct file *, struct poll_table_struct *);
    int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
    int (*mmap) (struct file *, struct vm_area_struct *);
    int (*open) (struct inode *, struct file *);
    int (*release) (struct inode *, struct file *);
    int (*fsync) (struct file *, struct dentry *);
    int (*fasync) (struct file *, int);
    int (*check_media_change) (kdev_t dev);
    int (*revalidate) (kdev_t dev);
    int (*lock) (struct file *, int, struct file_lock *);
};

δؿä˵ҤƤơåʤǸƤӽФޤ

  llseek: VFS եΰ֤򼨤ǥåưɬפ
    ˸ƤӽФޤ

  read: read(2) Ϣ륷ƥॳ뤫ƤӽФޤ

  write: write(2) Ϣ륷ƥॳ뤫ƤӽФޤ

  readdir: VFS ǥ쥯ȥƤɤ߹ɬפ˸ƤӽФ
    ޤ

  poll: VFS ˤꡢե˥ƥӥƥ¸ߤ뤫ɤ [
    եɤߡ񤭤ԤäƤ֤ˤ뤫ɤ] 򤢤
    å硢ޤ (ǤդǤ) ƥӥƥȯ
    ޤǥץ򥹥꡼פ select(2) 
    poll(2) ƥॳѤ뤳Ȥˤä VFS ƤӽФ
    

  ioctl: ioctl(2) ƥॳ뤫ƤӽФޤ

  mmap: mmap(2) ƥॳ뤫ƤӽФޤ

  open: VFS ˤꡢinode 򥪡ץ󤹤ɬפ˸ƤӽФޤ
    VFS ϥե򥪡ץ󤹤 "struct file" ե
    طι¤ "f_op"  inode ¤Τ "default_file_ops" ե
    ɤǽޤƿ˳ݤ줿 file ¤Τ open ؿ
    ƤӽФޤopen ؿϼºݤˤ "struct inode_operations" 
    ˤ󤸤ʤȻפä餯Ǥ餯ϥե
    륷ƥμñˤ뤿ˤʤäƤΤȻפޤ
    open() ؿ file ¤Τ "private_data" Ф device ¤
    ؤ褦ˤ硢Τ乥Υߥ󥰤Ǥ

  release: ץ󤷤ƤեؤκǸλȤ줿
    ƤӽФޤ

  fsync: fsync(2) ƥॳ뤫ƤӽФޤ

  fasync: եؤƱ (֥å) ⡼ɤͭˤʤäƤ
    ˡfcntl(2) ƥॳ뤫ƤӽФޤ

file_operations  inode ¸ߤե륷ƥ˰¸ˤʤ
Ƥޤ(饯⤷ϥ֥å) ǥХΡɤ򥪡ץ󤹤
硢¿Υե륷ƥǤɬפʥǥХɥ饤Фξ򸫤Ĥ
롢VFS ̤ʥݡȥ롼ƤӽФޤΥ롼
ե륷ƥ file ؿǥХɥ饤Фʪ֤ơ
ץ󤹤եѤο open() ؿƤӽФޤ줬ե
ƥΥǥХե򥪡ץ󤹤ˡǽŪ˥ǥХɥ饤
 open() ؿƤФȤߤǤdevfs(Device FileSystem) ˤϥǥ
ΡɤǥХɥ饤ФؤΡľŪʻȤߤޤ (
ѥåǤ)[devfs  2.4.0 Ǥϥͥĥ꡼˼
ޤƤޤ]

struct dentry_operations                                     <section>
========================

Ǥϥե륷ƥब̾ dentry ֤ˡˤĤ
Ƥޤdentry  dcache  VFS ġΥե륷ƥμ
ΰǤǤϥǥХɥ饤Фˤϲδط⤢ޤ󡣤δ
Ǥդ뤤 VFS ΥǥեȤưΤᡢNULL ꤵƤ뤫
⤷ޤ󡣥ͥ 2.1.99 ʹߤǤϡΤ褦Ƥޤ

struct dentry_operations {
    int (*d_revalidate)(struct dentry *);
    int (*d_hash) (struct dentry *, struct qstr *);
    int (*d_compare) (struct dentry *, struct qstr *, struct qstr *);
    void (*d_delete)(struct dentry *);
    void (*d_release)(struct dentry *);
    void (*d_iput)(struct dentry *, struct inode *);
};

  d_revalidate: VFS  dentry ɾɬפ˸ƤӽФޤ
    ̾򸡺롼 dentry  dcache ˸Ĥˤ
    ĤǤƤӤޤ¿Υե륷ƥ NULL ˤʤ
    Ƥޤʤʤ餽Τ褦ʥե륷ƥǤ dcache  dentry
    Ϥɤ (Ĥ) ̵ˤʤʤǤ

  d_hash: VFS ϥåơ֥ dentry ɲä˸ƤӽФޤ

  d_compare: dentry Ӥ˸ƤӽФޤ

  d_delete: dentry ؤκǸλȤ줿˸ƤӽФޤĤ
    ꤳϡ denty ïѤƤޤ󤬡dcache Ǥޤͭ
    ȤȤ̣Ƥޤ

  d_release: dentry ºݤ˲˸ƤӽФޤ

  d_iput: dentry Ȥ inode ˸ƤӽФޤ (
    ľ˼¹Ԥޤ)줬ǥեȤ NULL ξ硢VFS 
    iput() ƤӽФޤδؿ硢 iput() 
    ӽФɬפޤ

 dentry ϻ dentry ΥϥåꥹȤƱͤˡ dentry ؤΥݥ
ޤ dentry ϴŪˤϥǥ쥯ȥΥեΤ褦ʤ
Ǥ

ե륷ƥ dentry Ĥ롢Ĥδؿ
ޤ

  dget: ¸ߤƤ dentry ؤοϥɥ򥪡ץ󤷤ޤ (
    ñ˻ѥȿ䤹Ǥ)

  dput: dentry ؤΥϥɥ򥯥ޤ (ѥȿ򸺤餷
    )ѥȿ 0 ˤʤä "d_delete" ؿƤФ졢
    dentry ޤƤΥϥåꥹȤ¸ߤ dentry  unused
    list ֤ޤdentry  unused list ֤ȡƥब RAM
    ɬפȤ硢dentry  unused list Фơ餬
    Ǥˡdentry ϥå̵ѥȤ 0 ˤʤä
    硢"d_delete" ؿƤӽФ줿塢dentry ޤ

  d_drop: dentry ƥϥåꥹȤޤѥȿ
    0 ˤʤä硢˸ƤФ dput()  dentry ޤ

  d_delete: dentry ޤdentry ¾˻ȤƤΤ̵ʤ
    ˤ dentry  negative dentry ˤʤޤ (d_iput() ؿƤ
    Фޤ)ȤƤΤ¾ˤˤ d_drop() 
    ƤӽФޤ

  d_add: dentry ƥϥåꥹȤɲäd_instantiate() ƤӽФ
    ޤ

  d_instantiate: dentry  inode ΥꥢϥåꥹȤɲä
    "d_inode" Ф򹹿ޤinode ¤Τ "i_count" Ф
    ꤹ롿䤹ɬפǤ礦inode ݥ󥿤 NULL ξ硢
    dentry  "negative dentry" ȸƤФޤδؿ̾¸
     negative dentry Ф inode ˸ƤӽФޤ
