[Devel] [PATCH RHEL8 COMMIT] ve/vtty: Make indices to match pcs6 scheme

Konstantin Khorenko khorenko at virtuozzo.com
Mon Jul 26 20:15:25 MSK 2021


The commit is pushed to "branch-rh8-4.18.0-305.3.1.vz8.7.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-305.3.1.el8
------>
commit 314e3d6169bd6824684003e3510e611214496ae2
Author: Cyrill Gorcunov <gorcunov at virtuozzo.com>
Date:   Mon Jul 26 20:15:25 2021 +0300

    ve/vtty: Make indices to match pcs6 scheme
    
    In pcs6 vttys are mapped into internal kernel representation in
    nonobvious way. The /dev/console represent [maj:5,min:1], in
    turn /dev/tty[0-...] are defined as [maj:4,min:0...], where
    minor is bijective to symbol postfix of the tty. Internally
    in the pcs6 kernel any open of /dev/ttyX has been mapping
    minor into vtty index as
    
     |      if (minor > 0)
     |              index = minor - 1
     |      else
     |              index = 0
    
    which actually shifts indices and make /dev/tty0 as
    an alias to /dev/console inside container.
    
    Same time vzctl tool passes console number argument
    in a decremented way, iow when one is typing
    
            vzctl console $ctid 1
    
    here is 1 is a tty number, the kernel sees is as 0,
    opening containers /dev/console.
    
    When one types "vzctl console $ctid 2" (which implies
    to open container's /dev/tty2) the vzctl passes index 1
    and the kernel opens /dev/tty2 because of the if/else index
    mapping as show above.
    
    Lets implement same indices mapping in pcs7 for backward
    compatibility (in pcs7 there is a per-VE vtty_map_t structure
    which reserve up to MAX_NR_VTTY_CONSOLES ttys to track
    and it is simply an array addressed by tty index).
    
    Same time lets fix a few nits: disable setup of controlling
    terminal on /dev/console only, since all ttys can have
    controlling sign; make sure we're having @tty_fops for
    such terminals.
    
    https://jira.sw.ru/browse/PSBM-40088
    
    Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
    
    Reviewed-by: Vladimir Davydov <vdavydov at virtuozzo.com>
    
    CC: Konstantin Khorenko <khorenko at virtuozzo.com>
    CC: Igor Sukhih <igor at parallels.com>
    
    https://jira.sw.ru/browse/PSBM-132299
    
    (cherry-picked from 4ef6a64a6463d01c4cd0a27376084b6b65d46208)
    Signed-off-by: Valeriy Vdovin <valeriy.vdovin at virtuozzo.com>
---
 drivers/tty/pty.c    | 7 +++++--
 drivers/tty/tty_io.c | 9 ++++++++-
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c
index d9cc63b0c11e..2a8ed5151655 100644
--- a/drivers/tty/pty.c
+++ b/drivers/tty/pty.c
@@ -936,8 +936,11 @@ struct tty_driver *vtty_console_driver(int *index)
 struct tty_driver *vtty_driver(dev_t dev, int *index)
 {
 	if (MAJOR(dev) == TTY_MAJOR &&
-	    MINOR(dev) < MAX_NR_VTTY_CONSOLES) {
-		*index = MINOR(dev);
+	MINOR(dev) <= MAX_NR_VTTY_CONSOLES) {
+		if (MINOR(dev))
+			*index = MINOR(dev) - 1;
+		else
+			*index = 0;
 		return vttys_driver;
 	}
 	return NULL;
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index ac237a60200c..fcb4139b4d83 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -1859,8 +1859,15 @@ static struct tty_driver *tty_lookup_driver(dev_t device, struct file *filp,
 	case MKDEV(TTYAUX_MAJOR, 1): {
 		struct tty_driver *console_driver = console_device(index);
 #ifdef CONFIG_VE
-		if (!ve_is_super(ve))
+		if (!ve_is_super(ve)) {
 			console_driver = vtty_console_driver(index);
+			/*
+			 * Reset fops, sometimes there might be
+			 * console_fops picked from inode->i_cdev
+			 * in chrdev_open()
+			 */
+			filp->f_op = &tty_fops;
+		}
 #endif
 		if (console_driver) {
 			driver = tty_driver_kref_get(console_driver);


More information about the Devel mailing list