Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06a2f9fa authored by Chris Mason's avatar Chris Mason Committed by David Woodhouse
Browse files

Btrfs: try to drop dead cow pages from ram

parent 28b8bb9e
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -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)
+17 −0
Original line number Original line Diff line number Diff line
@@ -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
			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
	 */
	 */
	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)) {