[CRIU] [PATCH 5/9] tty: Rework tty_driver structure
Pavel Emelyanov
xemul at parallels.com
Fri Mar 13 04:36:09 PDT 2015
On 03/06/2015 01:39 PM, Cyrill Gorcunov wrote:
> - 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 | 52 +++++++++++++++++++++++-----------------------------
> 4 files changed, 25 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 f37730199fbe..803e137ab0e5 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 e4976a02e03c..cfec00cf20f4 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_MASTER,
> .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);
This thing will start working differently for CONSOLE after patching.
> }
>
> 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))) {
So will this.
> 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,10 +621,10 @@ 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)
> + if (info->driver->type == TTY_TYPE__VT && !opts.shell_job)
> return true;
>
> return false;
> @@ -1416,7 +1410,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;
>
> @@ -1440,7 +1434,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;
>
More information about the CRIU
mailing list