|
@@ -8534,15 +8534,28 @@ int btrfs_readpage(struct file *file, struct page *page)
|
|
|
static int btrfs_writepage(struct page *page, struct writeback_control *wbc)
|
|
|
{
|
|
|
struct extent_io_tree *tree;
|
|
|
-
|
|
|
+ struct inode *inode = page->mapping->host;
|
|
|
+ int ret;
|
|
|
|
|
|
if (current->flags & PF_MEMALLOC) {
|
|
|
redirty_page_for_writepage(wbc, page);
|
|
|
unlock_page(page);
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If we are under memory pressure we will call this directly from the
|
|
|
+ * VM, we need to make sure we have the inode referenced for the ordered
|
|
|
+ * extent. If not just return like we didn't do anything.
|
|
|
+ */
|
|
|
+ if (!igrab(inode)) {
|
|
|
+ redirty_page_for_writepage(wbc, page);
|
|
|
+ return AOP_WRITEPAGE_ACTIVATE;
|
|
|
+ }
|
|
|
tree = &BTRFS_I(page->mapping->host)->io_tree;
|
|
|
- return extent_write_full_page(tree, page, btrfs_get_extent, wbc);
|
|
|
+ ret = extent_write_full_page(tree, page, btrfs_get_extent, wbc);
|
|
|
+ btrfs_add_delayed_iput(inode);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static int btrfs_writepages(struct address_space *mapping,
|