aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2015-10-12 03:35:38 -0400
committerChris Mason <clm@fb.com>2015-10-21 21:37:44 -0400
commitfefdc55702a5f9f99778b6bdce4c4e1185ff943f (patch)
tree5200c727ca441747ae8c1d168962749bd25dbe48 /fs/btrfs/extent_io.c
parentd38ed27f0442c8cd520e093081127949d4bcf9bc (diff)
btrfs: extent_io: Introduce new function clear_record_extent_bits()
Introduce new function clear_record_extent_bits(), which will clear bits for given range and record the details about which ranges are cleared and how many bytes in total it changes. This provides the basis for later qgroup reserve codes. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c50
1 files changed, 39 insertions, 11 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 9c066d687a42..33a01ea41465 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -141,6 +141,8 @@ static void add_extent_changeset(struct extent_state *state, unsigned bits,
141 return; 141 return;
142 if (set && (state->state & bits) == bits) 142 if (set && (state->state & bits) == bits)
143 return; 143 return;
144 if (!set && (state->state & bits) == 0)
145 return;
144 changeset->bytes_changed += state->end - state->start + 1; 146 changeset->bytes_changed += state->end - state->start + 1;
145 ret = ulist_add(changeset->range_changed, state->start, state->end, 147 ret = ulist_add(changeset->range_changed, state->start, state->end,
146 GFP_ATOMIC); 148 GFP_ATOMIC);
@@ -529,7 +531,8 @@ static struct extent_state *next_state(struct extent_state *state)
529 */ 531 */
530static struct extent_state *clear_state_bit(struct extent_io_tree *tree, 532static struct extent_state *clear_state_bit(struct extent_io_tree *tree,
531 struct extent_state *state, 533 struct extent_state *state,
532 unsigned *bits, int wake) 534 unsigned *bits, int wake,
535 struct extent_changeset *changeset)
533{ 536{
534 struct extent_state *next; 537 struct extent_state *next;
535 unsigned bits_to_clear = *bits & ~EXTENT_CTLBITS; 538 unsigned bits_to_clear = *bits & ~EXTENT_CTLBITS;
@@ -540,6 +543,7 @@ static struct extent_state *clear_state_bit(struct extent_io_tree *tree,
540 tree->dirty_bytes -= range; 543 tree->dirty_bytes -= range;
541 } 544 }
542 clear_state_cb(tree, state, bits); 545 clear_state_cb(tree, state, bits);
546 add_extent_changeset(state, bits_to_clear, changeset, 0);
543 state->state &= ~bits_to_clear; 547 state->state &= ~bits_to_clear;
544 if (wake) 548 if (wake)
545 wake_up(&state->wq); 549 wake_up(&state->wq);
@@ -587,10 +591,10 @@ static void extent_io_tree_panic(struct extent_io_tree *tree, int err)
587 * 591 *
588 * This takes the tree lock, and returns 0 on success and < 0 on error. 592 * This takes the tree lock, and returns 0 on success and < 0 on error.
589 */ 593 */
590int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, 594static int __clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
591 unsigned bits, int wake, int delete, 595 unsigned bits, int wake, int delete,
592 struct extent_state **cached_state, 596 struct extent_state **cached_state,
593 gfp_t mask) 597 gfp_t mask, struct extent_changeset *changeset)
594{ 598{
595 struct extent_state *state; 599 struct extent_state *state;
596 struct extent_state *cached; 600 struct extent_state *cached;
@@ -689,7 +693,8 @@ hit_next:
689 if (err) 693 if (err)
690 goto out; 694 goto out;
691 if (state->end <= end) { 695 if (state->end <= end) {
692 state = clear_state_bit(tree, state, &bits, wake); 696 state = clear_state_bit(tree, state, &bits, wake,
697 changeset);
693 goto next; 698 goto next;
694 } 699 }
695 goto search_again; 700 goto search_again;
@@ -710,13 +715,13 @@ hit_next:
710 if (wake) 715 if (wake)
711 wake_up(&state->wq); 716 wake_up(&state->wq);
712 717
713 clear_state_bit(tree, prealloc, &bits, wake); 718 clear_state_bit(tree, prealloc, &bits, wake, changeset);
714 719
715 prealloc = NULL; 720 prealloc = NULL;
716 goto out; 721 goto out;
717 } 722 }
718 723
719 state = clear_state_bit(tree, state, &bits, wake); 724 state = clear_state_bit(tree, state, &bits, wake, changeset);
720next: 725next:
721 if (last_end == (u64)-1) 726 if (last_end == (u64)-1)
722 goto out; 727 goto out;
@@ -1151,7 +1156,7 @@ hit_next:
1151 if (state->start == start && state->end <= end) { 1156 if (state->start == start && state->end <= end) {
1152 set_state_bits(tree, state, &bits, NULL); 1157 set_state_bits(tree, state, &bits, NULL);
1153 cache_state(state, cached_state); 1158 cache_state(state, cached_state);
1154 state = clear_state_bit(tree, state, &clear_bits, 0); 1159 state = clear_state_bit(tree, state, &clear_bits, 0, NULL);
1155 if (last_end == (u64)-1) 1160 if (last_end == (u64)-1)
1156 goto out; 1161 goto out;
1157 start = last_end + 1; 1162 start = last_end + 1;
@@ -1192,7 +1197,8 @@ hit_next:
1192 if (state->end <= end) { 1197 if (state->end <= end) {
1193 set_state_bits(tree, state, &bits, NULL); 1198 set_state_bits(tree, state, &bits, NULL);
1194 cache_state(state, cached_state); 1199 cache_state(state, cached_state);
1195 state = clear_state_bit(tree, state, &clear_bits, 0); 1200 state = clear_state_bit(tree, state, &clear_bits, 0,
1201 NULL);
1196 if (last_end == (u64)-1) 1202 if (last_end == (u64)-1)
1197 goto out; 1203 goto out;
1198 start = last_end + 1; 1204 start = last_end + 1;
@@ -1254,7 +1260,7 @@ hit_next:
1254 1260
1255 set_state_bits(tree, prealloc, &bits, NULL); 1261 set_state_bits(tree, prealloc, &bits, NULL);
1256 cache_state(prealloc, cached_state); 1262 cache_state(prealloc, cached_state);
1257 clear_state_bit(tree, prealloc, &clear_bits, 0); 1263 clear_state_bit(tree, prealloc, &clear_bits, 0, NULL);
1258 prealloc = NULL; 1264 prealloc = NULL;
1259 goto out; 1265 goto out;
1260 } 1266 }
@@ -1309,6 +1315,14 @@ int set_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
1309 changeset); 1315 changeset);
1310} 1316}
1311 1317
1318int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
1319 unsigned bits, int wake, int delete,
1320 struct extent_state **cached, gfp_t mask)
1321{
1322 return __clear_extent_bit(tree, start, end, bits, wake, delete,
1323 cached, mask, NULL);
1324}
1325
1312int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, 1326int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
1313 unsigned bits, gfp_t mask) 1327 unsigned bits, gfp_t mask)
1314{ 1328{
@@ -1320,6 +1334,20 @@ int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
1320 return clear_extent_bit(tree, start, end, bits, wake, 0, NULL, mask); 1334 return clear_extent_bit(tree, start, end, bits, wake, 0, NULL, mask);
1321} 1335}
1322 1336
1337int clear_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
1338 unsigned bits, gfp_t mask,
1339 struct extent_changeset *changeset)
1340{
1341 /*
1342 * Don't support EXTENT_LOCKED case, same reason as
1343 * set_record_extent_bits().
1344 */
1345 BUG_ON(bits & EXTENT_LOCKED);
1346
1347 return __clear_extent_bit(tree, start, end, bits, 0, 0, NULL, mask,
1348 changeset);
1349}
1350
1323int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end, 1351int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
1324 struct extent_state **cached_state, gfp_t mask) 1352 struct extent_state **cached_state, gfp_t mask)
1325{ 1353{