diff --git a/sys/kern/vfs_vnops.c.dotdot b/sys/kern/vfs_vnops.c.sav --- a/sys/kern/vfs_vnops.c.dotdot +++ b/sys/kern/vfs_vnops.c.sav @@ -363,10 +363,20 @@ if ((error = namei(ndp)) != 0) return (error); vp = ndp->ni_vp; - if ((fmode & O_NAMEDATTR) != 0 && (vp->v_mount->mnt_flag & - MNT_NAMEDATTR) == 0) { - error = EINVAL; - goto bad; + if ((fmode & O_NAMEDATTR) != 0) { + short irflag; + + irflag = vn_irflag_read(vp); + if ((vp->v_mount->mnt_flag & + MNT_NAMEDATTR) == 0 || + ((irflag & VIRF_NAMEDATTR) != 0 && + vp->v_type != VREG)) + error = EINVAL; + else if ((irflag & (VIRF_NAMEDDIR | + VIRF_NAMEDATTR)) == 0) + error = ENOATTR; + if (error != 0) + goto bad; } } error = vn_open_vnode(vp, fmode, cred, curthread, fp);