mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
devpts: Make each mount of devpts an independent filesystem.
The /dev/ptmx device node is changed to lookup the directory entry "pts" in the same directory as the /dev/ptmx device node was opened in. If there is a "pts" entry and that entry is a devpts filesystem /dev/ptmx uses that filesystem. Otherwise the open of /dev/ptmx fails. The DEVPTS_MULTIPLE_INSTANCES configuration option is removed, so that userspace can now safely depend on each mount of devpts creating a new instance of the filesystem. Each mount of devpts is now a separate and equal filesystem. Reserved ttys are now available to all instances of devpts where the mounter is in the initial mount namespace. A new vfs helper path_pts is introduced that finds a directory entry named "pts" in the directory of the passed in path, and changes the passed in path to point to it. The helper path_pts uses a function path_parent_directory that was factored out of follow_dotdot. In the implementation of devpts: - devpts_mnt is killed as it is no longer meaningful if all mounts of devpts are equal. - pts_sb_from_inode is replaced by just inode->i_sb as all cached inodes in the tty layer are now from the devpts filesystem. - devpts_add_ref is rolled into the new function devpts_ptmx. And the unnecessary inode hold is removed. - devpts_del_ref is renamed devpts_release and reduced to just a deacrivate_super. - The newinstance mount option continues to be accepted but is now ignored. In devpts_fs.h definitions for when !CONFIG_UNIX98_PTYS are removed as they are never used. Documentation/filesystems/devices.txt is updated to describe the current situation. This has been verified to work properly on openwrt-15.05, centos5, centos6, centos7, debian-6.0.2, debian-7.9, debian-8.2, ubuntu-14.04.3, ubuntu-15.10, fedora23, magia-5, mint-17.3, opensuse-42.1, slackware-14.1, gentoo-20151225 (13.0?), archlinux-2015-12-01. With the caveat that on centos6 and on slackware-14.1 that there wind up being two instances of the devpts filesystem mounted on /dev/pts, the lower copy does not end up getting used. Signed-off-by: "Eric W. Biederman" <[email protected]> Cc: Greg KH <[email protected]> Cc: Peter Hurley <[email protected]> Cc: Peter Anvin <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Al Viro <[email protected]> Cc: Serge Hallyn <[email protected]> Cc: Willy Tarreau <[email protected]> Cc: Aurelien Jarno <[email protected]> Cc: One Thousand Gnomes <[email protected]> Cc: Jann Horn <[email protected]> Cc: Jiri Slaby <[email protected]> Cc: Florian Weimer <[email protected]> Cc: Konstantin Khlebnikov <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
049ec1b5a7
commit
eedf265aa0
7 changed files with 126 additions and 296 deletions
|
|
@ -120,17 +120,6 @@ config UNIX98_PTYS
|
|||
All modern Linux systems use the Unix98 ptys. Say Y unless
|
||||
you're on an embedded system and want to conserve memory.
|
||||
|
||||
config DEVPTS_MULTIPLE_INSTANCES
|
||||
bool "Support multiple instances of devpts"
|
||||
depends on UNIX98_PTYS
|
||||
default n
|
||||
---help---
|
||||
Enable support for multiple instances of devpts filesystem.
|
||||
If you want to have isolated PTY namespaces (eg: in containers),
|
||||
say Y here. Otherwise, say N. If enabled, each mount of devpts
|
||||
filesystem with the '-o newinstance' option will create an
|
||||
independent PTY namespace.
|
||||
|
||||
config LEGACY_PTYS
|
||||
bool "Legacy (BSD) PTY support"
|
||||
default y
|
||||
|
|
|
|||
|
|
@ -668,7 +668,7 @@ static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
|
|||
else
|
||||
fsi = tty->link->driver_data;
|
||||
devpts_kill_index(fsi, tty->index);
|
||||
devpts_put_ref(fsi);
|
||||
devpts_release(fsi);
|
||||
}
|
||||
|
||||
static const struct tty_operations ptm_unix98_ops = {
|
||||
|
|
@ -733,10 +733,11 @@ static int ptmx_open(struct inode *inode, struct file *filp)
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
fsi = devpts_get_ref(inode, filp);
|
||||
retval = -ENODEV;
|
||||
if (!fsi)
|
||||
fsi = devpts_acquire(filp);
|
||||
if (IS_ERR(fsi)) {
|
||||
retval = PTR_ERR(fsi);
|
||||
goto out_free_file;
|
||||
}
|
||||
|
||||
/* find a device that is not in use. */
|
||||
mutex_lock(&devpts_mutex);
|
||||
|
|
@ -745,7 +746,7 @@ static int ptmx_open(struct inode *inode, struct file *filp)
|
|||
|
||||
retval = index;
|
||||
if (index < 0)
|
||||
goto out_put_ref;
|
||||
goto out_put_fsi;
|
||||
|
||||
|
||||
mutex_lock(&tty_mutex);
|
||||
|
|
@ -789,8 +790,8 @@ err_release:
|
|||
return retval;
|
||||
out:
|
||||
devpts_kill_index(fsi, index);
|
||||
out_put_ref:
|
||||
devpts_put_ref(fsi);
|
||||
out_put_fsi:
|
||||
devpts_release(fsi);
|
||||
out_free_file:
|
||||
tty_free_file(filp);
|
||||
return retval;
|
||||
|
|
|
|||
Loading…
Reference in a new issue