aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2015-10-12 02:53:37 -0400
committerChris Mason <clm@fb.com>2015-10-21 21:37:44 -0400
commitd38ed27f0442c8cd520e093081127949d4bcf9bc (patch)
treed8fdb42478d6badd99db87c2a4551616ab3c8923 /fs/btrfs/extent_io.c
parentac46777213e00e26b9210060586f473368c54da2 (diff)
btrfs: extent_io: Introduce new function set_record_extent_bits
Introduce new function set_record_extent_bits(), which will not only set given bits, but also record how many bytes are changed, and detailed range info. This is quite important for later qgroup reserve framework. The number of bytes will be used to do qgroup reserve, and detailed range info will be used to cleanup for EQUOT case. 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.c71
1 files changed, 53 insertions, 18 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 6e6df34d74f0..9c066d687a42 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -131,6 +131,23 @@ struct extent_page_data {
131 unsigned int sync_io:1; 131 unsigned int sync_io:1;
132}; 132};
133 133
134static void add_extent_changeset(struct extent_state *state, unsigned bits,
135 struct extent_changeset *changeset,
136 int set)
137{
138 int ret;
139
140 if (!changeset)
141 return;
142 if (set && (state->state & bits) == bits)
143 return;
144 changeset->bytes_changed += state->end - state->start + 1;
145 ret = ulist_add(changeset->range_changed, state->start, state->end,
146 GFP_ATOMIC);
147 /* ENOMEM */
148 BUG_ON(ret < 0);
149}
150
134static noinline void flush_write_bio(void *data); 151static noinline void flush_write_bio(void *data);
135static inline struct btrfs_fs_info * 152static inline struct btrfs_fs_info *
136tree_fs_info(struct extent_io_tree *tree) 153tree_fs_info(struct extent_io_tree *tree)
@@ -410,7 +427,8 @@ static void clear_state_cb(struct extent_io_tree *tree,
410} 427}
411 428
412static void set_state_bits(struct extent_io_tree *tree, 429static void set_state_bits(struct extent_io_tree *tree,
413 struct extent_state *state, unsigned *bits); 430 struct extent_state *state, unsigned *bits,
431 struct extent_changeset *changeset);
414 432
415/* 433/*
416 * insert an extent_state struct into the tree. 'bits' are set on the 434 * insert an extent_state struct into the tree. 'bits' are set on the
@@ -426,7 +444,7 @@ static int insert_state(struct extent_io_tree *tree,
426 struct extent_state *state, u64 start, u64 end, 444 struct extent_state *state, u64 start, u64 end,
427 struct rb_node ***p, 445 struct rb_node ***p,
428 struct rb_node **parent, 446 struct rb_node **parent,
429 unsigned *bits) 447 unsigned *bits, struct extent_changeset *changeset)
430{ 448{
431 struct rb_node *node; 449 struct rb_node *node;
432 450
@@ -436,7 +454,7 @@ static int insert_state(struct extent_io_tree *tree,
436 state->start = start; 454 state->start = start;
437 state->end = end; 455 state->end = end;
438 456
439 set_state_bits(tree, state, bits); 457 set_state_bits(tree, state, bits, changeset);
440 458
441 node = tree_insert(&tree->state, NULL, end, &state->rb_node, p, parent); 459 node = tree_insert(&tree->state, NULL, end, &state->rb_node, p, parent);
442 if (node) { 460 if (node) {
@@ -789,7 +807,7 @@ out:
789 807
790static void set_state_bits(struct extent_io_tree *tree, 808static void set_state_bits(struct extent_io_tree *tree,
791 struct extent_state *state, 809 struct extent_state *state,
792 unsigned *bits) 810 unsigned *bits, struct extent_changeset *changeset)
793{ 811{
794 unsigned bits_to_set = *bits & ~EXTENT_CTLBITS; 812 unsigned bits_to_set = *bits & ~EXTENT_CTLBITS;
795 813
@@ -798,6 +816,7 @@ static void set_state_bits(struct extent_io_tree *tree,
798 u64 range = state->end - state->start + 1; 816 u64 range = state->end - state->start + 1;
799 tree->dirty_bytes += range; 817 tree->dirty_bytes += range;
800 } 818 }
819 add_extent_changeset(state, bits_to_set, changeset, 1);
801 state->state |= bits_to_set; 820 state->state |= bits_to_set;
802} 821}
803 822
@@ -835,7 +854,7 @@ static int __must_check
835__set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, 854__set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
836 unsigned bits, unsigned exclusive_bits, 855 unsigned bits, unsigned exclusive_bits,
837 u64 *failed_start, struct extent_state **cached_state, 856 u64 *failed_start, struct extent_state **cached_state,
838 gfp_t mask) 857 gfp_t mask, struct extent_changeset *changeset)
839{ 858{
840 struct extent_state *state; 859 struct extent_state *state;
841 struct extent_state *prealloc = NULL; 860 struct extent_state *prealloc = NULL;
@@ -873,7 +892,7 @@ again:
873 prealloc = alloc_extent_state_atomic(prealloc); 892 prealloc = alloc_extent_state_atomic(prealloc);
874 BUG_ON(!prealloc); 893 BUG_ON(!prealloc);
875 err = insert_state(tree, prealloc, start, end, 894 err = insert_state(tree, prealloc, start, end,
876 &p, &parent, &bits); 895 &p, &parent, &bits, changeset);
877 if (err) 896 if (err)
878 extent_io_tree_panic(tree, err); 897 extent_io_tree_panic(tree, err);
879 898
@@ -899,7 +918,7 @@ hit_next:
899 goto out; 918 goto out;
900 } 919 }
901 920
902 set_state_bits(tree, state, &bits); 921 set_state_bits(tree, state, &bits, changeset);
903 cache_state(state, cached_state); 922 cache_state(state, cached_state);
904 merge_state(tree, state); 923 merge_state(tree, state);
905 if (last_end == (u64)-1) 924 if (last_end == (u64)-1)
@@ -945,7 +964,7 @@ hit_next:
945 if (err) 964 if (err)
946 goto out; 965 goto out;
947 if (state->end <= end) { 966 if (state->end <= end) {
948 set_state_bits(tree, state, &bits); 967 set_state_bits(tree, state, &bits, changeset);
949 cache_state(state, cached_state); 968 cache_state(state, cached_state);
950 merge_state(tree, state); 969 merge_state(tree, state);
951 if (last_end == (u64)-1) 970 if (last_end == (u64)-1)
@@ -980,7 +999,7 @@ hit_next:
980 * the later extent. 999 * the later extent.
981 */ 1000 */
982 err = insert_state(tree, prealloc, start, this_end, 1001 err = insert_state(tree, prealloc, start, this_end,
983 NULL, NULL, &bits); 1002 NULL, NULL, &bits, changeset);
984 if (err) 1003 if (err)
985 extent_io_tree_panic(tree, err); 1004 extent_io_tree_panic(tree, err);
986 1005
@@ -1008,7 +1027,7 @@ hit_next:
1008 if (err) 1027 if (err)
1009 extent_io_tree_panic(tree, err); 1028 extent_io_tree_panic(tree, err);
1010 1029
1011 set_state_bits(tree, prealloc, &bits); 1030 set_state_bits(tree, prealloc, &bits, changeset);
1012 cache_state(prealloc, cached_state); 1031 cache_state(prealloc, cached_state);
1013 merge_state(tree, prealloc); 1032 merge_state(tree, prealloc);
1014 prealloc = NULL; 1033 prealloc = NULL;
@@ -1038,7 +1057,7 @@ int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
1038 struct extent_state **cached_state, gfp_t mask) 1057 struct extent_state **cached_state, gfp_t mask)
1039{ 1058{
1040 return __set_extent_bit(tree, start, end, bits, 0, failed_start, 1059 return __set_extent_bit(tree, start, end, bits, 0, failed_start,
1041 cached_state, mask); 1060 cached_state, mask, NULL);
1042} 1061}
1043 1062
1044 1063
@@ -1111,7 +1130,7 @@ again:
1111 goto out; 1130 goto out;
1112 } 1131 }
1113 err = insert_state(tree, prealloc, start, end, 1132 err = insert_state(tree, prealloc, start, end,
1114 &p, &parent, &bits); 1133 &p, &parent, &bits, NULL);
1115 if (err) 1134 if (err)
1116 extent_io_tree_panic(tree, err); 1135 extent_io_tree_panic(tree, err);
1117 cache_state(prealloc, cached_state); 1136 cache_state(prealloc, cached_state);
@@ -1130,7 +1149,7 @@ hit_next:
1130 * Just lock what we found and keep going 1149 * Just lock what we found and keep going
1131 */ 1150 */
1132 if (state->start == start && state->end <= end) { 1151 if (state->start == start && state->end <= end) {
1133 set_state_bits(tree, state, &bits); 1152 set_state_bits(tree, state, &bits, NULL);
1134 cache_state(state, cached_state); 1153 cache_state(state, cached_state);
1135 state = clear_state_bit(tree, state, &clear_bits, 0); 1154 state = clear_state_bit(tree, state, &clear_bits, 0);
1136 if (last_end == (u64)-1) 1155 if (last_end == (u64)-1)
@@ -1171,7 +1190,7 @@ hit_next:
1171 if (err) 1190 if (err)
1172 goto out; 1191 goto out;
1173 if (state->end <= end) { 1192 if (state->end <= end) {
1174 set_state_bits(tree, state, &bits); 1193 set_state_bits(tree, state, &bits, NULL);
1175 cache_state(state, cached_state); 1194 cache_state(state, cached_state);
1176 state = clear_state_bit(tree, state, &clear_bits, 0); 1195 state = clear_state_bit(tree, state, &clear_bits, 0);
1177 if (last_end == (u64)-1) 1196 if (last_end == (u64)-1)
@@ -1208,7 +1227,7 @@ hit_next:
1208 * the later extent. 1227 * the later extent.
1209 */ 1228 */
1210 err = insert_state(tree, prealloc, start, this_end, 1229 err = insert_state(tree, prealloc, start, this_end,
1211 NULL, NULL, &bits); 1230 NULL, NULL, &bits, NULL);
1212 if (err) 1231 if (err)
1213 extent_io_tree_panic(tree, err); 1232 extent_io_tree_panic(tree, err);
1214 cache_state(prealloc, cached_state); 1233 cache_state(prealloc, cached_state);
@@ -1233,7 +1252,7 @@ hit_next:
1233 if (err) 1252 if (err)
1234 extent_io_tree_panic(tree, err); 1253 extent_io_tree_panic(tree, err);
1235 1254
1236 set_state_bits(tree, prealloc, &bits); 1255 set_state_bits(tree, prealloc, &bits, NULL);
1237 cache_state(prealloc, cached_state); 1256 cache_state(prealloc, cached_state);
1238 clear_state_bit(tree, prealloc, &clear_bits, 0); 1257 clear_state_bit(tree, prealloc, &clear_bits, 0);
1239 prealloc = NULL; 1258 prealloc = NULL;
@@ -1274,6 +1293,22 @@ int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
1274 NULL, mask); 1293 NULL, mask);
1275} 1294}
1276 1295
1296int set_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
1297 unsigned bits, gfp_t mask,
1298 struct extent_changeset *changeset)
1299{
1300 /*
1301 * We don't support EXTENT_LOCKED yet, as current changeset will
1302 * record any bits changed, so for EXTENT_LOCKED case, it will
1303 * either fail with -EEXIST or changeset will record the whole
1304 * range.
1305 */
1306 BUG_ON(bits & EXTENT_LOCKED);
1307
1308 return __set_extent_bit(tree, start, end, bits, 0, NULL, NULL, mask,
1309 changeset);
1310}
1311
1277int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, 1312int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
1278 unsigned bits, gfp_t mask) 1313 unsigned bits, gfp_t mask)
1279{ 1314{
@@ -1343,7 +1378,7 @@ int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
1343 while (1) { 1378 while (1) {
1344 err = __set_extent_bit(tree, start, end, EXTENT_LOCKED | bits, 1379 err = __set_extent_bit(tree, start, end, EXTENT_LOCKED | bits,
1345 EXTENT_LOCKED, &failed_start, 1380 EXTENT_LOCKED, &failed_start,
1346 cached_state, GFP_NOFS); 1381 cached_state, GFP_NOFS, NULL);
1347 if (err == -EEXIST) { 1382 if (err == -EEXIST) {
1348 wait_extent_bit(tree, failed_start, end, EXTENT_LOCKED); 1383 wait_extent_bit(tree, failed_start, end, EXTENT_LOCKED);
1349 start = failed_start; 1384 start = failed_start;
@@ -1365,7 +1400,7 @@ int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end)
1365 u64 failed_start; 1400 u64 failed_start;
1366 1401
1367 err = __set_extent_bit(tree, start, end, EXTENT_LOCKED, EXTENT_LOCKED, 1402 err = __set_extent_bit(tree, start, end, EXTENT_LOCKED, EXTENT_LOCKED,
1368 &failed_start, NULL, GFP_NOFS); 1403 &failed_start, NULL, GFP_NOFS, NULL);
1369 if (err == -EEXIST) { 1404 if (err == -EEXIST) {
1370 if (failed_start > start) 1405 if (failed_start > start)
1371 clear_extent_bit(tree, start, failed_start - 1, 1406 clear_extent_bit(tree, start, failed_start - 1,