diff -urP linux-2.6.8.orig/drivers/char/tty_io.c linux-2.6.8/drivers/char/tty_io.c --- linux-2.6.8.orig/drivers/char/tty_io.c 2006-08-30 07:55:23.000000000 +0300 +++ linux-2.6.8/drivers/char/tty_io.c 2006-08-31 19:07:39.000000000 +0300 @@ -2584,3 +2584,28 @@ return 0; } module_init(tty_init); + +#ifdef CONFIG_UNIX98_PTYS +struct class_simple *init_tty_class() +{ + struct class_simple *class = class_simple_create(THIS_MODULE, "tty"); + + if (IS_ERR(class)) + return NULL; + + class_simple_device_add(class, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx"); + + return class; +} + +void destroy_tty_class(struct class_simple *class) +{ + if (class != NULL) { + class_simple_device_remove(MKDEV(TTYAUX_MAJOR, 2)); + class_simple_destroy(class); + } +} + +EXPORT_SYMBOL(init_tty_class); +EXPORT_SYMBOL(destroy_tty_class); +#endif diff -urP linux-2.6.8.orig/include/linux/ve.h linux-2.6.8/include/linux/ve.h --- linux-2.6.8.orig/include/linux/ve.h 2006-08-30 07:55:26.000000000 +0300 +++ linux-2.6.8/include/linux/ve.h 2006-08-31 12:57:30.000000000 +0300 @@ -185,7 +185,9 @@ struct subsystem *class_subsys; struct subsystem *class_obj_subsys; struct class *net_class; - +#ifdef CONFIG_UNIX98_PTYS + struct class_simple *tty_class; +#endif /* User uids hash */ struct list_head uidhash_table[UIDHASH_SZ_VE]; diff -urP linux-2.6.8.orig/kernel/vecalls.c linux-2.6.8/kernel/vecalls.c --- linux-2.6.8.orig/kernel/vecalls.c 2006-08-30 07:55:24.000000000 +0300 +++ linux-2.6.8/kernel/vecalls.c 2006-08-31 13:40:19.000000000 +0300 @@ -1132,7 +1132,11 @@ if (err != 0) goto out_class_register; ve->net_class = nc; - +#ifdef CONFIG_UNIX98_PTYS + ve->tty_class = init_tty_class(); + if (ve->tty_class == NULL) + goto out_class_register; +#endif return err; out_class_register: @@ -1156,6 +1160,9 @@ static void fini_ve_sysfs(struct ve_struct *ve) { +#ifdef CONFIG_UNIX98_PTYS + destroy_tty_class(ve->tty_class); +#endif class_unregister(ve->net_class); subsystem_unregister(ve->class_subsys);