diff options
Diffstat (limited to 'fs/btrfs/free-space-cache.c')
-rw-r--r-- | fs/btrfs/free-space-cache.c | 193 |
1 files changed, 76 insertions, 117 deletions
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index bf0d61567f3..41ac927401d 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -98,6 +98,12 @@ struct inode *lookup_free_space_inode(struct btrfs_root *root, | |||
98 | return inode; | 98 | return inode; |
99 | 99 | ||
100 | spin_lock(&block_group->lock); | 100 | spin_lock(&block_group->lock); |
101 | if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) { | ||
102 | printk(KERN_INFO "Old style space inode found, converting.\n"); | ||
103 | BTRFS_I(inode)->flags &= ~BTRFS_INODE_NODATASUM; | ||
104 | block_group->disk_cache_state = BTRFS_DC_CLEAR; | ||
105 | } | ||
106 | |||
101 | if (!btrfs_fs_closing(root->fs_info)) { | 107 | if (!btrfs_fs_closing(root->fs_info)) { |
102 | block_group->inode = igrab(inode); | 108 | block_group->inode = igrab(inode); |
103 | block_group->iref = 1; | 109 | block_group->iref = 1; |
@@ -135,7 +141,7 @@ int __create_free_space_inode(struct btrfs_root *root, | |||
135 | btrfs_set_inode_gid(leaf, inode_item, 0); | 141 | btrfs_set_inode_gid(leaf, inode_item, 0); |
136 | btrfs_set_inode_mode(leaf, inode_item, S_IFREG | 0600); | 142 | btrfs_set_inode_mode(leaf, inode_item, S_IFREG | 0600); |
137 | btrfs_set_inode_flags(leaf, inode_item, BTRFS_INODE_NOCOMPRESS | | 143 | btrfs_set_inode_flags(leaf, inode_item, BTRFS_INODE_NOCOMPRESS | |
138 | BTRFS_INODE_PREALLOC | BTRFS_INODE_NODATASUM); | 144 | BTRFS_INODE_PREALLOC); |
139 | btrfs_set_inode_nlink(leaf, inode_item, 1); | 145 | btrfs_set_inode_nlink(leaf, inode_item, 1); |
140 | btrfs_set_inode_transid(leaf, inode_item, trans->transid); | 146 | btrfs_set_inode_transid(leaf, inode_item, trans->transid); |
141 | btrfs_set_inode_block_group(leaf, inode_item, offset); | 147 | btrfs_set_inode_block_group(leaf, inode_item, offset); |
@@ -184,9 +190,11 @@ int btrfs_truncate_free_space_cache(struct btrfs_root *root, | |||
184 | struct btrfs_path *path, | 190 | struct btrfs_path *path, |
185 | struct inode *inode) | 191 | struct inode *inode) |
186 | { | 192 | { |
193 | struct btrfs_block_rsv *rsv; | ||
187 | loff_t oldsize; | 194 | loff_t oldsize; |
188 | int ret = 0; | 195 | int ret = 0; |
189 | 196 | ||
197 | rsv = trans->block_rsv; | ||
190 | trans->block_rsv = root->orphan_block_rsv; | 198 | trans->block_rsv = root->orphan_block_rsv; |
191 | ret = btrfs_block_rsv_check(trans, root, | 199 | ret = btrfs_block_rsv_check(trans, root, |
192 | root->orphan_block_rsv, | 200 | root->orphan_block_rsv, |
@@ -204,6 +212,8 @@ int btrfs_truncate_free_space_cache(struct btrfs_root *root, | |||
204 | */ | 212 | */ |
205 | ret = btrfs_truncate_inode_items(trans, root, inode, | 213 | ret = btrfs_truncate_inode_items(trans, root, inode, |
206 | 0, BTRFS_EXTENT_DATA_KEY); | 214 | 0, BTRFS_EXTENT_DATA_KEY); |
215 | |||
216 | trans->block_rsv = rsv; | ||
207 | if (ret) { | 217 | if (ret) { |
208 | WARN_ON(1); | 218 | WARN_ON(1); |
209 | return ret; | 219 | return ret; |
@@ -239,17 +249,12 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
239 | struct btrfs_free_space_header *header; | 249 | struct btrfs_free_space_header *header; |
240 | struct extent_buffer *leaf; | 250 | struct extent_buffer *leaf; |
241 | struct page *page; | 251 | struct page *page; |
242 | u32 *checksums = NULL, *crc; | ||
243 | char *disk_crcs = NULL; | ||
244 | struct btrfs_key key; | 252 | struct btrfs_key key; |
245 | struct list_head bitmaps; | 253 | struct list_head bitmaps; |
246 | u64 num_entries; | 254 | u64 num_entries; |
247 | u64 num_bitmaps; | 255 | u64 num_bitmaps; |
248 | u64 generation; | 256 | u64 generation; |
249 | u32 cur_crc = ~(u32)0; | ||
250 | pgoff_t index = 0; | 257 | pgoff_t index = 0; |
251 | unsigned long first_page_offset; | ||
252 | int num_checksums; | ||
253 | int ret = 0; | 258 | int ret = 0; |
254 | 259 | ||
255 | INIT_LIST_HEAD(&bitmaps); | 260 | INIT_LIST_HEAD(&bitmaps); |
@@ -292,16 +297,6 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
292 | if (!num_entries) | 297 | if (!num_entries) |
293 | goto out; | 298 | goto out; |
294 | 299 | ||
295 | /* Setup everything for doing checksumming */ | ||
296 | num_checksums = i_size_read(inode) / PAGE_CACHE_SIZE; | ||
297 | checksums = crc = kzalloc(sizeof(u32) * num_checksums, GFP_NOFS); | ||
298 | if (!checksums) | ||
299 | goto out; | ||
300 | first_page_offset = (sizeof(u32) * num_checksums) + sizeof(u64); | ||
301 | disk_crcs = kzalloc(first_page_offset, GFP_NOFS); | ||
302 | if (!disk_crcs) | ||
303 | goto out; | ||
304 | |||
305 | ret = readahead_cache(inode); | 300 | ret = readahead_cache(inode); |
306 | if (ret) | 301 | if (ret) |
307 | goto out; | 302 | goto out; |
@@ -311,18 +306,12 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
311 | struct btrfs_free_space *e; | 306 | struct btrfs_free_space *e; |
312 | void *addr; | 307 | void *addr; |
313 | unsigned long offset = 0; | 308 | unsigned long offset = 0; |
314 | unsigned long start_offset = 0; | ||
315 | int need_loop = 0; | 309 | int need_loop = 0; |
316 | 310 | ||
317 | if (!num_entries && !num_bitmaps) | 311 | if (!num_entries && !num_bitmaps) |
318 | break; | 312 | break; |
319 | 313 | ||
320 | if (index == 0) { | 314 | page = find_or_create_page(inode->i_mapping, index, GFP_NOFS); |
321 | start_offset = first_page_offset; | ||
322 | offset = start_offset; | ||
323 | } | ||
324 | |||
325 | page = grab_cache_page(inode->i_mapping, index); | ||
326 | if (!page) | 315 | if (!page) |
327 | goto free_cache; | 316 | goto free_cache; |
328 | 317 | ||
@@ -342,8 +331,15 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
342 | if (index == 0) { | 331 | if (index == 0) { |
343 | u64 *gen; | 332 | u64 *gen; |
344 | 333 | ||
345 | memcpy(disk_crcs, addr, first_page_offset); | 334 | /* |
346 | gen = addr + (sizeof(u32) * num_checksums); | 335 | * We put a bogus crc in the front of the first page in |
336 | * case old kernels try to mount a fs with the new | ||
337 | * format to make sure they discard the cache. | ||
338 | */ | ||
339 | addr += sizeof(u64); | ||
340 | offset += sizeof(u64); | ||
341 | |||
342 | gen = addr; | ||
347 | if (*gen != BTRFS_I(inode)->generation) { | 343 | if (*gen != BTRFS_I(inode)->generation) { |
348 | printk(KERN_ERR "btrfs: space cache generation" | 344 | printk(KERN_ERR "btrfs: space cache generation" |
349 | " (%llu) does not match inode (%llu)\n", | 345 | " (%llu) does not match inode (%llu)\n", |
@@ -355,24 +351,10 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
355 | page_cache_release(page); | 351 | page_cache_release(page); |
356 | goto free_cache; | 352 | goto free_cache; |
357 | } | 353 | } |
358 | crc = (u32 *)disk_crcs; | 354 | addr += sizeof(u64); |
355 | offset += sizeof(u64); | ||
359 | } | 356 | } |
360 | entry = addr + start_offset; | 357 | entry = addr; |
361 | |||
362 | /* First lets check our crc before we do anything fun */ | ||
363 | cur_crc = ~(u32)0; | ||
364 | cur_crc = btrfs_csum_data(root, addr + start_offset, cur_crc, | ||
365 | PAGE_CACHE_SIZE - start_offset); | ||
366 | btrfs_csum_final(cur_crc, (char *)&cur_crc); | ||
367 | if (cur_crc != *crc) { | ||
368 | printk(KERN_ERR "btrfs: crc mismatch for page %lu\n", | ||
369 | index); | ||
370 | kunmap(page); | ||
371 | unlock_page(page); | ||
372 | page_cache_release(page); | ||
373 | goto free_cache; | ||
374 | } | ||
375 | crc++; | ||
376 | 358 | ||
377 | while (1) { | 359 | while (1) { |
378 | if (!num_entries) | 360 | if (!num_entries) |
@@ -470,8 +452,6 @@ next: | |||
470 | 452 | ||
471 | ret = 1; | 453 | ret = 1; |
472 | out: | 454 | out: |
473 | kfree(checksums); | ||
474 | kfree(disk_crcs); | ||
475 | return ret; | 455 | return ret; |
476 | free_cache: | 456 | free_cache: |
477 | __btrfs_remove_free_space_cache(ctl); | 457 | __btrfs_remove_free_space_cache(ctl); |
@@ -569,8 +549,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
569 | struct btrfs_key key; | 549 | struct btrfs_key key; |
570 | u64 start, end, len; | 550 | u64 start, end, len; |
571 | u64 bytes = 0; | 551 | u64 bytes = 0; |
572 | u32 *crc, *checksums; | 552 | u32 crc = ~(u32)0; |
573 | unsigned long first_page_offset; | ||
574 | int index = 0, num_pages = 0; | 553 | int index = 0, num_pages = 0; |
575 | int entries = 0; | 554 | int entries = 0; |
576 | int bitmaps = 0; | 555 | int bitmaps = 0; |
@@ -590,34 +569,13 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
590 | num_pages = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> | 569 | num_pages = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> |
591 | PAGE_CACHE_SHIFT; | 570 | PAGE_CACHE_SHIFT; |
592 | 571 | ||
593 | /* Since the first page has all of our checksums and our generation we | ||
594 | * need to calculate the offset into the page that we can start writing | ||
595 | * our entries. | ||
596 | */ | ||
597 | first_page_offset = (sizeof(u32) * num_pages) + sizeof(u64); | ||
598 | |||
599 | filemap_write_and_wait(inode->i_mapping); | 572 | filemap_write_and_wait(inode->i_mapping); |
600 | btrfs_wait_ordered_range(inode, inode->i_size & | 573 | btrfs_wait_ordered_range(inode, inode->i_size & |
601 | ~(root->sectorsize - 1), (u64)-1); | 574 | ~(root->sectorsize - 1), (u64)-1); |
602 | 575 | ||
603 | /* make sure we don't overflow that first page */ | ||
604 | if (first_page_offset + sizeof(struct btrfs_free_space_entry) >= PAGE_CACHE_SIZE) { | ||
605 | /* this is really the same as running out of space, where we also return 0 */ | ||
606 | printk(KERN_CRIT "Btrfs: free space cache was too big for the crc page\n"); | ||
607 | ret = 0; | ||
608 | goto out_update; | ||
609 | } | ||
610 | |||
611 | /* We need a checksum per page. */ | ||
612 | crc = checksums = kzalloc(sizeof(u32) * num_pages, GFP_NOFS); | ||
613 | if (!crc) | ||
614 | return -1; | ||
615 | |||
616 | pages = kzalloc(sizeof(struct page *) * num_pages, GFP_NOFS); | 576 | pages = kzalloc(sizeof(struct page *) * num_pages, GFP_NOFS); |
617 | if (!pages) { | 577 | if (!pages) |
618 | kfree(crc); | ||
619 | return -1; | 578 | return -1; |
620 | } | ||
621 | 579 | ||
622 | /* Get the cluster for this block_group if it exists */ | 580 | /* Get the cluster for this block_group if it exists */ |
623 | if (block_group && !list_empty(&block_group->cluster_list)) | 581 | if (block_group && !list_empty(&block_group->cluster_list)) |
@@ -640,7 +598,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
640 | * know and don't freak out. | 598 | * know and don't freak out. |
641 | */ | 599 | */ |
642 | while (index < num_pages) { | 600 | while (index < num_pages) { |
643 | page = grab_cache_page(inode->i_mapping, index); | 601 | page = find_or_create_page(inode->i_mapping, index, GFP_NOFS); |
644 | if (!page) { | 602 | if (!page) { |
645 | int i; | 603 | int i; |
646 | 604 | ||
@@ -648,7 +606,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
648 | unlock_page(pages[i]); | 606 | unlock_page(pages[i]); |
649 | page_cache_release(pages[i]); | 607 | page_cache_release(pages[i]); |
650 | } | 608 | } |
651 | goto out_free; | 609 | goto out; |
652 | } | 610 | } |
653 | pages[index] = page; | 611 | pages[index] = page; |
654 | index++; | 612 | index++; |
@@ -668,17 +626,11 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
668 | /* Write out the extent entries */ | 626 | /* Write out the extent entries */ |
669 | do { | 627 | do { |
670 | struct btrfs_free_space_entry *entry; | 628 | struct btrfs_free_space_entry *entry; |
671 | void *addr; | 629 | void *addr, *orig; |
672 | unsigned long offset = 0; | 630 | unsigned long offset = 0; |
673 | unsigned long start_offset = 0; | ||
674 | 631 | ||
675 | next_page = false; | 632 | next_page = false; |
676 | 633 | ||
677 | if (index == 0) { | ||
678 | start_offset = first_page_offset; | ||
679 | offset = start_offset; | ||
680 | } | ||
681 | |||
682 | if (index >= num_pages) { | 634 | if (index >= num_pages) { |
683 | out_of_space = true; | 635 | out_of_space = true; |
684 | break; | 636 | break; |
@@ -686,10 +638,26 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
686 | 638 | ||
687 | page = pages[index]; | 639 | page = pages[index]; |
688 | 640 | ||
689 | addr = kmap(page); | 641 | orig = addr = kmap(page); |
690 | entry = addr + start_offset; | 642 | if (index == 0) { |
643 | u64 *gen; | ||
691 | 644 | ||
692 | memset(addr, 0, PAGE_CACHE_SIZE); | 645 | /* |
646 | * We're going to put in a bogus crc for this page to | ||
647 | * make sure that old kernels who aren't aware of this | ||
648 | * format will be sure to discard the cache. | ||
649 | */ | ||
650 | addr += sizeof(u64); | ||
651 | offset += sizeof(u64); | ||
652 | |||
653 | gen = addr; | ||
654 | *gen = trans->transid; | ||
655 | addr += sizeof(u64); | ||
656 | offset += sizeof(u64); | ||
657 | } | ||
658 | entry = addr; | ||
659 | |||
660 | memset(addr, 0, PAGE_CACHE_SIZE - offset); | ||
693 | while (node && !next_page) { | 661 | while (node && !next_page) { |
694 | struct btrfs_free_space *e; | 662 | struct btrfs_free_space *e; |
695 | 663 | ||
@@ -752,13 +720,19 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
752 | next_page = true; | 720 | next_page = true; |
753 | entry++; | 721 | entry++; |
754 | } | 722 | } |
755 | *crc = ~(u32)0; | ||
756 | *crc = btrfs_csum_data(root, addr + start_offset, *crc, | ||
757 | PAGE_CACHE_SIZE - start_offset); | ||
758 | kunmap(page); | ||
759 | 723 | ||
760 | btrfs_csum_final(*crc, (char *)crc); | 724 | /* Generate bogus crc value */ |
761 | crc++; | 725 | if (index == 0) { |
726 | u32 *tmp; | ||
727 | crc = btrfs_csum_data(root, orig + sizeof(u64), crc, | ||
728 | PAGE_CACHE_SIZE - sizeof(u64)); | ||
729 | btrfs_csum_final(crc, (char *)&crc); | ||
730 | crc++; | ||
731 | tmp = orig; | ||
732 | *tmp = crc; | ||
733 | } | ||
734 | |||
735 | kunmap(page); | ||
762 | 736 | ||
763 | bytes += PAGE_CACHE_SIZE; | 737 | bytes += PAGE_CACHE_SIZE; |
764 | 738 | ||
@@ -779,11 +753,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
779 | 753 | ||
780 | addr = kmap(page); | 754 | addr = kmap(page); |
781 | memcpy(addr, entry->bitmap, PAGE_CACHE_SIZE); | 755 | memcpy(addr, entry->bitmap, PAGE_CACHE_SIZE); |
782 | *crc = ~(u32)0; | ||
783 | *crc = btrfs_csum_data(root, addr, *crc, PAGE_CACHE_SIZE); | ||
784 | kunmap(page); | 756 | kunmap(page); |
785 | btrfs_csum_final(*crc, (char *)crc); | ||
786 | crc++; | ||
787 | bytes += PAGE_CACHE_SIZE; | 757 | bytes += PAGE_CACHE_SIZE; |
788 | 758 | ||
789 | list_del_init(&entry->list); | 759 | list_del_init(&entry->list); |
@@ -796,7 +766,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
796 | i_size_read(inode) - 1, &cached_state, | 766 | i_size_read(inode) - 1, &cached_state, |
797 | GFP_NOFS); | 767 | GFP_NOFS); |
798 | ret = 0; | 768 | ret = 0; |
799 | goto out_free; | 769 | goto out; |
800 | } | 770 | } |
801 | 771 | ||
802 | /* Zero out the rest of the pages just to make sure */ | 772 | /* Zero out the rest of the pages just to make sure */ |
@@ -811,20 +781,6 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
811 | index++; | 781 | index++; |
812 | } | 782 | } |
813 | 783 | ||
814 | /* Write the checksums and trans id to the first page */ | ||
815 | { | ||
816 | void *addr; | ||
817 | u64 *gen; | ||
818 | |||
819 | page = pages[0]; | ||
820 | |||
821 | addr = kmap(page); | ||
822 | memcpy(addr, checksums, sizeof(u32) * num_pages); | ||
823 | gen = addr + (sizeof(u32) * num_pages); | ||
824 | *gen = trans->transid; | ||
825 | kunmap(page); | ||
826 | } | ||
827 | |||
828 | ret = btrfs_dirty_pages(root, inode, pages, num_pages, 0, | 784 | ret = btrfs_dirty_pages(root, inode, pages, num_pages, 0, |
829 | bytes, &cached_state); | 785 | bytes, &cached_state); |
830 | btrfs_drop_pages(pages, num_pages); | 786 | btrfs_drop_pages(pages, num_pages); |
@@ -833,7 +789,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
833 | 789 | ||
834 | if (ret) { | 790 | if (ret) { |
835 | ret = 0; | 791 | ret = 0; |
836 | goto out_free; | 792 | goto out; |
837 | } | 793 | } |
838 | 794 | ||
839 | BTRFS_I(inode)->generation = trans->transid; | 795 | BTRFS_I(inode)->generation = trans->transid; |
@@ -850,7 +806,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
850 | clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, bytes - 1, | 806 | clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, bytes - 1, |
851 | EXTENT_DIRTY | EXTENT_DELALLOC | | 807 | EXTENT_DIRTY | EXTENT_DELALLOC | |
852 | EXTENT_DO_ACCOUNTING, 0, 0, NULL, GFP_NOFS); | 808 | EXTENT_DO_ACCOUNTING, 0, 0, NULL, GFP_NOFS); |
853 | goto out_free; | 809 | goto out; |
854 | } | 810 | } |
855 | leaf = path->nodes[0]; | 811 | leaf = path->nodes[0]; |
856 | if (ret > 0) { | 812 | if (ret > 0) { |
@@ -866,7 +822,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
866 | EXTENT_DO_ACCOUNTING, 0, 0, NULL, | 822 | EXTENT_DO_ACCOUNTING, 0, 0, NULL, |
867 | GFP_NOFS); | 823 | GFP_NOFS); |
868 | btrfs_release_path(path); | 824 | btrfs_release_path(path); |
869 | goto out_free; | 825 | goto out; |
870 | } | 826 | } |
871 | } | 827 | } |
872 | header = btrfs_item_ptr(leaf, path->slots[0], | 828 | header = btrfs_item_ptr(leaf, path->slots[0], |
@@ -879,11 +835,8 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
879 | 835 | ||
880 | ret = 1; | 836 | ret = 1; |
881 | 837 | ||
882 | out_free: | 838 | out: |
883 | kfree(checksums); | ||
884 | kfree(pages); | 839 | kfree(pages); |
885 | |||
886 | out_update: | ||
887 | if (ret != 1) { | 840 | if (ret != 1) { |
888 | invalidate_inode_pages2_range(inode->i_mapping, 0, index); | 841 | invalidate_inode_pages2_range(inode->i_mapping, 0, index); |
889 | BTRFS_I(inode)->generation = 0; | 842 | BTRFS_I(inode)->generation = 0; |
@@ -1219,9 +1172,9 @@ static void recalculate_thresholds(struct btrfs_free_space_ctl *ctl) | |||
1219 | div64_u64(extent_bytes, (sizeof(struct btrfs_free_space))); | 1172 | div64_u64(extent_bytes, (sizeof(struct btrfs_free_space))); |
1220 | } | 1173 | } |
1221 | 1174 | ||
1222 | static void bitmap_clear_bits(struct btrfs_free_space_ctl *ctl, | 1175 | static inline void __bitmap_clear_bits(struct btrfs_free_space_ctl *ctl, |
1223 | struct btrfs_free_space *info, u64 offset, | 1176 | struct btrfs_free_space *info, |
1224 | u64 bytes) | 1177 | u64 offset, u64 bytes) |
1225 | { | 1178 | { |
1226 | unsigned long start, count; | 1179 | unsigned long start, count; |
1227 | 1180 | ||
@@ -1232,6 +1185,13 @@ static void bitmap_clear_bits(struct btrfs_free_space_ctl *ctl, | |||
1232 | bitmap_clear(info->bitmap, start, count); | 1185 | bitmap_clear(info->bitmap, start, count); |
1233 | 1186 | ||
1234 | info->bytes -= bytes; | 1187 | info->bytes -= bytes; |
1188 | } | ||
1189 | |||
1190 | static void bitmap_clear_bits(struct btrfs_free_space_ctl *ctl, | ||
1191 | struct btrfs_free_space *info, u64 offset, | ||
1192 | u64 bytes) | ||
1193 | { | ||
1194 | __bitmap_clear_bits(ctl, info, offset, bytes); | ||
1235 | ctl->free_space -= bytes; | 1195 | ctl->free_space -= bytes; |
1236 | } | 1196 | } |
1237 | 1197 | ||
@@ -2035,7 +1995,7 @@ static u64 btrfs_alloc_from_bitmap(struct btrfs_block_group_cache *block_group, | |||
2035 | return 0; | 1995 | return 0; |
2036 | 1996 | ||
2037 | ret = search_start; | 1997 | ret = search_start; |
2038 | bitmap_clear_bits(ctl, entry, ret, bytes); | 1998 | __bitmap_clear_bits(ctl, entry, ret, bytes); |
2039 | 1999 | ||
2040 | return ret; | 2000 | return ret; |
2041 | } | 2001 | } |
@@ -2090,7 +2050,6 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group, | |||
2090 | continue; | 2050 | continue; |
2091 | } | 2051 | } |
2092 | } else { | 2052 | } else { |
2093 | |||
2094 | ret = entry->offset; | 2053 | ret = entry->offset; |
2095 | 2054 | ||
2096 | entry->offset += bytes; | 2055 | entry->offset += bytes; |