diff -urBN /usr/src.2/sys/fs/unionfs/union_subr.c /usr/src/sys/fs/unionfs/union_subr.c --- /usr/src.2/sys/fs/unionfs/union_subr.c 2008-01-07 13:19:07.000000000 +0900 +++ /usr/src/sys/fs/unionfs/union_subr.c 2008-01-07 13:47:39.000000000 +0900 @@ -113,10 +113,10 @@ struct unionfs_node *unp; struct vnode *vp; - KASSERT((uvp == NULLVP || uvp->v_type == VDIR), - ("unionfs_get_cached_vdir: v_type != VDIR")); - KASSERT((lvp == NULLVP || lvp->v_type == VDIR), - ("unionfs_get_cached_vdir: v_type != VDIR")); + KASSERT((uvp == NULLVP || uvp->v_type == VDIR || uvp->v_type == VSOCK), + ("unionfs_get_cached_vdir: v_type != VDIR/VSOCK")); + KASSERT((lvp == NULLVP || lvp->v_type == VDIR || lvp->v_type == VSOCK), + ("unionfs_get_cached_vdir: v_type != VDIR/VSOCK")); VI_LOCK(dvp); hd = unionfs_get_hashhead(dvp, path); @@ -150,10 +150,12 @@ struct unionfs_node *unp; struct vnode *vp; - KASSERT((uncp->un_uppervp==NULLVP || uncp->un_uppervp->v_type==VDIR), - ("unionfs_ins_cached_vdir: v_type != VDIR")); - KASSERT((uncp->un_lowervp==NULLVP || uncp->un_lowervp->v_type==VDIR), - ("unionfs_ins_cached_vdir: v_type != VDIR")); + KASSERT((uncp->un_uppervp==NULLVP || uncp->un_uppervp->v_type==VDIR || + uncp->un_uppervp->v_type==VSOCK), + ("unionfs_ins_cached_vdir: v_type != VDIR/VSOCK")); + KASSERT((uncp->un_lowervp==NULLVP || uncp->un_lowervp->v_type==VDIR || + uncp->un_lowervp->v_type==VSOCK), + ("unionfs_ins_cached_vdir: v_type != VDIR/VSOCK")); VI_LOCK(dvp); hd = unionfs_get_hashhead(dvp, path); @@ -232,7 +234,7 @@ path = NULL; /* check the vdir cache */ - if (path != NULL && dvp != NULLVP && vt == VDIR) { + if (path != NULL && dvp != NULLVP && (vt == VDIR || vt == VSOCK)) { vp = unionfs_get_cached_vdir(uppervp, lowervp, dvp, path); if (vp != NULLVP) { vref(vp); @@ -273,9 +275,20 @@ if (lowervp != NULLVP) vref(lowervp); - if (vt == VDIR) + switch (vt) { + case VDIR: unp->un_hashtbl = hashinit(NUNIONFSNODECACHE, M_UNIONFSHASH, &(unp->un_hashmask)); + break; + case VSOCK: + if (uppervp != NULLVP) + vp->v_socket = uppervp->v_socket; + else + vp->v_socket = lowervp->v_socket; + break; + default: + break; + } unp->un_vnode = vp; unp->un_uppervp = uppervp; @@ -299,7 +312,7 @@ (lowervp != NULLVP && ump->um_lowervp == lowervp)) vp->v_vflag |= VV_ROOT; - if (path != NULL && dvp != NULLVP && vt == VDIR) + if (path != NULL && dvp != NULLVP && (vt == VDIR || vt == VSOCK)) *vpp = unionfs_ins_cached_vdir(unp, dvp, path); if ((*vpp) != NULLVP) { if (dvp != NULLVP) @@ -358,7 +371,8 @@ VOP_UNLOCK(uvp, 0, td); vp->v_object = NULL; - if (unp->un_path != NULL && dvp != NULLVP && vp->v_type == VDIR) + if (unp->un_path != NULL && dvp != NULLVP && + (vp->v_type == VDIR || vp->v_type == VSOCK)) unionfs_rem_cached_vdir(unp, dvp); if (lvp != NULLVP) { @@ -722,7 +736,8 @@ /* * cache update */ - if (unp->un_path != NULL && dvp != NULLVP && vp->v_type == VDIR) { + if (unp->un_path != NULL && dvp != NULLVP && + (vp->v_type == VDIR || vp->v_type == VSOCK)) { static struct unionfs_node_hashhead *hd; VI_LOCK(dvp);