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
This commit is contained in:
Коммит
277f850fbc
21
fs/aio.c
21
fs/aio.c
|
@ -165,6 +165,15 @@ static struct vfsmount *aio_mnt;
|
|||
static const struct file_operations aio_ring_fops;
|
||||
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)
|
||||
{
|
||||
struct qstr this = QSTR_INIT("[aio]", 5);
|
||||
|
@ -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->private_data = ctx;
|
||||
inode->i_mapping->backing_dev_info = &aio_fs_backing_dev_info;
|
||||
inode->i_size = PAGE_SIZE * nr_pages;
|
||||
|
||||
path.dentry = d_alloc_pseudo(aio_mnt->mnt_sb, &this);
|
||||
|
@ -220,6 +230,9 @@ static int __init aio_setup(void)
|
|||
if (IS_ERR(aio_mnt))
|
||||
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);
|
||||
kioctx_cachep = KMEM_CACHE(kioctx,SLAB_HWCACHE_ALIGN|SLAB_PANIC);
|
||||
|
||||
|
@ -281,11 +294,6 @@ static const struct file_operations aio_ring_fops = {
|
|||
.mmap = aio_ring_mmap,
|
||||
};
|
||||
|
||||
static int aio_set_page_dirty(struct page *page)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_MIGRATION)
|
||||
static int aio_migratepage(struct address_space *mapping, struct page *new,
|
||||
struct page *old, enum migrate_mode mode)
|
||||
|
@ -357,7 +365,7 @@ out:
|
|||
#endif
|
||||
|
||||
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)
|
||||
.migratepage = aio_migratepage,
|
||||
#endif
|
||||
|
@ -412,7 +420,6 @@ static int aio_setup_ring(struct kioctx *ctx)
|
|||
pr_debug("pid(%d) page[%d]->count=%d\n",
|
||||
current->pid, i, page_count(page));
|
||||
SetPageUptodate(page);
|
||||
SetPageDirty(page);
|
||||
unlock_page(page);
|
||||
|
||||
ctx->ring_pages[i] = page;
|
||||
|
|
Загрузка…
Ссылка в новой задаче