GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
VOP_LOOKUP(9) FreeBSD Kernel Developer's Manual VOP_LOOKUP(9)

̾??

VOP_LOOKUP?ѥ?̾?ι??????Ǥ?Ĵ??

<sys/param.h> <sys/vnode.h> <sys/namei.h> int (struct vnode *dvp, struct vnode **vpp, struct componentname *cnp)

???Υ????ȥ??ݥ????Ȥ?Ϳ?????줿?ǥ??쥯?ȥ?????ñ???Υѥ?̾???Ǥ?Ĵ?٤ޤ???

?????ϰʲ??ΤȤ????Ǥ???

dvp
?????????ǥ??쥯?ȥ??Υ??å????줿 vnode ?Ǥ???
vpp
???̤Υ??å????줿 vnode ????Ǽ???????٤??ѿ??Υ??ɥ쥹?Ǥ???
cnp
?????????뤿???Υѥ?̾???ǤǤ???

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 ?????ϡ????֥??????Ȥ???????Ū?˰?¸???? LOOKUP, CREATE, RENAME, ?ޤ??? DELETE ?Ǥ??? CREATE, RENAME, ?ޤ??? DELETE ?????????줿?Ȥ??ˤϡ??ǥ??쥯?ȥꥨ???ȥ??κ?????̾???ѹ????????? ???Ѥ??????󤬷׻??Ǥ??ޤ???

VOP_LOOKUP ?????Τγ??פǤ???

?ǥ??쥯?ȥ??Υ????????????????å????ޤ??? ?????å?????????̾???򸡺??????⤷???Ĥ????С?????̾?????֤??ޤ??? ?ǥ??쥯?ȥ???????̾???򸡺?????found ?ޤ??? notfound ??Ŭ?ڤ˿ʤߤޤ???

notfound:

?????ޤ???̾???ѹ??ǥѥ?̾?κǸ??ξ????ˤϡ? EJUSTRETURN ???֤??????Ѳ?ǽ?ʰ??֤˾??????Ĥ??ޤ??? ?????Ǥʤ????? ENOENT ???֤??ޤ???

found:

?ѥ?̾?κǸ??Ǻ????ξ????ˤϡ?????????ǽ?ˤ??????????֤??ޤ??? ?ѥ?̾?κǸ???̾???ѹ??ξ????ˤϡ??ѹ????? inode ?????å????? ̾???ѹ?????ǽ?ˤ??????????֤??ޤ??? ?Ǹ??Ǥʤ??????ˤϡ?̾???򥭥??å??????ɲä??ޤ??? ?Ǹ??Ǻ????Ǥ??????Ǥ??ʤ??????ˤϡ?̾???򥭥??å??????ɲä??ޤ???

?ǥ??쥯?ȥ? dvp ?ϥ????ȥ????˥??å??????Ƥ????٤??Ǥ??? ???顼 (??: ?????? EJUSTRETURN ?ϥ??顼?ȤϤߤʤ????ޤ???) ?????Ф??줿?????ˤϡ????å????줿?ޤ??????ޤ??? ???????ʤ??顢 cnp->cn_flags ?? LOCKPARENT ?????? ISLASTCN ??ξ?????????????Ƥ??ʤ??????ˤϡ????????å??????ޤ????? ?????ȥ꤬???Υǥ??쥯?ȥ??????Ǹ??Ĥ??ä??????ˤϡ????å????????֤????ޤ???

???Ǥ????Ĥ??ä??????ˤϡ? *vpp ?ˤ??Υե??????Υ??å????줿 vnode ?????ꤵ???ơ?0 ???֤????ޤ??? ?????????Ƥ??????Ǥ? "." ?ξ??硢???? vnode ?? vref(9) ?????Ѥ????ɲä??줿;ʬ?ʻ??Ȥ????ޤ??? ???ξ????ϡ??ƤӽФ?¦??Ŭ?ڤ˥??å??????????뤳?Ȥ????դ??ʤ????Фʤ??ޤ?????

???Ǥ????Ĥ??餺??? CREATE ?ޤ??? RENAME ?Ǥ????????ˤϡ??ե饰 ISLASTCN ?????????????????????????????̤??????? EJUSTRETURN ???֤????ޤ??? ?????Ǥʤ??????ˤϡ?Ŭ?ڤʥ??顼?????ɤ??֤????ޤ???

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);
    }
}

[ENOTDIR]
vnode dvp ???ǥ??쥯?ȥ???ɽ?路?Ƥ??ޤ?????
[ENOENT]
???? dvp ?????Υǥ??쥯?ȥ??ˤϸ??Ĥ????ޤ?????
[EACCES]
???????줿?????Τ????Υ????????????ݤ????ޤ?????
[EJUSTRETURN]
?ޤ??? RENAME ?????????????Ǥ???

VOP_ACCESS(9), VOP_CREATE(9), VOP_MKDIR(9), VOP_MKNOD(9), VOP_RENAME(9), VOP_SYMLINK(9), vnode(9)

?ؿ? VOP_LOOKUP ?? 4.3BSD ???о줷?ޤ?????

???Υޥ˥奢???ڡ????? ufs_lookup.c ?????Υ??????Ȥ????Υƥ????Ȥ??Ȥäơ? Doug Rabson ???񤭤ޤ?????

November 24, 1997 FreeBSD 14.3-RELEASE

Search for    or go to Top of page |  Section 9 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.