diff options
Diffstat (limited to 'net/sctp/socket.c')
| -rw-r--r-- | net/sctp/socket.c | 60 | 
1 files changed, 36 insertions, 24 deletions
| diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 8d760863bc41..d4730ada7f32 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -100,8 +100,9 @@ static int sctp_send_asconf(struct sctp_association *asoc,  			    struct sctp_chunk *chunk);  static int sctp_do_bind(struct sock *, union sctp_addr *, int);  static int sctp_autobind(struct sock *sk); -static void sctp_sock_migrate(struct sock *, struct sock *, -			      struct sctp_association *, sctp_socket_type_t); +static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, +			      struct sctp_association *assoc, +			      enum sctp_socket_type type);  static unsigned long sctp_memory_pressure;  static atomic_long_t sctp_memory_allocated; @@ -1055,7 +1056,7 @@ static int __sctp_connect(struct sock *sk,  	struct sctp_association *asoc2;  	struct sctp_transport *transport;  	union sctp_addr to; -	sctp_scope_t scope; +	enum sctp_scope scope;  	long timeo;  	int err = 0;  	int addrcnt = 0; @@ -1593,7 +1594,8 @@ static int sctp_error(struct sock *sk, int flags, int err)   */  /* BUG:  We do not implement the equivalent of sk_stream_wait_memory(). */ -static int sctp_msghdr_parse(const struct msghdr *, sctp_cmsgs_t *); +static int sctp_msghdr_parse(const struct msghdr *msg, +			     struct sctp_cmsgs *cmsgs);  static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len)  { @@ -1609,8 +1611,8 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len)  	struct sctp_sndrcvinfo *sinfo;  	struct sctp_initmsg *sinit;  	sctp_assoc_t associd = 0; -	sctp_cmsgs_t cmsgs = { NULL }; -	sctp_scope_t scope; +	struct sctp_cmsgs cmsgs = { NULL }; +	enum sctp_scope scope;  	bool fill_sinfo_ttl = false, wait_connect = false;  	struct sctp_datamsg *datamsg;  	int msg_flags = msg->msg_flags; @@ -4656,29 +4658,39 @@ int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *),  EXPORT_SYMBOL_GPL(sctp_transport_lookup_process);  int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *), -			    struct net *net, int pos, void *p) { +			    int (*cb_done)(struct sctp_transport *, void *), +			    struct net *net, int *pos, void *p) {  	struct rhashtable_iter hti; -	void *obj; -	int err; - -	err = sctp_transport_walk_start(&hti); -	if (err) -		return err; +	struct sctp_transport *tsp; +	int ret; -	obj = sctp_transport_get_idx(net, &hti, pos + 1); -	for (; !IS_ERR_OR_NULL(obj); obj = sctp_transport_get_next(net, &hti)) { -		struct sctp_transport *transport = obj; +again: +	ret = sctp_transport_walk_start(&hti); +	if (ret) +		return ret; -		if (!sctp_transport_hold(transport)) +	tsp = sctp_transport_get_idx(net, &hti, *pos + 1); +	for (; !IS_ERR_OR_NULL(tsp); tsp = sctp_transport_get_next(net, &hti)) { +		if (!sctp_transport_hold(tsp))  			continue; -		err = cb(transport, p); -		sctp_transport_put(transport); -		if (err) +		ret = cb(tsp, p); +		if (ret)  			break; +		(*pos)++; +		sctp_transport_put(tsp);  	}  	sctp_transport_walk_stop(&hti); -	return err; +	if (ret) { +		if (cb_done && !cb_done(tsp, p)) { +			(*pos)++; +			sctp_transport_put(tsp); +			goto again; +		} +		sctp_transport_put(tsp); +	} + +	return ret;  }  EXPORT_SYMBOL_GPL(sctp_for_each_transport); @@ -7444,10 +7456,10 @@ static int sctp_autobind(struct sock *sk)   * msg_control   * points here   */ -static int sctp_msghdr_parse(const struct msghdr *msg, sctp_cmsgs_t *cmsgs) +static int sctp_msghdr_parse(const struct msghdr *msg, struct sctp_cmsgs *cmsgs)  { -	struct cmsghdr *cmsg;  	struct msghdr *my_msg = (struct msghdr *)msg; +	struct cmsghdr *cmsg;  	for_each_cmsghdr(cmsg, my_msg) {  		if (!CMSG_OK(my_msg, cmsg)) @@ -8084,7 +8096,7 @@ static inline void sctp_copy_descendant(struct sock *sk_to,   */  static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,  			      struct sctp_association *assoc, -			      sctp_socket_type_t type) +			      enum sctp_socket_type type)  {  	struct sctp_sock *oldsp = sctp_sk(oldsk);  	struct sctp_sock *newsp = sctp_sk(newsk); |