![]() |
![]()
| ![]() |
![]()
̾??
????
???????Υ????ȥ??ݥ????Ȥ?Ϳ?????줿?ǥ??쥯?ȥ?????ñ???Υѥ?̾???Ǥ?Ĵ?٤ޤ??? ?????ϰʲ??ΤȤ????Ǥ???
cnp ?ϰʲ????????????Ƥ??? componentname ??¤?ΤؤΥݥ??Ǥ??? struct componentname { /* * lookup ?ؤΰ????Ǥ??? */ u_long cn_nameiop; /* namei ???? */ u_long cn_flags; /* namei ?ؤΥե饰 */ struct thread *cn_thread; /* lookup ???ᤷ?Ƥ??륹???å? */ struct ucred *cn_cred; /* ???? */ /* * ?????롼?????ӥ??ߥåȥ롼?????Ƕ?ͭ?????ޤ??? */ char *cn_pnbuf; /* ?ѥ?̾?Хåե? */ char *cn_nameptr; /* ???????줿̾???ؤΥݥ????? */ long cn_namelen; /* ???????줿???Ǥ?Ĺ?? */ u_long cn_hash; /* ???????줿̾???Υϥå????? */ long cn_consume; /* lookup() ?Ǿ???ʸ???? */ }; ?ѥ?̾?????Ǥ????å????줿 vnode ?ؤΥݥ????Ѵ????ޤ??? ???줬?????濴?Ǥ??ꡢ????ʣ???ʥ롼?????Ǥ??? ?ե????륷???ƥब??̩?ʥĥ???ؤ??ݤ????Ƥ??ʤ??????ˤϡ? ?ǥåɥ??å????֤˴٤뤳?Ȥ??????ޤ??? cnp->cn_nameiop
?????ϡ????֥??????Ȥ???????Ū?˰?¸????
VOP_LOOKUP ?????Τγ??פǤ??? ?ǥ??쥯?ȥ??Υ????????????????å????ޤ???
?????å?????????̾?????????⤷???Ĥ????С?????̾?????֤??ޤ???
?ǥ??쥯?ȥ???????̾????????found ?ޤ???
notfound ??Ŭ?ڤ˿ʤߤޤ???
notfound: ?????ޤ???̾???ѹ??ǥѥ?̾?κǸ??ξ????ˤϡ?
EJUSTRETURN
???֤??????Ѳ?ǽ?ʰ??֤˾??????Ĥ??ޤ???
?????Ǥʤ????? ENOENT
???֤??ޤ???found: ?ѥ?̾?κǸ??Ǻ????ξ????ˤϡ?????????ǽ?ˤ??????????֤??ޤ???
?ѥ?̾?κǸ???̾???ѹ??ξ????ˤϡ??ѹ?????
inode ?????å?????
̾???ѹ?????ǽ?ˤ??????????֤??ޤ???
?Ǹ??Ǥʤ??????ˤϡ?̾?????å??????ɲä??ޤ???
?Ǹ??Ǻ????Ǥ??????Ǥ??ʤ??????ˤϡ?̾?????å??????ɲä??ޤ???
???å??ǥ??쥯?ȥ? dvp
?ϥ????ȥ????˥??å??????Ƥ????٤??Ǥ???
???顼 (??: ?????? ?????????Ǥ????Ĥ??ä??????ˤϡ? *vpp ?ˤ??Υե??????Υ??å????줿 vnode ?????ꤵ???ơ?0 ???֤????ޤ??? ?????????Ƥ??????Ǥ? "." ?ξ??硢???? vnode ?? vref(9) ?????Ѥ????ɲä??줿;ʬ?ʻ??Ȥ????ޤ??? ???ξ????ϡ??ƤӽФ?¦??Ŭ?ڤ˥??å??????????뤳?Ȥ????դ??ʤ????Фʤ??ޤ????? ???Ǥ????Ĥ??餺???
??????????int vop_lookup(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp) { int error; int nameiop = cnp->cn_nameiop; int flags = cnp->cn_flags; int lockparent = flags & LOCKPARENT; int islastcn = flags & ISLASTCN; struct vnode *vp = NULL; /* * ?ǥ??쥯?ȥ??Υ????????????????å????ޤ??? */ if (dvp->v_type != VDIR) return ENOTDIR; error = VOP_ACCESS(dvp, VEXEC, cred, cnp->cn_thread); if (error) return (error); if (islastcn && (dvp->v_mount->mnt_flag & MNT_RDONLY) && (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) return (EROFS); /* * ?ǥ??쥯?ȥ?/̾???Υڥ??Τ?????̾???????å??????????å????ޤ??? * ?????ϡ?¸?ߤ??Ƥ??ʤ?̾???ξ????ˤ? ENOENT ????̾???????Ĥ??ä? * ?????ˤ? -1 ?????Ǥʤ??????ˤ? 0 ???֤??ޤ??? */ error = cache_lookup(dvp, vpp, cnp); if (error) { int vpid; if (error = ENOENT) return error; vp = *vpp; if (dvp == vp) { /* "." ????õ???ޤ? */ VREF(vp); error = 0; } else if (flags & ISDOTDOT) { /* * ?ǥåɥ??å????뤿?ᡢ".." ?Υ??å????줿 vnode ?? * ???????????ˡ????Υǥ??쥯?ȥ??????å?????ɬ?פ? * ?????ޤ??? */ VOP_UNLOCK(dvp); error = vget(vp, 1); if (!error) { if (lockparent && islastcn) error = VOP_LOCK(dvp); } } else { error = vget(vp, 1); if (error || !(lockparent && islastcn)) { VOP_UNLOCK(dvp); } } /* * ???å????ԤäƤ????֤??????ο????Ѳ????Ƥ??ʤ????Ȥ? * ?????å????ޤ??? */ if (!error) { if (vpid == vp->v_id) { /* * lockparent && islastcn ?ξ????ˤ? dvp ?????å? * ?????ޤ??? vp ?????å??????ޤ??? */ return (0); } vput(vp); if (dvp != vp && lockparent && islastcn) VOP_UNLOCK(pdp); } /* * ?ʲ??Υǥ??쥯?ȥ긡???Τ????? dvp ?????٥??å????ޤ??? */ error = VOP_LOCK(dvp); if (error) { return (error); } *vpp = NULL; } /* * ???? cnp->cn_nameptr ?Τ????? dvp ?????ޤ??? */ ...; if (!found) { if ((nameiop == CREATE || nameiop == RENAME) && islastcn && directory dvp has not been removed) { /* * ?ǥ??쥯?ȥ??ν????߸????????å????ޤ??? */ /* * ?Ǥ????¤ꡢ?ǥ??쥯?ȥ??????ο????????Ǥ?̾???Τ????? * ??ʬ???礭???????ΰ??֤???Ͽ???ޤ??? ?????? dvp ?Τ????? * vnode ?λ?Ū?ǡ????????˵?Ͽ?????뤳?Ȥ???ǽ?Ǥ??? * VOP_CREATE ?ޤ??? VOP_RENAME ?Ǹ??ǻ??Ѥ??뤿???ˡ? * ?ѥ?̾???ݻ????뤿???? SAVENAME ?ե饰?????ꤷ?ޤ??? */ cnp->cn_flags |= SAVENAME; if (!lockparent) /* * ?嵭?ǵ?Ͽ???줿?ɲäΥǡ????? lockparent ?????? * ???줿???ˤΤ?ͭ?ѤǤ??뤳?Ȥ????դ??Ƥ????????? */ VOP_UNLOCK(dvp); return EJUSTRETURN; } /* * ?????å?????̾???????????뤳?Ȥ???θ???ޤ??? */ if ((cnp->cn_flags & MAKEENTRY) && nameiop != CREATE) cache_enter(dvp, NULL, cnp); return ENOENT; } else { /* * ?????ǥѥ?̾?κǸ??ξ????ˤϡ??ե??????κ????˻??ѤǤ??? * ?ѥ???????֤??ޤ??? wantparent ?ե饰?????ꤵ???Ƥ??ʤ? * ?????ˤϤ??Υǥ??쥯?ȥ??Τߤ??֤????????Ǥʤ??????ˤ? * ³???Ƥ??? inode ?????å?????"." ?????դ??ޤ??? */ if (nameiop == DELETE && islastcn) { /* * ?ǥ??쥯?ȥ??ν????߸????????å????ޤ??? */ error = VOP_ACCESS(dvp, VWRITE, cred, cnp->cn_thread); if (error) return (error); if (found entry is same as dvp) { VREF(dvp); *vpp = dvp; return 0; } error = VFS_VGET(dvp->v_mount, ..., &vp); if (error) return error; if (directory is sticky && cred->cr_uid != 0 && cred->cr_uid != owner of dvp && owner of vp != cred->cr_uid) { vput(vp); return EPERM; } *vpp = vp; if (!lockparent) VOP_UNLOCK(dvp); return 0; } /* * ?ƽ????? (RENAME) ?ξ????ˤϡ????? inode ?????Ӹ??ߤ? * ?ǥ??쥯?ȥ????ƽ????ߤ??뤿?????ᤵ???????????֤??ޤ??? * ?̾??ե??????ޤ??϶??Υǥ??쥯?ȥ??Ǥ??뤳?Ȥ???ǧ???뤿???ˡ? * ?ǥ??쥯?ȥꥨ???ȥ??? inode ?????????ʤ????Фʤ??ޤ????? */ if (nameiop == RENAME && wantparent && islastcn) { error = VOP_ACCESS(dvp, VWRITE, cred, cnp->cn_thread); if (error) return (error); /* * "." ???????å????ޤ??? */ if (found entry is same as dvp) return EISDIR; error = VFS_VGET(dvp->v_mount, ..., &vp); if (error) return error; *vpp = vp; /* * ???? VOP_RENAME ?ǻ??Ѥ??뤿????̾??????¸???ޤ??? */ cnp->cn_flags |= SAVENAME; if (!lockparent) VOP_UNLOCK(dvp); return 0; } /* * ̾?????Ѵ??Υ??ƥåפ????ƤǤ??? ?????ܥ??å????????ߤ? * ?ǥ??쥯?ȥ꤫???????ФǤ????????ˤϡ?????ɬ?פˤʤ??Τǡ? * ?ǥ??쥯?ȥ??? 'vput' ???ޤ????? ???????? "pdp" ?Ȥ??? * ???????å????줿?ǥ??쥯?ȥ?????¸???ޤ??? ???????????ˤ??? * inode ???????????ʤ????Ȥ??ݾڤ??뤿???ˡ????Υǥ??쥯?ȥ??? * ???????å???????????Ū?? inode ?????????ʤ????Фʤ??ޤ????? * ?롼?Ȥ????ǥ??쥯?ȥ??ĥ???????? inode ?????????? * ???Ȥǡ??ǥåɥ??å???????ͽ?ɤ??ޤ??? ?????äơ??ո????? * ?ݥ????? ".." ??é???Ȥ??ˤϡ??ᤵ?줿?ǥ??쥯?ȥ??????????? * ???˿ƥǥ??쥯?ȥ??????å????ʤ????Фʤ??ޤ????? ".." ?? * ??Ϣ?դ????줿 inode ?Τ????? VFS_VGET ?????????ˡ????ߤ? * ?????ӿƥǥ??쥯?ȥ???ξ???????????줿?????ˤϡ???????????Ū?? * ???????֤??????ޤ??? ????????ʣ???ʥǥåɥ??å????Х??르?ꥺ?? * ?μ????ʤ??ˤ??ζ??????֤??뤳?Ȥ??Ǥ??ʤ??Τǡ????? * ???????֤?ȯ???????Ǥ??뤳?Ȥ????Ԥ??Ƥ??ޤ??? ?ե????륷???ƥब?? * ".." ?ʳ??ˡ??ǥ??쥯?ȥ깽¤???????̤????ؤ??ϡ??ɥ??? * ???ľ??硢???δ?ñ?ʥǥåɥ??å????е?????Ư???ʤ????Ȥˤ????? * ???Ƥ????????? */ if (flags & ISDOTDOT) { VOP_UNLOCK(dvp); /* inode ?????????뤿???ζ????Ǥ? */ error = VFS_VGET(dvp->v_mount, ..., &vp); if (error) { VOP_LOCK(dvp); return (error); } if (lockparent && islastcn) { error = VOP_LOCK(dvp); if (error) { vput(vp); return error; } } *vpp = vp; } else if (found entry is same as dvp) { VREF(dvp); /* ?㤨?? "." ?ʤɡ???ʬ???Ȥ?ɬ?פǤ? */ *vpp = dvp; } else { error = VFS_VGET(dvp->v_mount, ..., &vp); if (error) return (error); if (!lockparent || !islastcn) VOP_UNLOCK(dvp); *vpp = vp; } /* * Ŭ?ڤǤ?????̾?????å????????????ޤ??? */ if (cnp->cn_flags & MAKEENTRY) cache_enter(dvp, *vpp, cnp); return (0); } } ???顼
??Ϣ????VOP_ACCESS(9), VOP_CREATE(9), VOP_MKDIR(9), VOP_MKNOD(9), VOP_RENAME(9), VOP_SYMLINK(9), vnode(9) ?????ؿ? ???????Υޥ˥奢???ڡ????? ufs_lookup.c ?????Υ??????Ȥ????Υƥ????Ȥ??Ȥäơ? Doug Rabson ???ޤ?????
|