n314の日記

 | 

2007-12-16raifメモ

lookup時の動作

| 17:58 |  lookup時の動作 - n314の日記 を含むブックマーク はてなブックマーク -  lookup時の動作 - n314の日記

参考: lsコマンドの動作

  1. __d_lookup()
    1. parent->d_op->compare(parent, qstr, name)
      1. hidden_dentry = dentry->d_fsdata->udi_dentry[0]
      2. err = hidden_dentry->d_compare(hidden_dentry, a, b)
      3. return err;

vfsによりd_lookup(parent, name)が失敗した場合

  1. raif_lookup()
  2. raif_lookup_backend()
    1. 探索対象dentry->d_op = &raif_dops;
    2. dentry->d_fsdata にstruct raif_dentry_info分のメモリ確保
    3. dentry->d_fsdata->udi_dentry = struct dentry * dir->i_private->b_num のメモリ確保
    4. raif_rule_lookup()
      1. 対象dentryと親のdentryのstruct raif_dentry_info(rdi, rdi_p)取得
      2. read_lock(&rdi_p->d.rules.spin)
      3. struct rule *rp = rdi_p->d.rules.local_rule
      4. raif_rule_regexp(dentry->d_name.name, rp->regexp)で見つかるまでrp->nextループ
      5. rdiのデータをrpからコピー
      6. read_unlock(&rdi_p->d.rules.spin)
    5. global_bindexをdentry->d_fsdata->maskから取得
      • maskをシフトしつつビットが立っている数がbindexの数だけ経過すればシフト数をreturn
    6. hidden_dentry = raif_lookup_branch(dentry, global_bindex, nd)
      1. lower_dentry = lookup_one_len(dentry->d_name.name, hidden_parent, dentry->d_name.len)
      2. return lower_dentry
    7. ...
    8. return ERR_PTR(err) 必ずエラー(?)
 |