From: richard (licac.sugqfa@weizmann.ac.il)
Date: Fri Feb 22 2002 - 03:01:50 EET
Hi ,just to confuse things even more, for mandrake kernels
2.4.18-rc2 is incoporated in 2.4.17-20mdk
so will substituting 2.4.17-20mdk in place of 2.4.18-rc2 in the patch
still function ??
73 richard
On Thu, 2002-02-21 at 11:16, Tomi Manninen OH2BNS wrote:
> Hi all,
>
> would people please test the attached patch to the NET/ROM subsystem. You
> will need linux-2.4.18-rc2 and this patch.
>
> The patch should fix the problems in rebooting (or unloading the
> modules) when NET/ROM is in use. The problems show up as complaints
> like "unregister_netdevice: waiting for xxx to become free." from the
> kernel.
>
> The rc2 kernel already has some AX.25 related (beacon should not kill your
> box anymore) and ROSE related patches (both done by people other than me)
> so please test it.
>
> --
> Tomi Manninen Internet: wpagmx@sopragroup.com
> OH2BNS AX.25: dlqfars.neczdqibm@cba.multicon.pl
> KP20ME04 Amprnet: fiyzxqxu@n.net.pl
> ----
>
> diff -ruN -X dontdiff linux-2.4.18-rc2/net/netrom/af_netrom.c linux/net/netrom/af_netrom.c
> --- linux-2.4.18-rc2/net/netrom/af_netrom.c Tue Feb 19 16:06:42 2002
> +++ linux/net/netrom/af_netrom.c Tue Feb 19 16:14:39 2002
> @@ -31,7 +31,9 @@
> * NET/ROM 007 Jonathan(G4KLX) New timer architecture.
> * Impmented Idle timer.
> * Arnaldo C. Melo s/suser/capable/, micro cleanups
> - * Jeroen (PE1RXQ) Use sock_orphan() on release.
> + * Jeroen(PE1RXQ) Use sock_orphan() on release.
> + * Tomi(OH2BNS) Better frame type checking.
> + * Device refcnt fixes.
> */
>
> #include <linux/config.h>
> @@ -128,6 +130,7 @@
>
> if ((s = nr_list) == sk) {
> nr_list = s->next;
> + dev_put(sk->protinfo.nr->device);
> restore_flags(flags);
> return;
> }
> @@ -135,6 +138,7 @@
> while (s != NULL && s->next != NULL) {
> if (s->next == sk) {
> s->next = sk->next;
> + dev_put(sk->protinfo.nr->device);
> restore_flags(flags);
> return;
> }
> @@ -616,16 +620,20 @@
> * Only the super user can set an arbitrary user callsign.
> */
> if (addr->fsa_ax25.sax25_ndigis == 1) {
> - if (!capable(CAP_NET_BIND_SERVICE))
> + if (!capable(CAP_NET_BIND_SERVICE)) {
> + dev_put(dev);
> return -EACCES;
> + }
> sk->protinfo.nr->user_addr = addr->fsa_digipeater[0];
> sk->protinfo.nr->source_addr = addr->fsa_ax25.sax25_call;
> } else {
> source = &addr->fsa_ax25.sax25_call;
>
> if ((user = ax25_findbyuid(current->euid)) == NULL) {
> - if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE))
> + if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
> + dev_put(dev);
> return -EPERM;
> + }
> user = source;
> }
>
> @@ -680,8 +688,10 @@
> source = (ax25_address *)dev->dev_addr;
>
> if ((user = ax25_findbyuid(current->euid)) == NULL) {
> - if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
> + if (ax25_uid_policy && !capable(CAP_NET_ADMIN)) {
> + dev_put(dev);
> return -EPERM;
> + }
> user = source;
> }
>
> @@ -976,6 +986,8 @@
> sk->ack_backlog++;
> make->pair = sk;
>
> + dev_hold(make->protinfo.nr->device);
> +
> nr_insert_socket(make);
>
> skb_queue_head(&sk->receive_queue, skb);
> @@ -1364,7 +1376,6 @@
> dev_nr[i].priv = NULL;
> unregister_netdev(&dev_nr[i]);
> }
> - kfree(dev_nr[i].name);
> }
>
> kfree(dev_nr);
> diff -ruN -X dontdiff linux-2.4.18-rc2/net/netrom/nr_loopback.c linux/net/netrom/nr_loopback.c
> --- linux-2.4.18-rc2/net/netrom/nr_loopback.c Thu Jun 28 03:10:55 2001
> +++ linux/net/netrom/nr_loopback.c Tue Feb 19 16:12:35 2002
> @@ -85,6 +85,9 @@
> if (dev == NULL || nr_rx_frame(skb, dev) == 0)
> kfree_skb(skb);
>
> + if (dev != NULL)
> + dev_put(dev);
> +
> if (!skb_queue_empty(&loopback_queue) && !nr_loopback_running())
> nr_set_loopback_timer();
> }
> diff -ruN -X dontdiff linux-2.4.18-rc2/net/netrom/nr_route.c linux/net/netrom/nr_route.c
> --- linux-2.4.18-rc2/net/netrom/nr_route.c Sat Dec 30 00:44:46 2000
> +++ linux/net/netrom/nr_route.c Tue Feb 19 16:12:35 2002
> @@ -19,6 +19,7 @@
> * Alan Cox(GW4PTS) Added the firewall hooks.
> * NET/ROM 006 Jonathan(G4KLX) Added the setting of digipeated neighbours.
> * Tomi(OH2BNS) Routing quality and link failure changes.
> + * Device refcnt fixes.
> */
>
> #include <linux/errno.h>
> @@ -66,11 +67,15 @@
> struct nr_node *nr_node;
> struct nr_neigh *nr_neigh;
> struct nr_route nr_route;
> + struct net_device *tdev;
> unsigned long flags;
> int i, found;
>
> - if (nr_dev_get(nr) != NULL) /* Can't add routes to ourself */
> + /* Can't add routes to ourself */
> + if ((tdev = nr_dev_get(nr)) != NULL) {
> + dev_put(tdev);
> return -EINVAL;
> + }
>
> for (nr_node = nr_node_list; nr_node != NULL; nr_node = nr_node->next)
> if (ax25cmp(nr, &nr_node->callsign) == 0)
> @@ -124,6 +129,8 @@
> memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi));
> }
>
> + dev_hold(nr_neigh->dev);
> +
> save_flags(flags);
> cli();
>
> @@ -294,6 +301,7 @@
> if ((s = nr_neigh_list) == nr_neigh) {
> nr_neigh_list = nr_neigh->next;
> restore_flags(flags);
> + dev_put(nr_neigh->dev);
> if (nr_neigh->digipeat != NULL)
> kfree(nr_neigh->digipeat);
> kfree(nr_neigh);
> @@ -304,6 +312,7 @@
> if (s->next == nr_neigh) {
> s->next = nr_neigh->next;
> restore_flags(flags);
> + dev_put(nr_neigh->dev);
> if (nr_neigh->digipeat != NULL)
> kfree(nr_neigh->digipeat);
> kfree(nr_neigh);
> @@ -404,6 +413,8 @@
> memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi));
> }
>
> + dev_hold(nr_neigh->dev);
> +
> save_flags(flags);
> cli();
>
> @@ -570,6 +581,10 @@
> if (first == NULL || strncmp(dev->name, first->name, 3) < 0)
> first = dev;
> }
> +
> + if (first != NULL)
> + dev_hold(first);
> +
> read_unlock(&dev_base_lock);
>
> return first;
> @@ -620,6 +635,7 @@
> {
> struct nr_route_struct nr_route;
> struct net_device *dev;
> + int ret;
>
> switch (cmd) {
>
> @@ -628,23 +644,30 @@
> return -EFAULT;
> if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)
> return -EINVAL;
> - if (nr_route.ndigis < 0 || nr_route.ndigis > AX25_MAX_DIGIS)
> + if (nr_route.ndigis < 0 || nr_route.ndigis > AX25_MAX_DIGIS) {
> + dev_put(dev);
> return -EINVAL;
> + }
> switch (nr_route.type) {
> case NETROM_NODE:
> - return nr_add_node(&nr_route.callsign,
> + ret = nr_add_node(&nr_route.callsign,
> nr_route.mnemonic,
> &nr_route.neighbour,
> nr_call_to_digi(nr_route.ndigis, nr_route.digipeaters),
> dev, nr_route.quality,
> nr_route.obs_count);
> + break;
> case NETROM_NEIGH:
> - return nr_add_neigh(&nr_route.callsign,
> + ret = nr_add_neigh(&nr_route.callsign,
> nr_call_to_digi(nr_route.ndigis, nr_route.digipeaters),
> dev, nr_route.quality);
> + break;
> default:
> - return -EINVAL;
> + ret = -EINVAL;
> + break;
> }
> + dev_put(dev);
> + return ret;
>
> case SIOCDELRT:
> if (copy_from_user(&nr_route, arg, sizeof(struct nr_route_struct)))
> @@ -653,14 +676,19 @@
> return -EINVAL;
> switch (nr_route.type) {
> case NETROM_NODE:
> - return nr_del_node(&nr_route.callsign,
> + ret = nr_del_node(&nr_route.callsign,
> &nr_route.neighbour, dev);
> + break;
> case NETROM_NEIGH:
> - return nr_del_neigh(&nr_route.callsign,
> + ret = nr_del_neigh(&nr_route.callsign,
> dev, nr_route.quality);
> + break;
> default:
> - return -EINVAL;
> + ret = -EINVAL;
> + break;
> }
> + dev_put(dev);
> + return ret;
>
> case SIOCNRDECOBS:
> return nr_dec_obs();
> @@ -717,10 +745,15 @@
> ax25->ax25_dev->dev, 0, sysctl_netrom_obsolescence_count_initialiser);
>
> if ((dev = nr_dev_get(nr_dest)) != NULL) { /* Its for me */
> + int ret;
> +
> if (ax25 == NULL) /* Its from me */
> - return nr_loopback_queue(skb);
> + ret = nr_loopback_queue(skb);
> else
> - return nr_rx_frame(skb, dev);
> + ret = nr_rx_frame(skb, dev);
> +
> + dev_put(dev);
> + return ret;
> }
>
> if (!sysctl_netrom_routing_control && ax25 != NULL)
> @@ -747,6 +780,8 @@
>
> nr_neigh->ax25 = ax25_send_frame(skb, 256, (ax25_address *)dev->dev_addr, &nr_neigh->callsign, nr_neigh->digipeat, nr_neigh->dev);
>
> + dev_put(dev);
> +
> return (nr_neigh->ax25 != NULL);
> }
>
--- To unsubscribe from this list: send the line "unsubscribe linux-hams" in the body of a message to euz@freeshell.org More majordomo info at http://vger.kernel.org/majordomo-info.html
This archive was generated by hypermail 2b30 : Fri Feb 22 2002 - 02:57:05 EET