diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index b117dd3b8172..2f9515dccce0 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -209,7 +209,7 @@ void btrfs_set_buffer_lockdep_class(u64 objectid, struct extent_buffer *eb,  static void csum_tree_block(struct extent_buffer *buf, u8 *result)  {  	struct btrfs_fs_info *fs_info = buf->fs_info; -	const int num_pages = fs_info->nodesize >> PAGE_SHIFT; +	const int num_pages = num_extent_pages(buf);  	const int first_page_part = min_t(u32, PAGE_SIZE, fs_info->nodesize);  	SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);  	char *kaddr; @@ -3392,11 +3392,16 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device  		goto fail_alloc;  	} -	/* For 4K sector size support, it's only read-only */ -	if (PAGE_SIZE == SZ_64K && sectorsize == SZ_4K) { -		if (!sb_rdonly(sb) || btrfs_super_log_root(disk_super)) { +	if (sectorsize != PAGE_SIZE) { +		btrfs_warn(fs_info, +		"read-write for sector size %u with page size %lu is experimental", +			   sectorsize, PAGE_SIZE); +	} +	if (sectorsize != PAGE_SIZE) { +		if (btrfs_super_incompat_flags(fs_info->super_copy) & +			BTRFS_FEATURE_INCOMPAT_RAID56) {  			btrfs_err(fs_info, -	"subpage sectorsize %u only supported read-only for page size %lu", +		"RAID56 is not yet supported for sector size %u with page size %lu",  				sectorsize, PAGE_SIZE);  			err = -EINVAL;  			goto fail_alloc;  |