|
@@ -688,7 +688,7 @@ static void pty_unix98_shutdown(struct tty_struct *tty)
|
|
|
else
|
|
|
ptmx_inode = tty->link->driver_data;
|
|
|
devpts_kill_index(ptmx_inode, tty->index);
|
|
|
- iput(ptmx_inode); /* drop reference we acquired at ptmx_open */
|
|
|
+ devpts_del_ref(ptmx_inode);
|
|
|
}
|
|
|
|
|
|
static const struct tty_operations ptm_unix98_ops = {
|
|
@@ -785,9 +785,12 @@ static int ptmx_open(struct inode *inode, struct file *filp)
|
|
|
* still have /dev/tty opened pointing to the master/slave pair (ptmx
|
|
|
* is closed/released before /dev/tty), we must make sure that the inode
|
|
|
* is still valid when we call the final pty_unix98_shutdown, thus we
|
|
|
- * hold an additional reference to the ptmx inode
|
|
|
+ * hold an additional reference to the ptmx inode. For the same /dev/tty
|
|
|
+ * last close case, we also need to make sure the super_block isn't
|
|
|
+ * destroyed (devpts instance unmounted), before /dev/tty is closed and
|
|
|
+ * on its release devpts_kill_index is called.
|
|
|
*/
|
|
|
- ihold(inode);
|
|
|
+ devpts_add_ref(inode);
|
|
|
|
|
|
tty_add_file(tty, filp);
|
|
|
|