diff options
Diffstat (limited to 'drivers/tty/tty_io.c')
| -rw-r--r-- | drivers/tty/tty_io.c | 18 | 
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index 05400acbc45..b0452688308 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -941,6 +941,14 @@ void start_tty(struct tty_struct *tty)  EXPORT_SYMBOL(start_tty); +static void tty_update_time(struct timespec *time) +{ +	unsigned long sec = get_seconds(); +	sec -= sec % 60; +	if ((long)(sec - time->tv_sec) > 0) +		time->tv_sec = sec; +} +  /**   *	tty_read	-	read method for tty device files   *	@file: pointer to tty file @@ -960,10 +968,11 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count,  			loff_t *ppos)  {  	int i; +	struct inode *inode = file_inode(file);  	struct tty_struct *tty = file_tty(file);  	struct tty_ldisc *ld; -	if (tty_paranoia_check(tty, file_inode(file), "tty_read")) +	if (tty_paranoia_check(tty, inode, "tty_read"))  		return -EIO;  	if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))  		return -EIO; @@ -977,6 +986,9 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count,  		i = -EIO;  	tty_ldisc_deref(ld); +	if (i > 0) +		tty_update_time(&inode->i_atime); +  	return i;  } @@ -1077,8 +1089,10 @@ static inline ssize_t do_tty_write(  			break;  		cond_resched();  	} -	if (written) +	if (written) { +		tty_update_time(&file_inode(file)->i_mtime);  		ret = written; +	}  out:  	tty_write_unlock(tty);  	return ret;  |