@@ -7,6 +7,7 @@
#include <linux/iomap.h>
#include <linux/fiemap.h>
#include <linux/iversion.h>
+#include <linux/sched/mm.h>
#include "ext4_jbd2.h"
#include "ext4.h"
@@ -525,6 +526,7 @@ static int ext4_convert_inline_data_to_extent(struct address_space *mapping,
struct page *page = NULL;
unsigned from, to;
struct ext4_iloc iloc;
+ int nofs_flags;
if (!ext4_has_inline_data(inode)) {
/*
@@ -551,9 +553,12 @@ static int ext4_convert_inline_data_to_extent(struct address_space *mapping,
/* We cannot recurse into the filesystem as the transaction is already
* started */
- flags |= AOP_FLAG_NOFS;
+ nofs_flags = memalloc_nofs_save();
page = grab_cache_page_write_begin(mapping, 0, flags);
+
+ memalloc_nofs_restore(nofs_flags);
+
if (!page) {
ret = -ENOMEM;
goto out;
@@ -645,6 +650,8 @@ int ext4_try_to_write_inline_data(struct address_space *mapping,
handle_t *handle;
struct page *page;
struct ext4_iloc iloc;
+ unsigned nofs_flags;
+
if (pos + len > ext4_get_max_inline_size(inode))
goto convert;
@@ -675,9 +682,11 @@ int ext4_try_to_write_inline_data(struct address_space *mapping,
goto convert;
}
- flags |= AOP_FLAG_NOFS;
+ nofs_flags = memalloc_nofs_save();
page = grab_cache_page_write_begin(mapping, 0, flags);
+
+ memalloc_nofs_restore(nofs_flags);
if (!page) {
ret = -ENOMEM;
goto out;
@@ -873,17 +882,13 @@ int ext4_da_write_inline_data_begin(struct address_space *mapping,
goto out_journal;
}
- /*
- * We cannot recurse into the filesystem as the transaction
- * is already started.
- */
- flags |= AOP_FLAG_NOFS;
-
if (ret == -ENOSPC) {
+ int nofs_flags = memalloc_nofs_save();
ret = ext4_da_convert_inline_data_to_extent(mapping,
inode,
flags,
fsdata);
+ memalloc_nofs_restore(nofs_flags);
ext4_journal_stop(handle);
if (ret == -ENOSPC &&
ext4_should_retry_alloc(inode->i_sb, &retries))
@@ -8,6 +8,7 @@
#include <linux/fs.h>
#include <linux/quotaops.h>
#include <linux/slab.h>
+#include <linux/sched/mm.h>
#include "ext4_jbd2.h"
#include "ext4.h"
#include "ext4_extents.h"
@@ -127,7 +128,7 @@ mext_page_double_lock(struct inode *inode1, struct inode *inode2,
pgoff_t index1, pgoff_t index2, struct page *page[2])
{
struct address_space *mapping[2];
- unsigned fl = AOP_FLAG_NOFS;
+ unsigned nofs_fl = memalloc_nofs_save();
BUG_ON(!inode1 || !inode2);
if (inode1 < inode2) {
@@ -141,11 +142,14 @@ mext_page_double_lock(struct inode *inode1, struct inode *inode2,
mapping[1] = inode1->i_mapping;
}
- page[0] = grab_cache_page_write_begin(mapping[0], index1, fl);
- if (!page[0])
+ page[0] = grab_cache_page_write_begin(mapping[0], index1, 0);
+ if (!page[0]) {
+ memalloc_nofs_restore(nofs_fl);
return -ENOMEM;
+ }
- page[1] = grab_cache_page_write_begin(mapping[1], index2, fl);
+ page[1] = grab_cache_page_write_begin(mapping[1], index2, 0);
+ memalloc_nofs_restore(nofs_fl);
if (!page[1]) {
unlock_page(page[0]);
put_page(page[0]);