|
̾??
????
???????Υ????ȥ??ݥ????Ȥ?Ϳ?????줿?ǥ??쥯?ȥ?????ñ???Υѥ?̾???Ǥ?Ĵ?٤ޤ??? ?????ϰʲ??ΤȤ????Ǥ???
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 ???ޤ?????
|