]> git.ipfire.org Git - people/ms/linux.git/blobdiff - net/bluetooth/rfcomm/sock.c
Bluetooth: RFCOMM: Replace use of memcpy_from_msg with bt_skb_sendmmsg
[people/ms/linux.git] / net / bluetooth / rfcomm / sock.c
index 2c95bb58f901a5c429a345441618a38e56e86467..5938af3e9936e063db5618806828b7546efdf678 100644 (file)
@@ -575,46 +575,20 @@ static int rfcomm_sock_sendmsg(struct socket *sock, struct msghdr *msg,
        lock_sock(sk);
 
        sent = bt_sock_wait_ready(sk, msg->msg_flags);
-       if (sent)
-               goto done;
-
-       while (len) {
-               size_t size = min_t(size_t, len, d->mtu);
-               int err;
-
-               skb = sock_alloc_send_skb(sk, size + RFCOMM_SKB_RESERVE,
-                               msg->msg_flags & MSG_DONTWAIT, &err);
-               if (!skb) {
-                       if (sent == 0)
-                               sent = err;
-                       break;
-               }
-               skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
-
-               err = memcpy_from_msg(skb_put(skb, size), msg, size);
-               if (err) {
-                       kfree_skb(skb);
-                       if (sent == 0)
-                               sent = err;
-                       break;
-               }
 
-               skb->priority = sk->sk_priority;
+       release_sock(sk);
 
-               err = rfcomm_dlc_send(d, skb);
-               if (err < 0) {
-                       kfree_skb(skb);
-                       if (sent == 0)
-                               sent = err;
-                       break;
-               }
+       if (sent)
+               return sent;
 
-               sent += size;
-               len  -= size;
-       }
+       skb = bt_skb_sendmmsg(sk, msg, len, d->mtu, RFCOMM_SKB_HEAD_RESERVE,
+                             RFCOMM_SKB_TAIL_RESERVE);
+       if (IS_ERR_OR_NULL(skb))
+               return PTR_ERR(skb);
 
-done:
-       release_sock(sk);
+       sent = rfcomm_dlc_send(d, skb);
+       if (sent < 0)
+               kfree_skb(skb);
 
        return sent;
 }