2424#include "free-space-cache.h"
2525#include "transaction.h"
2626#include "disk-io.h"
27+ #include "extent_io.h"
2728
2829#define BITS_PER_BITMAP (PAGE_CACHE_SIZE * 8)
2930#define MAX_CACHE_BYTES_PER_GIG (32 * 1024)
@@ -81,6 +82,8 @@ struct inode *lookup_free_space_inode(struct btrfs_root *root,
8182 return ERR_PTR (- ENOENT );
8283 }
8384
85+ inode -> i_mapping -> flags &= ~__GFP_FS ;
86+
8487 spin_lock (& block_group -> lock );
8588 if (!root -> fs_info -> closing ) {
8689 block_group -> inode = igrab (inode );
@@ -222,6 +225,7 @@ int load_free_space_cache(struct btrfs_fs_info *fs_info,
222225 u64 num_entries ;
223226 u64 num_bitmaps ;
224227 u64 generation ;
228+ u64 used = btrfs_block_group_used (& block_group -> item );
225229 u32 cur_crc = ~(u32 )0 ;
226230 pgoff_t index = 0 ;
227231 unsigned long first_page_offset ;
@@ -467,6 +471,17 @@ int load_free_space_cache(struct btrfs_fs_info *fs_info,
467471 index ++ ;
468472 }
469473
474+ spin_lock (& block_group -> tree_lock );
475+ if (block_group -> free_space != (block_group -> key .offset - used -
476+ block_group -> bytes_super )) {
477+ spin_unlock (& block_group -> tree_lock );
478+ printk (KERN_ERR "block group %llu has an wrong amount of free "
479+ "space\n" , block_group -> key .objectid );
480+ ret = 0 ;
481+ goto free_cache ;
482+ }
483+ spin_unlock (& block_group -> tree_lock );
484+
470485 ret = 1 ;
471486out :
472487 kfree (checksums );
@@ -495,8 +510,11 @@ int btrfs_write_out_cache(struct btrfs_root *root,
495510 struct list_head * pos , * n ;
496511 struct page * page ;
497512 struct extent_state * cached_state = NULL ;
513+ struct btrfs_free_cluster * cluster = NULL ;
514+ struct extent_io_tree * unpin = NULL ;
498515 struct list_head bitmap_list ;
499516 struct btrfs_key key ;
517+ u64 start , end , len ;
500518 u64 bytes = 0 ;
501519 u32 * crc , * checksums ;
502520 pgoff_t index = 0 , last_index = 0 ;
@@ -505,6 +523,7 @@ int btrfs_write_out_cache(struct btrfs_root *root,
505523 int entries = 0 ;
506524 int bitmaps = 0 ;
507525 int ret = 0 ;
526+ bool next_page = false;
508527
509528 root = root -> fs_info -> tree_root ;
510529
@@ -551,6 +570,18 @@ int btrfs_write_out_cache(struct btrfs_root *root,
551570 */
552571 first_page_offset = (sizeof (u32 ) * num_checksums ) + sizeof (u64 );
553572
573+ /* Get the cluster for this block_group if it exists */
574+ if (!list_empty (& block_group -> cluster_list ))
575+ cluster = list_entry (block_group -> cluster_list .next ,
576+ struct btrfs_free_cluster ,
577+ block_group_list );
578+
579+ /*
580+ * We shouldn't have switched the pinned extents yet so this is the
581+ * right one
582+ */
583+ unpin = root -> fs_info -> pinned_extents ;
584+
554585 /*
555586 * Lock all pages first so we can lock the extent safely.
556587 *
@@ -580,13 +611,21 @@ int btrfs_write_out_cache(struct btrfs_root *root,
580611 lock_extent_bits (& BTRFS_I (inode )-> io_tree , 0 , i_size_read (inode ) - 1 ,
581612 0 , & cached_state , GFP_NOFS );
582613
614+ /*
615+ * When searching for pinned extents, we need to start at our start
616+ * offset.
617+ */
618+ start = block_group -> key .objectid ;
619+
583620 /* Write out the extent entries */
584621 do {
585622 struct btrfs_free_space_entry * entry ;
586623 void * addr ;
587624 unsigned long offset = 0 ;
588625 unsigned long start_offset = 0 ;
589626
627+ next_page = false;
628+
590629 if (index == 0 ) {
591630 start_offset = first_page_offset ;
592631 offset = start_offset ;
@@ -598,7 +637,7 @@ int btrfs_write_out_cache(struct btrfs_root *root,
598637 entry = addr + start_offset ;
599638
600639 memset (addr , 0 , PAGE_CACHE_SIZE );
601- while (1 ) {
640+ while (node && ! next_page ) {
602641 struct btrfs_free_space * e ;
603642
604643 e = rb_entry (node , struct btrfs_free_space , offset_index );
@@ -614,12 +653,49 @@ int btrfs_write_out_cache(struct btrfs_root *root,
614653 entry -> type = BTRFS_FREE_SPACE_EXTENT ;
615654 }
616655 node = rb_next (node );
617- if (!node )
618- break ;
656+ if (!node && cluster ) {
657+ node = rb_first (& cluster -> root );
658+ cluster = NULL ;
659+ }
619660 offset += sizeof (struct btrfs_free_space_entry );
620661 if (offset + sizeof (struct btrfs_free_space_entry ) >=
621662 PAGE_CACHE_SIZE )
663+ next_page = true;
664+ entry ++ ;
665+ }
666+
667+ /*
668+ * We want to add any pinned extents to our free space cache
669+ * so we don't leak the space
670+ */
671+ while (!next_page && (start < block_group -> key .objectid +
672+ block_group -> key .offset )) {
673+ ret = find_first_extent_bit (unpin , start , & start , & end ,
674+ EXTENT_DIRTY );
675+ if (ret ) {
676+ ret = 0 ;
677+ break ;
678+ }
679+
680+ /* This pinned extent is out of our range */
681+ if (start >= block_group -> key .objectid +
682+ block_group -> key .offset )
622683 break ;
684+
685+ len = block_group -> key .objectid +
686+ block_group -> key .offset - start ;
687+ len = min (len , end + 1 - start );
688+
689+ entries ++ ;
690+ entry -> offset = cpu_to_le64 (start );
691+ entry -> bytes = cpu_to_le64 (len );
692+ entry -> type = BTRFS_FREE_SPACE_EXTENT ;
693+
694+ start = end + 1 ;
695+ offset += sizeof (struct btrfs_free_space_entry );
696+ if (offset + sizeof (struct btrfs_free_space_entry ) >=
697+ PAGE_CACHE_SIZE )
698+ next_page = true;
623699 entry ++ ;
624700 }
625701 * crc = ~(u32 )0 ;
@@ -650,7 +726,7 @@ int btrfs_write_out_cache(struct btrfs_root *root,
650726 page_cache_release (page );
651727
652728 index ++ ;
653- } while (node );
729+ } while (node || next_page );
654730
655731 /* Write out the bitmaps */
656732 list_for_each_safe (pos , n , & bitmap_list ) {
0 commit comments