]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/tty/tty_io.c
TTY: fix atime/mtime regression
[karo-tx-linux.git] / drivers / tty / tty_io.c
index 05400acbc456f1e9e888972e5c73c5c4f634d71c..b0452688308c6605bfc64168c790a442bef1407d 100644 (file)
@@ -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;