mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-12-03 23:28:57 +00:00
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:
parent
6b79597012
commit
4c3a3ec075
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=71048
@ -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)));
|
||||
|
Loading…
Reference in New Issue
Block a user