Btrfs: Do delalloc accounting via hooks in the extent_state code
Signed-off-by: Chris Mason <chris.mason@oracle.com>
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 8aec722..e81b35b 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -256,6 +256,26 @@
return 0;
}
+static void set_state_cb(struct extent_io_tree *tree,
+ struct extent_state *state,
+ unsigned long bits)
+{
+ if (tree->ops && tree->ops->set_bit_hook) {
+ tree->ops->set_bit_hook(tree->mapping->host, state->start,
+ state->end, bits);
+ }
+}
+
+static void clear_state_cb(struct extent_io_tree *tree,
+ struct extent_state *state,
+ unsigned long bits)
+{
+ if (tree->ops && tree->ops->set_bit_hook) {
+ tree->ops->clear_bit_hook(tree->mapping->host, state->start,
+ state->end, bits);
+ }
+}
+
/*
* insert an extent_state struct into the tree. 'bits' are set on the
* struct before it is inserted.
@@ -281,6 +301,7 @@
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;
@@ -349,6 +370,7 @@
tree->dirty_bytes -= range;
}
state->state &= ~bits;
+ clear_state_cb(tree, state, bits);
if (wake)
wake_up(&state->wq);
if (delete || state->state == 0) {
@@ -553,6 +575,7 @@
tree->dirty_bytes += range;
}
state->state |= bits;
+ set_state_cb(tree, state, bits);
}
/*
@@ -975,6 +998,7 @@
goto search_again;
}
state->state |= EXTENT_LOCKED;
+ set_state_cb(tree, state, EXTENT_LOCKED);
if (!found)
*start = state->start;
found++;
@@ -1474,6 +1498,7 @@
state = NULL;
}
clear->state |= EXTENT_UPTODATE;
+ set_state_cb(tree, clear, EXTENT_UPTODATE);
clear_state_bit(tree, clear, EXTENT_LOCKED,
1, 0);
if (cur == start)