static int unionfs_mknod(void *v) { struct vop_mknod_args *ap = v; struct unionfs_node *dunp; struct componentname *cnp; struct vnode *udvp; struct vnode *vp; int error; UNIONFS_INTERNAL_DEBUG("unionfs_mknod: enter\n"); dunp = VTOUNIONFS(ap->a_dvp); cnp = ap->a_cnp; udvp = dunp->un_uppervp; error = EROFS; if (udvp != NULLVP) { if ((error = VOP_MKNOD(udvp, &vp, cnp, ap->a_vap)) == 0) { error = unionfs_nodeget(ap->a_dvp->v_mount, vp, NULLVP, ap->a_dvp, ap->a_vpp, cnp); if (error) { vput(vp); } else { vrele(vp); } } } UNIONFS_INTERNAL_DEBUG("unionfs_mknod: leave (%d)\n", error); return (error); }
int RUMP_VOP_MKNOD(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp, struct vattr *vap) { int error; rump_schedule(); error = VOP_MKNOD(dvp, vpp, cnp, vap); rump_unschedule(); return error; }
/* * union_mknod: * * a_dvp is locked on entry and should remain locked on return. * a_vpp is garbagre whether an error occurs or not. * * union_mknod(struct vnode *a_dvp, struct vnode **a_vpp, * struct componentname *a_cnp, struct vattr *a_vap) */ static int union_mknod(struct vop_old_mknod_args *ap) { struct union_node *dun = VTOUNION(ap->a_dvp); struct componentname *cnp = ap->a_cnp; struct vnode *dvp; int error = EROFS; if ((dvp = union_lock_upper(dun, cnp->cn_td)) != NULL) { error = VOP_MKNOD(dvp, ap->a_vpp, cnp, ap->a_vap); union_unlock_upper(dvp, cnp->cn_td); } return (error); }