参考: lsコマンドの動作
- __d_lookup()
- parent->d_op->compare(parent, qstr, name)
- hidden_dentry = dentry->d_fsdata->udi_dentry[0]
- err = hidden_dentry->d_compare(hidden_dentry, a, b)
- return err;
vfsによりd_lookup(parent, name)が失敗した場合
- raif_lookup()
- raif_lookup_backend()
- 探索対象dentry->d_op = &raif_dops;
- dentry->d_fsdata にstruct raif_dentry_info分のメモリ確保
- dentry->d_fsdata->udi_dentry = struct dentry * dir->i_private->b_num のメモリ確保
- raif_rule_lookup()
- 対象dentryと親のdentryのstruct raif_dentry_info(rdi, rdi_p)取得
- read_lock(&rdi_p->d.rules.spin)
- struct rule *rp = rdi_p->d.rules.local_rule
- raif_rule_regexp(dentry->d_name.name, rp->regexp)で見つかるまでrp->nextループ
- rdiのデータをrpからコピー
- read_unlock(&rdi_p->d.rules.spin)
- global_bindexをdentry->d_fsdata->maskから取得
- maskをシフトしつつビットが立っている数がbindexの数だけ経過すればシフト数をreturn
- hidden_dentry = raif_lookup_branch(dentry, global_bindex, nd)
- lower_dentry = lookup_one_len(dentry->d_name.name, hidden_parent, dentry->d_name.len)
- return lower_dentry
- ...
- return ERR_PTR(err) 必ずエラー(?)