|
|
@@ -17,6 +17,7 @@
|
|
|
#include <linux/semaphore.h>
|
|
|
#include <linux/error-injection.h>
|
|
|
#include <linux/crc32c.h>
|
|
|
+#include <linux/sched/mm.h>
|
|
|
#include <asm/unaligned.h>
|
|
|
#include "ctree.h"
|
|
|
#include "disk-io.h"
|
|
|
@@ -1236,10 +1237,17 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans,
|
|
|
struct btrfs_root *tree_root = fs_info->tree_root;
|
|
|
struct btrfs_root *root;
|
|
|
struct btrfs_key key;
|
|
|
+ unsigned int nofs_flag;
|
|
|
int ret = 0;
|
|
|
uuid_le uuid = NULL_UUID_LE;
|
|
|
|
|
|
+ /*
|
|
|
+ * We're holding a transaction handle, so use a NOFS memory allocation
|
|
|
+ * context to avoid deadlock if reclaim happens.
|
|
|
+ */
|
|
|
+ nofs_flag = memalloc_nofs_save();
|
|
|
root = btrfs_alloc_root(fs_info, GFP_KERNEL);
|
|
|
+ memalloc_nofs_restore(nofs_flag);
|
|
|
if (!root)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|