diff options
Diffstat (limited to 'fs/btrfs/free-space-cache.c')
| -rw-r--r-- | fs/btrfs/free-space-cache.c | 61 | 
1 files changed, 22 insertions, 39 deletions
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 6b10acfc2f5..59ea2e4349c 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -307,7 +307,6 @@ static void io_ctl_unmap_page(struct io_ctl *io_ctl)  static void io_ctl_map_page(struct io_ctl *io_ctl, int clear)  { -	WARN_ON(io_ctl->cur);  	BUG_ON(io_ctl->index >= io_ctl->num_pages);  	io_ctl->page = io_ctl->pages[io_ctl->index++];  	io_ctl->cur = kmap(io_ctl->page); @@ -966,7 +965,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode,  			       block_group->key.offset)) {  		ret = find_first_extent_bit(unpin, start,  					    &extent_start, &extent_end, -					    EXTENT_DIRTY); +					    EXTENT_DIRTY, NULL);  		if (ret) {  			ret = 0;  			break; @@ -1250,18 +1249,13 @@ tree_search_offset(struct btrfs_free_space_ctl *ctl,  			 * if previous extent entry covers the offset,  			 * we should return it instead of the bitmap entry  			 */ -			n = &entry->offset_index; -			while (1) { -				n = rb_prev(n); -				if (!n) -					break; +			n = rb_prev(&entry->offset_index); +			if (n) {  				prev = rb_entry(n, struct btrfs_free_space,  						offset_index); -				if (!prev->bitmap) { -					if (prev->offset + prev->bytes > offset) -						entry = prev; -					break; -				} +				if (!prev->bitmap && +				    prev->offset + prev->bytes > offset) +					entry = prev;  			}  		}  		return entry; @@ -1287,18 +1281,13 @@ tree_search_offset(struct btrfs_free_space_ctl *ctl,  	}  	if (entry->bitmap) { -		n = &entry->offset_index; -		while (1) { -			n = rb_prev(n); -			if (!n) -				break; +		n = rb_prev(&entry->offset_index); +		if (n) {  			prev = rb_entry(n, struct btrfs_free_space,  					offset_index); -			if (!prev->bitmap) { -				if (prev->offset + prev->bytes > offset) -					return prev; -				break; -			} +			if (!prev->bitmap && +			    prev->offset + prev->bytes > offset) +				return prev;  		}  		if (entry->offset + BITS_PER_BITMAP * ctl->unit > offset)  			return entry; @@ -1364,7 +1353,7 @@ static void recalculate_thresholds(struct btrfs_free_space_ctl *ctl)  	u64 bitmap_bytes;  	u64 extent_bytes;  	u64 size = block_group->key.offset; -	u64 bytes_per_bg = BITS_PER_BITMAP * block_group->sectorsize; +	u64 bytes_per_bg = BITS_PER_BITMAP * ctl->unit;  	int max_bitmaps = div64_u64(size + bytes_per_bg - 1, bytes_per_bg);  	BUG_ON(ctl->total_bitmaps > max_bitmaps); @@ -1454,9 +1443,7 @@ static int search_bitmap(struct btrfs_free_space_ctl *ctl,  			  max_t(u64, *offset, bitmap_info->offset));  	bits = bytes_to_bits(*bytes, ctl->unit); -	for (i = find_next_bit(bitmap_info->bitmap, BITS_PER_BITMAP, i); -	     i < BITS_PER_BITMAP; -	     i = find_next_bit(bitmap_info->bitmap, BITS_PER_BITMAP, i + 1)) { +	for_each_set_bit_from(i, bitmap_info->bitmap, BITS_PER_BITMAP) {  		next_zero = find_next_zero_bit(bitmap_info->bitmap,  					       BITS_PER_BITMAP, i);  		if ((next_zero - i) >= bits) { @@ -1652,8 +1639,7 @@ static bool use_bitmap(struct btrfs_free_space_ctl *ctl,  	 * some block groups are so tiny they can't be enveloped by a bitmap, so  	 * don't even bother to create a bitmap for this  	 */ -	if (BITS_PER_BITMAP * block_group->sectorsize > -	    block_group->key.offset) +	if (BITS_PER_BITMAP * ctl->unit > block_group->key.offset)  		return false;  	return true; @@ -2300,16 +2286,14 @@ static int btrfs_bitmap_cluster(struct btrfs_block_group_cache *block_group,  	unsigned long total_found = 0;  	int ret; -	i = offset_to_bit(entry->offset, block_group->sectorsize, +	i = offset_to_bit(entry->offset, ctl->unit,  			  max_t(u64, offset, entry->offset)); -	want_bits = bytes_to_bits(bytes, block_group->sectorsize); -	min_bits = bytes_to_bits(min_bytes, block_group->sectorsize); +	want_bits = bytes_to_bits(bytes, ctl->unit); +	min_bits = bytes_to_bits(min_bytes, ctl->unit);  again:  	found_bits = 0; -	for (i = find_next_bit(entry->bitmap, BITS_PER_BITMAP, i); -	     i < BITS_PER_BITMAP; -	     i = find_next_bit(entry->bitmap, BITS_PER_BITMAP, i + 1)) { +	for_each_set_bit_from(i, entry->bitmap, BITS_PER_BITMAP) {  		next_zero = find_next_zero_bit(entry->bitmap,  					       BITS_PER_BITMAP, i);  		if (next_zero - i >= min_bits) { @@ -2329,23 +2313,22 @@ again:  	total_found += found_bits; -	if (cluster->max_size < found_bits * block_group->sectorsize) -		cluster->max_size = found_bits * block_group->sectorsize; +	if (cluster->max_size < found_bits * ctl->unit) +		cluster->max_size = found_bits * ctl->unit;  	if (total_found < want_bits || cluster->max_size < cont1_bytes) {  		i = next_zero + 1;  		goto again;  	} -	cluster->window_start = start * block_group->sectorsize + -		entry->offset; +	cluster->window_start = start * ctl->unit + entry->offset;  	rb_erase(&entry->offset_index, &ctl->free_space_offset);  	ret = tree_insert_offset(&cluster->root, entry->offset,  				 &entry->offset_index, 1);  	BUG_ON(ret); /* -EEXIST; Logic error */  	trace_btrfs_setup_cluster(block_group, cluster, -				  total_found * block_group->sectorsize, 1); +				  total_found * ctl->unit, 1);  	return 0;  }  |