Commit 0bb3eb3e authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba

btrfs: allow read-only mount of 4K sector size fs on 64K page system

This adds the basic RO mount ability for 4K sector size on 64K page
system.

Currently we only plan to support 4K and 64K page system.
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 92082d40
...@@ -2483,13 +2483,21 @@ static int validate_super(struct btrfs_fs_info *fs_info, ...@@ -2483,13 +2483,21 @@ static int validate_super(struct btrfs_fs_info *fs_info,
btrfs_err(fs_info, "invalid sectorsize %llu", sectorsize); btrfs_err(fs_info, "invalid sectorsize %llu", sectorsize);
ret = -EINVAL; ret = -EINVAL;
} }
/* Only PAGE SIZE is supported yet */
if (sectorsize != PAGE_SIZE) { /*
* For 4K page size, we only support 4K sector size.
* For 64K page size, we support read-write for 64K sector size, and
* read-only for 4K sector size.
*/
if ((PAGE_SIZE == SZ_4K && sectorsize != PAGE_SIZE) ||
(PAGE_SIZE == SZ_64K && (sectorsize != SZ_4K &&
sectorsize != SZ_64K))) {
btrfs_err(fs_info, btrfs_err(fs_info,
"sectorsize %llu not supported yet, only support %lu", "sectorsize %llu not yet supported for page size %lu",
sectorsize, PAGE_SIZE); sectorsize, PAGE_SIZE);
ret = -EINVAL; ret = -EINVAL;
} }
if (!is_power_of_2(nodesize) || nodesize < sectorsize || if (!is_power_of_2(nodesize) || nodesize < sectorsize ||
nodesize > BTRFS_MAX_METADATA_BLOCKSIZE) { nodesize > BTRFS_MAX_METADATA_BLOCKSIZE) {
btrfs_err(fs_info, "invalid nodesize %llu", nodesize); btrfs_err(fs_info, "invalid nodesize %llu", nodesize);
...@@ -3248,6 +3256,17 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device ...@@ -3248,6 +3256,17 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device
goto fail_alloc; 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)) {
btrfs_err(fs_info,
"subpage sectorsize %u only supported read-only for page size %lu",
sectorsize, PAGE_SIZE);
err = -EINVAL;
goto fail_alloc;
}
}
ret = btrfs_init_workqueues(fs_info, fs_devices); ret = btrfs_init_workqueues(fs_info, fs_devices);
if (ret) { if (ret) {
err = ret; err = ret;
......
...@@ -2027,6 +2027,13 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data) ...@@ -2027,6 +2027,13 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)
ret = -EINVAL; ret = -EINVAL;
goto restore; goto restore;
} }
if (fs_info->sectorsize < PAGE_SIZE) {
btrfs_warn(fs_info,
"read-write mount is not yet allowed for sectorsize %u page size %lu",
fs_info->sectorsize, PAGE_SIZE);
ret = -EINVAL;
goto restore;
}
/* /*
* NOTE: when remounting with a change that does writes, don't * NOTE: when remounting with a change that does writes, don't
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment