timeo = mdev->net_conf->try_connect_int * HZ;
        timeo += (random32() & 1) ? timeo / 7 : -timeo / 7; /* 28.5% random jitter */
 
-       s_listen->sk->sk_reuse    = 1; /* SO_REUSEADDR */
+       s_listen->sk->sk_reuse    = SK_CAN_REUSE; /* SO_REUSEADDR */
        s_listen->sk->sk_rcvtimeo = timeo;
        s_listen->sk->sk_sndtimeo = timeo;
        drbd_setbufsize(s_listen, mdev->net_conf->sndbuf_size,
                }
        } while (1);
 
-       msock->sk->sk_reuse = 1; /* SO_REUSEADDR */
-       sock->sk->sk_reuse = 1; /* SO_REUSEADDR */
+       msock->sk->sk_reuse = SK_CAN_REUSE; /* SO_REUSEADDR */
+       sock->sk->sk_reuse = SK_CAN_REUSE; /* SO_REUSEADDR */
 
        sock->sk->sk_allocation = GFP_NOIO;
        msock->sk->sk_allocation = GFP_NOIO;
 
 
        /* setup Socket parameters */
        sk = sock->sk;
-       sk->sk_reuse = 1;
+       sk->sk_reuse = SK_CAN_REUSE;
        sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
        sk->sk_allocation = GFP_ATOMIC;
 
 
        r2net_listen_sock = sock;
        INIT_WORK(&r2net_listen_work, r2net_accept_many);
 
-       sock->sk->sk_reuse = 1;
+       sock->sk->sk_reuse = SK_CAN_REUSE;
        ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
        if (ret < 0) {
                printk(KERN_ERR "ramster: Error %d while binding socket at "
 
        o2net_listen_sock = sock;
        INIT_WORK(&o2net_listen_work, o2net_accept_many);
 
-       sock->sk->sk_reuse = 1;
+       sock->sk->sk_reuse = SK_CAN_REUSE;
        ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
        if (ret < 0) {
                printk(KERN_ERR "o2net: Error %d while binding socket at "
 
        void                    (*sk_destruct)(struct sock *sk);
 };
 
+/*
+ * SK_CAN_REUSE and SK_NO_REUSE on a socket mean that the socket is OK
+ * or not whether his port will be reused by someone else. SK_FORCE_REUSE
+ * on a socket means that the socket will reuse everybody else's port
+ * without looking at the other's sk_reuse value.
+ */
+
+#define SK_NO_REUSE    0
+#define SK_CAN_REUSE   1
+#define SK_FORCE_REUSE 2
+
 static inline int sk_peek_offset(struct sock *sk, int flags)
 {
        if ((flags & MSG_PEEK) && (sk->sk_peek_off >= 0))
 
                        sock_valbool_flag(sk, SOCK_DBG, valbool);
                break;
        case SO_REUSEADDR:
-               sk->sk_reuse = valbool;
+               sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE);
                break;
        case SO_TYPE:
        case SO_PROTOCOL:
 
        if (sk == NULL)
                goto out;
 
-       sk->sk_reuse = 1;
+       sk->sk_reuse = SK_CAN_REUSE;
        sock->ops = &econet_ops;
        sock_init_data(sock, sk);
 
                return error;
        }
 
-       udpsock->sk->sk_reuse = 1;
+       udpsock->sk->sk_reuse = SK_CAN_REUSE;
        udpsock->sk->sk_allocation = GFP_ATOMIC; /* we're going to call it
                                                    from interrupts */
 
 
        err = 0;
        sk->sk_no_check = answer_no_check;
        if (INET_PROTOSW_REUSE & answer_flags)
-               sk->sk_reuse = 1;
+               sk->sk_reuse = SK_CAN_REUSE;
 
        inet = inet_sk(sk);
        inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
 
        goto tb_not_found;
 tb_found:
        if (!hlist_empty(&tb->owners)) {
+               if (sk->sk_reuse == SK_FORCE_REUSE)
+                       goto success;
+
                if (tb->fastreuse > 0 &&
                    sk->sk_reuse && sk->sk_state != TCP_LISTEN &&
                    smallest_size == -1) {
 
        err = 0;
        sk->sk_no_check = answer_no_check;
        if (INET_PROTOSW_REUSE & answer_flags)
-               sk->sk_reuse = 1;
+               sk->sk_reuse = SK_CAN_REUSE;
 
        inet = inet_sk(sk);
        inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0;
 
         */
        sk_change_net(sock->sk, net);
        /* it is equivalent to the REUSEADDR option in user-space */
-       sock->sk->sk_reuse = 1;
+       sock->sk->sk_reuse = SK_CAN_REUSE;
 
        result = sock->ops->bind(sock, (struct sockaddr *) &mcast_addr,
                        sizeof(struct sockaddr));
 
        if (ret < 0)
                goto out;
 
-       sock->sk->sk_reuse = 1;
+       sock->sk->sk_reuse = SK_CAN_REUSE;
        rds_tcp_nonagle(sock);
 
        write_lock_bh(&sock->sk->sk_callback_lock);
 
                                        (char *)&val, sizeof(val));
 
        if (type == SOCK_STREAM)
-               sock->sk->sk_reuse = 1;         /* allow address reuse */
+               sock->sk->sk_reuse = SK_CAN_REUSE; /* allow address reuse */
        error = kernel_bind(sock, sin, len);
        if (error < 0)
                goto bummer;