提交 06a2f9fa 编写于 作者: C Chris Mason 提交者: David Woodhouse

Btrfs: try to drop dead cow pages from ram

Signed-off-by: NChris Mason <chris.mason@oracle.com>
上级 28b8bb9e
...@@ -6,8 +6,7 @@ ...@@ -6,8 +6,7 @@
* Check compat and incompat flags on the inode * Check compat and incompat flags on the inode
* Get rid of struct ctree_path, limiting tree levels held at one time * Get rid of struct ctree_path, limiting tree levels held at one time
* Add generation number to key pointer in nodes * Add generation number to key pointer in nodes
* Add parent pointer back to extent map. * Add generation number to inode
* Implement real list of pending transactions
* Release * Release
* Do real tree locking * Do real tree locking
* Add extent mirroring (backup copies of blocks) * Add extent mirroring (backup copies of blocks)
......
...@@ -291,10 +291,18 @@ static int update_block_group(struct btrfs_trans_handle *trans, ...@@ -291,10 +291,18 @@ static int update_block_group(struct btrfs_trans_handle *trans,
return 0; return 0;
} }
static int try_remove_page(struct address_space *mapping, unsigned long index)
{
int ret;
ret = invalidate_mapping_pages(mapping, index, index);
return ret;
}
int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct
btrfs_root *root) btrfs_root *root)
{ {
unsigned long gang[8]; unsigned long gang[8];
struct inode *btree_inode = root->fs_info->btree_inode;
u64 first = 0; u64 first = 0;
int ret; int ret;
int i; int i;
...@@ -309,6 +317,9 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct ...@@ -309,6 +317,9 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, struct
first = gang[0]; first = gang[0];
for (i = 0; i < ret; i++) { for (i = 0; i < ret; i++) {
clear_radix_bit(pinned_radix, gang[i]); clear_radix_bit(pinned_radix, gang[i]);
try_remove_page(btree_inode->i_mapping,
gang[i] << (PAGE_CACHE_SHIFT -
btree_inode->i_blkbits));
} }
} }
if (root->fs_info->block_group_cache) { if (root->fs_info->block_group_cache) {
...@@ -600,6 +611,12 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root ...@@ -600,6 +611,12 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
*/ */
btrfs_release_path(root, path); btrfs_release_path(root, path);
BUG_ON(ins->objectid < search_start); BUG_ON(ins->objectid < search_start);
if (ins->objectid >= btrfs_super_total_blocks(info->disk_super)) {
if (search_start == 0)
return -ENOSPC;
search_start = 0;
goto check_failed;
}
for (test_block = ins->objectid; for (test_block = ins->objectid;
test_block < ins->objectid + num_blocks; test_block++) { test_block < ins->objectid + num_blocks; test_block++) {
if (test_radix_bit(&info->pinned_radix, test_block)) { if (test_radix_bit(&info->pinned_radix, test_block)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册