tty idle time and hooking inode_ops from a chardev

From: Phillip Susi
Date: Fri Dec 16 2011 - 11:52:44 EST


I finally have spent some time figuring out an ancient bug that has bothered me on and off over the years: why the terminal idle time that who reports is sometimes very wrong. It seems that this feature relies on the atime of the tty dev node being updated by the kernel whenever input is entered ( or more specifically, when it is read ). Some programs, notably emacs and less, open /dev/tty rather than use stdin, and as a result, the atime of that inode is updated instead of the specific tty emacs is attached to. This also means that if you mknod another inode to reach that tty ( say, for a chroot ), the times won't be updated correctly either.

To solve this, I think that a timestamp needs to be added to the struct tty_struct, and this should be updated whenever there is input, rather than updating the inode when the input is actually read. In order to maintain compatibility with user space however, I would like to hook the stat calls and update the inode's atime from tty_struct whenever user space checks it.

To do this, I think that tty_open would need to replace the inode_operations pointer to point to its own version that has a set of functions that forward to the original inode_operations, but the iop->getattr would update the inode's atime from the tty_struct. This means it needs to be able to locate both the tty_struct and the original inode_operations given the inode. Is the i_private member of struct inode available for the tty code to use for this?

Alternatively, does anyone have a better idea to accomplish this?

Perhaps instead, struct cdev could gain a function pointer to allow it to hook vfs_stat? I'm pretty sure there is a way to find the tty_struct given the cdev ( through dev_t? ), but I'm not sure what it is.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/