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 <gorcu...@virtuozzo.com>

Reviewed-by: Vladimir Davydov <vdavy...@virtuozzo.com>

CC: Konstantin Khorenko <khore...@virtuozzo.com>
CC: Igor Sukhih <i...@parallels.com>

https://jira.sw.ru/browse/PSBM-132299

(cherry-picked from 4ef6a64a6463d01c4cd0a27376084b6b65d46208)
Signed-off-by: Valeriy Vdovin <valeriy.vdo...@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 6ed441f9c566..12f4d41e92ed 100644
--- a/drivers/tty/pty.c
+++ b/drivers/tty/pty.c
@@ -930,8 +930,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 ca5bc2bad1b9..05aeee7be09a 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -1969,8 +1969,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);
-- 
2.31.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to