ceph: switch to sock_recvmsg()
... and use ITER_BVEC instead of playing with kmap() Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
3995d16107
Коммит
100803a84d
|
@ -520,7 +520,8 @@ static int ceph_tcp_recvmsg(struct socket *sock, void *buf, size_t len)
|
|||
struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL };
|
||||
int r;
|
||||
|
||||
r = kernel_recvmsg(sock, &msg, &iov, 1, len, msg.msg_flags);
|
||||
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, len);
|
||||
r = sock_recvmsg(sock, &msg, msg.msg_flags);
|
||||
if (r == -EAGAIN)
|
||||
r = 0;
|
||||
return r;
|
||||
|
@ -529,17 +530,20 @@ static int ceph_tcp_recvmsg(struct socket *sock, void *buf, size_t len)
|
|||
static int ceph_tcp_recvpage(struct socket *sock, struct page *page,
|
||||
int page_offset, size_t length)
|
||||
{
|
||||
void *kaddr;
|
||||
int ret;
|
||||
struct bio_vec bvec = {
|
||||
.bv_page = page,
|
||||
.bv_offset = page_offset,
|
||||
.bv_len = length
|
||||
};
|
||||
struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL };
|
||||
int r;
|
||||
|
||||
BUG_ON(page_offset + length > PAGE_SIZE);
|
||||
|
||||
kaddr = kmap(page);
|
||||
BUG_ON(!kaddr);
|
||||
ret = ceph_tcp_recvmsg(sock, kaddr + page_offset, length);
|
||||
kunmap(page);
|
||||
|
||||
return ret;
|
||||
iov_iter_bvec(&msg.msg_iter, READ | ITER_BVEC, &bvec, 1, length);
|
||||
r = sock_recvmsg(sock, &msg, msg.msg_flags);
|
||||
if (r == -EAGAIN)
|
||||
r = 0;
|
||||
return r;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче