[Devel] [PATCH rh7] vtty: Make indices to match pcs6 scheme

Cyrill Gorcunov gorcunov at virtuozzo.com
Mon Oct 5 02:54:26 PDT 2015


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>
CC: Vladimir Davydov <vdavydov at virtuozzo.com>
CC: Konstantin Khorenko <khorenko at virtuozzo.com>
CC: Igor Sukhih <igor at parallels.com>
---

Guys, I see another problem with login on centos6 template
(for some reason it doesn't pass login/pass pair but it's
 another problem I believe, which needs to be investigated.
 This patch only addesses indexing scheme issue).

 drivers/tty/pty.c    |    7 +++++--
 drivers/tty/tty_io.c |   12 ++++++++++--
 2 files changed, 15 insertions(+), 4 deletions(-)

Index: linux-pcs7.git/drivers/tty/pty.c
===================================================================
--- linux-pcs7.git.orig/drivers/tty/pty.c
+++ linux-pcs7.git/drivers/tty/pty.c
@@ -1240,8 +1240,11 @@ struct tty_driver *vtty_console_driver(i
 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;
Index: linux-pcs7.git/drivers/tty/tty_io.c
===================================================================
--- linux-pcs7.git.orig/drivers/tty/tty_io.c
+++ linux-pcs7.git/drivers/tty/tty_io.c
@@ -1941,7 +1941,8 @@ static struct tty_driver *tty_lookup_dri
 	if (!ve_is_super(ve)) {
 		driver = vtty_driver(device, index);
 		if (driver) {
-			*noctty = 1;
+			if (MINOR(device) == 0)
+				*noctty = 1;
 			return tty_driver_kref_get(driver);
 		}
 	}
@@ -1960,8 +1961,15 @@ static struct tty_driver *tty_lookup_dri
 	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