- if (wantrsrc) {
- /* Use cnode's rsrcfork vnode (if available) */
- if (cp->c_rsrc_vp != NULL) {
- *vpp = vp = cp->c_rsrc_vp;
- if (VNAME(vp) == NULL) {
- // the +1/-2 thing is to skip the leading "/" on the rsrc fork spec
- // and to not count the trailing null byte at the end of the string.
- VNAME(vp) = add_name(_PATH_RSRCFORKSPEC+1, sizeof(_PATH_RSRCFORKSPEC)-2, 0, 0);
- }
- if (VPARENT(vp) == NULL) {
- vget(cp->c_vp, 0, p);
- VPARENT(vp) = cp->c_vp;
- }
- vpid = vp->v_id;
- } else {
- goto lookup;
- }
- }
- }
- error = vget(vp, 0, p);
- if (error == 0) {
- if (VTOC(vp) == NULL || vp->v_data != (void *)cp) {
- panic("hfs: cache lookup: my cnode disappeared/went bad! vp 0x%x 0x%x 0x%x\n",
- vp, vp->v_data, cp);
- }
- if (cnp->cn_nameiop == LOOKUP &&
- (!(flags & ISLASTCN) || (flags & SHAREDLEAF)))
- error = lockmgr(&VTOC(vp)->c_lock, LK_SHARED, NULL, p);
- else
- error = lockmgr(&VTOC(vp)->c_lock, LK_EXCLUSIVE, NULL, p);
- }
- if (!lockparent || error || !(flags & ISLASTCN)) {
- (void) lockmgr(&dcp->c_lock, LK_RELEASE, NULL, p);
- }