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);
                        }

Reply via email to