[CRIU] [PATCH 1/6] tty: Rework tty_driver structure

Cyrill Gorcunov gorcunov at openvz.org
Thu Mar 19 08:13:08 PDT 2015


 - rename @t to @type and use protobuf constants here instead
 - for special features use @subtype just like kernel does
 - get rid of TTY_TYPE_ constants, we don't need them
 - drop @flags, we don't need it anymore

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 include/parasite.h |  1 +
 include/tty.h      | 10 ----------
 pie/parasite.c     |  3 +--
 tty.c              | 57 +++++++++++++++++++++++++++---------------------------
 4 files changed, 30 insertions(+), 41 deletions(-)

diff --git a/include/parasite.h b/include/parasite.h
index 365e6746de27..f884bb5baeb4 100644
--- a/include/parasite.h
+++ b/include/parasite.h
@@ -17,6 +17,7 @@
 #include "util-pie.h"
 
 #include "protobuf/vma.pb-c.h"
+#include "protobuf/tty.pb-c.h"
 
 #define __head __used __section(.head.text)
 
diff --git a/include/tty.h b/include/tty.h
index 6cda60e48c2c..1d1a2e95c378 100644
--- a/include/tty.h
+++ b/include/tty.h
@@ -9,16 +9,6 @@
 /* Kernel's limit */
 #define TERMIOS_NCC	19
 
-enum {
-	TTY_TYPE_UNKNOWN	= 0,
-	TTY_TYPE_PTM		= 1,
-	TTY_TYPE_PTS		= 2,
-	TTY_TYPE_CONSOLE	= 3,
-	TTY_TYPE_VT		= 4,
-
-	TTY_TYPE_MAX
-};
-
 extern const struct fdtype_ops tty_dump_ops;
 
 struct tty_driver;
diff --git a/pie/parasite.c b/pie/parasite.c
index b7d0f1e3eef0..9961b2fba84e 100644
--- a/pie/parasite.c
+++ b/pie/parasite.c
@@ -436,8 +436,7 @@ static int parasite_dump_tty(struct parasite_tty_args *args)
 	__tty_ioctl(TIOCGPGRP, args->pgrp);
 	__tty_ioctl(TIOCGEXCL,	args->st_excl);
 
-	if (args->type == TTY_TYPE_PTM ||
-	    args->type == TTY_TYPE_PTS) {
+	if (args->type == TTY_TYPE__PTY) {
 		__tty_ioctl(TIOCGPKT,	args->st_pckt);
 		__tty_ioctl(TIOCGPTLCK,	args->st_lock);
 	}
diff --git a/tty.c b/tty.c
index 5af40c929086..88161b139233 100644
--- a/tty.c
+++ b/tty.c
@@ -132,18 +132,17 @@ static DECLARE_BITMAP(tty_bitmap, (MAX_TTYS << 1));
 static DECLARE_BITMAP(tty_active_pairs, (MAX_TTYS << 1));
 
 struct tty_driver {
-	int				t;
+	short				type;
+	short				subtype;
 	char				*name;
 	int				index;
-	int				img_type;
-	unsigned int			flags;
 	int				(*fd_get_index)(int fd, const struct fd_parms *p);
 	int				(*img_get_index)(struct tty_info *ti);
 	int				(*open)(struct tty_info *ti);
 };
 
-#define TTY_PAIR	0x1
-#define TTY_MASTER	0x2
+#define TTY_SUBTYPE_MASTER			0x0001
+#define TTY_SUBTYPE_SLAVE			0x0002
 
 static int ptm_fd_get_index(int fd, const struct fd_parms *p)
 {
@@ -170,10 +169,9 @@ static int pty_get_index(struct tty_info *ti)
 static int pty_open_ptmx(struct tty_info *info);
 
 static struct tty_driver ptm_driver = {
-	.t			= TTY_TYPE_PTM,
-	.flags			= TTY_PAIR | TTY_MASTER,
+	.type			= TTY_TYPE__PTY,
+	.subtype		= TTY_SUBTYPE_MASTER,
 	.name			= "ptmx",
-	.img_type		= TTY_TYPE__PTY,
 	.fd_get_index		= ptm_fd_get_index,
 	.img_get_index		= pty_get_index,
 	.open			= pty_open_ptmx,
@@ -182,19 +180,16 @@ static struct tty_driver ptm_driver = {
 static int open_simple_tty(struct tty_info *info);
 
 static struct tty_driver console_driver = {
-	.t			= TTY_TYPE_CONSOLE,
-	.flags			= TTY_MASTER,
+	.type			= TTY_TYPE__CONSOLE,
+	.subtype		= TTY_SUBTYPE_SLAVE,
 	.name			= "console",
-	.img_type		= TTY_TYPE__CONSOLE,
 	.index			= CONSOLE_INDEX,
 	.open			= open_simple_tty,
 };
 
 static struct tty_driver vt_driver = {
-	.t			= TTY_TYPE_VT,
-	.flags			= 0,
+	.type			= TTY_TYPE__VT,
 	.name			= "vt",
-	.img_type		= TTY_TYPE__VT,
 	.index			= VT_INDEX,
 	.open			= open_simple_tty,
 };
@@ -220,10 +215,9 @@ static int pts_fd_get_index(int fd, const struct fd_parms *p)
 }
 
 static struct tty_driver pts_driver = {
-	.t			= TTY_TYPE_PTS,
-	.flags			= TTY_PAIR,
+	.type			= TTY_TYPE__PTY,
+	.subtype		= TTY_SUBTYPE_SLAVE,
 	.name			= "pts",
-	.img_type		= TTY_TYPE__PTY,
 	.fd_get_index		= pts_fd_get_index,
 	.img_get_index		= pty_get_index,
 	.open			= pty_open_ptmx,
@@ -256,7 +250,7 @@ struct tty_driver *get_tty_driver(int major, int minor)
 
 static inline int is_pty(struct tty_driver *driver)
 {
-	return driver->flags & TTY_PAIR;
+	return driver->type == TTY_TYPE__PTY;
 }
 
 /*
@@ -304,7 +298,7 @@ int prepare_shared_tty(void)
 
 static int tty_gen_id(struct tty_driver *driver, int index)
 {
-	return (index << 1) + (driver->t == TTY_TYPE_PTM);
+	return (index << 1) + (driver->subtype == TTY_SUBTYPE_MASTER);
 }
 
 static int tty_get_index(u32 id)
@@ -408,7 +402,7 @@ static struct file_desc *pty_alloc_reg(struct tty_info *info, bool add)
  * the inverted path is /dev/pts/1, for inverted slaves it's simplier
  * we just add 'ptmx' postfix.
  */
-static struct reg_file_info *pty_alloc_fake_reg(struct tty_info *info, int type)
+static struct reg_file_info *pty_alloc_fake_reg(struct tty_info *info, int subtype)
 {
 	struct reg_file_info *new, *orig;
 	struct file_desc *fake_desc;
@@ -426,8 +420,8 @@ static struct reg_file_info *pty_alloc_fake_reg(struct tty_info *info, int type)
 	orig = container_of(info->reg_d, struct reg_file_info, d);
 	new = container_of(fake_desc, struct reg_file_info, d);
 
-	if ((type == TTY_TYPE_PTM && tty_is_master(info)) ||
-	    (type == TTY_TYPE_PTS && !tty_is_master(info))) {
+	if ((subtype == TTY_SUBTYPE_MASTER && tty_is_master(info)) ||
+	    (subtype == TTY_SUBTYPE_SLAVE && !tty_is_master(info))) {
 		new->path = xstrdup(orig->path);
 		new->rfe->name = &new->path[1];
 	} else {
@@ -439,7 +433,7 @@ static struct reg_file_info *pty_alloc_fake_reg(struct tty_info *info, int type)
 		BUG_ON(!pos || !inverted_path);
 
 		memcpy(inverted_path, orig->rfe->name, slash_at + 1);
-		if (type == TTY_TYPE_PTM)
+		if (subtype == TTY_SUBTYPE_MASTER)
 			strcat(inverted_path, "ptmx");
 		else {
 			if (slash_at >= 3 && strncmp(&inverted_path[slash_at - 3], "pts", 3))
@@ -457,8 +451,8 @@ static struct reg_file_info *pty_alloc_fake_reg(struct tty_info *info, int type)
 	return new;
 }
 
-#define pty_alloc_fake_master(info)	pty_alloc_fake_reg(info, TTY_TYPE_PTM)
-#define pty_alloc_fake_slave(info)	pty_alloc_fake_reg(info, TTY_TYPE_PTS)
+#define pty_alloc_fake_master(info)	pty_alloc_fake_reg(info, TTY_SUBTYPE_MASTER)
+#define pty_alloc_fake_slave(info)	pty_alloc_fake_reg(info, TTY_SUBTYPE_SLAVE)
 
 static void pty_free_fake_reg(struct reg_file_info **r)
 {
@@ -627,11 +621,16 @@ err:
 
 static bool tty_is_master(struct tty_info *info)
 {
-	if (info->driver->flags & TTY_MASTER)
+	if (info->driver->subtype == TTY_SUBTYPE_MASTER)
 		return true;
 
-	if (info->driver->t == TTY_TYPE_VT && !opts.shell_job)
+	switch (info->driver->type) {
+	case TTY_TYPE__CONSOLE:
 		return true;
+	case TTY_TYPE__VT:
+		if (!opts.shell_job)
+			return true;
+	}
 
 	return false;
 }
@@ -1414,7 +1413,7 @@ static int dump_tty_info(int lfd, u32 id, const struct fd_parms *p, struct tty_d
 	BUILD_BUG_ON(sizeof(termios.c_cc) != sizeof(void *));
 	BUILD_BUG_ON((sizeof(termios.c_cc) * TERMIOS_NCC) < sizeof(t.c_cc));
 
-	pti = parasite_dump_tty(p->ctl, p->fd, driver->t);
+	pti = parasite_dump_tty(p->ctl, p->fd, driver->type);
 	if (!pti)
 		return -1;
 
@@ -1438,7 +1437,7 @@ static int dump_tty_info(int lfd, u32 id, const struct fd_parms *p, struct tty_d
 	info.exclusive		= pti->st_excl;
 	info.packet_mode	= pti->st_pckt;
 
-	info.type = driver->img_type;
+	info.type = driver->type;
 	if (info.type == TTY_TYPE__PTY) {
 		info.pty	= &pty;
 		pty.index	= index;
-- 
1.9.3



More information about the CRIU mailing list