* devices.h (device::get_device): New method.

* fhandler_dev.cc (fhandler_dev::readdir): Set st_ino to device number.
	* syscalls.cc (fhandler_base::stat_fixup): Ditto.  Fix link count for
	CD-ROM devices.  Fix typo in comment.
This commit is contained in:
Corinna Vinschen 2012-04-02 19:25:58 +00:00
parent 467e17b9af
commit eb7729eb36
4 changed files with 17 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2012-04-02 Corinna Vinschen <corinna@vinschen.de>
* devices.h (device::get_device): New method.
* fhandler_dev.cc (fhandler_dev::readdir): Set st_ino to device number.
* syscalls.cc (fhandler_base::stat_fixup): Ditto. Fix link count for
CD-ROM devices. Fix typo in comment.
2012-04-02 Corinna Vinschen <corinna@vinschen.de> 2012-04-02 Corinna Vinschen <corinna@vinschen.de>
* fhandler.h (fhandler_base::stat_fixup): Rename from * fhandler.h (fhandler_base::stat_fixup): Rename from

View File

@ -308,6 +308,7 @@ struct device
_minor_t get_minor () const {return d.minor;} _minor_t get_minor () const {return d.minor;}
_major_t get_major () const {return d.major;} _major_t get_major () const {return d.major;}
_dev_t get_device () const {return d.devn;}
inline operator int& () {return d.devn_int;} inline operator int& () {return d.devn_int;}
inline operator fh_devices () {return d.devn_fh_devices;} inline operator fh_devices () {return d.devn_fh_devices;}

View File

@ -208,11 +208,10 @@ fhandler_dev::readdir (DIR *dir, dirent *de)
{ {
/* Make sure conin, conout, and console have the same inode number /* Make sure conin, conout, and console have the same inode number
as the current consX. */ as the current consX. */
dev.parse (myself->ctty); de->d_ino = myself->ctty;
de->d_ino = hash_path_name (0, dev.native);
} }
else else
de->d_ino = hash_path_name (0, curdev->native); de->d_ino = curdev->get_device ();
de->d_type = curdev->type (); de->d_type = curdev->type ();
ret = 0; ret = 0;
break; break;

View File

@ -1591,8 +1591,10 @@ static bool dev_st_inited;
void void
fhandler_base::stat_fixup (struct __stat64 *buf) fhandler_base::stat_fixup (struct __stat64 *buf)
{ {
/* Set inode number to device number. This gives us a valid, unique
inode number and we especially don't have to call hash_path_name. */
if (!buf->st_ino) if (!buf->st_ino)
buf->st_ino = get_ino (); buf->st_ino = get_device ();
/* For /dev-based devices, st_dev must be set to the device number of /dev, /* For /dev-based devices, st_dev must be set to the device number of /dev,
not it's own device major/minor numbers. What we do here to speed up not it's own device major/minor numbers. What we do here to speed up
the process is to fetch the device number of /dev only once, liberally the process is to fetch the device number of /dev only once, liberally
@ -1616,9 +1618,12 @@ fhandler_base::stat_fixup (struct __stat64 *buf)
{ {
buf->st_rdev = get_device (); buf->st_rdev = get_device ();
/* consX, console, conin, and conout point to the same device. /* consX, console, conin, and conout point to the same device.
make sure the link count is correct. */ Make sure the link count is correct. */
if (buf->st_rdev == (dev_t) myself->ctty && iscons_dev (myself->ctty)) if (buf->st_rdev == (dev_t) myself->ctty && iscons_dev (myself->ctty))
buf->st_nlink = 4; buf->st_nlink = 4;
/* CD-ROM drives have two links, /dev/srX and /dev/scdX. */
else if (gnu_dev_major (buf->st_rdev) == DEV_CDROM_MAJOR)
buf->st_nlink = 2;
} }
} }