return nbufs;
 }
 
+static int io_net_kbuf_recyle(struct io_kiocb *req,
+                             struct io_async_msghdr *kmsg, int len)
+{
+       req->flags |= REQ_F_BL_NO_RECYCLE;
+       if (req->flags & REQ_F_BUFFERS_COMMIT)
+               io_kbuf_commit(req, req->buf_list, len, io_bundle_nbufs(kmsg, len));
+       return IOU_RETRY;
+}
+
 static inline bool io_send_finish(struct io_kiocb *req, int *ret,
                                  struct io_async_msghdr *kmsg,
                                  unsigned issue_flags)
                        kmsg->msg.msg_controllen = 0;
                        kmsg->msg.msg_control = NULL;
                        sr->done_io += ret;
-                       req->flags |= REQ_F_BL_NO_RECYCLE;
-                       return -EAGAIN;
+                       return io_net_kbuf_recyle(req, kmsg, ret);
                }
                if (ret == -ERESTARTSYS)
                        ret = -EINTR;
                        sr->len -= ret;
                        sr->buf += ret;
                        sr->done_io += ret;
-                       req->flags |= REQ_F_BL_NO_RECYCLE;
-                       return -EAGAIN;
+                       return io_net_kbuf_recyle(req, kmsg, ret);
                }
                if (ret == -ERESTARTSYS)
                        ret = -EINTR;
                }
                if (ret > 0 && io_net_retry(sock, flags)) {
                        sr->done_io += ret;
-                       req->flags |= REQ_F_BL_NO_RECYCLE;
-                       return IOU_RETRY;
+                       return io_net_kbuf_recyle(req, kmsg, ret);
                }
                if (ret == -ERESTARTSYS)
                        ret = -EINTR;
                        sr->len -= ret;
                        sr->buf += ret;
                        sr->done_io += ret;
-                       req->flags |= REQ_F_BL_NO_RECYCLE;
-                       return -EAGAIN;
+                       return io_net_kbuf_recyle(req, kmsg, ret);
                }
                if (ret == -ERESTARTSYS)
                        ret = -EINTR;
                        zc->len -= ret;
                        zc->buf += ret;
                        zc->done_io += ret;
-                       req->flags |= REQ_F_BL_NO_RECYCLE;
-                       return -EAGAIN;
+                       return io_net_kbuf_recyle(req, kmsg, ret);
                }
                if (ret == -ERESTARTSYS)
                        ret = -EINTR;
 
                if (ret > 0 && io_net_retry(sock, flags)) {
                        sr->done_io += ret;
-                       req->flags |= REQ_F_BL_NO_RECYCLE;
-                       return -EAGAIN;
+                       return io_net_kbuf_recyle(req, kmsg, ret);
                }
                if (ret == -ERESTARTSYS)
                        ret = -EINTR;