Hi,
I want to acknowledge here a set of very usefull ROSE patches provided
by richard Stearn.
Since years, it has not been possible to set rose0 device down without
creating an endless loop of kernel waiting for rose to become free.
Richard found that a number of dev_put(dev) were missing.
Applying the following patch subset cured the issue and allowed a clean
rose module removal.
The following patches are part of a larger series committed by Richard
but rejected by Dave Miller mostly for format reasons.
I selected and checked the minimal changes necessary to cure the
refcount issue.
See :
http://marc.info/?l=linux-hams&m=146873255413533&w=2
Richard does not want to jump in again.
So I would appreciate if someone could help us by confirming that this
patch is extremely convenient.
Then someone could submit this subset to linux-hams and linux-netdev
referees.
73 de Bernard, f6bvp
----------------------------------------
diff -ruN a/net/rose/af_rose.c b/net/rose/af_rose.c
--- a/net/rose/af_rose.c 2017-04-03 19:02:14.205800053 +0200
+++ b/net/rose/af_rose.c 2017-04-03 12:18:02.290052819 +0200
@@ -688,8 +688,10 @@
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;
}
@@ -710,6 +712,7 @@
rose_insert_socket(sk);
sock_reset_flag(sk, SOCK_ZAPPED);
+ dev_put(dev);
return 0;
}
diff -ruN a/net/rose/rose_loopback.c b/net/rose/rose_loopback.c
--- a/net/rose/rose_loopback.c 2017-04-03 19:02:14.206800010 +0200
+++ b/net/rose/rose_loopback.c 2017-04-03 12:18:02.291052777 +0200
@@ -102,6 +102,7 @@
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);
}
diff -ruN a/net/rose/rose_route.c b/net/rose/rose_route.c
--- a/net/rose/rose_route.c 2017-04-03 19:02:14.207799967 +0200
+++ b/net/rose/rose_route.c 2017-04-03 12:18:02.290052819 +0200
@@ -875,6 +875,11 @@
src_addr = (rose_address *)(skb->data +
ROSE_CALL_REQ_SRC_ADDR_OFF);
dest_addr = (rose_address *)(skb->data +
ROSE_CALL_REQ_DEST_ADDR_OFF);
+ if (ax25 == NULL) {
+ printk(KERN_ERR "rose_route_frame : called with ax25
callback == NULL\n");
+ return res;
+ }
+
spin_lock_bh(&rose_neigh_list_lock);
spin_lock_bh(&rose_route_list_lock);
--
To unsubscribe from this list: send the line "unsubscribe linux-hams" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html