[CRIU] [PATCH 11/12] tty: Add external ttys handling

Andrew Vagin avagin at parallels.com
Fri Oct 3 01:25:37 PDT 2014


On Fri, Oct 03, 2014 at 12:07:34PM +0400, Cyrill Gorcunov wrote:
> On Fri, Oct 03, 2014 at 12:00:30PM +0400, Andrew Vagin wrote:
> > On Fri, Oct 03, 2014 at 11:50:04AM +0400, Cyrill Gorcunov wrote:
> > > Some types of ttys (such as /dev/console) should be c/r'ed in
> > > simle manner -- just opent them by path on restore, for this
> > > sake that named external TTYs are introduced.
> > > 
> > > For example, for /dev/console one simply need to pass an option
> > > 
> > > 	--ext-tty 5:1
> > 
> > Can we use paths instead of maj:min? For example LXC bindmounts a host
> > /dev/pty/X to /dev/console.
> 
> We can, but the problem is that
> 
> static int dump_chrdev(struct fd_parms *p, int lfd, struct cr_img *img)
> {
> 	int maj = major(p->stat.st_rdev);
> 	const struct fdtype_ops *ops;
> 
> 	switch (maj) {
> 	case MEM_MAJOR:
> 		ops = &regfile_dump_ops;
> 		break;
> 	case TTYAUX_MAJOR:
> 	case UNIX98_PTY_MASTER_MAJOR ... (UNIX98_PTY_MASTER_MAJOR + UNIX98_PTY_MAJOR_COUNT - 1):
> 	case UNIX98_PTY_SLAVE_MAJOR:

An external terminal can be a pty slave but from the host devpts mount,
so we need to find a way how to determine that.

> 		ops = &tty_dump_ops;
> 		break;
> 	case MISC_MAJOR:
> 		ops = get_misc_dev_ops(minor(p->stat.st_rdev));
> 		if (ops)
> 			break;
> 		/* fallthrough */
> 	default: {
> 		char more[32];
> 
> 		/*
> 		 * Ext mapping for tty devices.
> 		 */
> -->		if (lookup_ext_tty(maj, minor(p->stat.st_rdev))) {
> 			ops = &tty_dump_ops;
> 			goto found;
> 		}
> 
> 		sprintf(more, "%d:%d", maj, minor(p->stat.st_rdev));
> 		return dump_unsupp_fd(p, lfd, img, "chr", more);
> 	}
> 	}
> 
> found:
> 	return do_dump_gen_file(p, lfd, ops, img);
> }
> 
> I'll have to readlink here instead which is inconvenient, so that
> what prevents one to simply pass stat of /dev/pty/X here?

You can collect stats for external terminals and then compare them.



More information about the CRIU mailing list