Trying to remove rose device invariably makes console sending endless
message
"waiting for rose module to become free" with a random fixed count.
This has been confirmed by many ROSE/FPAC users on all kernel versions
for ages.
Richard Stearn investigated the issue and found that dev_put(dev) were
missing:
two in rose_bind() and one in rose_loopback_timer().
Once patch is applied, rose can be removed cleanly.
Patch tested by Charley k4gbb and Bernard f6bvp.
Signed-off-by: Bernard Pidoux <[email protected]>
---
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
index 4a9729257023..4476582c1710 100644
--- a/net/rose/af_rose.c
+++ b/net/rose/af_rose.c
@@ -688,8 +688,10 @@ static int rose_bind(struct socket *sock, struct sockaddr
*uaddr, int addr_len)
rose->source_call = user->call;
ax25_uid_put(user);
} else {
- if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE))
+ if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
+ dev_put(dev);
return -EACCES;
+ }
rose->source_call = *source;
}
@@ -711,6 +713,8 @@ static int rose_bind(struct socket *sock, struct sockaddr
*uaddr, int addr_len)
sock_reset_flag(sk, SOCK_ZAPPED);
+ dev_put(dev);
+
return 0;
}
diff --git a/net/rose/rose_loopback.c b/net/rose/rose_loopback.c
index 344456206b70..958ac24a9d47 100644
--- a/net/rose/rose_loopback.c
+++ b/net/rose/rose_loopback.c
@@ -102,6 +102,7 @@ static void rose_loopback_timer(unsigned long param)
if ((dev = rose_dev_get(dest)) != NULL) {
if (rose_rx_call_request(skb, dev,
rose_loopback_neigh, lci_o) == 0)
kfree_skb(skb);
+ dev_put(dev);
} else {
kfree_skb(skb);
}