>>>>> "richard" == richard <[EMAIL PROTECTED]> writes:
richard> OK so no-ones wants to answer request for info on how to build the non
richard> standard parts of the mdk kernel.
hi
will be in 2.4.18-4mdk (3mdk is already in stress-testing).
Later, Juan.
richard> OK rephase and alter the question to:- who is willing to add a patch to
richard> the current kernel so it dosnt need to be recompiled for use by people
richard> using the ham radio sections.A small patch that dos'nt effect anything
richard> apart from netrom on the ham radio part of the kernel, which in its
richard> current state stops a clean shutdown with an "unregistered netdevice
richard> "error
richard> perhaps this is why the majority of radio hams that are using linux use
richard> SuSE, Debian, Redhat or slackware.
richard> BTW there are a lot of radio hams., a few million !
richard> TIA just in case
richard> --
richard> Best regards
richard> Richard Bown
richard> diff -ruN -X dontdiff linux-2.4.18-rc2/net/netrom/af_netrom.c
linux/net/netrom/af_netrom.c
richard> --- linux-2.4.18-rc2/net/netrom/af_netrom.c Tue Feb 19 16:06:42 2002
richard> +++ linux/net/netrom/af_netrom.c Tue Feb 19 16:14:39 2002
richard> @@ -31,7 +31,9 @@
richard> * NET/ROM 007 Jonathan(G4KLX) New timer architecture.
richard> * Impmented Idle timer.
richard> * Arnaldo C. Melo s/suser/capable/, micro cleanups
richard> - * Jeroen (PE1RXQ) Use sock_orphan() on release.
richard> + * Jeroen(PE1RXQ) Use sock_orphan() on release.
richard> + * Tomi(OH2BNS) Better frame type checking.
richard> + * Device refcnt fixes.
richard> */
richard> #include <linux/config.h>
richard> @@ -128,6 +130,7 @@
richard> if ((s = nr_list) == sk) {
richard> nr_list = s->next;
richard> + dev_put(sk->protinfo.nr->device);
richard> restore_flags(flags);
richard> return;
richard> }
richard> @@ -135,6 +138,7 @@
richard> while (s != NULL && s->next != NULL) {
richard> if (s->next == sk) {
s-> next = sk->next;
richard> + dev_put(sk->protinfo.nr->device);
richard> restore_flags(flags);
richard> return;
richard> }
richard> @@ -616,16 +620,20 @@
richard> * Only the super user can set an arbitrary user callsign.
richard> */
richard> if (addr->fsa_ax25.sax25_ndigis == 1) {
richard> - if (!capable(CAP_NET_BIND_SERVICE))
richard> + if (!capable(CAP_NET_BIND_SERVICE)) {
richard> + dev_put(dev);
richard> return -EACCES;
richard> + }
sk-> protinfo.nr->user_addr = addr->fsa_digipeater[0];
sk-> protinfo.nr->source_addr = addr->fsa_ax25.sax25_call;
richard> } else {
richard> source = &addr->fsa_ax25.sax25_call;
richard> if ((user = ax25_findbyuid(current->euid)) == NULL) {
richard> - if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE))
richard> + if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE))
{
richard> + dev_put(dev);
richard> return -EPERM;
richard> + }
richard> user = source;
richard> }
richard> @@ -680,8 +688,10 @@
richard> source = (ax25_address *)dev->dev_addr;
richard> if ((user = ax25_findbyuid(current->euid)) == NULL) {
richard> - if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
richard> + if (ax25_uid_policy && !capable(CAP_NET_ADMIN)) {
richard> + dev_put(dev);
richard> return -EPERM;
richard> + }
richard> user = source;
richard> }
richard> @@ -976,6 +986,8 @@
sk-> ack_backlog++;
make-> pair = sk;
richard> + dev_hold(make->protinfo.nr->device);
richard> +
richard> nr_insert_socket(make);
richard> skb_queue_head(&sk->receive_queue, skb);
richard> @@ -1364,7 +1376,6 @@
richard> dev_nr[i].priv = NULL;
richard> unregister_netdev(&dev_nr[i]);
richard> }
richard> - kfree(dev_nr[i].name);
richard> }
richard> kfree(dev_nr);
richard> diff -ruN -X dontdiff linux-2.4.18-rc2/net/netrom/nr_loopback.c
linux/net/netrom/nr_loopback.c
richard> --- linux-2.4.18-rc2/net/netrom/nr_loopback.c Thu Jun 28 03:10:55 2001
richard> +++ linux/net/netrom/nr_loopback.c Tue Feb 19 16:12:35 2002
richard> @@ -85,6 +85,9 @@
richard> if (dev == NULL || nr_rx_frame(skb, dev) == 0)
richard> kfree_skb(skb);
richard> + if (dev != NULL)
richard> + dev_put(dev);
richard> +
richard> if (!skb_queue_empty(&loopback_queue) && !nr_loopback_running())
richard> nr_set_loopback_timer();
richard> }
richard> diff -ruN -X dontdiff linux-2.4.18-rc2/net/netrom/nr_route.c
linux/net/netrom/nr_route.c
richard> --- linux-2.4.18-rc2/net/netrom/nr_route.c Sat Dec 30 00:44:46 2000
richard> +++ linux/net/netrom/nr_route.c Tue Feb 19 16:12:35 2002
richard> @@ -19,6 +19,7 @@
richard> * Alan Cox(GW4PTS) Added the firewall hooks.
richard> * NET/ROM 006 Jonathan(G4KLX) Added the setting of digipeated
neighbours.
richard> * Tomi(OH2BNS) Routing quality and link failure
changes.
richard> + * Device refcnt fixes.
richard> */
richard> #include <linux/errno.h>
richard> @@ -66,11 +67,15 @@
richard> struct nr_node *nr_node;
richard> struct nr_neigh *nr_neigh;
richard> struct nr_route nr_route;
richard> + struct net_device *tdev;
richard> unsigned long flags;
richard> int i, found;
richard> - if (nr_dev_get(nr) != NULL) /* Can't add routes to ourself */
richard> + /* Can't add routes to ourself */
richard> + if ((tdev = nr_dev_get(nr)) != NULL) {
richard> + dev_put(tdev);
richard> return -EINVAL;
richard> + }
richard> for (nr_node = nr_node_list; nr_node != NULL; nr_node = nr_node->next)
richard> if (ax25cmp(nr, &nr_node->callsign) == 0)
richard> @@ -124,6 +129,8 @@
richard> memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi));
richard> }
richard> + dev_hold(nr_neigh->dev);
richard> +
richard> save_flags(flags);
richard> cli();
richard> @@ -294,6 +301,7 @@
richard> if ((s = nr_neigh_list) == nr_neigh) {
richard> nr_neigh_list = nr_neigh->next;
richard> restore_flags(flags);
richard> + dev_put(nr_neigh->dev);
richard> if (nr_neigh->digipeat != NULL)
richard> kfree(nr_neigh->digipeat);
richard> kfree(nr_neigh);
richard> @@ -304,6 +312,7 @@
richard> if (s->next == nr_neigh) {
s-> next = nr_neigh->next;
richard> restore_flags(flags);
richard> + dev_put(nr_neigh->dev);
richard> if (nr_neigh->digipeat != NULL)
richard> kfree(nr_neigh->digipeat);
richard> kfree(nr_neigh);
richard> @@ -404,6 +413,8 @@
richard> memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi));
richard> }
richard> + dev_hold(nr_neigh->dev);
richard> +
richard> save_flags(flags);
richard> cli();
richard> @@ -570,6 +581,10 @@
richard> if (first == NULL || strncmp(dev->name, first->name, 3) < 0)
richard> first = dev;
richard> }
richard> +
richard> + if (first != NULL)
richard> + dev_hold(first);
richard> +
richard> read_unlock(&dev_base_lock);
richard> return first;
richard> @@ -620,6 +635,7 @@
richard> {
richard> struct nr_route_struct nr_route;
richard> struct net_device *dev;
richard> + int ret;
richard> switch (cmd) {
richard> @@ -628,23 +644,30 @@
richard> return -EFAULT;
richard> if ((dev = nr_ax25_dev_get(nr_route.device)) == NULL)
richard> return -EINVAL;
richard> - if (nr_route.ndigis < 0 || nr_route.ndigis >
AX25_MAX_DIGIS)
richard> + if (nr_route.ndigis < 0 || nr_route.ndigis >
AX25_MAX_DIGIS) {
richard> + dev_put(dev);
richard> return -EINVAL;
richard> + }
richard> switch (nr_route.type) {
richard> case NETROM_NODE:
richard> - return nr_add_node(&nr_route.callsign,
richard> + ret = nr_add_node(&nr_route.callsign,
richard> nr_route.mnemonic,
richard> &nr_route.neighbour,
richard> nr_call_to_digi(nr_route.ndigis, nr_route.digipeaters),
richard> dev, nr_route.quality,
richard> nr_route.obs_count);
richard> + break;
richard> case NETROM_NEIGH:
richard> - return nr_add_neigh(&nr_route.callsign,
richard> + ret = nr_add_neigh(&nr_route.callsign,
richard> nr_call_to_digi(nr_route.ndigis, nr_route.digipeaters),
richard> dev, nr_route.quality);
richard> + break;
richard> default:
richard> - return -EINVAL;
richard> + ret = -EINVAL;
richard> + break;
richard> }
richard> + dev_put(dev);
richard> + return ret;
richard> case SIOCDELRT:
richard> if (copy_from_user(&nr_route, arg, sizeof(struct nr_route_struct)))
richard> @@ -653,14 +676,19 @@
richard> return -EINVAL;
richard> switch (nr_route.type) {
richard> case NETROM_NODE:
richard> - return nr_del_node(&nr_route.callsign,
richard> + ret = nr_del_node(&nr_route.callsign,
richard> &nr_route.neighbour, dev);
richard> + break;
richard> case NETROM_NEIGH:
richard> - return nr_del_neigh(&nr_route.callsign,
richard> + ret = nr_del_neigh(&nr_route.callsign,
richard> dev, nr_route.quality);
richard> + break;
richard> default:
richard> - return -EINVAL;
richard> + ret = -EINVAL;
richard> + break;
richard> }
richard> + dev_put(dev);
richard> + return ret;
richard> case SIOCNRDECOBS:
richard> return nr_dec_obs();
richard> @@ -717,10 +745,15 @@
ax25-> ax25_dev->dev, 0, sysctl_netrom_obsolescence_count_initialiser);
richard> if ((dev = nr_dev_get(nr_dest)) != NULL) { /* Its for me */
richard> + int ret;
richard> +
richard> if (ax25 == NULL) /* Its from me */
richard> - return nr_loopback_queue(skb);
richard> + ret = nr_loopback_queue(skb);
richard> else
richard> - return nr_rx_frame(skb, dev);
richard> + ret = nr_rx_frame(skb, dev);
richard> +
richard> + dev_put(dev);
richard> + return ret;
richard> }
richard> if (!sysctl_netrom_routing_control && ax25 != NULL)
richard> @@ -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);
richard> + dev_put(dev);
richard> +
richard> return (nr_neigh->ax25 != NULL);
richard> }
--
In theory, practice and theory are the same, but in practice they
are different -- Larry McVoy