static int unix_read_sock(struct sock *sk, read_descriptor_t *desc,
			  sk_read_actor_t recv_actor)
{
	int copied = 0;

	while (1) {
		struct unix_sock *u = unix_sk(sk);
		struct sk_buff *skb;
		int used, err;

		mutex_lock(&u->iolock);
		skb = skb_recv_datagram(sk, 0, 1, &err);
		mutex_unlock(&u->iolock);
		if (!skb)
			return err;

		used = recv_actor(desc, skb, 0, skb->len);
		if (used <= 0) {
			if (!copied)
				copied = used;
			kfree_skb(skb);
			break;
		} else if (used <= skb->len) {
			copied += used;
		}

		kfree_skb(skb);
		if (!desc->count)
			break;
	}

	return copied;
}
static int unix_read_sock(struct sock *sk, read_descriptor_t *desc,
			  sk_read_actor_t recv_actor)
{
	int copied = 0;

	while (1) {
		struct unix_sock *u = unix_sk(sk);
		struct sk_buff *skb;
		int used, err;

		mutex_lock(&u->iolock);
		skb = skb_recv_datagram(sk, 0, 1, &err);
		mutex_unlock(&u->iolock);
		if (!skb)
			return err;

		used = recv_actor(desc, skb, 0, skb->len);
		if (used <= 0) {
			if (!copied)
				copied = used;
			kfree_skb(skb);
			break;
		} else if (used <= skb->len) {
			copied += used;
		}

		kfree_skb(skb);
		if (!desc->count)
			break;
	}

	return copied;
}