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.

Signed-off-by: Qu Wenruo <w...@suse.com>
Signed-off-by: David Sterba <dste...@suse.com>
---
 fs/btrfs/disk-io.c | 24 +++++++++++++++++++++---
 fs/btrfs/super.c   |  7 +++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 0b10577ad2bd..d74ee0a396ac 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -2483,13 +2483,21 @@ static int validate_super(struct btrfs_fs_info *fs_info,
                btrfs_err(fs_info, "invalid sectorsize %llu", sectorsize);
                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 RW for 64K sector size, and RO for
+        * 4K sector size.
+        */
+       if ((SZ_4K == PAGE_SIZE && sectorsize != PAGE_SIZE) ||
+           (SZ_64K == PAGE_SIZE && (sectorsize != SZ_4K &&
+                                    sectorsize != SZ_64K))) {
                btrfs_err(fs_info,
-                       "sectorsize %llu not supported yet, only support %lu",
+                       "sectorsize %llu not supported yet for page size %lu",
                        sectorsize, PAGE_SIZE);
                ret = -EINVAL;
        }
+
        if (!is_power_of_2(nodesize) || nodesize < sectorsize ||
            nodesize > BTRFS_MAX_METADATA_BLOCKSIZE) {
                btrfs_err(fs_info, "invalid nodesize %llu", nodesize);
@@ -3248,6 +3256,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 yet */
+       if (PAGE_SIZE == SZ_64K && sectorsize == SZ_4K) {
+               if (!sb_rdonly(sb) || btrfs_super_log_root(disk_super)) {
+                       btrfs_err(fs_info,
+                               "subpage sector size only support RO yet");
+                       err = -EINVAL;
+                       goto fail_alloc;
+               }
+       }
+
        ret = btrfs_init_workqueues(fs_info, fs_devices);
        if (ret) {
                err = ret;
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 919ed5c357e9..8be9985feeb0 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -2027,6 +2027,13 @@ static int btrfs_remount(struct super_block *sb, int 
*flags, char *data)
                        ret = -EINVAL;
                        goto restore;
                }
+               if (fs_info->sectorsize < PAGE_SIZE) {
+                       btrfs_warn(fs_info,
+       "read-write mount is not yet allowed for sector size %u page size %lu",
+                                  fs_info->sectorsize, PAGE_SIZE);
+                       ret = -EINVAL;
+                       goto restore;
+               }
 
                /*
                 * NOTE: when remounting with a change that does writes, don't
-- 
2.30.0

Reply via email to