diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2014-10-09 13:19:53 -0700 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2014-11-03 16:07:29 -0800 |
commit | 34ba94bac938be14ffe2a639a4688b81a37d0f58 (patch) | |
tree | b679b836ce5bb3deeb2953e1795bae138c2f3c97 /fs/f2fs/segment.c | |
parent | f4ca536f71ad69d9a974d0156d43b24b3f3112de (diff) | |
download | blackbird-op-linux-34ba94bac938be14ffe2a639a4688b81a37d0f58.tar.gz blackbird-op-linux-34ba94bac938be14ffe2a639a4688b81a37d0f58.zip |
f2fs: do not make dirty any inmemory pages
This patch let inmemory pages be clean all the time.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs/segment.c')
-rw-r--r-- | fs/f2fs/segment.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 923cb76fdc46..9d4a7ab33b06 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -178,7 +178,8 @@ void register_inmem_page(struct inode *inode, struct page *page) { struct f2fs_inode_info *fi = F2FS_I(inode); struct inmem_pages *new; - + int err; +retry: new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS); /* add atomic page indices to the list */ @@ -187,6 +188,16 @@ void register_inmem_page(struct inode *inode, struct page *page) /* increase reference count with clean state */ mutex_lock(&fi->inmem_lock); + err = radix_tree_insert(&fi->inmem_root, page->index, new); + if (err == -EEXIST) { + mutex_unlock(&fi->inmem_lock); + kmem_cache_free(inmem_entry_slab, new); + return; + } else if (err) { + mutex_unlock(&fi->inmem_lock); + kmem_cache_free(inmem_entry_slab, new); + goto retry; + } get_page(page); list_add_tail(&new->list, &fi->inmem_pages); mutex_unlock(&fi->inmem_lock); @@ -216,6 +227,7 @@ void commit_inmem_pages(struct inode *inode, bool abort) do_write_data_page(cur->page, &fio); submit_bio = true; } + radix_tree_delete(&fi->inmem_root, cur->page->index); f2fs_put_page(cur->page, 1); list_del(&cur->list); kmem_cache_free(inmem_entry_slab, cur); |