|
@@ -1318,7 +1318,7 @@ static void o2net_start_connect(void *arg)
|
|
{
|
|
{
|
|
struct o2net_node *nn = arg;
|
|
struct o2net_node *nn = arg;
|
|
struct o2net_sock_container *sc = NULL;
|
|
struct o2net_sock_container *sc = NULL;
|
|
- struct o2nm_node *node = NULL;
|
|
|
|
|
|
+ struct o2nm_node *node = NULL, *mynode = NULL;
|
|
struct socket *sock = NULL;
|
|
struct socket *sock = NULL;
|
|
struct sockaddr_in myaddr = {0, }, remoteaddr = {0, };
|
|
struct sockaddr_in myaddr = {0, }, remoteaddr = {0, };
|
|
int ret = 0;
|
|
int ret = 0;
|
|
@@ -1334,6 +1334,12 @@ static void o2net_start_connect(void *arg)
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ mynode = o2nm_get_node_by_num(o2nm_this_node());
|
|
|
|
+ if (mynode == NULL) {
|
|
|
|
+ ret = 0;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+
|
|
spin_lock(&nn->nn_lock);
|
|
spin_lock(&nn->nn_lock);
|
|
/* see if we already have one pending or have given up */
|
|
/* see if we already have one pending or have given up */
|
|
if (nn->nn_sc || nn->nn_persistent_error)
|
|
if (nn->nn_sc || nn->nn_persistent_error)
|
|
@@ -1361,12 +1367,14 @@ static void o2net_start_connect(void *arg)
|
|
sock->sk->sk_allocation = GFP_ATOMIC;
|
|
sock->sk->sk_allocation = GFP_ATOMIC;
|
|
|
|
|
|
myaddr.sin_family = AF_INET;
|
|
myaddr.sin_family = AF_INET;
|
|
|
|
+ myaddr.sin_addr.s_addr = (__force u32)mynode->nd_ipv4_address;
|
|
myaddr.sin_port = (__force u16)htons(0); /* any port */
|
|
myaddr.sin_port = (__force u16)htons(0); /* any port */
|
|
|
|
|
|
ret = sock->ops->bind(sock, (struct sockaddr *)&myaddr,
|
|
ret = sock->ops->bind(sock, (struct sockaddr *)&myaddr,
|
|
sizeof(myaddr));
|
|
sizeof(myaddr));
|
|
if (ret) {
|
|
if (ret) {
|
|
- mlog(0, "bind failed: %d\n", ret);
|
|
|
|
|
|
+ mlog(ML_ERROR, "bind failed with %d at address %u.%u.%u.%u\n",
|
|
|
|
+ ret, NIPQUAD(mynode->nd_ipv4_address));
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1407,6 +1415,8 @@ out:
|
|
sc_put(sc);
|
|
sc_put(sc);
|
|
if (node)
|
|
if (node)
|
|
o2nm_node_put(node);
|
|
o2nm_node_put(node);
|
|
|
|
+ if (mynode)
|
|
|
|
+ o2nm_node_put(mynode);
|
|
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|