diff options
Diffstat (limited to 'fs/btrfs/tests/extent-io-tests.c')
| -rw-r--r-- | fs/btrfs/tests/extent-io-tests.c | 87 | 
1 files changed, 51 insertions, 36 deletions
diff --git a/fs/btrfs/tests/extent-io-tests.c b/fs/btrfs/tests/extent-io-tests.c index d19ab0317283..caad80bb9bd0 100644 --- a/fs/btrfs/tests/extent-io-tests.c +++ b/fs/btrfs/tests/extent-io-tests.c @@ -273,20 +273,37 @@ out:  	return ret;  } -/** - * test_bit_in_byte - Determine whether a bit is set in a byte - * @nr: bit number to test - * @addr: Address to start counting from - */ -static inline int test_bit_in_byte(int nr, const u8 *addr) +static int check_eb_bitmap(unsigned long *bitmap, struct extent_buffer *eb, +			   unsigned long len)  { -	return 1UL & (addr[nr / BITS_PER_BYTE] >> (nr & (BITS_PER_BYTE - 1))); +	unsigned long i; + +	for (i = 0; i < len * BITS_PER_BYTE; i++) { +		int bit, bit1; + +		bit = !!test_bit(i, bitmap); +		bit1 = !!extent_buffer_test_bit(eb, 0, i); +		if (bit1 != bit) { +			test_msg("Bits do not match\n"); +			return -EINVAL; +		} + +		bit1 = !!extent_buffer_test_bit(eb, i / BITS_PER_BYTE, +						i % BITS_PER_BYTE); +		if (bit1 != bit) { +			test_msg("Offset bits do not match\n"); +			return -EINVAL; +		} +	} +	return 0;  }  static int __test_eb_bitmaps(unsigned long *bitmap, struct extent_buffer *eb,  			     unsigned long len)  { -	unsigned long i, x; +	unsigned long i, j; +	u32 x; +	int ret;  	memset(bitmap, 0, len);  	memset_extent_buffer(eb, 0, 0, len); @@ -297,16 +314,18 @@ static int __test_eb_bitmaps(unsigned long *bitmap, struct extent_buffer *eb,  	bitmap_set(bitmap, 0, len * BITS_PER_BYTE);  	extent_buffer_bitmap_set(eb, 0, 0, len * BITS_PER_BYTE); -	if (memcmp_extent_buffer(eb, bitmap, 0, len) != 0) { +	ret = check_eb_bitmap(bitmap, eb, len); +	if (ret) {  		test_msg("Setting all bits failed\n"); -		return -EINVAL; +		return ret;  	}  	bitmap_clear(bitmap, 0, len * BITS_PER_BYTE);  	extent_buffer_bitmap_clear(eb, 0, 0, len * BITS_PER_BYTE); -	if (memcmp_extent_buffer(eb, bitmap, 0, len) != 0) { +	ret = check_eb_bitmap(bitmap, eb, len); +	if (ret) {  		test_msg("Clearing all bits failed\n"); -		return -EINVAL; +		return ret;  	}  	/* Straddling pages test */ @@ -316,9 +335,10 @@ static int __test_eb_bitmaps(unsigned long *bitmap, struct extent_buffer *eb,  			sizeof(long) * BITS_PER_BYTE);  		extent_buffer_bitmap_set(eb, PAGE_SIZE - sizeof(long) / 2, 0,  					sizeof(long) * BITS_PER_BYTE); -		if (memcmp_extent_buffer(eb, bitmap, 0, len) != 0) { +		ret = check_eb_bitmap(bitmap, eb, len); +		if (ret) {  			test_msg("Setting straddling pages failed\n"); -			return -EINVAL; +			return ret;  		}  		bitmap_set(bitmap, 0, len * BITS_PER_BYTE); @@ -328,9 +348,10 @@ static int __test_eb_bitmaps(unsigned long *bitmap, struct extent_buffer *eb,  		extent_buffer_bitmap_set(eb, 0, 0, len * BITS_PER_BYTE);  		extent_buffer_bitmap_clear(eb, PAGE_SIZE - sizeof(long) / 2, 0,  					sizeof(long) * BITS_PER_BYTE); -		if (memcmp_extent_buffer(eb, bitmap, 0, len) != 0) { +		ret = check_eb_bitmap(bitmap, eb, len); +		if (ret) {  			test_msg("Clearing straddling pages failed\n"); -			return -EINVAL; +			return ret;  		}  	} @@ -339,28 +360,22 @@ static int __test_eb_bitmaps(unsigned long *bitmap, struct extent_buffer *eb,  	 * something repetitive that could miss some hypothetical off-by-n bug.  	 */  	x = 0; -	for (i = 0; i < len / sizeof(long); i++) { -		x = (0x19660dULL * (u64)x + 0x3c6ef35fULL) & 0xffffffffUL; -		bitmap[i] = x; -	} -	write_extent_buffer(eb, bitmap, 0, len); - -	for (i = 0; i < len * BITS_PER_BYTE; i++) { -		int bit, bit1; - -		bit = !!test_bit_in_byte(i, (u8 *)bitmap); -		bit1 = !!extent_buffer_test_bit(eb, 0, i); -		if (bit1 != bit) { -			test_msg("Testing bit pattern failed\n"); -			return -EINVAL; +	bitmap_clear(bitmap, 0, len * BITS_PER_BYTE); +	extent_buffer_bitmap_clear(eb, 0, 0, len * BITS_PER_BYTE); +	for (i = 0; i < len * BITS_PER_BYTE / 32; i++) { +		x = (0x19660dULL * (u64)x + 0x3c6ef35fULL) & 0xffffffffU; +		for (j = 0; j < 32; j++) { +			if (x & (1U << j)) { +				bitmap_set(bitmap, i * 32 + j, 1); +				extent_buffer_bitmap_set(eb, 0, i * 32 + j, 1); +			}  		} +	} -		bit1 = !!extent_buffer_test_bit(eb, i / BITS_PER_BYTE, -						i % BITS_PER_BYTE); -		if (bit1 != bit) { -			test_msg("Testing bit pattern with offset failed\n"); -			return -EINVAL; -		} +	ret = check_eb_bitmap(bitmap, eb, len); +	if (ret) { +		test_msg("Random bit pattern failed\n"); +		return ret;  	}  	return 0;  |