|
@@ -1220,6 +1220,20 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
|
return blkdev_ioctl(bdev, mode, cmd, arg);
|
|
return blkdev_ioctl(bdev, mode, cmd, arg);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Try to release a page associated with block device when the system
|
|
|
|
+ * is under memory pressure.
|
|
|
|
+ */
|
|
|
|
+static int blkdev_releasepage(struct page *page, gfp_t wait)
|
|
|
|
+{
|
|
|
|
+ struct super_block *super = BDEV_I(page->mapping->host)->bdev.bd_super;
|
|
|
|
+
|
|
|
|
+ if (super && super->s_op->bdev_try_to_free_page)
|
|
|
|
+ return super->s_op->bdev_try_to_free_page(super, page, wait);
|
|
|
|
+
|
|
|
|
+ return try_to_free_buffers(page);
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct address_space_operations def_blk_aops = {
|
|
static const struct address_space_operations def_blk_aops = {
|
|
.readpage = blkdev_readpage,
|
|
.readpage = blkdev_readpage,
|
|
.writepage = blkdev_writepage,
|
|
.writepage = blkdev_writepage,
|
|
@@ -1227,6 +1241,7 @@ static const struct address_space_operations def_blk_aops = {
|
|
.write_begin = blkdev_write_begin,
|
|
.write_begin = blkdev_write_begin,
|
|
.write_end = blkdev_write_end,
|
|
.write_end = blkdev_write_end,
|
|
.writepages = generic_writepages,
|
|
.writepages = generic_writepages,
|
|
|
|
+ .releasepage = blkdev_releasepage,
|
|
.direct_IO = blkdev_direct_IO,
|
|
.direct_IO = blkdev_direct_IO,
|
|
};
|
|
};
|
|
|
|
|