Commit 277f850f authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kvack.org/~bcrl/aio-fixes

Pull aio fix from Ben LaHaise:
 "Dirty page accounting fix for aio"

* git://git.kvack.org/~bcrl/aio-fixes:
  aio: fix uncorrent dirty pages accouting when truncating AIO ring buffer
parents d1ca0007 835f252c
...@@ -165,6 +165,15 @@ static struct vfsmount *aio_mnt; ...@@ -165,6 +165,15 @@ static struct vfsmount *aio_mnt;
static const struct file_operations aio_ring_fops; static const struct file_operations aio_ring_fops;
static const struct address_space_operations aio_ctx_aops; static const struct address_space_operations aio_ctx_aops;
/* Backing dev info for aio fs.
* -no dirty page accounting or writeback happens
*/
static struct backing_dev_info aio_fs_backing_dev_info = {
.name = "aiofs",
.state = 0,
.capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK | BDI_CAP_MAP_COPY,
};
static struct file *aio_private_file(struct kioctx *ctx, loff_t nr_pages) static struct file *aio_private_file(struct kioctx *ctx, loff_t nr_pages)
{ {
struct qstr this = QSTR_INIT("[aio]", 5); struct qstr this = QSTR_INIT("[aio]", 5);
...@@ -176,6 +185,7 @@ static struct file *aio_private_file(struct kioctx *ctx, loff_t nr_pages) ...@@ -176,6 +185,7 @@ static struct file *aio_private_file(struct kioctx *ctx, loff_t nr_pages)
inode->i_mapping->a_ops = &aio_ctx_aops; inode->i_mapping->a_ops = &aio_ctx_aops;
inode->i_mapping->private_data = ctx; inode->i_mapping->private_data = ctx;
inode->i_mapping->backing_dev_info = &aio_fs_backing_dev_info;
inode->i_size = PAGE_SIZE * nr_pages; inode->i_size = PAGE_SIZE * nr_pages;
path.dentry = d_alloc_pseudo(aio_mnt->mnt_sb, &this); path.dentry = d_alloc_pseudo(aio_mnt->mnt_sb, &this);
...@@ -220,6 +230,9 @@ static int __init aio_setup(void) ...@@ -220,6 +230,9 @@ static int __init aio_setup(void)
if (IS_ERR(aio_mnt)) if (IS_ERR(aio_mnt))
panic("Failed to create aio fs mount."); panic("Failed to create aio fs mount.");
if (bdi_init(&aio_fs_backing_dev_info))
panic("Failed to init aio fs backing dev info.");
kiocb_cachep = KMEM_CACHE(kiocb, SLAB_HWCACHE_ALIGN|SLAB_PANIC); kiocb_cachep = KMEM_CACHE(kiocb, SLAB_HWCACHE_ALIGN|SLAB_PANIC);
kioctx_cachep = KMEM_CACHE(kioctx,SLAB_HWCACHE_ALIGN|SLAB_PANIC); kioctx_cachep = KMEM_CACHE(kioctx,SLAB_HWCACHE_ALIGN|SLAB_PANIC);
...@@ -281,11 +294,6 @@ static const struct file_operations aio_ring_fops = { ...@@ -281,11 +294,6 @@ static const struct file_operations aio_ring_fops = {
.mmap = aio_ring_mmap, .mmap = aio_ring_mmap,
}; };
static int aio_set_page_dirty(struct page *page)
{
return 0;
}
#if IS_ENABLED(CONFIG_MIGRATION) #if IS_ENABLED(CONFIG_MIGRATION)
static int aio_migratepage(struct address_space *mapping, struct page *new, static int aio_migratepage(struct address_space *mapping, struct page *new,
struct page *old, enum migrate_mode mode) struct page *old, enum migrate_mode mode)
...@@ -357,7 +365,7 @@ static int aio_migratepage(struct address_space *mapping, struct page *new, ...@@ -357,7 +365,7 @@ static int aio_migratepage(struct address_space *mapping, struct page *new,
#endif #endif
static const struct address_space_operations aio_ctx_aops = { static const struct address_space_operations aio_ctx_aops = {
.set_page_dirty = aio_set_page_dirty, .set_page_dirty = __set_page_dirty_no_writeback,
#if IS_ENABLED(CONFIG_MIGRATION) #if IS_ENABLED(CONFIG_MIGRATION)
.migratepage = aio_migratepage, .migratepage = aio_migratepage,
#endif #endif
...@@ -412,7 +420,6 @@ static int aio_setup_ring(struct kioctx *ctx) ...@@ -412,7 +420,6 @@ static int aio_setup_ring(struct kioctx *ctx)
pr_debug("pid(%d) page[%d]->count=%d\n", pr_debug("pid(%d) page[%d]->count=%d\n",
current->pid, i, page_count(page)); current->pid, i, page_count(page));
SetPageUptodate(page); SetPageUptodate(page);
SetPageDirty(page);
unlock_page(page); unlock_page(page);
ctx->ring_pages[i] = page; ctx->ring_pages[i] = page;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment