Instead of hard coding the major numbers for IDE and SCSI disks

look in the device's cdevsw for the D_DISK flag.
This commit is contained in:
Josef Karthauser 2001-01-14 23:33:50 +00:00
parent 6b79597012
commit 4c3a3ec075
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=71048

View File

@ -100,6 +100,8 @@ static int
newstat_copyout(struct stat *buf, void *ubuf)
{
struct linux_newstat tbuf;
struct cdevsw *cdevsw;
dev_t dev;
tbuf.stat_dev = uminor(buf->st_dev) | (umajor(buf->st_dev) << 8);
tbuf.stat_ino = buf->st_ino;
@ -114,17 +116,22 @@ newstat_copyout(struct stat *buf, void *ubuf)
tbuf.stat_ctime = buf->st_ctime;
tbuf.stat_blksize = buf->st_blksize;
tbuf.stat_blocks = buf->st_blocks;
/* Lie about disk drives which are character devices
* in FreeBSD but block devices under Linux.
*/
if (tbuf.stat_mode & S_IFCHR &&
(umajor(buf->st_rdev) == 116 ||
umajor(buf->st_rdev) == 13)) {
(dev = udev2dev(buf->st_rdev, 0)) != NODEV) {
cdevsw = devsw(dev);
if (cdevsw != NULL && (cdevsw->d_flags & D_DISK)) {
tbuf.stat_mode &= ~S_IFCHR;
tbuf.stat_mode |= S_IFBLK;
tbuf.stat_mode &= ~S_IFCHR;
tbuf.stat_mode |= S_IFBLK;
/* XXX this may not be quite right */
/* Map major number to 0 */
tbuf.stat_dev = uminor(buf->st_dev) & 0xf;
tbuf.stat_rdev = buf->st_rdev & 0xff;
/* XXX this may not be quite right */
/* Map major number to 0 */
tbuf.stat_dev = uminor(buf->st_dev) & 0xf;
tbuf.stat_rdev = buf->st_rdev & 0xff;
}
}
return (copyout(&tbuf, ubuf, sizeof(tbuf)));