tty: drop tty_ldisc_ops::refcount
authorJiri Slaby <jslaby@suse.cz>
Wed, 5 May 2021 09:19:10 +0000 (11:19 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 May 2021 14:57:17 +0000 (16:57 +0200)
The refcount is checked only in tty_unregister_ldisc and EBUSY returned
if it is nonzero. But none of the tty_unregister_ldisc callers act
anyhow if this (or any other) error is returned. So remove
tty_ldisc_ops::refcount completely and make tty_unregister_ldisc return
'void' in the next patches. That means we assume tty_unregister_ldisc is
not called while the ldisc might be in use. That relies on
try_module_get in get_ldops and module_put in put_ldops.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20210505091928.22010-18-jslaby@suse.cz
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/n_tty.c
drivers/tty/tty_ldisc.c
include/linux/tty_ldisc.h

index 2fe2790..0ec93f1 100644 (file)
@@ -2450,7 +2450,7 @@ void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
 {
        *ops = n_tty_ops;
        ops->owner = NULL;
-       ops->refcount = ops->flags = 0;
+       ops->flags = 0;
 }
 EXPORT_SYMBOL_GPL(n_tty_inherit_ops);
 
index d02deeb..98e8316 100644 (file)
@@ -69,7 +69,6 @@ int tty_register_ldisc(struct tty_ldisc_ops *new_ldisc)
 
        raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
        tty_ldiscs[new_ldisc->num] = new_ldisc;
-       new_ldisc->refcount = 0;
        raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
 
        return ret;
@@ -90,16 +89,12 @@ EXPORT_SYMBOL(tty_register_ldisc);
 int tty_unregister_ldisc(struct tty_ldisc_ops *ldisc)
 {
        unsigned long flags;
-       int ret = 0;
 
        raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
-       if (tty_ldiscs[ldisc->num]->refcount)
-               ret = -EBUSY;
-       else
-               tty_ldiscs[ldisc->num] = NULL;
+       tty_ldiscs[ldisc->num] = NULL;
        raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
 
-       return ret;
+       return 0;
 }
 EXPORT_SYMBOL(tty_unregister_ldisc);
 
@@ -113,10 +108,8 @@ static struct tty_ldisc_ops *get_ldops(int disc)
        ldops = tty_ldiscs[disc];
        if (ldops) {
                ret = ERR_PTR(-EAGAIN);
-               if (try_module_get(ldops->owner)) {
-                       ldops->refcount++;
+               if (try_module_get(ldops->owner))
                        ret = ldops;
-               }
        }
        raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
        return ret;
@@ -127,7 +120,6 @@ static void put_ldops(struct tty_ldisc_ops *ldops)
        unsigned long flags;
 
        raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
-       ldops->refcount--;
        module_put(ldops->owner);
        raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
 }
index c20ca6a..fbe9de2 100644 (file)
@@ -208,8 +208,6 @@ struct tty_ldisc_ops {
                                const char *fp, int count);
 
        struct  module *owner;
-
-       int refcount;
 };
 
 struct tty_ldisc {