2012-03-08 12 views
0

私はオープン()システムコール構造体file_operations構造体のファイルを見つけるためにファイルの作成中に接続して取得し、次います。ファイルの作成中に、struct file_operationsとstruct fileがいつ接続されますか?

sys_open -> do_sys_open -> do_filp_open -> nameidata_to_filp -> __dentry_open 

static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt, 
            int flags, struct file *f, 
            int (*open)(struct inode *, struct file *), 
            const struct cred *cred) 
{ 
    struct inode *inode; 
    int error; 

    f->f_flags = flags; 
    f->f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK | 
          FMODE_PREAD | FMODE_PWRITE; 
    inode = dentry->d_inode; 
    if (f->f_mode & FMODE_WRITE) { 
      error = __get_file_write_access(inode, mnt); 
      if (error) 
        goto cleanup_file; 
      if (!special_file(inode->i_mode)) 
        file_take_write(f); 
    } 

    f->f_mapping = inode->i_mapping; 
    f->f_path.dentry = dentry; 
    f->f_path.mnt = mnt; 
    f->f_pos = 0; 
    f->f_op = fops_get(inode->i_fop);//I think it is here that they get connected 
    file_move(f, &inode->i_sb->s_files); 

    error = security_dentry_open(f); 

    ... 

しかし、としたが機能__dentry_openでは、iノード内i_fopが初期化されることを次のように

メインパスはありますか?

答えて

1

あなたはthisthisを見たことがあります:

オープン(2)システムコールはFS/open.cに実装されています。SYS_OPEN機能 と実際の作業は、FS/open.cによって行われます。filp_open ( )は、2つの部分に分割されています。

open_namei():dentry とvfsmount構造体を含むnameidata構造体を埋め込みます。 dentry_open():dentryとvfsmountを指定した場合、 この関数は新しい構造ファイルを割り当ててリンクします。 は、inodeがopen_namei()(dentry-> d_inodeで のiノードを提供していた)で読み込まれたときにinode-> i_fopに設定されたファイルシステム固有のf_op-> open()メソッドも呼び出す。

(ファイルが存在する場合)これは、実際にpath_walk関数に設定されている:

path_walk(const char *name, struct nameidata *nd) { 
/* ... */ 
       /* if . or .. then special, otherwise: */ 
       dentry = cached_lookup(nd->dentry, &this); 
/* ... */ 
       if (!dentry) 
       dentry = real_lookup(nd->dentry, &this); 

のdentryは、d_inode部材内のiノード情報を含みます。したがって、初期化のinodeはopen_namei関数(またはその下のどこか)で、dentry_openの前にあります。歯の構造を追跡するだけです。

+0

inodeは、ファイルの作成とともに作成されます。それはそこに生まれていない。したがって、iノードi_fopはどこかで初期化する必要があります。しかしここで? – sliter

0

ファイル操作は、既存のファイルに対してdentryオブジェクトを作成するときに割り当てられます。これは、ファイルシステム特有の検索機能で行われます。以下はそのためのコールフローです。

SYS_OPEN - > do_sys_open - > do_filp_open - > path_openat - > do_last - > walk_component - > do_lookup - > d_alloc_and_lookup - >ファイルシステム固有のルックアップ関数()

ファイルシステム固有の検索ext2ファイルシステム用の関数はext2_lookup()であり、ext3ではext3_lookup()であり、ext4ではext4_lookup()です。ルックアップ関数の中には、ext2_iget()やext3_iget()やext4_iget()のような関数呼び出しがあります。この関数はinodeオブジェクトのi_fopフィールドを埋めます。

これはLinux-3.0上にあります。

関連する問題