diff options
Diffstat (limited to 'net/ceph/messenger.c')
-rw-r--r-- | net/ceph/messenger.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 57fcc6b4bf6e..2f126eff275d 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -580,9 +580,15 @@ static int ceph_tcp_sendpage(struct socket *sock, struct page *page, | |||
580 | struct bio_vec bvec; | 580 | struct bio_vec bvec; |
581 | int ret; | 581 | int ret; |
582 | 582 | ||
583 | /* sendpage cannot properly handle pages with page_count == 0, | 583 | /* |
584 | * we need to fallback to sendmsg if that's the case */ | 584 | * sendpage cannot properly handle pages with page_count == 0, |
585 | if (page_count(page) >= 1) | 585 | * we need to fall back to sendmsg if that's the case. |
586 | * | ||
587 | * Same goes for slab pages: skb_can_coalesce() allows | ||
588 | * coalescing neighboring slab objects into a single frag which | ||
589 | * triggers one of hardened usercopy checks. | ||
590 | */ | ||
591 | if (page_count(page) >= 1 && !PageSlab(page)) | ||
586 | return __ceph_tcp_sendpage(sock, page, offset, size, more); | 592 | return __ceph_tcp_sendpage(sock, page, offset, size, more); |
587 | 593 | ||
588 | bvec.bv_page = page; | 594 | bvec.bv_page = page; |