drm/amd/display: only accept async flips for fast updates
[linux-2.6-microblaze.git] / drivers / tty / tty_io.c
index 4737a8f..3959efc 100644 (file)
 #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: