diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-03-24 17:35:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-03-24 17:35:39 -0400 |
commit | 59d9cb91d07236b5255a3b1999f6f2d9985b3657 (patch) | |
tree | df5d56796d70c53cef1752e9ebd397f4fe4a92ed | |
parent | 2056b7c7df94d9c3e81bcee7430fe2417158e455 (diff) | |
parent | 633ee407b9d15a75ac9740ba9d3338815e1fcb95 (diff) |
Merge tag 'ceph-for-4.11-rc4' of git://github.com/ceph/ceph-client
Pull ceph fix from Ilya Dryomov:
"A fix for a writeback deadlock caused by a GFP_KERNEL allocation on
the reclaim path, tagged for stable"
* tag 'ceph-for-4.11-rc4' of git://github.com/ceph/ceph-client:
libceph: force GFP_NOIO for socket allocations
-rw-r--r-- | net/ceph/messenger.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 38dcf1eb427d..f76bb3332613 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/kthread.h> | 7 | #include <linux/kthread.h> |
8 | #include <linux/net.h> | 8 | #include <linux/net.h> |
9 | #include <linux/nsproxy.h> | 9 | #include <linux/nsproxy.h> |
10 | #include <linux/sched/mm.h> | ||
10 | #include <linux/slab.h> | 11 | #include <linux/slab.h> |
11 | #include <linux/socket.h> | 12 | #include <linux/socket.h> |
12 | #include <linux/string.h> | 13 | #include <linux/string.h> |
@@ -469,11 +470,16 @@ static int ceph_tcp_connect(struct ceph_connection *con) | |||
469 | { | 470 | { |
470 | struct sockaddr_storage *paddr = &con->peer_addr.in_addr; | 471 | struct sockaddr_storage *paddr = &con->peer_addr.in_addr; |
471 | struct socket *sock; | 472 | struct socket *sock; |
473 | unsigned int noio_flag; | ||
472 | int ret; | 474 | int ret; |
473 | 475 | ||
474 | BUG_ON(con->sock); | 476 | BUG_ON(con->sock); |
477 | |||
478 | /* sock_create_kern() allocates with GFP_KERNEL */ | ||
479 | noio_flag = memalloc_noio_save(); | ||
475 | ret = sock_create_kern(read_pnet(&con->msgr->net), paddr->ss_family, | 480 | ret = sock_create_kern(read_pnet(&con->msgr->net), paddr->ss_family, |
476 | SOCK_STREAM, IPPROTO_TCP, &sock); | 481 | SOCK_STREAM, IPPROTO_TCP, &sock); |
482 | memalloc_noio_restore(noio_flag); | ||
477 | if (ret) | 483 | if (ret) |
478 | return ret; | 484 | return ret; |
479 | sock->sk->sk_allocation = GFP_NOFS; | 485 | sock->sk->sk_allocation = GFP_NOFS; |