else
                        ldata->push = 0;
                tty_audit_push();
+               return false;
        }
-       return 0;
+ 
+       /* No EOL found - do a continuation retry if there is more data */
+       return ldata->read_tail != canon_head;
  }
  
 -extern ssize_t redirected_tty_write(struct file *, const char __user *,
 -                                                      size_t, loff_t *);
 -
  /**
   *    job_control             -       check job control
   *    @tty: tty
 
  /* Mutex to protect creating and releasing a tty */
  DEFINE_MUTEX(tty_mutex);
  
- static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *);
+ static ssize_t tty_read(struct kiocb *, struct iov_iter *);
  static ssize_t tty_write(struct kiocb *, struct iov_iter *);
 -ssize_t redirected_tty_write(struct kiocb *, struct iov_iter *);
  static __poll_t tty_poll(struct file *, poll_table *);
  static int tty_open(struct inode *, struct file *);
 -long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
  #ifdef CONFIG_COMPAT
  static long tty_compat_ioctl(struct file *file, unsigned int cmd,
                                unsigned long arg);
 
  extern int tty_dev_name_to_number(const char *name, dev_t *number);
  extern int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout);
  extern void tty_ldisc_unlock(struct tty_struct *tty);
 +extern ssize_t redirected_tty_write(struct kiocb *, struct iov_iter *);
+ extern struct file *tty_release_redirect(struct tty_struct *tty);
  #else
  static inline void tty_kref_put(struct tty_struct *tty)
  { }