mISDN: Fix deactivation, if peer IP is removed from l1oip instance.

 Added GETPEER operation.
 Socket now checks if device is already busy at a differen mode.

Signed-off-by: Andreas Eversberg <andreas@eversberg.eu>
Signed-off-by: Karsten Keil <kkeil@suse.de>
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c
index 2f6d6e8..916569ca 100644
--- a/drivers/isdn/mISDN/socket.c
+++ b/drivers/isdn/mISDN/socket.c
@@ -460,6 +460,8 @@
 {
 	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 @@
 		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;