Commit 19475209 authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman
Browse files

tty: drop tty_ldisc_ops::refcount



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: default avatarJiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20210505091928.22010-18-jslaby@suse.cz


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f81ee8b8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);

+3 −11
Original line number Diff line number Diff line
@@ -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;
	raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);

	return ret;
	return 0;
}
EXPORT_SYMBOL(tty_unregister_ldisc);

@@ -113,11 +108,9 @@ 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);
}
+0 −2
Original line number Diff line number Diff line
@@ -208,8 +208,6 @@ struct tty_ldisc_ops {
				const char *fp, int count);

	struct  module *owner;

	int refcount;
};

struct tty_ldisc {