154948Sheideman /*
263248Sbostic * Copyright (c) 1992, 1993
363248Sbostic * The Regents of the University of California. All rights reserved.
454948Sheideman *
554960Sheideman * This code is derived from software donated to Berkeley by
654960Sheideman * the UCLA Ficus project.
754948Sheideman *
854948Sheideman * %sccs.include.redist.c%
954948Sheideman *
10*69615Smckusick * @(#)umap_vnops.c 8.6 (Berkeley) 05/22/95
1154948Sheideman */
1254948Sheideman
1354948Sheideman /*
1454948Sheideman * Umap Layer
1554948Sheideman */
1654948Sheideman
1754948Sheideman #include <sys/param.h>
1854948Sheideman #include <sys/systm.h>
1954948Sheideman #include <sys/time.h>
2054948Sheideman #include <sys/types.h>
2154948Sheideman #include <sys/vnode.h>
2254948Sheideman #include <sys/mount.h>
2354948Sheideman #include <sys/namei.h>
2454948Sheideman #include <sys/malloc.h>
2554948Sheideman #include <sys/buf.h>
2655052Smckusick #include <miscfs/umapfs/umap.h>
2754948Sheideman
2854948Sheideman
2954948Sheideman int umap_bug_bypass = 0; /* for debugging: enables bypass printf'ing */
3054948Sheideman
3154948Sheideman /*
3254948Sheideman * This is the 10-Apr-92 bypass routine.
3354960Sheideman * See null_vnops.c:null_bypass for more details.
3454948Sheideman */
3554948Sheideman int
umap_bypass(ap)3654948Sheideman umap_bypass(ap)
3755052Smckusick struct vop_generic_args /* {
3855052Smckusick struct vnodeop_desc *a_desc;
3955052Smckusick <other random data follows, presumably>
4055052Smckusick } */ *ap;
4154948Sheideman {
4254948Sheideman extern int (**umap_vnodeop_p)(); /* not extern, really "forward" */
4365491Spendry struct ucred **credpp = 0, *credp = 0;
4465491Spendry struct ucred *savecredp, *savecompcredp = 0;
4565491Spendry struct ucred *compcredp = 0;
4665491Spendry struct vnode **this_vp_p;
4754948Sheideman int error;
4865491Spendry struct vnode *old_vps[VDESC_MAX_VPS];
4965491Spendry struct vnode *vp1 = 0;
5054948Sheideman struct vnode **vps_p[VDESC_MAX_VPS];
5154948Sheideman struct vnode ***vppp;
5254948Sheideman struct vnodeop_desc *descp = ap->a_desc;
5354948Sheideman int reles, i;
5465491Spendry struct componentname **compnamepp = 0;
5554948Sheideman
5654948Sheideman if (umap_bug_bypass)
5754948Sheideman printf ("umap_bypass: %s\n", descp->vdesc_name);
5854948Sheideman
5954948Sheideman #ifdef SAFETY
6054948Sheideman /*
6154948Sheideman * We require at least one vp.
6254948Sheideman */
6354960Sheideman if (descp->vdesc_vp_offsets == NULL ||
6454960Sheideman descp->vdesc_vp_offsets[0] == VDESC_NO_OFFSET)
6554948Sheideman panic ("umap_bypass: no vp's in map.\n");
6654948Sheideman #endif
6754948Sheideman
6854948Sheideman /*
6954948Sheideman * Map the vnodes going in.
7054948Sheideman * Later, we'll invoke the operation based on
7154948Sheideman * the first mapped vnode's operation vector.
7254948Sheideman */
7354948Sheideman reles = descp->vdesc_flags;
7454960Sheideman for (i = 0; i < VDESC_MAX_VPS; reles >>= 1, i++) {
7554960Sheideman if (descp->vdesc_vp_offsets[i] == VDESC_NO_OFFSET)
7654948Sheideman break; /* bail out at end of list */
7754948Sheideman vps_p[i] = this_vp_p =
7865491Spendry VOPARG_OFFSETTO(struct vnode**, descp->vdesc_vp_offsets[i], ap);
7954948Sheideman
8065491Spendry if (i == 0) {
8154948Sheideman vp1 = *vps_p[0];
8254948Sheideman }
8354948Sheideman
8454948Sheideman /*
8554948Sheideman * We're not guaranteed that any but the first vnode
8654948Sheideman * are of our type. Check for and don't map any
8754960Sheideman * that aren't. (Must map first vp or vclean fails.)
8854948Sheideman */
8954948Sheideman
9054960Sheideman if (i && (*this_vp_p)->v_op != umap_vnodeop_p) {
9154960Sheideman old_vps[i] = NULL;
9254948Sheideman } else {
9354948Sheideman old_vps[i] = *this_vp_p;
9454948Sheideman *(vps_p[i]) = UMAPVPTOLOWERVP(*this_vp_p);
9554948Sheideman if (reles & 1)
9654948Sheideman VREF(*this_vp_p);
9754960Sheideman }
9854948Sheideman
9954960Sheideman }
10054948Sheideman
10154960Sheideman /*
10254960Sheideman * Fix the credentials. (That's the purpose of this layer.)
10354960Sheideman */
10454948Sheideman
10554948Sheideman if (descp->vdesc_cred_offset != VDESC_NO_OFFSET) {
10654948Sheideman
10754948Sheideman credpp = VOPARG_OFFSETTO(struct ucred**,
10854948Sheideman descp->vdesc_cred_offset, ap);
10954948Sheideman
11054948Sheideman /* Save old values */
11154948Sheideman
11254948Sheideman savecredp = (*credpp);
11354960Sheideman (*credpp) = crdup(savecredp);
11454948Sheideman credp = *credpp;
11554948Sheideman
11665491Spendry if (umap_bug_bypass && credp->cr_uid != 0)
11754948Sheideman printf("umap_bypass: user was %d, group %d\n",
11865491Spendry credp->cr_uid, credp->cr_gid);
11954948Sheideman
12054948Sheideman /* Map all ids in the credential structure. */
12154948Sheideman
12265491Spendry umap_mapids(vp1->v_mount, credp);
12354948Sheideman
12465491Spendry if (umap_bug_bypass && credp->cr_uid != 0)
12554948Sheideman printf("umap_bypass: user now %d, group %d\n",
12665491Spendry credp->cr_uid, credp->cr_gid);
12754948Sheideman }
12854948Sheideman
12954960Sheideman /* BSD often keeps a credential in the componentname structure
13054960Sheideman * for speed. If there is one, it better get mapped, too.
13154960Sheideman */
13254960Sheideman
13354960Sheideman if (descp->vdesc_componentname_offset != VDESC_NO_OFFSET) {
13454960Sheideman
13554960Sheideman compnamepp = VOPARG_OFFSETTO(struct componentname**,
13654960Sheideman descp->vdesc_componentname_offset, ap);
13754960Sheideman
13854960Sheideman compcredp = (*compnamepp)->cn_cred;
13954960Sheideman savecompcredp = compcredp;
14054960Sheideman compcredp = (*compnamepp)->cn_cred = crdup(savecompcredp);
14154960Sheideman
14265491Spendry if (umap_bug_bypass && compcredp->cr_uid != 0)
14354960Sheideman printf("umap_bypass: component credit user was %d, group %d\n",
14465491Spendry compcredp->cr_uid, compcredp->cr_gid);
14554960Sheideman
14654960Sheideman /* Map all ids in the credential structure. */
14754960Sheideman
14865491Spendry umap_mapids(vp1->v_mount, compcredp);
14954960Sheideman
15065491Spendry if (umap_bug_bypass && compcredp->cr_uid != 0)
15154960Sheideman printf("umap_bypass: component credit user now %d, group %d\n",
15265491Spendry compcredp->cr_uid, compcredp->cr_gid);
15354960Sheideman }
15454960Sheideman
15554948Sheideman /*
15654948Sheideman * Call the operation on the lower layer
15754948Sheideman * with the modified argument structure.
15854948Sheideman */
15954948Sheideman error = VCALL(*(vps_p[0]), descp->vdesc_offset, ap);
16054948Sheideman
16154948Sheideman /*
16254948Sheideman * Maintain the illusion of call-by-value
16354948Sheideman * by restoring vnodes in the argument structure
16454948Sheideman * to their original value.
16554948Sheideman */
16654948Sheideman reles = descp->vdesc_flags;
16754960Sheideman for (i = 0; i < VDESC_MAX_VPS; reles >>= 1, i++) {
16854960Sheideman if (descp->vdesc_vp_offsets[i] == VDESC_NO_OFFSET)
16954948Sheideman break; /* bail out at end of list */
17054948Sheideman if (old_vps[i]) {
17154948Sheideman *(vps_p[i]) = old_vps[i];
17254948Sheideman if (reles & 1)
17354948Sheideman vrele(*(vps_p[i]));
17454948Sheideman };
17554948Sheideman };
17654948Sheideman
17754948Sheideman /*
17854948Sheideman * Map the possible out-going vpp
17954948Sheideman * (Assumes that the lower layer always returns
18054948Sheideman * a VREF'ed vpp unless it gets an error.)
18154948Sheideman */
18254948Sheideman if (descp->vdesc_vpp_offset != VDESC_NO_OFFSET &&
18354948Sheideman !(descp->vdesc_flags & VDESC_NOMAP_VPP) &&
18454948Sheideman !error) {
18554960Sheideman if (descp->vdesc_flags & VDESC_VPP_WILLRELE)
18654960Sheideman goto out;
18754960Sheideman vppp = VOPARG_OFFSETTO(struct vnode***,
18865491Spendry descp->vdesc_vpp_offset, ap);
18954948Sheideman error = umap_node_create(old_vps[0]->v_mount, **vppp, *vppp);
19054948Sheideman };
19154948Sheideman
19254960Sheideman out:
19354948Sheideman /*
19454948Sheideman * Free duplicate cred structure and restore old one.
19554948Sheideman */
19654948Sheideman if (descp->vdesc_cred_offset != VDESC_NO_OFFSET) {
19765491Spendry if (umap_bug_bypass && credp && credp->cr_uid != 0)
19865491Spendry printf("umap_bypass: returning-user was %d\n",
19965491Spendry credp->cr_uid);
20054948Sheideman
20154948Sheideman crfree(credp);
20254948Sheideman (*credpp) = savecredp;
20365491Spendry if (umap_bug_bypass && credpp && (*credpp)->cr_uid != 0)
20454948Sheideman printf("umap_bypass: returning-user now %d\n\n",
20554948Sheideman (*credpp)->cr_uid);
20654948Sheideman }
20754948Sheideman
20854960Sheideman if (descp->vdesc_componentname_offset != VDESC_NO_OFFSET) {
20965491Spendry if (umap_bug_bypass && compcredp && compcredp->cr_uid != 0)
21054960Sheideman printf("umap_bypass: returning-component-user was %d\n",
21165491Spendry compcredp->cr_uid);
21254960Sheideman
21354960Sheideman crfree(compcredp);
21454960Sheideman (*compnamepp)->cn_cred = savecompcredp;
21565491Spendry if (umap_bug_bypass && credpp && (*credpp)->cr_uid != 0)
21665491Spendry printf("umap_bypass: returning-component-user now %d\n",
21765491Spendry compcredp->cr_uid);
21854960Sheideman }
21954960Sheideman
22054948Sheideman return (error);
22154948Sheideman }
22254948Sheideman
22354948Sheideman
22454948Sheideman /*
22554948Sheideman * We handle getattr to change the fsid.
22654948Sheideman */
22754948Sheideman int
umap_getattr(ap)22854948Sheideman umap_getattr(ap)
22955052Smckusick struct vop_getattr_args /* {
23055052Smckusick struct vnode *a_vp;
23155052Smckusick struct vattr *a_vap;
23255052Smckusick struct ucred *a_cred;
23355052Smckusick struct proc *a_p;
23455052Smckusick } */ *ap;
23554948Sheideman {
23654948Sheideman short uid, gid;
23765491Spendry int error, tmpid, nentries, gnentries;
23865491Spendry u_long (*mapdata)[2], (*gmapdata)[2];
23954960Sheideman struct vnode **vp1p;
24054960Sheideman struct vnodeop_desc *descp = ap->a_desc;
24154948Sheideman
24254960Sheideman if (error = umap_bypass(ap))
24355052Smckusick return (error);
24454948Sheideman /* Requires that arguments be restored. */
24554948Sheideman ap->a_vap->va_fsid = ap->a_vp->v_mount->mnt_stat.f_fsid.val[0];
24654948Sheideman
24754960Sheideman /*
24854960Sheideman * Umap needs to map the uid and gid returned by a stat
24954960Sheideman * into the proper values for this site. This involves
25054960Sheideman * finding the returned uid in the mapping information,
25154960Sheideman * translating it into the uid on the other end,
25254960Sheideman * and filling in the proper field in the vattr
25354960Sheideman * structure pointed to by ap->a_vap. The group
25454960Sheideman * is easier, since currently all groups will be
25554960Sheideman * translate to the NULLGROUP.
25654960Sheideman */
25754948Sheideman
25854948Sheideman /* Find entry in map */
25954948Sheideman
26054948Sheideman uid = ap->a_vap->va_uid;
26154948Sheideman gid = ap->a_vap->va_gid;
26254948Sheideman if (umap_bug_bypass)
26365491Spendry printf("umap_getattr: mapped uid = %d, mapped gid = %d\n", uid,
26454948Sheideman gid);
26554948Sheideman
26665491Spendry vp1p = VOPARG_OFFSETTO(struct vnode**, descp->vdesc_vp_offsets[0], ap);
26754960Sheideman nentries = MOUNTTOUMAPMOUNT((*vp1p)->v_mount)->info_nentries;
26865491Spendry mapdata = (MOUNTTOUMAPMOUNT((*vp1p)->v_mount)->info_mapdata);
26954960Sheideman gnentries = MOUNTTOUMAPMOUNT((*vp1p)->v_mount)->info_gnentries;
27065491Spendry gmapdata = (MOUNTTOUMAPMOUNT((*vp1p)->v_mount)->info_gmapdata);
27154948Sheideman
27254948Sheideman /* Reverse map the uid for the vnode. Since it's a reverse
27354948Sheideman map, we can't use umap_mapids() to do it. */
27454948Sheideman
27565491Spendry tmpid = umap_reverse_findid(uid, mapdata, nentries);
27654948Sheideman
27765491Spendry if (tmpid != -1) {
27854948Sheideman
27965491Spendry ap->a_vap->va_uid = (uid_t) tmpid;
28054948Sheideman if (umap_bug_bypass)
28165491Spendry printf("umap_getattr: original uid = %d\n", uid);
28254948Sheideman } else
28365491Spendry ap->a_vap->va_uid = (uid_t) NOBODY;
28454948Sheideman
28554948Sheideman /* Reverse map the gid for the vnode. */
28654948Sheideman
28765491Spendry tmpid = umap_reverse_findid(gid, gmapdata, gnentries);
28854948Sheideman
28954948Sheideman if (tmpid != -1) {
29054948Sheideman
29165491Spendry ap->a_vap->va_gid = (gid_t) tmpid;
29254948Sheideman if (umap_bug_bypass)
29365491Spendry printf("umap_getattr: original gid = %d\n", gid);
29454948Sheideman } else
29565491Spendry ap->a_vap->va_gid = (gid_t) NULLGROUP;
29654948Sheideman
29755052Smckusick return (0);
29854948Sheideman }
29954948Sheideman
30069445Smckusick /*
301*69615Smckusick * We need to process our own vnode lock and then clear the
302*69615Smckusick * interlock flag as it applies only to our vnode, not the
30369445Smckusick * vnodes below us on the stack.
30469445Smckusick */
30554948Sheideman int
umap_lock(ap)30669445Smckusick umap_lock(ap)
307*69615Smckusick struct vop_lock_args /* {
308*69615Smckusick struct vnode *a_vp;
309*69615Smckusick int a_flags;
310*69615Smckusick struct proc *a_p;
311*69615Smckusick } */ *ap;
31269445Smckusick {
313*69615Smckusick
314*69615Smckusick vop_nolock(ap);
315*69615Smckusick if ((ap->a_flags & LK_TYPE_MASK) == LK_DRAIN)
316*69615Smckusick return (0);
317*69615Smckusick ap->a_flags &= ~LK_INTERLOCK;
318*69615Smckusick return (null_bypass(ap));
319*69615Smckusick }
320*69615Smckusick
321*69615Smckusick /*
322*69615Smckusick * We need to process our own vnode unlock and then clear the
323*69615Smckusick * interlock flag as it applies only to our vnode, not the
324*69615Smckusick * vnodes below us on the stack.
325*69615Smckusick */
326*69615Smckusick int
umap_unlock(ap)327*69615Smckusick umap_unlock(ap)
328*69615Smckusick struct vop_unlock_args /* {
329*69615Smckusick struct vnode *a_vp;
330*69615Smckusick int a_flags;
331*69615Smckusick struct proc *a_p;
332*69615Smckusick } */ *ap;
333*69615Smckusick {
33469445Smckusick struct vnode *vp = ap->a_vp;
33569445Smckusick
336*69615Smckusick vop_nounlock(ap);
33769445Smckusick ap->a_flags &= ~LK_INTERLOCK;
338*69615Smckusick return (null_bypass(ap));
33969445Smckusick }
34069445Smckusick
34169445Smckusick int
umap_inactive(ap)34255052Smckusick umap_inactive(ap)
34355052Smckusick struct vop_inactive_args /* {
34455052Smckusick struct vnode *a_vp;
345*69615Smckusick struct proc *a_p;
34655052Smckusick } */ *ap;
34754948Sheideman {
34854948Sheideman /*
34954948Sheideman * Do nothing (and _don't_ bypass).
35054948Sheideman * Wait to vrele lowervp until reclaim,
35154948Sheideman * so that until then our umap_node is in the
35254948Sheideman * cache and reusable.
35354948Sheideman *
35454948Sheideman */
355*69615Smckusick VOP_UNLOCK(ap->a_vp, 0, ap->a_p);
35655052Smckusick return (0);
35754948Sheideman }
35854948Sheideman
35954948Sheideman int
umap_reclaim(ap)36055052Smckusick umap_reclaim(ap)
36155052Smckusick struct vop_reclaim_args /* {
36255052Smckusick struct vnode *a_vp;
36355052Smckusick } */ *ap;
36454948Sheideman {
36554960Sheideman struct vnode *vp = ap->a_vp;
36654960Sheideman struct umap_node *xp = VTOUMAP(vp);
36754960Sheideman struct vnode *lowervp = xp->umap_lowervp;
36854960Sheideman
36954960Sheideman /* After this assignment, this node will not be re-used. */
37054960Sheideman xp->umap_lowervp = NULL;
37167717Smckusick LIST_REMOVE(xp, umap_hash);
37254960Sheideman FREE(vp->v_data, M_TEMP);
37354960Sheideman vp->v_data = NULL;
37465491Spendry vrele(lowervp);
37555052Smckusick return (0);
37654948Sheideman }
37754948Sheideman
37854948Sheideman int
umap_strategy(ap)37955052Smckusick umap_strategy(ap)
38055052Smckusick struct vop_strategy_args /* {
38155052Smckusick struct buf *a_bp;
38255052Smckusick } */ *ap;
38354948Sheideman {
38454960Sheideman struct buf *bp = ap->a_bp;
38554960Sheideman int error;
38654960Sheideman struct vnode *savedvp;
38754948Sheideman
38854960Sheideman savedvp = bp->b_vp;
38954960Sheideman bp->b_vp = UMAPVPTOLOWERVP(bp->b_vp);
39054960Sheideman
39154960Sheideman error = VOP_STRATEGY(ap->a_bp);
39254960Sheideman
39354960Sheideman bp->b_vp = savedvp;
39454960Sheideman
39555052Smckusick return (error);
39654948Sheideman }
39754948Sheideman
39854948Sheideman int
umap_bwrite(ap)39955052Smckusick umap_bwrite(ap)
40055052Smckusick struct vop_bwrite_args /* {
40155052Smckusick struct buf *a_bp;
40255052Smckusick } */ *ap;
40354948Sheideman {
40454960Sheideman struct buf *bp = ap->a_bp;
40554948Sheideman int error;
40654948Sheideman struct vnode *savedvp;
40754948Sheideman
40854960Sheideman savedvp = bp->b_vp;
40954960Sheideman bp->b_vp = UMAPVPTOLOWERVP(bp->b_vp);
41054948Sheideman
41154960Sheideman error = VOP_BWRITE(ap->a_bp);
41254948Sheideman
41354960Sheideman bp->b_vp = savedvp;
41454948Sheideman
41555052Smckusick return (error);
41654948Sheideman }
41754948Sheideman
41854948Sheideman
41954948Sheideman int
umap_print(ap)42055052Smckusick umap_print(ap)
42155052Smckusick struct vop_print_args /* {
42255052Smckusick struct vnode *a_vp;
42355052Smckusick } */ *ap;
42454948Sheideman {
42565491Spendry struct vnode *vp = ap->a_vp;
42665491Spendry printf("\ttag VT_UMAPFS, vp=%x, lowervp=%x\n", vp, UMAPVPTOLOWERVP(vp));
42755052Smckusick return (0);
42854948Sheideman }
42954948Sheideman
43054960Sheideman int
umap_rename(ap)43154960Sheideman umap_rename(ap)
43255052Smckusick struct vop_rename_args /* {
43355052Smckusick struct vnode *a_fdvp;
43455052Smckusick struct vnode *a_fvp;
43555052Smckusick struct componentname *a_fcnp;
43655052Smckusick struct vnode *a_tdvp;
43755052Smckusick struct vnode *a_tvp;
43855052Smckusick struct componentname *a_tcnp;
43955052Smckusick } */ *ap;
44054960Sheideman {
44154960Sheideman int error;
44254960Sheideman struct componentname *compnamep;
44354960Sheideman struct ucred *compcredp, *savecompcredp;
44454960Sheideman struct vnode *vp;
44554948Sheideman
44655585Sheideman /*
44755585Sheideman * Rename is irregular, having two componentname structures.
44855585Sheideman * We need to map the cre in the second structure,
44955585Sheideman * and then bypass takes care of the rest.
45054960Sheideman */
45154960Sheideman
45254960Sheideman vp = ap->a_fdvp;
45354960Sheideman compnamep = ap->a_tcnp;
45454960Sheideman compcredp = compnamep->cn_cred;
45554960Sheideman
45654960Sheideman savecompcredp = compcredp;
45754960Sheideman compcredp = compnamep->cn_cred = crdup(savecompcredp);
45854960Sheideman
45965491Spendry if (umap_bug_bypass && compcredp->cr_uid != 0)
46054960Sheideman printf("umap_rename: rename component credit user was %d, group %d\n",
46165491Spendry compcredp->cr_uid, compcredp->cr_gid);
46254960Sheideman
46354960Sheideman /* Map all ids in the credential structure. */
46454960Sheideman
46565491Spendry umap_mapids(vp->v_mount, compcredp);
46654960Sheideman
46765491Spendry if (umap_bug_bypass && compcredp->cr_uid != 0)
46854960Sheideman printf("umap_rename: rename component credit user now %d, group %d\n",
46965491Spendry compcredp->cr_uid, compcredp->cr_gid);
47054960Sheideman
47155585Sheideman error = umap_bypass(ap);
47254960Sheideman
47354960Sheideman /* Restore the additional mapped componentname cred structure. */
47454960Sheideman
47554960Sheideman crfree(compcredp);
47654960Sheideman compnamep->cn_cred = savecompcredp;
47755585Sheideman
47855585Sheideman return error;
47954960Sheideman }
48054960Sheideman
48154948Sheideman /*
48254948Sheideman * Global vfs data structures
48354948Sheideman */
48454948Sheideman /*
48565491Spendry * XXX - strategy, bwrite are hand coded currently. They should
48654948Sheideman * go away with a merged buffer/block cache.
48754948Sheideman *
48854948Sheideman */
48954948Sheideman int (**umap_vnodeop_p)();
49054948Sheideman struct vnodeopv_entry_desc umap_vnodeop_entries[] = {
49154948Sheideman { &vop_default_desc, umap_bypass },
49254948Sheideman
49354948Sheideman { &vop_getattr_desc, umap_getattr },
49469445Smckusick { &vop_lock_desc, umap_lock },
495*69615Smckusick { &vop_unlock_desc, umap_unlock },
49654948Sheideman { &vop_inactive_desc, umap_inactive },
49754948Sheideman { &vop_reclaim_desc, umap_reclaim },
49854948Sheideman { &vop_print_desc, umap_print },
49955585Sheideman { &vop_rename_desc, umap_rename },
50054948Sheideman
50154948Sheideman { &vop_strategy_desc, umap_strategy },
50254960Sheideman { &vop_bwrite_desc, umap_bwrite },
50354948Sheideman
50465491Spendry { (struct vnodeop_desc*) NULL, (int(*)()) NULL }
50554948Sheideman };
50654948Sheideman struct vnodeopv_desc umap_vnodeop_opv_desc =
50754948Sheideman { &umap_vnodeop_p, umap_vnodeop_entries };
508