diff options
Diffstat (limited to 'drivers/tty/tty_io.c')
| -rw-r--r-- | drivers/tty/tty_io.c | 31 | 
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index 4737a8f92c2e..3959efc717aa 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -101,6 +101,7 @@  #include <linux/compat.h>  #include <linux/uaccess.h>  #include <linux/termios_internal.h> +#include <linux/fs.h>  #include <linux/kbd_kern.h>  #include <linux/vt_kern.h> @@ -811,18 +812,26 @@ void start_tty(struct tty_struct *tty)  }  EXPORT_SYMBOL(start_tty); -static void tty_update_time(struct timespec64 *time) +static void tty_update_time(struct tty_struct *tty, bool mtime)  {  	time64_t sec = ktime_get_real_seconds(); +	struct tty_file_private *priv; -	/* -	 * We only care if the two values differ in anything other than the -	 * lower three bits (i.e every 8 seconds).  If so, then we can update -	 * the time of the tty device, otherwise it could be construded as a -	 * security leak to let userspace know the exact timing of the tty. -	 */ -	if ((sec ^ time->tv_sec) & ~7) -		time->tv_sec = sec; +	spin_lock(&tty->files_lock); +	list_for_each_entry(priv, &tty->tty_files, list) { +		struct inode *inode = file_inode(priv->file); +		struct timespec64 *time = mtime ? &inode->i_mtime : &inode->i_atime; + +		/* +		 * We only care if the two values differ in anything other than the +		 * lower three bits (i.e every 8 seconds).  If so, then we can update +		 * the time of the tty device, otherwise it could be construded as a +		 * security leak to let userspace know the exact timing of the tty. +		 */ +		if ((sec ^ time->tv_sec) & ~7) +			time->tv_sec = sec; +	} +	spin_unlock(&tty->files_lock);  }  /* @@ -928,7 +937,7 @@ static ssize_t tty_read(struct kiocb *iocb, struct iov_iter *to)  	tty_ldisc_deref(ld);  	if (i > 0) -		tty_update_time(&inode->i_atime); +		tty_update_time(tty, false);  	return i;  } @@ -1036,7 +1045,7 @@ static inline ssize_t do_tty_write(  		cond_resched();  	}  	if (written) { -		tty_update_time(&file_inode(file)->i_mtime); +		tty_update_time(tty, true);  		ret = written;  	}  out:  | 
