|
@@ -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);
|