On Thu, Mar 06, 2025 at 04:45:06PM -0800, Luis Chamberlain wrote: > On Thu, Mar 06, 2025 at 01:39:49PM -0500, Kent Overstreet wrote: > > On Tue, Mar 04, 2025 at 05:53:01PM -0800, Luis Chamberlain wrote: > > > The commit titled "block/bdev: lift block size restrictions to 64k" > > > lifted the block layer's max supported block size to 64k inside the > > > helper blk_validate_block_size() now that we support large folios. > > > However in lifting the block size we also removed the silly use > > > cases many filesystems have to use sb_set_blocksize() to *verify* > > > that the block size < PAGE_SIZE. The call to sb_set_blocksize() can > > > happen in-kernel given mkfs utilities *can* create for example an > > > ext4 32k block size filesystem on x86_64, the issue we want to prevent > > > is mounting it on x86_64 unless the filesystem supports LBS. > > > > > > While, we could argue that such checks should be filesystem specific, > > > there are much more users of sb_set_blocksize() than LBS enabled > > > filesystem on linux-next, so just do the easier thing and bring back > > > the PAGE_SIZE check for sb_set_blocksize() users. > > > > > > This will ensure that tests such as generic/466 when run in a loop > > > against say, ext4, won't try to try to actually mount a filesystem with > > > a block size larger than your filesystem supports given your PAGE_SIZE > > > and in the worst case crash. > > > > > > Cc: Kent Overstreet <kent.overstreet@xxxxxxxxx> > > > Signed-off-by: Luis Chamberlain <mcgrof@xxxxxxxxxx> > > > > bcachefs doesn't use sb_set_blocksize() - but it appears it should, and > > it does also support bs > ps in -next. > > > > Can we get a proper helper for lbs filesystems? > > What do you think of this last recommention I had? Perfect :) > > diff --git a/block/bdev.c b/block/bdev.c > index 3bd948e6438d..4844d1e27b6f 100644 > --- a/block/bdev.c > +++ b/block/bdev.c > @@ -181,6 +181,8 @@ EXPORT_SYMBOL(set_blocksize); > > int sb_set_blocksize(struct super_block *sb, int size) > { > + if (!(sb->s_type->fs_flags & FS_LBS) && size > PAGE_SIZE) > + return 0; > if (set_blocksize(sb->s_bdev_file, size)) > return 0; > /* If we get here, we know size is validated */ > diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c > index 90ade8f648d9..e99e378d68ea 100644 > --- a/fs/bcachefs/fs.c > +++ b/fs/bcachefs/fs.c > @@ -2396,7 +2396,7 @@ static struct file_system_type bcache_fs_type = { > .name = "bcachefs", > .init_fs_context = bch2_init_fs_context, > .kill_sb = bch2_kill_sb, > - .fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP, > + .fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP | FS_LBS, > }; > > MODULE_ALIAS_FS("bcachefs"); > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index d92d7a07ea89..3d8b80165d48 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -2118,7 +2118,8 @@ static struct file_system_type xfs_fs_type = { > .init_fs_context = xfs_init_fs_context, > .parameters = xfs_fs_parameters, > .kill_sb = xfs_kill_sb, > - .fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP | FS_MGTIME, > + .fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP | FS_MGTIME | > + FS_LBS, > }; > MODULE_ALIAS_FS("xfs"); > > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 2c3b2f8a621f..16d17bd82be0 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -2616,6 +2616,7 @@ struct file_system_type { > #define FS_DISALLOW_NOTIFY_PERM 16 /* Disable fanotify permission events */ > #define FS_ALLOW_IDMAP 32 /* FS has been updated to handle vfs idmappings. */ > #define FS_MGTIME 64 /* FS uses multigrain timestamps */ > +#define FS_LBS 128 /* FS supports LBS */ > #define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */ > int (*init_fs_context)(struct fs_context *); > const struct fs_parameter_spec *parameters;