diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2020-03-27 17:38:51 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2020-03-27 18:25:05 -0400 |
commit | aea3934d5464b31cc22075b5490f3ece37d93842 (patch) | |
tree | 818c623e2b1260cbbb243438c76a18c61e11e3f6 | |
parent | 96b991466ac851ea3c7adbd2e30184837573e2a0 (diff) |
bcachefs: Use memalloc_nofs_save()
vmalloc allocations don't always obey GFP_NOFS - memalloc_nofs_save() is
the prefered approach for the future.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/btree_io.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c index b48d48b8c27d..bc586031e9e1 100644 --- a/fs/bcachefs/btree_io.c +++ b/fs/bcachefs/btree_io.c @@ -19,6 +19,7 @@ #include "journal_seq_blacklist.h" #include "super-io.h" +#include <linux/sched/mm.h> #include <trace/events/bcachefs.h> static void verify_no_dups(struct btree *b, @@ -68,17 +69,19 @@ static void btree_bounce_free(struct bch_fs *c, unsigned order, static void *btree_bounce_alloc(struct bch_fs *c, unsigned order, bool *used_mempool) { + unsigned flags = memalloc_nofs_save(); void *p; BUG_ON(order > btree_page_order(c)); *used_mempool = false; p = (void *) __get_free_pages(__GFP_NOWARN|GFP_NOWAIT, order); - if (p) - return p; - - *used_mempool = true; - return mempool_alloc(&c->btree_bounce_pool, GFP_NOIO); + if (!p) { + *used_mempool = true; + p = mempool_alloc(&c->btree_bounce_pool, GFP_NOIO); + } + memalloc_nofs_restore(flags); + return p; } static void sort_bkey_ptrs(const struct btree *bt, |