]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/isdn/mISDN/socket.c
mISDN: Fix deactivation, if peer IP is removed from l1oip instance.
[linux-2.6-omap-h63xx.git] / drivers / isdn / mISDN / socket.c
index 2f6d6e88ff2c23d14fc6217a724b9e419610b830..916569ca156d4daf1b699fef711599f7b30b1b77 100644 (file)
@@ -460,6 +460,8 @@ data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
 {
        struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;
        struct sock *sk = sock->sk;
+       struct hlist_node *node;
+       struct sock *csk;
        int err = 0;
 
        if (*debug & DEBUG_SOCKET)
@@ -480,6 +482,24 @@ data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
                err = -ENODEV;
                goto done;
        }
+
+       read_lock_bh(&data_sockets.lock);
+       sk_for_each(csk, node, &data_sockets.head) {
+               if (sk == csk)
+                       continue;
+               if (_pms(csk)->dev != _pms(sk)->dev)
+                       continue;
+               if (csk->sk_protocol >= ISDN_P_B_START)
+                       continue;
+               if (IS_ISDN_P_TE(csk->sk_protocol)
+                               == IS_ISDN_P_TE(sk->sk_protocol))
+                       continue;
+               read_unlock_bh(&data_sockets.lock);
+               err = -EBUSY;
+               goto done;
+       }
+       read_unlock_bh(&data_sockets.lock);
+
        _pms(sk)->ch.send = mISDN_send;
        _pms(sk)->ch.ctrl = mISDN_ctrl;