--- src/sys/vfs/gnu/ext2fs/ext2_vnops.c 2007/05/06 19:23:33 1.38 +++ src/sys/vfs/gnu/ext2fs/ext2_vnops.c 2007/05/09 00:53:35 1.39 @@ -286,18 +286,23 @@ ext2_mknod(struct vop_old_mknod_args *ap ino_t ino; int error; + if (vap->va_rmajor != VNOVAL && + makeudev(vap->va_rmajor, vap->va_rminor) == NOUDEV) { + return (EINVAL); + } + error = ext2_makeinode(MAKEIMODE(vap->va_type, vap->va_mode), ap->a_dvp, vpp, ap->a_cnp); if (error) return (error); ip = VTOI(*vpp); ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; - if (vap->va_rdev != VNOVAL) { + if (vap->va_rmajor != VNOVAL) { /* * Want to be able to use this to make badblock * inodes, so don't truncate the dev number. */ - ip->i_rdev = vap->va_rdev; + ip->i_rdev = makeudev(vap->va_rmajor, vap->va_rminor); } /* * Remove inode, then reload it through VFS_VGET so it is @@ -1441,7 +1446,8 @@ ext2_getattr(struct vop_getattr_args *ap ip->i_effnlink : ip->i_nlink; vap->va_uid = ip->i_uid; vap->va_gid = ip->i_gid; - vap->va_rdev = ip->i_rdev; + vap->va_rmajor = umajor(ip->i_rdev); + vap->va_rminor = uminor(ip->i_rdev); vap->va_size = ip->i_din.di_size; vap->va_atime.tv_sec = ip->i_atime; vap->va_atime.tv_nsec = ip->i_atimensec; @@ -1478,7 +1484,7 @@ ext2_setattr(struct vop_setattr_args *ap */ if ((vap->va_type != VNON) || (vap->va_nlink != VNOVAL) || (vap->va_fsid != VNOVAL) || (vap->va_fileid != VNOVAL) || - (vap->va_blocksize != VNOVAL) || (vap->va_rdev != VNOVAL) || + (vap->va_blocksize != VNOVAL) || (vap->va_rmajor != VNOVAL) || ((int)vap->va_bytes != VNOVAL) || (vap->va_gen != VNOVAL)) { return (EINVAL); } @@ -2040,7 +2046,7 @@ ext2_vinit(struct mount *mntp, struct vn case VCHR: case VBLK: vp->v_ops = &mntp->mnt_vn_spec_ops; - addaliasu(vp, ip->i_rdev); + addaliasu(vp, umajor(ip->i_rdev), uminor(ip->i_rdev)); break; case VFIFO: vp->v_ops = &mntp->mnt_vn_fifo_ops;