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

Commit b0c68f8b authored by Chris Mason's avatar Chris Mason
Browse files

Btrfs: Enable delalloc accounting

parent 0181e58f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -861,6 +861,10 @@ int close_ctree(struct btrfs_root *root)
	write_ctree_super(NULL, root);
	mutex_unlock(&fs_info->fs_mutex);

	if (fs_info->delalloc_bytes) {
		printk("btrfs: at unmount delalloc count %Lu\n",
		       fs_info->delalloc_bytes);
	}
	if (fs_info->extent_root->node)
		free_extent_buffer(fs_info->extent_root->node);

+7 −7
Original line number Diff line number Diff line
@@ -262,7 +262,7 @@ static void set_state_cb(struct extent_io_tree *tree,
{
	if (tree->ops && tree->ops->set_bit_hook) {
		tree->ops->set_bit_hook(tree->mapping->host, state->start,
					state->end, bits);
					state->end, state->state, bits);
	}
}

@@ -272,7 +272,7 @@ static void clear_state_cb(struct extent_io_tree *tree,
{
	if (tree->ops && tree->ops->set_bit_hook) {
		tree->ops->clear_bit_hook(tree->mapping->host, state->start,
					  state->end, bits);
					  state->end, state->state, bits);
	}
}

@@ -298,10 +298,10 @@ static int insert_state(struct extent_io_tree *tree,
	}
	if (bits & EXTENT_DIRTY)
		tree->dirty_bytes += end - start + 1;
	set_state_cb(tree, state, bits);
	state->state |= bits;
	state->start = start;
	state->end = end;
	set_state_cb(tree, state, bits);
	node = tree_insert(&tree->state, end, &state->rb_node);
	if (node) {
		struct extent_state *found;
@@ -369,8 +369,8 @@ static int clear_state_bit(struct extent_io_tree *tree,
		WARN_ON(range > tree->dirty_bytes);
		tree->dirty_bytes -= range;
	}
	state->state &= ~bits;
	clear_state_cb(tree, state, bits);
	state->state &= ~bits;
	if (wake)
		wake_up(&state->wq);
	if (delete || state->state == 0) {
@@ -574,8 +574,8 @@ static void set_state_bits(struct extent_io_tree *tree,
		u64 range = state->end - state->start + 1;
		tree->dirty_bytes += range;
	}
	state->state |= bits;
	set_state_cb(tree, state, bits);
	state->state |= bits;
}

/*
@@ -997,8 +997,8 @@ u64 find_lock_delalloc_range(struct extent_io_tree *tree,
			free_extent_state(state);
			goto search_again;
		}
		state->state |= EXTENT_LOCKED;
		set_state_cb(tree, state, EXTENT_LOCKED);
		state->state |= EXTENT_LOCKED;
		if (!found)
			*start = state->start;
		found++;
@@ -1497,8 +1497,8 @@ static int end_bio_extent_readpage(struct bio *bio,
			} else {
				state = NULL;
			}
			clear->state |= EXTENT_UPTODATE;
			set_state_cb(tree, clear, EXTENT_UPTODATE);
			clear->state |= EXTENT_UPTODATE;
			clear_state_bit(tree, clear, EXTENT_LOCKED,
					1, 0);
			if (cur == start)
+2 −2
Original line number Diff line number Diff line
@@ -34,9 +34,9 @@ struct extent_io_ops {
	void (*writepage_end_io_hook)(struct page *page, u64 start, u64 end,
				      struct extent_state *state);
	int (*set_bit_hook)(struct inode *inode, u64 start, u64 end,
			    unsigned long bits);
			    unsigned long old, unsigned long bits);
	int (*clear_bit_hook)(struct inode *inode, u64 start, u64 end,
			    unsigned long bits);
			    unsigned long old, unsigned long bits);
};

struct extent_io_tree {
+13 −5
Original line number Diff line number Diff line
@@ -260,9 +260,9 @@ static int run_delalloc_range(struct inode *inode, u64 start, u64 end)
}

int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end,
		       unsigned long bits)
		       unsigned long old, unsigned long bits)
{
	if ((bits & EXTENT_DELALLOC)) {
	if (!(old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) {
		struct btrfs_root *root = BTRFS_I(inode)->root;
		spin_lock(&root->fs_info->delalloc_lock);
		root->fs_info->delalloc_bytes += end - start + 1;
@@ -272,12 +272,18 @@ int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end,
}

int btrfs_clear_bit_hook(struct inode *inode, u64 start, u64 end,
			 unsigned long bits)
			 unsigned long old, unsigned long bits)
{
	if ((bits & EXTENT_DELALLOC)) {
	if ((old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) {
		struct btrfs_root *root = BTRFS_I(inode)->root;
		spin_lock(&root->fs_info->delalloc_lock);
		if (end - start + 1 > root->fs_info->delalloc_bytes) {
			printk("warning: delalloc account %Lu %Lu\n",
			       end - start + 1, root->fs_info->delalloc_bytes);
			root->fs_info->delalloc_bytes = 0;
		} else {
			root->fs_info->delalloc_bytes -= end - start + 1;
		}
		spin_unlock(&root->fs_info->delalloc_lock);
	}
	return 0;
@@ -3002,6 +3008,8 @@ static struct extent_io_ops btrfs_extent_io_ops = {
	.writepage_io_hook = btrfs_writepage_io_hook,
	.readpage_io_hook = btrfs_readpage_io_hook,
	.readpage_end_io_hook = btrfs_readpage_end_io_hook,
	.set_bit_hook = btrfs_set_bit_hook,
	.clear_bit_hook = btrfs_clear_bit_hook,
};

static struct address_space_operations btrfs_aops = {