|
@@ -459,9 +459,9 @@ static void process_sctp_notification(struct connection *con,
|
|
|
int prim_len, ret;
|
|
|
int addr_len;
|
|
|
struct connection *new_con;
|
|
|
- struct file *file;
|
|
|
sctp_peeloff_arg_t parg;
|
|
|
int parglen = sizeof(parg);
|
|
|
+ int err;
|
|
|
|
|
|
/*
|
|
|
* We get this before any data for an association.
|
|
@@ -516,19 +516,22 @@ static void process_sctp_notification(struct connection *con,
|
|
|
ret = kernel_getsockopt(con->sock, IPPROTO_SCTP,
|
|
|
SCTP_SOCKOPT_PEELOFF,
|
|
|
(void *)&parg, &parglen);
|
|
|
- if (ret) {
|
|
|
+ if (ret < 0) {
|
|
|
log_print("Can't peel off a socket for "
|
|
|
- "connection %d to node %d: err=%d\n",
|
|
|
+ "connection %d to node %d: err=%d",
|
|
|
parg.associd, nodeid, ret);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ new_con->sock = sockfd_lookup(parg.sd, &err);
|
|
|
+ if (!new_con->sock) {
|
|
|
+ log_print("sockfd_lookup error %d", err);
|
|
|
+ return;
|
|
|
}
|
|
|
- file = fget(parg.sd);
|
|
|
- new_con->sock = SOCKET_I(file->f_dentry->d_inode);
|
|
|
add_sock(new_con->sock, new_con);
|
|
|
- fput(file);
|
|
|
- put_unused_fd(parg.sd);
|
|
|
+ sockfd_put(new_con->sock);
|
|
|
|
|
|
- log_print("got new/restarted association %d nodeid %d",
|
|
|
- (int)sn->sn_assoc_change.sac_assoc_id, nodeid);
|
|
|
+ log_print("connecting to %d sctp association %d",
|
|
|
+ nodeid, (int)sn->sn_assoc_change.sac_assoc_id);
|
|
|
|
|
|
/* Send any pending writes */
|
|
|
clear_bit(CF_CONNECT_PENDING, &new_con->flags);
|
|
@@ -841,8 +844,6 @@ static void sctp_init_assoc(struct connection *con)
|
|
|
if (con->retries++ > MAX_CONNECT_RETRIES)
|
|
|
return;
|
|
|
|
|
|
- log_print("Initiating association with node %d", con->nodeid);
|
|
|
-
|
|
|
if (nodeid_to_addr(con->nodeid, (struct sockaddr *)&rem_addr)) {
|
|
|
log_print("no address for nodeid %d", con->nodeid);
|
|
|
return;
|