diff options
Diffstat (limited to 'net/atm/clip.c')
| -rw-r--r-- | net/atm/clip.c | 89 |
1 files changed, 43 insertions, 46 deletions
diff --git a/net/atm/clip.c b/net/atm/clip.c index 64629c354343..95fdd1185067 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | 2 | ||
| 3 | /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ | 3 | /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ |
| 4 | 4 | ||
| 5 | #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ | ||
| 6 | |||
| 5 | #include <linux/string.h> | 7 | #include <linux/string.h> |
| 6 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
| 7 | #include <linux/kernel.h> /* for UINT_MAX */ | 9 | #include <linux/kernel.h> /* for UINT_MAX */ |
| @@ -28,12 +30,13 @@ | |||
| 28 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
| 29 | #include <linux/rcupdate.h> | 31 | #include <linux/rcupdate.h> |
| 30 | #include <linux/jhash.h> | 32 | #include <linux/jhash.h> |
| 33 | #include <linux/slab.h> | ||
| 31 | #include <net/route.h> /* for struct rtable and routing */ | 34 | #include <net/route.h> /* for struct rtable and routing */ |
| 32 | #include <net/icmp.h> /* icmp_send */ | 35 | #include <net/icmp.h> /* icmp_send */ |
| 33 | #include <asm/param.h> /* for HZ */ | 36 | #include <linux/param.h> /* for HZ */ |
| 37 | #include <linux/uaccess.h> | ||
| 34 | #include <asm/byteorder.h> /* for htons etc. */ | 38 | #include <asm/byteorder.h> /* for htons etc. */ |
| 35 | #include <asm/system.h> /* save/restore_flags */ | 39 | #include <asm/system.h> /* save/restore_flags */ |
| 36 | #include <asm/uaccess.h> | ||
| 37 | #include <asm/atomic.h> | 40 | #include <asm/atomic.h> |
| 38 | 41 | ||
| 39 | #include "common.h" | 42 | #include "common.h" |
| @@ -51,13 +54,13 @@ static int to_atmarpd(enum atmarp_ctrl_type type, int itf, __be32 ip) | |||
| 51 | struct atmarp_ctrl *ctrl; | 54 | struct atmarp_ctrl *ctrl; |
| 52 | struct sk_buff *skb; | 55 | struct sk_buff *skb; |
| 53 | 56 | ||
| 54 | pr_debug("to_atmarpd(%d)\n", type); | 57 | pr_debug("(%d)\n", type); |
| 55 | if (!atmarpd) | 58 | if (!atmarpd) |
| 56 | return -EUNATCH; | 59 | return -EUNATCH; |
| 57 | skb = alloc_skb(sizeof(struct atmarp_ctrl),GFP_ATOMIC); | 60 | skb = alloc_skb(sizeof(struct atmarp_ctrl), GFP_ATOMIC); |
| 58 | if (!skb) | 61 | if (!skb) |
| 59 | return -ENOMEM; | 62 | return -ENOMEM; |
| 60 | ctrl = (struct atmarp_ctrl *) skb_put(skb,sizeof(struct atmarp_ctrl)); | 63 | ctrl = (struct atmarp_ctrl *)skb_put(skb, sizeof(struct atmarp_ctrl)); |
| 61 | ctrl->type = type; | 64 | ctrl->type = type; |
| 62 | ctrl->itf_num = itf; | 65 | ctrl->itf_num = itf; |
| 63 | ctrl->ip = ip; | 66 | ctrl->ip = ip; |
| @@ -71,8 +74,7 @@ static int to_atmarpd(enum atmarp_ctrl_type type, int itf, __be32 ip) | |||
| 71 | 74 | ||
| 72 | static void link_vcc(struct clip_vcc *clip_vcc, struct atmarp_entry *entry) | 75 | static void link_vcc(struct clip_vcc *clip_vcc, struct atmarp_entry *entry) |
| 73 | { | 76 | { |
| 74 | pr_debug("link_vcc %p to entry %p (neigh %p)\n", clip_vcc, entry, | 77 | pr_debug("%p to entry %p (neigh %p)\n", clip_vcc, entry, entry->neigh); |
| 75 | entry->neigh); | ||
| 76 | clip_vcc->entry = entry; | 78 | clip_vcc->entry = entry; |
| 77 | clip_vcc->xoff = 0; /* @@@ may overrun buffer by one packet */ | 79 | clip_vcc->xoff = 0; /* @@@ may overrun buffer by one packet */ |
| 78 | clip_vcc->next = entry->vccs; | 80 | clip_vcc->next = entry->vccs; |
| @@ -86,7 +88,7 @@ static void unlink_clip_vcc(struct clip_vcc *clip_vcc) | |||
| 86 | struct clip_vcc **walk; | 88 | struct clip_vcc **walk; |
| 87 | 89 | ||
| 88 | if (!entry) { | 90 | if (!entry) { |
| 89 | printk(KERN_CRIT "!clip_vcc->entry (clip_vcc %p)\n", clip_vcc); | 91 | pr_crit("!clip_vcc->entry (clip_vcc %p)\n", clip_vcc); |
| 90 | return; | 92 | return; |
| 91 | } | 93 | } |
| 92 | netif_tx_lock_bh(entry->neigh->dev); /* block clip_start_xmit() */ | 94 | netif_tx_lock_bh(entry->neigh->dev); /* block clip_start_xmit() */ |
| @@ -106,13 +108,11 @@ static void unlink_clip_vcc(struct clip_vcc *clip_vcc) | |||
| 106 | error = neigh_update(entry->neigh, NULL, NUD_NONE, | 108 | error = neigh_update(entry->neigh, NULL, NUD_NONE, |
| 107 | NEIGH_UPDATE_F_ADMIN); | 109 | NEIGH_UPDATE_F_ADMIN); |
| 108 | if (error) | 110 | if (error) |
| 109 | printk(KERN_CRIT "unlink_clip_vcc: " | 111 | pr_crit("neigh_update failed with %d\n", error); |
| 110 | "neigh_update failed with %d\n", error); | ||
| 111 | goto out; | 112 | goto out; |
| 112 | } | 113 | } |
| 113 | printk(KERN_CRIT "ATMARP: unlink_clip_vcc failed (entry %p, vcc " | 114 | pr_crit("ATMARP: failed (entry %p, vcc 0x%p)\n", entry, clip_vcc); |
| 114 | "0x%p)\n", entry, clip_vcc); | 115 | out: |
| 115 | out: | ||
| 116 | netif_tx_unlock_bh(entry->neigh->dev); | 116 | netif_tx_unlock_bh(entry->neigh->dev); |
| 117 | } | 117 | } |
| 118 | 118 | ||
| @@ -127,7 +127,7 @@ static int neigh_check_cb(struct neighbour *n) | |||
| 127 | 127 | ||
| 128 | if (cv->idle_timeout && time_after(jiffies, exp)) { | 128 | if (cv->idle_timeout && time_after(jiffies, exp)) { |
| 129 | pr_debug("releasing vcc %p->%p of entry %p\n", | 129 | pr_debug("releasing vcc %p->%p of entry %p\n", |
| 130 | cv, cv->vcc, entry); | 130 | cv, cv->vcc, entry); |
| 131 | vcc_release_async(cv->vcc, -ETIMEDOUT); | 131 | vcc_release_async(cv->vcc, -ETIMEDOUT); |
| 132 | } | 132 | } |
| 133 | } | 133 | } |
| @@ -139,7 +139,7 @@ static int neigh_check_cb(struct neighbour *n) | |||
| 139 | struct sk_buff *skb; | 139 | struct sk_buff *skb; |
| 140 | 140 | ||
| 141 | pr_debug("destruction postponed with ref %d\n", | 141 | pr_debug("destruction postponed with ref %d\n", |
| 142 | atomic_read(&n->refcnt)); | 142 | atomic_read(&n->refcnt)); |
| 143 | 143 | ||
| 144 | while ((skb = skb_dequeue(&n->arp_queue)) != NULL) | 144 | while ((skb = skb_dequeue(&n->arp_queue)) != NULL) |
| 145 | dev_kfree_skb(skb); | 145 | dev_kfree_skb(skb); |
| @@ -163,7 +163,7 @@ static int clip_arp_rcv(struct sk_buff *skb) | |||
| 163 | { | 163 | { |
| 164 | struct atm_vcc *vcc; | 164 | struct atm_vcc *vcc; |
| 165 | 165 | ||
| 166 | pr_debug("clip_arp_rcv\n"); | 166 | pr_debug("\n"); |
| 167 | vcc = ATM_SKB(skb)->vcc; | 167 | vcc = ATM_SKB(skb)->vcc; |
| 168 | if (!vcc || !atm_charge(vcc, skb->truesize)) { | 168 | if (!vcc || !atm_charge(vcc, skb->truesize)) { |
| 169 | dev_kfree_skb_any(skb); | 169 | dev_kfree_skb_any(skb); |
| @@ -188,7 +188,7 @@ static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb) | |||
| 188 | { | 188 | { |
| 189 | struct clip_vcc *clip_vcc = CLIP_VCC(vcc); | 189 | struct clip_vcc *clip_vcc = CLIP_VCC(vcc); |
| 190 | 190 | ||
| 191 | pr_debug("clip push\n"); | 191 | pr_debug("\n"); |
| 192 | if (!skb) { | 192 | if (!skb) { |
| 193 | pr_debug("removing VCC %p\n", clip_vcc); | 193 | pr_debug("removing VCC %p\n", clip_vcc); |
| 194 | if (clip_vcc->entry) | 194 | if (clip_vcc->entry) |
| @@ -206,12 +206,12 @@ static void clip_push(struct atm_vcc *vcc, struct sk_buff *skb) | |||
| 206 | } | 206 | } |
| 207 | ATM_SKB(skb)->vcc = vcc; | 207 | ATM_SKB(skb)->vcc = vcc; |
| 208 | skb_reset_mac_header(skb); | 208 | skb_reset_mac_header(skb); |
| 209 | if (!clip_vcc->encap | 209 | if (!clip_vcc->encap || |
| 210 | || skb->len < RFC1483LLC_LEN | 210 | skb->len < RFC1483LLC_LEN || |
| 211 | || memcmp(skb->data, llc_oui, sizeof (llc_oui))) | 211 | memcmp(skb->data, llc_oui, sizeof(llc_oui))) |
| 212 | skb->protocol = htons(ETH_P_IP); | 212 | skb->protocol = htons(ETH_P_IP); |
| 213 | else { | 213 | else { |
| 214 | skb->protocol = ((__be16 *) skb->data)[3]; | 214 | skb->protocol = ((__be16 *)skb->data)[3]; |
| 215 | skb_pull(skb, RFC1483LLC_LEN); | 215 | skb_pull(skb, RFC1483LLC_LEN); |
| 216 | if (skb->protocol == htons(ETH_P_ARP)) { | 216 | if (skb->protocol == htons(ETH_P_ARP)) { |
| 217 | skb->dev->stats.rx_packets++; | 217 | skb->dev->stats.rx_packets++; |
| @@ -239,7 +239,7 @@ static void clip_pop(struct atm_vcc *vcc, struct sk_buff *skb) | |||
| 239 | int old; | 239 | int old; |
| 240 | unsigned long flags; | 240 | unsigned long flags; |
| 241 | 241 | ||
| 242 | pr_debug("clip_pop(vcc %p)\n", vcc); | 242 | pr_debug("(vcc %p)\n", vcc); |
| 243 | clip_vcc->old_pop(vcc, skb); | 243 | clip_vcc->old_pop(vcc, skb); |
| 244 | /* skb->dev == NULL in outbound ARP packets */ | 244 | /* skb->dev == NULL in outbound ARP packets */ |
| 245 | if (!dev) | 245 | if (!dev) |
| @@ -255,7 +255,7 @@ static void clip_pop(struct atm_vcc *vcc, struct sk_buff *skb) | |||
| 255 | 255 | ||
| 256 | static void clip_neigh_solicit(struct neighbour *neigh, struct sk_buff *skb) | 256 | static void clip_neigh_solicit(struct neighbour *neigh, struct sk_buff *skb) |
| 257 | { | 257 | { |
| 258 | pr_debug("clip_neigh_solicit (neigh %p, skb %p)\n", neigh, skb); | 258 | pr_debug("(neigh %p, skb %p)\n", neigh, skb); |
| 259 | to_atmarpd(act_need, PRIV(neigh->dev)->number, NEIGH2ENTRY(neigh)->ip); | 259 | to_atmarpd(act_need, PRIV(neigh->dev)->number, NEIGH2ENTRY(neigh)->ip); |
| 260 | } | 260 | } |
| 261 | 261 | ||
| @@ -284,7 +284,7 @@ static int clip_constructor(struct neighbour *neigh) | |||
| 284 | struct in_device *in_dev; | 284 | struct in_device *in_dev; |
| 285 | struct neigh_parms *parms; | 285 | struct neigh_parms *parms; |
| 286 | 286 | ||
| 287 | pr_debug("clip_constructor (neigh %p, entry %p)\n", neigh, entry); | 287 | pr_debug("(neigh %p, entry %p)\n", neigh, entry); |
| 288 | neigh->type = inet_addr_type(&init_net, entry->ip); | 288 | neigh->type = inet_addr_type(&init_net, entry->ip); |
| 289 | if (neigh->type != RTN_UNICAST) | 289 | if (neigh->type != RTN_UNICAST) |
| 290 | return -EINVAL; | 290 | return -EINVAL; |
| @@ -369,9 +369,9 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb, | |||
| 369 | int old; | 369 | int old; |
| 370 | unsigned long flags; | 370 | unsigned long flags; |
| 371 | 371 | ||
| 372 | pr_debug("clip_start_xmit (skb %p)\n", skb); | 372 | pr_debug("(skb %p)\n", skb); |
| 373 | if (!skb_dst(skb)) { | 373 | if (!skb_dst(skb)) { |
| 374 | printk(KERN_ERR "clip_start_xmit: skb_dst(skb) == NULL\n"); | 374 | pr_err("skb_dst(skb) == NULL\n"); |
| 375 | dev_kfree_skb(skb); | 375 | dev_kfree_skb(skb); |
| 376 | dev->stats.tx_dropped++; | 376 | dev->stats.tx_dropped++; |
| 377 | return NETDEV_TX_OK; | 377 | return NETDEV_TX_OK; |
| @@ -385,7 +385,7 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb, | |||
| 385 | return 0; | 385 | return 0; |
| 386 | } | 386 | } |
| 387 | #endif | 387 | #endif |
| 388 | printk(KERN_ERR "clip_start_xmit: NO NEIGHBOUR !\n"); | 388 | pr_err("NO NEIGHBOUR !\n"); |
| 389 | dev_kfree_skb(skb); | 389 | dev_kfree_skb(skb); |
| 390 | dev->stats.tx_dropped++; | 390 | dev->stats.tx_dropped++; |
| 391 | return NETDEV_TX_OK; | 391 | return NETDEV_TX_OK; |
| @@ -421,7 +421,7 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb, | |||
| 421 | pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, vcc, vcc->dev); | 421 | pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, vcc, vcc->dev); |
| 422 | old = xchg(&entry->vccs->xoff, 1); /* assume XOFF ... */ | 422 | old = xchg(&entry->vccs->xoff, 1); /* assume XOFF ... */ |
| 423 | if (old) { | 423 | if (old) { |
| 424 | printk(KERN_WARNING "clip_start_xmit: XOFF->XOFF transition\n"); | 424 | pr_warning("XOFF->XOFF transition\n"); |
| 425 | return NETDEV_TX_OK; | 425 | return NETDEV_TX_OK; |
| 426 | } | 426 | } |
| 427 | dev->stats.tx_packets++; | 427 | dev->stats.tx_packets++; |
| @@ -456,7 +456,7 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout) | |||
| 456 | clip_vcc = kmalloc(sizeof(struct clip_vcc), GFP_KERNEL); | 456 | clip_vcc = kmalloc(sizeof(struct clip_vcc), GFP_KERNEL); |
| 457 | if (!clip_vcc) | 457 | if (!clip_vcc) |
| 458 | return -ENOMEM; | 458 | return -ENOMEM; |
| 459 | pr_debug("mkip clip_vcc %p vcc %p\n", clip_vcc, vcc); | 459 | pr_debug("%p vcc %p\n", clip_vcc, vcc); |
| 460 | clip_vcc->vcc = vcc; | 460 | clip_vcc->vcc = vcc; |
| 461 | vcc->user_back = clip_vcc; | 461 | vcc->user_back = clip_vcc; |
| 462 | set_bit(ATM_VF_IS_CLIP, &vcc->flags); | 462 | set_bit(ATM_VF_IS_CLIP, &vcc->flags); |
| @@ -506,32 +506,32 @@ static int clip_setentry(struct atm_vcc *vcc, __be32 ip) | |||
| 506 | struct rtable *rt; | 506 | struct rtable *rt; |
| 507 | 507 | ||
| 508 | if (vcc->push != clip_push) { | 508 | if (vcc->push != clip_push) { |
| 509 | printk(KERN_WARNING "clip_setentry: non-CLIP VCC\n"); | 509 | pr_warning("non-CLIP VCC\n"); |
| 510 | return -EBADF; | 510 | return -EBADF; |
| 511 | } | 511 | } |
| 512 | clip_vcc = CLIP_VCC(vcc); | 512 | clip_vcc = CLIP_VCC(vcc); |
| 513 | if (!ip) { | 513 | if (!ip) { |
| 514 | if (!clip_vcc->entry) { | 514 | if (!clip_vcc->entry) { |
| 515 | printk(KERN_ERR "hiding hidden ATMARP entry\n"); | 515 | pr_err("hiding hidden ATMARP entry\n"); |
| 516 | return 0; | 516 | return 0; |
| 517 | } | 517 | } |
| 518 | pr_debug("setentry: remove\n"); | 518 | pr_debug("remove\n"); |
| 519 | unlink_clip_vcc(clip_vcc); | 519 | unlink_clip_vcc(clip_vcc); |
| 520 | return 0; | 520 | return 0; |
| 521 | } | 521 | } |
| 522 | error = ip_route_output_key(&init_net, &rt, &fl); | 522 | error = ip_route_output_key(&init_net, &rt, &fl); |
| 523 | if (error) | 523 | if (error) |
| 524 | return error; | 524 | return error; |
| 525 | neigh = __neigh_lookup(&clip_tbl, &ip, rt->u.dst.dev, 1); | 525 | neigh = __neigh_lookup(&clip_tbl, &ip, rt->dst.dev, 1); |
| 526 | ip_rt_put(rt); | 526 | ip_rt_put(rt); |
| 527 | if (!neigh) | 527 | if (!neigh) |
| 528 | return -ENOMEM; | 528 | return -ENOMEM; |
| 529 | entry = NEIGH2ENTRY(neigh); | 529 | entry = NEIGH2ENTRY(neigh); |
| 530 | if (entry != clip_vcc->entry) { | 530 | if (entry != clip_vcc->entry) { |
| 531 | if (!clip_vcc->entry) | 531 | if (!clip_vcc->entry) |
| 532 | pr_debug("setentry: add\n"); | 532 | pr_debug("add\n"); |
| 533 | else { | 533 | else { |
| 534 | pr_debug("setentry: update\n"); | 534 | pr_debug("update\n"); |
| 535 | unlink_clip_vcc(clip_vcc); | 535 | unlink_clip_vcc(clip_vcc); |
| 536 | } | 536 | } |
| 537 | link_vcc(clip_vcc, entry); | 537 | link_vcc(clip_vcc, entry); |
| @@ -614,16 +614,16 @@ static int clip_device_event(struct notifier_block *this, unsigned long event, | |||
| 614 | 614 | ||
| 615 | switch (event) { | 615 | switch (event) { |
| 616 | case NETDEV_UP: | 616 | case NETDEV_UP: |
| 617 | pr_debug("clip_device_event NETDEV_UP\n"); | 617 | pr_debug("NETDEV_UP\n"); |
| 618 | to_atmarpd(act_up, PRIV(dev)->number, 0); | 618 | to_atmarpd(act_up, PRIV(dev)->number, 0); |
| 619 | break; | 619 | break; |
| 620 | case NETDEV_GOING_DOWN: | 620 | case NETDEV_GOING_DOWN: |
| 621 | pr_debug("clip_device_event NETDEV_DOWN\n"); | 621 | pr_debug("NETDEV_DOWN\n"); |
| 622 | to_atmarpd(act_down, PRIV(dev)->number, 0); | 622 | to_atmarpd(act_down, PRIV(dev)->number, 0); |
| 623 | break; | 623 | break; |
| 624 | case NETDEV_CHANGE: | 624 | case NETDEV_CHANGE: |
| 625 | case NETDEV_CHANGEMTU: | 625 | case NETDEV_CHANGEMTU: |
| 626 | pr_debug("clip_device_event NETDEV_CHANGE*\n"); | 626 | pr_debug("NETDEV_CHANGE*\n"); |
| 627 | to_atmarpd(act_change, PRIV(dev)->number, 0); | 627 | to_atmarpd(act_change, PRIV(dev)->number, 0); |
| 628 | break; | 628 | break; |
| 629 | } | 629 | } |
| @@ -645,7 +645,6 @@ static int clip_inet_event(struct notifier_block *this, unsigned long event, | |||
| 645 | return clip_device_event(this, NETDEV_CHANGE, in_dev->dev); | 645 | return clip_device_event(this, NETDEV_CHANGE, in_dev->dev); |
| 646 | } | 646 | } |
| 647 | 647 | ||
| 648 | |||
| 649 | static struct notifier_block clip_dev_notifier = { | 648 | static struct notifier_block clip_dev_notifier = { |
| 650 | .notifier_call = clip_device_event, | 649 | .notifier_call = clip_device_event, |
| 651 | }; | 650 | }; |
| @@ -660,7 +659,7 @@ static struct notifier_block clip_inet_notifier = { | |||
| 660 | 659 | ||
| 661 | static void atmarpd_close(struct atm_vcc *vcc) | 660 | static void atmarpd_close(struct atm_vcc *vcc) |
| 662 | { | 661 | { |
| 663 | pr_debug("atmarpd_close\n"); | 662 | pr_debug("\n"); |
| 664 | 663 | ||
| 665 | rtnl_lock(); | 664 | rtnl_lock(); |
| 666 | atmarpd = NULL; | 665 | atmarpd = NULL; |
| @@ -671,7 +670,6 @@ static void atmarpd_close(struct atm_vcc *vcc) | |||
| 671 | module_put(THIS_MODULE); | 670 | module_put(THIS_MODULE); |
| 672 | } | 671 | } |
| 673 | 672 | ||
| 674 | |||
| 675 | static struct atmdev_ops atmarpd_dev_ops = { | 673 | static struct atmdev_ops atmarpd_dev_ops = { |
| 676 | .close = atmarpd_close | 674 | .close = atmarpd_close |
| 677 | }; | 675 | }; |
| @@ -693,11 +691,11 @@ static int atm_init_atmarp(struct atm_vcc *vcc) | |||
| 693 | return -EADDRINUSE; | 691 | return -EADDRINUSE; |
| 694 | } | 692 | } |
| 695 | 693 | ||
| 696 | mod_timer(&idle_timer, jiffies+CLIP_CHECK_INTERVAL*HZ); | 694 | mod_timer(&idle_timer, jiffies + CLIP_CHECK_INTERVAL * HZ); |
| 697 | 695 | ||
| 698 | atmarpd = vcc; | 696 | atmarpd = vcc; |
| 699 | set_bit(ATM_VF_META,&vcc->flags); | 697 | set_bit(ATM_VF_META, &vcc->flags); |
| 700 | set_bit(ATM_VF_READY,&vcc->flags); | 698 | set_bit(ATM_VF_READY, &vcc->flags); |
| 701 | /* allow replies and avoid getting closed if signaling dies */ | 699 | /* allow replies and avoid getting closed if signaling dies */ |
| 702 | vcc->dev = &atmarpd_dev; | 700 | vcc->dev = &atmarpd_dev; |
| 703 | vcc_insert_socket(sk_atm(vcc)); | 701 | vcc_insert_socket(sk_atm(vcc)); |
| @@ -950,8 +948,7 @@ static int __init atm_clip_init(void) | |||
| 950 | 948 | ||
| 951 | p = proc_create("arp", S_IRUGO, atm_proc_root, &arp_seq_fops); | 949 | p = proc_create("arp", S_IRUGO, atm_proc_root, &arp_seq_fops); |
| 952 | if (!p) { | 950 | if (!p) { |
| 953 | printk(KERN_ERR "Unable to initialize " | 951 | pr_err("Unable to initialize /proc/net/atm/arp\n"); |
| 954 | "/proc/net/atm/arp\n"); | ||
| 955 | atm_clip_exit_noproc(); | 952 | atm_clip_exit_noproc(); |
| 956 | return -ENOMEM; | 953 | return -ENOMEM; |
| 957 | } | 954 | } |
