|
|
@@ -311,7 +311,7 @@ static void pppoe_flush_dev(struct net_device *dev)
|
|
|
lock_sock(sk);
|
|
|
|
|
|
if (po->pppoe_dev == dev &&
|
|
|
- sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) {
|
|
|
+ sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND)) {
|
|
|
pppox_unbind_sock(sk);
|
|
|
sk->sk_state_change(sk);
|
|
|
po->pppoe_dev = NULL;
|
|
|
@@ -500,27 +500,9 @@ static int pppoe_disc_rcv(struct sk_buff *skb, struct net_device *dev,
|
|
|
|
|
|
pn = pppoe_pernet(dev_net(dev));
|
|
|
po = get_item(pn, ph->sid, eth_hdr(skb)->h_source, dev->ifindex);
|
|
|
- if (po) {
|
|
|
- struct sock *sk = sk_pppox(po);
|
|
|
-
|
|
|
- bh_lock_sock(sk);
|
|
|
-
|
|
|
- /* If the user has locked the socket, just ignore
|
|
|
- * the packet. With the way two rcv protocols hook into
|
|
|
- * one socket family type, we cannot (easily) distinguish
|
|
|
- * what kind of SKB it is during backlog rcv.
|
|
|
- */
|
|
|
- if (sock_owned_by_user(sk) == 0) {
|
|
|
- /* We're no longer connect at the PPPOE layer,
|
|
|
- * and must wait for ppp channel to disconnect us.
|
|
|
- */
|
|
|
- sk->sk_state = PPPOX_ZOMBIE;
|
|
|
- }
|
|
|
-
|
|
|
- bh_unlock_sock(sk);
|
|
|
+ if (po)
|
|
|
if (!schedule_work(&po->proto.pppoe.padt_work))
|
|
|
- sock_put(sk);
|
|
|
- }
|
|
|
+ sock_put(sk_pppox(po));
|
|
|
|
|
|
abort:
|
|
|
kfree_skb(skb);
|
|
|
@@ -793,7 +775,7 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
|
|
|
struct pppox_sock *relay_po;
|
|
|
|
|
|
err = -EBUSY;
|
|
|
- if (sk->sk_state & (PPPOX_BOUND | PPPOX_ZOMBIE | PPPOX_DEAD))
|
|
|
+ if (sk->sk_state & (PPPOX_BOUND | PPPOX_DEAD))
|
|
|
break;
|
|
|
|
|
|
err = -ENOTCONN;
|