From 612d5b9967c1991368911f0393a38042cae5e428 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 16 Apr 2003 23:09:42 -0700 Subject: [PATCH] [PATCH] make devpts filesystem mandatory even for CONFIG_DEVFS This patch rips out handling of UNIX98 ptys from devfs. We already have a special small filesystem to handle it (devpts) that's always compiled in anyway. This allows to get rid of all DEVFS_FL* flags and some gunk in devfs. --- drivers/char/pty.c | 8 ----- drivers/char/tty_io.c | 75 ++++++++++++++++++------------------------- 2 files changed, 32 insertions(+), 51 deletions(-) diff --git a/drivers/char/pty.c b/drivers/char/pty.c index e0ee2a18428e..85c52650290d 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c @@ -305,7 +305,6 @@ static void pty_flush_buffer(struct tty_struct *tty) } } -extern void tty_register_devfs (struct tty_driver *driver, unsigned int flags, unsigned minor); static int pty_open(struct tty_struct *tty, struct file * filp) { int retval; @@ -333,13 +332,6 @@ static int pty_open(struct tty_struct *tty, struct file * filp) wake_up_interruptible(&pty->open_wait); set_bit(TTY_THROTTLED, &tty->flags); set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); - - /* Register a slave for the master */ - if (tty->driver.major == PTY_MASTER_MAJOR) - tty_register_devfs(&tty->link->driver, - DEVFS_FL_CURRENT_OWNER | DEVFS_FL_WAIT, - tty->link->driver.minor_start + - minor(tty->device)-tty->driver.minor_start); retval = 0; out: return retval; diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index acacb8cfe527..b5b29750dbf0 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c @@ -1355,46 +1355,38 @@ retry_open: if (IS_PTMX_DEV(device)) { #ifdef CONFIG_UNIX98_PTYS - /* find a free pty. */ int major, minor; struct tty_driver *driver; /* find a device that is not in use. */ retval = -1; - for ( major = 0 ; major < UNIX98_NR_MAJORS ; major++ ) { + for (major = 0 ; major < UNIX98_NR_MAJORS ; major++) { driver = &ptm_driver[major]; - for (minor = driver->minor_start ; - minor < driver->minor_start + driver->num ; + for (minor = driver->minor_start; + minor < driver->minor_start + driver->num; minor++) { device = mk_kdev(driver->major, minor); - if (!init_dev(device, &tty)) goto ptmx_found; /* ok! */ + if (!init_dev(device, &tty)) + goto ptmx_found; /* ok! */ } } return -EIO; /* no free ptys */ + ptmx_found: set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */ minor -= driver->minor_start; devpts_pty_new(driver->other->name_base + minor, MKDEV(driver->other->major, minor + driver->other->minor_start)); - tty_register_device(&pts_driver[major], - pts_driver[major].minor_start + minor); noctty = 1; - goto init_dev_done; - -#else /* CONFIG_UNIX_98_PTYS */ - +#else return -ENODEV; - #endif /* CONFIG_UNIX_98_PTYS */ + } else { + retval = init_dev(device, &tty); + if (retval) + return retval; } - retval = init_dev(device, &tty); - if (retval) - return retval; - -#ifdef CONFIG_UNIX98_PTYS -init_dev_done: -#endif filp->private_data = tty; file_move(filp, &tty->tty_files); check_tty_count(tty, "tty_open"); @@ -2052,51 +2044,48 @@ static void tty_default_put_char(struct tty_struct *tty, unsigned char ch) tty->driver.write(tty, 0, &ch, 1); } -void tty_register_devfs (struct tty_driver *driver, unsigned int flags, unsigned minor) -{ #ifdef CONFIG_DEVFS_FS +static void tty_register_devfs(struct tty_driver *driver, unsigned minor) +{ umode_t mode = S_IFCHR | S_IRUSR | S_IWUSR; - kdev_t device = mk_kdev(driver->major, minor); + kdev_t dev = mk_kdev(driver->major, minor); int idx = minor - driver->minor_start; char buf[32]; - if (IS_TTY_DEV(device) || IS_PTMX_DEV(device)) - mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; - else { - if (driver->major == PTY_MASTER_MAJOR) - mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; - } - if ( (minor < driver->minor_start) || - (minor >= driver->minor_start + driver->num) ) { + if ((minor < driver->minor_start) || + (minor >= driver->minor_start + driver->num)) { printk(KERN_ERR "Attempt to register invalid minor number " "with devfs (%d:%d).\n", (int)driver->major,(int)minor); return; } -# ifdef CONFIG_UNIX98_PTYS - if ( (driver->major >= UNIX98_PTY_SLAVE_MAJOR) && - (driver->major < UNIX98_PTY_SLAVE_MAJOR + UNIX98_NR_MAJORS) ) - flags |= DEVFS_FL_CURRENT_OWNER; -# endif + + if (IS_TTY_DEV(dev) || IS_PTMX_DEV(dev)) + mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; + sprintf(buf, driver->name, idx + driver->name_base); - devfs_register (NULL, buf, flags | DEVFS_FL_DEFAULT, - driver->major, minor, mode, &tty_fops, NULL); -#endif /* CONFIG_DEVFS_FS */ + devfs_register(NULL, buf, 0, driver->major, minor, mode, + &tty_fops, NULL); } -void tty_unregister_devfs (struct tty_driver *driver, unsigned minor) +static void tty_unregister_devfs(struct tty_driver *driver, unsigned minor) { - devfs_remove(driver->name, minor-driver->minor_start+driver->name_base); + devfs_remove(driver->name, + minor - driver->minor_start + driver->name_base); } +#else +# define tty_register_devfs(driver, minor) do { } while (0) +# define tty_unregister_devfs(driver, minor) do { } while (0) +#endif /* CONFIG_DEVFS_FS */ /* * Register a tty device described by , with minor number . */ -void tty_register_device (struct tty_driver *driver, unsigned minor) +void tty_register_device(struct tty_driver *driver, unsigned minor) { - tty_register_devfs(driver, 0, minor); + tty_register_devfs(driver, minor); } -void tty_unregister_device (struct tty_driver *driver, unsigned minor) +void tty_unregister_device(struct tty_driver *driver, unsigned minor) { tty_unregister_devfs(driver, minor); } -- 2.39.5