Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
Pull two ceph fixes from Sage Weil: "The first patch fixes a problem when we have a page count of 0 for sendpage which is triggered by zfs. The second fixes a bug in CRUSH that was resolved in the userland code a while back but fell through the cracks on the kernel side" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: crush: decode and initialize chooseleaf_vary_r libceph: fix corruption when using page_count 0 page in rbd
This commit is contained in:
commit
3062556903
|
@ -557,7 +557,7 @@ static int ceph_tcp_sendmsg(struct socket *sock, struct kvec *iov,
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ceph_tcp_sendpage(struct socket *sock, struct page *page,
|
static int __ceph_tcp_sendpage(struct socket *sock, struct page *page,
|
||||||
int offset, size_t size, bool more)
|
int offset, size_t size, bool more)
|
||||||
{
|
{
|
||||||
int flags = MSG_DONTWAIT | MSG_NOSIGNAL | (more ? MSG_MORE : MSG_EOR);
|
int flags = MSG_DONTWAIT | MSG_NOSIGNAL | (more ? MSG_MORE : MSG_EOR);
|
||||||
|
@ -570,6 +570,24 @@ static int ceph_tcp_sendpage(struct socket *sock, struct page *page,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ceph_tcp_sendpage(struct socket *sock, struct page *page,
|
||||||
|
int offset, size_t size, bool more)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct kvec iov;
|
||||||
|
|
||||||
|
/* sendpage cannot properly handle pages with page_count == 0,
|
||||||
|
* we need to fallback to sendmsg if that's the case */
|
||||||
|
if (page_count(page) >= 1)
|
||||||
|
return __ceph_tcp_sendpage(sock, page, offset, size, more);
|
||||||
|
|
||||||
|
iov.iov_base = kmap(page) + offset;
|
||||||
|
iov.iov_len = size;
|
||||||
|
ret = ceph_tcp_sendmsg(sock, &iov, 1, size, more);
|
||||||
|
kunmap(page);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shutdown/close the socket for the given connection.
|
* Shutdown/close the socket for the given connection.
|
||||||
|
|
|
@ -329,6 +329,11 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
|
||||||
dout("crush decode tunable chooseleaf_descend_once = %d",
|
dout("crush decode tunable chooseleaf_descend_once = %d",
|
||||||
c->chooseleaf_descend_once);
|
c->chooseleaf_descend_once);
|
||||||
|
|
||||||
|
ceph_decode_need(p, end, sizeof(u8), done);
|
||||||
|
c->chooseleaf_vary_r = ceph_decode_8(p);
|
||||||
|
dout("crush decode tunable chooseleaf_vary_r = %d",
|
||||||
|
c->chooseleaf_vary_r);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
dout("crush_decode success\n");
|
dout("crush_decode success\n");
|
||||||
return c;
|
return c;
|
||||||
|
|
Loading…
Reference in a new issue