if (rc != 0) goto out_discard; 
int dccp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,		 size_t len){	const struct dccp_sock *dp = dccp_sk(sk);	const int flags = msg->msg_flags;	const int noblock = flags & MSG_DONTWAIT;	struct sk_buff *skb;	int rc, size;	long timeo;	if (len > dp->dccps_mss_cache)		return -EMSGSIZE;	lock_sock(sk);	timeo = sock_sndtimeo(sk, noblock);	/*	 * We have to use sk_stream_wait_connect here to set sk_write_pending,	 * so that the trick in dccp_rcv_request_sent_state_process.	 */	/* Wait for a connection to finish. */	if ((1 << sk->sk_state) & ~(DCCPF_OPEN | DCCPF_PARTOPEN | DCCPF_CLOSING))		if ((rc = sk_stream_wait_connect(sk, &timeo)) != 0)			goto out_release;	size = sk->sk_prot->max_header + len;	release_sock(sk);	skb = sock_alloc_send_skb(sk, size, noblock, &rc);	lock_sock(sk);	if (skb == NULL)		goto out_release;	skb_reserve(skb, sk->sk_prot->max_header);	rc = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);	if (rc != 0)		goto out_discard;	rc = dccp_write_xmit(sk, skb, &timeo);	/*	 * XXX we don't use sk_write_queue, so just discard the packet.	 *     Current plan however is to _use_ sk_write_queue with	 *     an algorith similar to tcp_sendmsg, where the main difference	 *     is that in DCCP we have to respect packet boundaries, so	 *     no coalescing of skbs.	 *	 *     This bug was _quickly_ found & fixed by just looking at an OSTRA	 *     generated callgraph 8) -acme	 */	if (rc != 0)		goto out_discard;out_release:	release_sock(sk);	return rc ? : len;out_discard:	kfree_skb(skb);	goto out_release;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/ffa29347dfbc158d1f47f5925324a6f5713659c1/proto.c/clean/net/dccp/proto.c