Merge remote-tracking branches 'asoc/topic/sta529', 'asoc/topic/sti', 'asoc/topic...
[sfrench/cifs-2.6.git] / fs / btrfs / tests / free-space-tests.c
1 /*
2  * Copyright (C) 2013 Fusion IO.  All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public
6  * License v2 as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public
14  * License along with this program; if not, write to the
15  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16  * Boston, MA 021110-1307, USA.
17  */
18
19 #include <linux/slab.h>
20 #include "btrfs-tests.h"
21 #include "../ctree.h"
22 #include "../disk-io.h"
23 #include "../free-space-cache.h"
24
25 #define BITS_PER_BITMAP         (PAGE_SIZE * 8UL)
26
27 /*
28  * This test just does basic sanity checking, making sure we can add an extent
29  * entry and remove space from either end and the middle, and make sure we can
30  * remove space that covers adjacent extent entries.
31  */
32 static int test_extents(struct btrfs_block_group_cache *cache)
33 {
34         int ret = 0;
35
36         test_msg("Running extent only tests\n");
37
38         /* First just make sure we can remove an entire entry */
39         ret = btrfs_add_free_space(cache, 0, SZ_4M);
40         if (ret) {
41                 test_msg("Error adding initial extents %d\n", ret);
42                 return ret;
43         }
44
45         ret = btrfs_remove_free_space(cache, 0, SZ_4M);
46         if (ret) {
47                 test_msg("Error removing extent %d\n", ret);
48                 return ret;
49         }
50
51         if (test_check_exists(cache, 0, SZ_4M)) {
52                 test_msg("Full remove left some lingering space\n");
53                 return -1;
54         }
55
56         /* Ok edge and middle cases now */
57         ret = btrfs_add_free_space(cache, 0, SZ_4M);
58         if (ret) {
59                 test_msg("Error adding half extent %d\n", ret);
60                 return ret;
61         }
62
63         ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_1M);
64         if (ret) {
65                 test_msg("Error removing tail end %d\n", ret);
66                 return ret;
67         }
68
69         ret = btrfs_remove_free_space(cache, 0, SZ_1M);
70         if (ret) {
71                 test_msg("Error removing front end %d\n", ret);
72                 return ret;
73         }
74
75         ret = btrfs_remove_free_space(cache, SZ_2M, 4096);
76         if (ret) {
77                 test_msg("Error removing middle piece %d\n", ret);
78                 return ret;
79         }
80
81         if (test_check_exists(cache, 0, SZ_1M)) {
82                 test_msg("Still have space at the front\n");
83                 return -1;
84         }
85
86         if (test_check_exists(cache, SZ_2M, 4096)) {
87                 test_msg("Still have space in the middle\n");
88                 return -1;
89         }
90
91         if (test_check_exists(cache, 3 * SZ_1M, SZ_1M)) {
92                 test_msg("Still have space at the end\n");
93                 return -1;
94         }
95
96         /* Cleanup */
97         __btrfs_remove_free_space_cache(cache->free_space_ctl);
98
99         return 0;
100 }
101
102 static int test_bitmaps(struct btrfs_block_group_cache *cache,
103                         u32 sectorsize)
104 {
105         u64 next_bitmap_offset;
106         int ret;
107
108         test_msg("Running bitmap only tests\n");
109
110         ret = test_add_free_space_entry(cache, 0, SZ_4M, 1);
111         if (ret) {
112                 test_msg("Couldn't create a bitmap entry %d\n", ret);
113                 return ret;
114         }
115
116         ret = btrfs_remove_free_space(cache, 0, SZ_4M);
117         if (ret) {
118                 test_msg("Error removing bitmap full range %d\n", ret);
119                 return ret;
120         }
121
122         if (test_check_exists(cache, 0, SZ_4M)) {
123                 test_msg("Left some space in bitmap\n");
124                 return -1;
125         }
126
127         ret = test_add_free_space_entry(cache, 0, SZ_4M, 1);
128         if (ret) {
129                 test_msg("Couldn't add to our bitmap entry %d\n", ret);
130                 return ret;
131         }
132
133         ret = btrfs_remove_free_space(cache, SZ_1M, SZ_2M);
134         if (ret) {
135                 test_msg("Couldn't remove middle chunk %d\n", ret);
136                 return ret;
137         }
138
139         /*
140          * The first bitmap we have starts at offset 0 so the next one is just
141          * at the end of the first bitmap.
142          */
143         next_bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize);
144
145         /* Test a bit straddling two bitmaps */
146         ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M,
147                                         SZ_4M, 1);
148         if (ret) {
149                 test_msg("Couldn't add space that straddles two bitmaps %d\n",
150                                 ret);
151                 return ret;
152         }
153
154         ret = btrfs_remove_free_space(cache, next_bitmap_offset - SZ_1M, SZ_2M);
155         if (ret) {
156                 test_msg("Couldn't remove overlapping space %d\n", ret);
157                 return ret;
158         }
159
160         if (test_check_exists(cache, next_bitmap_offset - SZ_1M, SZ_2M)) {
161                 test_msg("Left some space when removing overlapping\n");
162                 return -1;
163         }
164
165         __btrfs_remove_free_space_cache(cache->free_space_ctl);
166
167         return 0;
168 }
169
170 /* This is the high grade jackassery */
171 static int test_bitmaps_and_extents(struct btrfs_block_group_cache *cache,
172                                     u32 sectorsize)
173 {
174         u64 bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize);
175         int ret;
176
177         test_msg("Running bitmap and extent tests\n");
178
179         /*
180          * First let's do something simple, an extent at the same offset as the
181          * bitmap, but the free space completely in the extent and then
182          * completely in the bitmap.
183          */
184         ret = test_add_free_space_entry(cache, SZ_4M, SZ_1M, 1);
185         if (ret) {
186                 test_msg("Couldn't create bitmap entry %d\n", ret);
187                 return ret;
188         }
189
190         ret = test_add_free_space_entry(cache, 0, SZ_1M, 0);
191         if (ret) {
192                 test_msg("Couldn't add extent entry %d\n", ret);
193                 return ret;
194         }
195
196         ret = btrfs_remove_free_space(cache, 0, SZ_1M);
197         if (ret) {
198                 test_msg("Couldn't remove extent entry %d\n", ret);
199                 return ret;
200         }
201
202         if (test_check_exists(cache, 0, SZ_1M)) {
203                 test_msg("Left remnants after our remove\n");
204                 return -1;
205         }
206
207         /* Now to add back the extent entry and remove from the bitmap */
208         ret = test_add_free_space_entry(cache, 0, SZ_1M, 0);
209         if (ret) {
210                 test_msg("Couldn't re-add extent entry %d\n", ret);
211                 return ret;
212         }
213
214         ret = btrfs_remove_free_space(cache, SZ_4M, SZ_1M);
215         if (ret) {
216                 test_msg("Couldn't remove from bitmap %d\n", ret);
217                 return ret;
218         }
219
220         if (test_check_exists(cache, SZ_4M, SZ_1M)) {
221                 test_msg("Left remnants in the bitmap\n");
222                 return -1;
223         }
224
225         /*
226          * Ok so a little more evil, extent entry and bitmap at the same offset,
227          * removing an overlapping chunk.
228          */
229         ret = test_add_free_space_entry(cache, SZ_1M, SZ_4M, 1);
230         if (ret) {
231                 test_msg("Couldn't add to a bitmap %d\n", ret);
232                 return ret;
233         }
234
235         ret = btrfs_remove_free_space(cache, SZ_512K, 3 * SZ_1M);
236         if (ret) {
237                 test_msg("Couldn't remove overlapping space %d\n", ret);
238                 return ret;
239         }
240
241         if (test_check_exists(cache, SZ_512K, 3 * SZ_1M)) {
242                 test_msg("Left over pieces after removing overlapping\n");
243                 return -1;
244         }
245
246         __btrfs_remove_free_space_cache(cache->free_space_ctl);
247
248         /* Now with the extent entry offset into the bitmap */
249         ret = test_add_free_space_entry(cache, SZ_4M, SZ_4M, 1);
250         if (ret) {
251                 test_msg("Couldn't add space to the bitmap %d\n", ret);
252                 return ret;
253         }
254
255         ret = test_add_free_space_entry(cache, SZ_2M, SZ_2M, 0);
256         if (ret) {
257                 test_msg("Couldn't add extent to the cache %d\n", ret);
258                 return ret;
259         }
260
261         ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_4M);
262         if (ret) {
263                 test_msg("Problem removing overlapping space %d\n", ret);
264                 return ret;
265         }
266
267         if (test_check_exists(cache, 3 * SZ_1M, SZ_4M)) {
268                 test_msg("Left something behind when removing space");
269                 return -1;
270         }
271
272         /*
273          * This has blown up in the past, the extent entry starts before the
274          * bitmap entry, but we're trying to remove an offset that falls
275          * completely within the bitmap range and is in both the extent entry
276          * and the bitmap entry, looks like this
277          *
278          *   [ extent ]
279          *      [ bitmap ]
280          *        [ del ]
281          */
282         __btrfs_remove_free_space_cache(cache->free_space_ctl);
283         ret = test_add_free_space_entry(cache, bitmap_offset + SZ_4M, SZ_4M, 1);
284         if (ret) {
285                 test_msg("Couldn't add bitmap %d\n", ret);
286                 return ret;
287         }
288
289         ret = test_add_free_space_entry(cache, bitmap_offset - SZ_1M,
290                                         5 * SZ_1M, 0);
291         if (ret) {
292                 test_msg("Couldn't add extent entry %d\n", ret);
293                 return ret;
294         }
295
296         ret = btrfs_remove_free_space(cache, bitmap_offset + SZ_1M, 5 * SZ_1M);
297         if (ret) {
298                 test_msg("Failed to free our space %d\n", ret);
299                 return ret;
300         }
301
302         if (test_check_exists(cache, bitmap_offset + SZ_1M, 5 * SZ_1M)) {
303                 test_msg("Left stuff over\n");
304                 return -1;
305         }
306
307         __btrfs_remove_free_space_cache(cache->free_space_ctl);
308
309         /*
310          * This blew up before, we have part of the free space in a bitmap and
311          * then the entirety of the rest of the space in an extent.  This used
312          * to return -EAGAIN back from btrfs_remove_extent, make sure this
313          * doesn't happen.
314          */
315         ret = test_add_free_space_entry(cache, SZ_1M, SZ_2M, 1);
316         if (ret) {
317                 test_msg("Couldn't add bitmap entry %d\n", ret);
318                 return ret;
319         }
320
321         ret = test_add_free_space_entry(cache, 3 * SZ_1M, SZ_1M, 0);
322         if (ret) {
323                 test_msg("Couldn't add extent entry %d\n", ret);
324                 return ret;
325         }
326
327         ret = btrfs_remove_free_space(cache, SZ_1M, 3 * SZ_1M);
328         if (ret) {
329                 test_msg("Error removing bitmap and extent overlapping %d\n", ret);
330                 return ret;
331         }
332
333         __btrfs_remove_free_space_cache(cache->free_space_ctl);
334         return 0;
335 }
336
337 /* Used by test_steal_space_from_bitmap_to_extent(). */
338 static bool test_use_bitmap(struct btrfs_free_space_ctl *ctl,
339                             struct btrfs_free_space *info)
340 {
341         return ctl->free_extents > 0;
342 }
343
344 /* Used by test_steal_space_from_bitmap_to_extent(). */
345 static int
346 check_num_extents_and_bitmaps(const struct btrfs_block_group_cache *cache,
347                               const int num_extents,
348                               const int num_bitmaps)
349 {
350         if (cache->free_space_ctl->free_extents != num_extents) {
351                 test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n",
352                          cache->free_space_ctl->free_extents, num_extents);
353                 return -EINVAL;
354         }
355         if (cache->free_space_ctl->total_bitmaps != num_bitmaps) {
356                 test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n",
357                          cache->free_space_ctl->total_bitmaps, num_bitmaps);
358                 return -EINVAL;
359         }
360         return 0;
361 }
362
363 /* Used by test_steal_space_from_bitmap_to_extent(). */
364 static int check_cache_empty(struct btrfs_block_group_cache *cache)
365 {
366         u64 offset;
367         u64 max_extent_size;
368
369         /*
370          * Now lets confirm that there's absolutely no free space left to
371          * allocate.
372          */
373         if (cache->free_space_ctl->free_space != 0) {
374                 test_msg("Cache free space is not 0\n");
375                 return -EINVAL;
376         }
377
378         /* And any allocation request, no matter how small, should fail now. */
379         offset = btrfs_find_space_for_alloc(cache, 0, 4096, 0,
380                                             &max_extent_size);
381         if (offset != 0) {
382                 test_msg("Space allocation did not fail, returned offset: %llu",
383                          offset);
384                 return -EINVAL;
385         }
386
387         /* And no extent nor bitmap entries in the cache anymore. */
388         return check_num_extents_and_bitmaps(cache, 0, 0);
389 }
390
391 /*
392  * Before we were able to steal free space from a bitmap entry to an extent
393  * entry, we could end up with 2 entries representing a contiguous free space.
394  * One would be an extent entry and the other a bitmap entry. Since in order
395  * to allocate space to a caller we use only 1 entry, we couldn't return that
396  * whole range to the caller if it was requested. This forced the caller to
397  * either assume ENOSPC or perform several smaller space allocations, which
398  * wasn't optimal as they could be spread all over the block group while under
399  * concurrency (extra overhead and fragmentation).
400  *
401  * This stealing approach is beneficial, since we always prefer to allocate
402  * from extent entries, both for clustered and non-clustered allocation
403  * requests.
404  */
405 static int
406 test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache,
407                                        u32 sectorsize)
408 {
409         int ret;
410         u64 offset;
411         u64 max_extent_size;
412         const struct btrfs_free_space_op test_free_space_ops = {
413                 .recalc_thresholds = cache->free_space_ctl->op->recalc_thresholds,
414                 .use_bitmap = test_use_bitmap,
415         };
416         const struct btrfs_free_space_op *orig_free_space_ops;
417
418         test_msg("Running space stealing from bitmap to extent\n");
419
420         /*
421          * For this test, we want to ensure we end up with an extent entry
422          * immediately adjacent to a bitmap entry, where the bitmap starts
423          * at an offset where the extent entry ends. We keep adding and
424          * removing free space to reach into this state, but to get there
425          * we need to reach a point where marking new free space doesn't
426          * result in adding new extent entries or merging the new space
427          * with existing extent entries - the space ends up being marked
428          * in an existing bitmap that covers the new free space range.
429          *
430          * To get there, we need to reach the threshold defined set at
431          * cache->free_space_ctl->extents_thresh, which currently is
432          * 256 extents on a x86_64 system at least, and a few other
433          * conditions (check free_space_cache.c). Instead of making the
434          * test much longer and complicated, use a "use_bitmap" operation
435          * that forces use of bitmaps as soon as we have at least 1
436          * extent entry.
437          */
438         orig_free_space_ops = cache->free_space_ctl->op;
439         cache->free_space_ctl->op = &test_free_space_ops;
440
441         /*
442          * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[
443          */
444         ret = test_add_free_space_entry(cache, SZ_128M - SZ_256K, SZ_128K, 0);
445         if (ret) {
446                 test_msg("Couldn't add extent entry %d\n", ret);
447                 return ret;
448         }
449
450         /* Bitmap entry covering free space range [128Mb + 512Kb, 256Mb[ */
451         ret = test_add_free_space_entry(cache, SZ_128M + SZ_512K,
452                                         SZ_128M - SZ_512K, 1);
453         if (ret) {
454                 test_msg("Couldn't add bitmap entry %d\n", ret);
455                 return ret;
456         }
457
458         ret = check_num_extents_and_bitmaps(cache, 2, 1);
459         if (ret)
460                 return ret;
461
462         /*
463          * Now make only the first 256Kb of the bitmap marked as free, so that
464          * we end up with only the following ranges marked as free space:
465          *
466          * [128Mb - 256Kb, 128Mb - 128Kb[
467          * [128Mb + 512Kb, 128Mb + 768Kb[
468          */
469         ret = btrfs_remove_free_space(cache,
470                                       SZ_128M + 768 * SZ_1K,
471                                       SZ_128M - 768 * SZ_1K);
472         if (ret) {
473                 test_msg("Failed to free part of bitmap space %d\n", ret);
474                 return ret;
475         }
476
477         /* Confirm that only those 2 ranges are marked as free. */
478         if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_128K)) {
479                 test_msg("Free space range missing\n");
480                 return -ENOENT;
481         }
482         if (!test_check_exists(cache, SZ_128M + SZ_512K, SZ_256K)) {
483                 test_msg("Free space range missing\n");
484                 return -ENOENT;
485         }
486
487         /*
488          * Confirm that the bitmap range [128Mb + 768Kb, 256Mb[ isn't marked
489          * as free anymore.
490          */
491         if (test_check_exists(cache, SZ_128M + 768 * SZ_1K,
492                               SZ_128M - 768 * SZ_1K)) {
493                 test_msg("Bitmap region not removed from space cache\n");
494                 return -EINVAL;
495         }
496
497         /*
498          * Confirm that the region [128Mb + 256Kb, 128Mb + 512Kb[, which is
499          * covered by the bitmap, isn't marked as free.
500          */
501         if (test_check_exists(cache, SZ_128M + SZ_256K, SZ_256K)) {
502                 test_msg("Invalid bitmap region marked as free\n");
503                 return -EINVAL;
504         }
505
506         /*
507          * Confirm that the region [128Mb, 128Mb + 256Kb[, which is covered
508          * by the bitmap too, isn't marked as free either.
509          */
510         if (test_check_exists(cache, SZ_128M, SZ_256K)) {
511                 test_msg("Invalid bitmap region marked as free\n");
512                 return -EINVAL;
513         }
514
515         /*
516          * Now lets mark the region [128Mb, 128Mb + 512Kb[ as free too. But,
517          * lets make sure the free space cache marks it as free in the bitmap,
518          * and doesn't insert a new extent entry to represent this region.
519          */
520         ret = btrfs_add_free_space(cache, SZ_128M, SZ_512K);
521         if (ret) {
522                 test_msg("Error adding free space: %d\n", ret);
523                 return ret;
524         }
525         /* Confirm the region is marked as free. */
526         if (!test_check_exists(cache, SZ_128M, SZ_512K)) {
527                 test_msg("Bitmap region not marked as free\n");
528                 return -ENOENT;
529         }
530
531         /*
532          * Confirm that no new extent entries or bitmap entries were added to
533          * the cache after adding that free space region.
534          */
535         ret = check_num_extents_and_bitmaps(cache, 2, 1);
536         if (ret)
537                 return ret;
538
539         /*
540          * Now lets add a small free space region to the right of the previous
541          * one, which is not contiguous with it and is part of the bitmap too.
542          * The goal is to test that the bitmap entry space stealing doesn't
543          * steal this space region.
544          */
545         ret = btrfs_add_free_space(cache, SZ_128M + SZ_16M, sectorsize);
546         if (ret) {
547                 test_msg("Error adding free space: %d\n", ret);
548                 return ret;
549         }
550
551         /*
552          * Confirm that no new extent entries or bitmap entries were added to
553          * the cache after adding that free space region.
554          */
555         ret = check_num_extents_and_bitmaps(cache, 2, 1);
556         if (ret)
557                 return ret;
558
559         /*
560          * Now mark the region [128Mb - 128Kb, 128Mb[ as free too. This will
561          * expand the range covered by the existing extent entry that represents
562          * the free space [128Mb - 256Kb, 128Mb - 128Kb[.
563          */
564         ret = btrfs_add_free_space(cache, SZ_128M - SZ_128K, SZ_128K);
565         if (ret) {
566                 test_msg("Error adding free space: %d\n", ret);
567                 return ret;
568         }
569         /* Confirm the region is marked as free. */
570         if (!test_check_exists(cache, SZ_128M - SZ_128K, SZ_128K)) {
571                 test_msg("Extent region not marked as free\n");
572                 return -ENOENT;
573         }
574
575         /*
576          * Confirm that our extent entry didn't stole all free space from the
577          * bitmap, because of the small 4Kb free space region.
578          */
579         ret = check_num_extents_and_bitmaps(cache, 2, 1);
580         if (ret)
581                 return ret;
582
583         /*
584          * So now we have the range [128Mb - 256Kb, 128Mb + 768Kb[ as free
585          * space. Without stealing bitmap free space into extent entry space,
586          * we would have all this free space represented by 2 entries in the
587          * cache:
588          *
589          * extent entry covering range: [128Mb - 256Kb, 128Mb[
590          * bitmap entry covering range: [128Mb, 128Mb + 768Kb[
591          *
592          * Attempting to allocate the whole free space (1Mb) would fail, because
593          * we can't allocate from multiple entries.
594          * With the bitmap free space stealing, we get a single extent entry
595          * that represents the 1Mb free space, and therefore we're able to
596          * allocate the whole free space at once.
597          */
598         if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_1M)) {
599                 test_msg("Expected region not marked as free\n");
600                 return -ENOENT;
601         }
602
603         if (cache->free_space_ctl->free_space != (SZ_1M + sectorsize)) {
604                 test_msg("Cache free space is not 1Mb + %u\n", sectorsize);
605                 return -EINVAL;
606         }
607
608         offset = btrfs_find_space_for_alloc(cache,
609                                             0, SZ_1M, 0,
610                                             &max_extent_size);
611         if (offset != (SZ_128M - SZ_256K)) {
612                 test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n",
613                          offset);
614                 return -EINVAL;
615         }
616
617         /*
618          * All that remains is a sectorsize free space region in a bitmap.
619          * Confirm.
620          */
621         ret = check_num_extents_and_bitmaps(cache, 1, 1);
622         if (ret)
623                 return ret;
624
625         if (cache->free_space_ctl->free_space != sectorsize) {
626                 test_msg("Cache free space is not %u\n", sectorsize);
627                 return -EINVAL;
628         }
629
630         offset = btrfs_find_space_for_alloc(cache,
631                                             0, sectorsize, 0,
632                                             &max_extent_size);
633         if (offset != (SZ_128M + SZ_16M)) {
634                 test_msg("Failed to allocate %u, returned offset : %llu\n",
635                          sectorsize, offset);
636                 return -EINVAL;
637         }
638
639         ret = check_cache_empty(cache);
640         if (ret)
641                 return ret;
642
643         __btrfs_remove_free_space_cache(cache->free_space_ctl);
644
645         /*
646          * Now test a similar scenario, but where our extent entry is located
647          * to the right of the bitmap entry, so that we can check that stealing
648          * space from a bitmap to the front of an extent entry works.
649          */
650
651         /*
652          * Extent entry covering free space range [128Mb + 128Kb, 128Mb + 256Kb[
653          */
654         ret = test_add_free_space_entry(cache, SZ_128M + SZ_128K, SZ_128K, 0);
655         if (ret) {
656                 test_msg("Couldn't add extent entry %d\n", ret);
657                 return ret;
658         }
659
660         /* Bitmap entry covering free space range [0, 128Mb - 512Kb[ */
661         ret = test_add_free_space_entry(cache, 0, SZ_128M - SZ_512K, 1);
662         if (ret) {
663                 test_msg("Couldn't add bitmap entry %d\n", ret);
664                 return ret;
665         }
666
667         ret = check_num_extents_and_bitmaps(cache, 2, 1);
668         if (ret)
669                 return ret;
670
671         /*
672          * Now make only the last 256Kb of the bitmap marked as free, so that
673          * we end up with only the following ranges marked as free space:
674          *
675          * [128Mb + 128b, 128Mb + 256Kb[
676          * [128Mb - 768Kb, 128Mb - 512Kb[
677          */
678         ret = btrfs_remove_free_space(cache, 0, SZ_128M - 768 * SZ_1K);
679         if (ret) {
680                 test_msg("Failed to free part of bitmap space %d\n", ret);
681                 return ret;
682         }
683
684         /* Confirm that only those 2 ranges are marked as free. */
685         if (!test_check_exists(cache, SZ_128M + SZ_128K, SZ_128K)) {
686                 test_msg("Free space range missing\n");
687                 return -ENOENT;
688         }
689         if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_256K)) {
690                 test_msg("Free space range missing\n");
691                 return -ENOENT;
692         }
693
694         /*
695          * Confirm that the bitmap range [0, 128Mb - 768Kb[ isn't marked
696          * as free anymore.
697          */
698         if (test_check_exists(cache, 0, SZ_128M - 768 * SZ_1K)) {
699                 test_msg("Bitmap region not removed from space cache\n");
700                 return -EINVAL;
701         }
702
703         /*
704          * Confirm that the region [128Mb - 512Kb, 128Mb[, which is
705          * covered by the bitmap, isn't marked as free.
706          */
707         if (test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) {
708                 test_msg("Invalid bitmap region marked as free\n");
709                 return -EINVAL;
710         }
711
712         /*
713          * Now lets mark the region [128Mb - 512Kb, 128Mb[ as free too. But,
714          * lets make sure the free space cache marks it as free in the bitmap,
715          * and doesn't insert a new extent entry to represent this region.
716          */
717         ret = btrfs_add_free_space(cache, SZ_128M - SZ_512K, SZ_512K);
718         if (ret) {
719                 test_msg("Error adding free space: %d\n", ret);
720                 return ret;
721         }
722         /* Confirm the region is marked as free. */
723         if (!test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) {
724                 test_msg("Bitmap region not marked as free\n");
725                 return -ENOENT;
726         }
727
728         /*
729          * Confirm that no new extent entries or bitmap entries were added to
730          * the cache after adding that free space region.
731          */
732         ret = check_num_extents_and_bitmaps(cache, 2, 1);
733         if (ret)
734                 return ret;
735
736         /*
737          * Now lets add a small free space region to the left of the previous
738          * one, which is not contiguous with it and is part of the bitmap too.
739          * The goal is to test that the bitmap entry space stealing doesn't
740          * steal this space region.
741          */
742         ret = btrfs_add_free_space(cache, SZ_32M, 2 * sectorsize);
743         if (ret) {
744                 test_msg("Error adding free space: %d\n", ret);
745                 return ret;
746         }
747
748         /*
749          * Now mark the region [128Mb, 128Mb + 128Kb[ as free too. This will
750          * expand the range covered by the existing extent entry that represents
751          * the free space [128Mb + 128Kb, 128Mb + 256Kb[.
752          */
753         ret = btrfs_add_free_space(cache, SZ_128M, SZ_128K);
754         if (ret) {
755                 test_msg("Error adding free space: %d\n", ret);
756                 return ret;
757         }
758         /* Confirm the region is marked as free. */
759         if (!test_check_exists(cache, SZ_128M, SZ_128K)) {
760                 test_msg("Extent region not marked as free\n");
761                 return -ENOENT;
762         }
763
764         /*
765          * Confirm that our extent entry didn't stole all free space from the
766          * bitmap, because of the small 2 * sectorsize free space region.
767          */
768         ret = check_num_extents_and_bitmaps(cache, 2, 1);
769         if (ret)
770                 return ret;
771
772         /*
773          * So now we have the range [128Mb - 768Kb, 128Mb + 256Kb[ as free
774          * space. Without stealing bitmap free space into extent entry space,
775          * we would have all this free space represented by 2 entries in the
776          * cache:
777          *
778          * extent entry covering range: [128Mb, 128Mb + 256Kb[
779          * bitmap entry covering range: [128Mb - 768Kb, 128Mb[
780          *
781          * Attempting to allocate the whole free space (1Mb) would fail, because
782          * we can't allocate from multiple entries.
783          * With the bitmap free space stealing, we get a single extent entry
784          * that represents the 1Mb free space, and therefore we're able to
785          * allocate the whole free space at once.
786          */
787         if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_1M)) {
788                 test_msg("Expected region not marked as free\n");
789                 return -ENOENT;
790         }
791
792         if (cache->free_space_ctl->free_space != (SZ_1M + 2 * sectorsize)) {
793                 test_msg("Cache free space is not 1Mb + %u\n", 2 * sectorsize);
794                 return -EINVAL;
795         }
796
797         offset = btrfs_find_space_for_alloc(cache, 0, SZ_1M, 0,
798                                             &max_extent_size);
799         if (offset != (SZ_128M - 768 * SZ_1K)) {
800                 test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n",
801                          offset);
802                 return -EINVAL;
803         }
804
805         /*
806          * All that remains is 2 * sectorsize free space region
807          * in a bitmap. Confirm.
808          */
809         ret = check_num_extents_and_bitmaps(cache, 1, 1);
810         if (ret)
811                 return ret;
812
813         if (cache->free_space_ctl->free_space != 2 * sectorsize) {
814                 test_msg("Cache free space is not %u\n", 2 * sectorsize);
815                 return -EINVAL;
816         }
817
818         offset = btrfs_find_space_for_alloc(cache,
819                                             0, 2 * sectorsize, 0,
820                                             &max_extent_size);
821         if (offset != SZ_32M) {
822                 test_msg("Failed to allocate %u, offset: %llu\n",
823                          2 * sectorsize,
824                          offset);
825                 return -EINVAL;
826         }
827
828         ret = check_cache_empty(cache);
829         if (ret)
830                 return ret;
831
832         cache->free_space_ctl->op = orig_free_space_ops;
833         __btrfs_remove_free_space_cache(cache->free_space_ctl);
834
835         return 0;
836 }
837
838 int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize)
839 {
840         struct btrfs_fs_info *fs_info;
841         struct btrfs_block_group_cache *cache;
842         struct btrfs_root *root = NULL;
843         int ret = -ENOMEM;
844
845         test_msg("Running btrfs free space cache tests\n");
846         fs_info = btrfs_alloc_dummy_fs_info(nodesize, sectorsize);
847         if (!fs_info)
848                 return -ENOMEM;
849
850
851         /*
852          * For ppc64 (with 64k page size), bytes per bitmap might be
853          * larger than 1G.  To make bitmap test available in ppc64,
854          * alloc dummy block group whose size cross bitmaps.
855          */
856         cache = btrfs_alloc_dummy_block_group(fs_info,
857                                       BITS_PER_BITMAP * sectorsize + PAGE_SIZE);
858         if (!cache) {
859                 test_msg("Couldn't run the tests\n");
860                 btrfs_free_dummy_fs_info(fs_info);
861                 return 0;
862         }
863
864         root = btrfs_alloc_dummy_root(fs_info);
865         if (IS_ERR(root)) {
866                 ret = PTR_ERR(root);
867                 goto out;
868         }
869
870         root->fs_info->extent_root = root;
871
872         ret = test_extents(cache);
873         if (ret)
874                 goto out;
875         ret = test_bitmaps(cache, sectorsize);
876         if (ret)
877                 goto out;
878         ret = test_bitmaps_and_extents(cache, sectorsize);
879         if (ret)
880                 goto out;
881
882         ret = test_steal_space_from_bitmap_to_extent(cache, sectorsize);
883 out:
884         btrfs_free_dummy_block_group(cache);
885         btrfs_free_dummy_root(root);
886         btrfs_free_dummy_fs_info(fs_info);
887         test_msg("Free space cache tests finished\n");
888         return ret;
889 }