|
@@ -86,7 +86,11 @@ int __logfs_buf_write(struct logfs_area *area, u64 ofs, void *buf, size_t len,
|
|
|
BUG_ON(!page); /* FIXME: reserve a pool */
|
|
|
SetPageUptodate(page);
|
|
|
memcpy(page_address(page) + offset, buf, copylen);
|
|
|
- SetPagePrivate(page);
|
|
|
+
|
|
|
+ if (!PagePrivate(page)) {
|
|
|
+ SetPagePrivate(page);
|
|
|
+ page_cache_get(page);
|
|
|
+ }
|
|
|
page_cache_release(page);
|
|
|
|
|
|
buf += copylen;
|
|
@@ -110,7 +114,10 @@ static void pad_partial_page(struct logfs_area *area)
|
|
|
page = get_mapping_page(sb, index, 0);
|
|
|
BUG_ON(!page); /* FIXME: reserve a pool */
|
|
|
memset(page_address(page) + offset, 0xff, len);
|
|
|
- SetPagePrivate(page);
|
|
|
+ if (!PagePrivate(page)) {
|
|
|
+ SetPagePrivate(page);
|
|
|
+ page_cache_get(page);
|
|
|
+ }
|
|
|
page_cache_release(page);
|
|
|
}
|
|
|
}
|
|
@@ -130,7 +137,10 @@ static void pad_full_pages(struct logfs_area *area)
|
|
|
BUG_ON(!page); /* FIXME: reserve a pool */
|
|
|
SetPageUptodate(page);
|
|
|
memset(page_address(page), 0xff, PAGE_CACHE_SIZE);
|
|
|
- SetPagePrivate(page);
|
|
|
+ if (!PagePrivate(page)) {
|
|
|
+ SetPagePrivate(page);
|
|
|
+ page_cache_get(page);
|
|
|
+ }
|
|
|
page_cache_release(page);
|
|
|
index++;
|
|
|
no_indizes--;
|
|
@@ -485,8 +495,12 @@ static void move_btree_to_page(struct inode *inode, struct page *page,
|
|
|
mempool_free(item, super->s_alias_pool);
|
|
|
}
|
|
|
block->page = page;
|
|
|
- SetPagePrivate(page);
|
|
|
- page->private = (unsigned long)block;
|
|
|
+
|
|
|
+ if (!PagePrivate(page)) {
|
|
|
+ SetPagePrivate(page);
|
|
|
+ page_cache_get(page);
|
|
|
+ set_page_private(page, (unsigned long) block);
|
|
|
+ }
|
|
|
block->ops = &indirect_block_ops;
|
|
|
initialize_block_counters(page, block, data, 0);
|
|
|
}
|
|
@@ -536,8 +550,12 @@ void move_page_to_btree(struct page *page)
|
|
|
list_add(&item->list, &block->item_list);
|
|
|
}
|
|
|
block->page = NULL;
|
|
|
- ClearPagePrivate(page);
|
|
|
- page->private = 0;
|
|
|
+
|
|
|
+ if (PagePrivate(page)) {
|
|
|
+ ClearPagePrivate(page);
|
|
|
+ page_cache_release(page);
|
|
|
+ set_page_private(page, 0);
|
|
|
+ }
|
|
|
block->ops = &btree_block_ops;
|
|
|
err = alias_tree_insert(block->sb, block->ino, block->bix, block->level,
|
|
|
block);
|
|
@@ -702,7 +720,10 @@ void freeseg(struct super_block *sb, u32 segno)
|
|
|
page = find_get_page(mapping, ofs >> PAGE_SHIFT);
|
|
|
if (!page)
|
|
|
continue;
|
|
|
- ClearPagePrivate(page);
|
|
|
+ if (PagePrivate(page)) {
|
|
|
+ ClearPagePrivate(page);
|
|
|
+ page_cache_release(page);
|
|
|
+ }
|
|
|
page_cache_release(page);
|
|
|
}
|
|
|
}
|