vserver 1.9.5.x5
[linux-2.6.git] / net / atm / mpc.c
index e629e89..a28db2d 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/timer.h>
 #include <linux/init.h>
 #include <linux/bitops.h>
+#include <linux/seq_file.h>
 
 /* We are an ethernet device */
 #include <linux/if_ether.h>
@@ -224,29 +225,27 @@ int atm_mpoa_delete_qos(struct atm_mpoa_qos *entry)
        return 0;
 }
 
-void atm_mpoa_disp_qos(char *page, ssize_t *len)
+/* this is buggered - we need locking for qos_head */
+void atm_mpoa_disp_qos(struct seq_file *m)
 {
-
        unsigned char *ip;
        char ipaddr[16];
        struct atm_mpoa_qos *qos;
 
        qos = qos_head;
-       *len += sprintf(page + *len, "QoS entries for shortcuts:\n");
-       *len += sprintf(page + *len, "IP address\n  TX:max_pcr pcr     min_pcr max_cdv max_sdu\n  RX:max_pcr pcr     min_pcr max_cdv max_sdu\n");
+       seq_printf(m, "QoS entries for shortcuts:\n");
+       seq_printf(m, "IP address\n  TX:max_pcr pcr     min_pcr max_cdv max_sdu\n  RX:max_pcr pcr     min_pcr max_cdv max_sdu\n");
 
        ipaddr[sizeof(ipaddr)-1] = '\0';
        while (qos != NULL) {
                ip = (unsigned char *)&qos->ipaddr;
                sprintf(ipaddr, "%u.%u.%u.%u", NIPQUAD(ip));
-               *len += sprintf(page + *len, "%u.%u.%u.%u\n     %-7d %-7d %-7d %-7d %-7d\n     %-7d %-7d %-7d %-7d %-7d\n",
+               seq_printf(m, "%u.%u.%u.%u\n     %-7d %-7d %-7d %-7d %-7d\n     %-7d %-7d %-7d %-7d %-7d\n",
                                NIPQUAD(ipaddr),
                                qos->qos.txtp.max_pcr, qos->qos.txtp.pcr, qos->qos.txtp.min_pcr, qos->qos.txtp.max_cdv, qos->qos.txtp.max_sdu,
                                qos->qos.rxtp.max_pcr, qos->qos.rxtp.pcr, qos->qos.rxtp.min_pcr, qos->qos.rxtp.max_cdv, qos->qos.rxtp.max_sdu);
                qos = qos->next;
        }
-       
-       return;
 }
 
 static struct net_device *find_lec_by_itfnum(int itf)
@@ -268,8 +267,8 @@ static struct mpoa_client *alloc_mpc(void)
        if (mpc == NULL)
                return NULL;
        memset(mpc, 0, sizeof(struct mpoa_client));
-       mpc->ingress_lock = RW_LOCK_UNLOCKED;
-       mpc->egress_lock  = RW_LOCK_UNLOCKED;
+       rwlock_init(&mpc->ingress_lock);
+       rwlock_init(&mpc->egress_lock);
        mpc->next = mpcs;
        atm_mpoa_init_cache(mpc);
 
@@ -756,13 +755,18 @@ int atm_mpoa_mpoad_attach (struct atm_vcc *vcc, int arg)
 {
        struct mpoa_client *mpc;
        struct lec_priv *priv;
+       int err;
        
        if (mpcs == NULL) {
                init_timer(&mpc_timer);
                mpc_timer_refresh();
 
                /* This lets us now how our LECs are doing */
-               register_netdevice_notifier(&mpoa_notifier);
+               err = register_netdevice_notifier(&mpoa_notifier);
+               if (err < 0) {
+                       del_timer(&mpc_timer);
+                       return err;
+               }
        }
        
        mpc = find_mpc_by_itfnum(arg);