[CRIU] [PATCH 05/11] tty: Per-type fd_get_index callback

Pavel Emelyanov xemul at parallels.com
Wed Feb 18 07:27:55 PST 2015


This one gets index from fd/fd_parms pair on dump. For
console and vt the index is constant and just sits on
the tty_type (will also be used on restore, see next
patch).

Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
 tty.c | 97 +++++++++++++++++++++++++++++++++++--------------------------------
 1 file changed, 50 insertions(+), 47 deletions(-)

diff --git a/tty.c b/tty.c
index a79b3b3..564c693 100644
--- a/tty.c
+++ b/tty.c
@@ -126,6 +126,7 @@ static LIST_HEAD(all_ttys);
 #define MAX_PTY_INDEX	1000
 #define CONSOLE_INDEX	1002
 #define VT_INDEX	1004
+#define INDEX_ERR	(MAX_TTYS + 1)
 
 static DECLARE_BITMAP(tty_bitmap, (MAX_TTYS << 1));
 static DECLARE_BITMAP(tty_active_pairs, (MAX_TTYS << 1));
@@ -133,26 +134,69 @@ static DECLARE_BITMAP(tty_active_pairs, (MAX_TTYS << 1));
 struct tty_type {
 	int t;
 	char *name;
+	int index;
+	int (*fd_get_index)(int fd, const struct fd_parms *);
 };
 
+static int ptm_fd_get_index(int fd, const struct fd_parms *p)
+{
+	int index;
+
+	if (ioctl(fd, TIOCGPTN, &index)) {
+		pr_perror("Can't obtain ptmx index");
+		return INDEX_ERR;
+	}
+
+	if (index > MAX_PTY_INDEX) {
+		pr_err("Index %d on ptmx is too big\n", index);
+		return INDEX_ERR;
+	}
+
+	return index;
+}
+
 static struct tty_type ptm_type = {
 	.t = TTY_TYPE_PTM,
 	.name = "ptmx",
+	.fd_get_index = ptm_fd_get_index,
 };
 
 static struct tty_type console_type = {
 	.t = TTY_TYPE_CONSOLE,
 	.name = "console",
+	.index = CONSOLE_INDEX,
 };
 
 static struct tty_type vt_type = {
 	.t = TTY_TYPE_VT,
 	.name = "vt",
+	.index = VT_INDEX,
 };
 
+static int pts_fd_get_index(int fd, const struct fd_parms *p)
+{
+	int index;
+	const struct fd_link *link = p->link;
+	char *pos = strrchr(link->name, '/');
+
+	if (!pos || pos == (link->name + link->len - 1)) {
+		pr_err("Unexpected format on path %s\n", link->name + 1);
+		return INDEX_ERR;
+	}
+
+	index = atoi(pos + 1);
+	if (index > MAX_PTY_INDEX) {
+		pr_err("Index %d on pts is too big\n", index);
+		return INDEX_ERR;
+	}
+
+	return index;
+}
+
 static struct tty_type pts_type = {
 	.t = TTY_TYPE_PTS,
 	.name = "pts",
+	.fd_get_index = pts_fd_get_index,
 };
 
 struct tty_type *get_tty_type(int major, int minor)
@@ -271,51 +315,6 @@ int tty_verify_active_pairs(void)
 	return 0;
 }
 
-static int parse_tty_index(u32 id, int lfd, const struct fd_parms *p, struct tty_type *type)
-{
-	int index = -1;
-
-	switch (type->t) {
-	case TTY_TYPE_PTM:
-		if (ioctl(lfd, TIOCGPTN, &index)) {
-			pr_perror("Can't obtain ptmx index");
-			return -1;
-		}
-		break;
-
-	case TTY_TYPE_PTS: {
-		const struct fd_link *link = p->link;
-		char *pos = strrchr(link->name, '/');
-
-		if (!pos || pos == (link->name + link->len - 1)) {
-			pr_err("Unexpected format on path %s\n", link->name + 1);
-			return -1;
-		}
-		index = atoi(pos + 1);
-		break;
-	}
-
-	case TTY_TYPE_CONSOLE:
-		index = CONSOLE_INDEX;
-		break;
-
-	case TTY_TYPE_VT:
-		index = VT_INDEX;
-		break;
-	default:
-		BUG();
-	}
-
-	if (type->t != TTY_TYPE_CONSOLE &&
-	    type->t != TTY_TYPE_VT &&
-	    index > MAX_PTY_INDEX) {
-		pr_err("Index %d on tty %x is too big\n", index, id);
-		return -1;
-	}
-
-	return index;
-}
-
 static int tty_test_and_set(int bit, unsigned long *bitmap)
 {
 	int ret;
@@ -1515,8 +1514,12 @@ static int dump_one_tty(int lfd, u32 id, const struct fd_parms *p)
 		return -1;
 
 	type = get_tty_type(major(p->stat.st_rdev), minor(p->stat.st_rdev));
-	index = parse_tty_index(id, lfd, p, type);
-	if (index < 0) {
+	if (type->fd_get_index)
+		index = type->fd_get_index(lfd, p);
+	else
+		index = type->index;
+
+	if (index == INDEX_ERR) {
 		pr_info("Can't obtain index on tty %d id %#x\n", lfd, id);
 		return -1;
 	}
-- 
1.8.4.2




More information about the CRIU mailing list