On Tue, Jun 22, 2021 at 10:12:17AM +0200, Christoph Hellwig wrote: > Just output the '\0' separate list of supported file systems for block > devices directly rather than going through a pointless round of string > manipulation. > > Based on an earlier patch from Al Viro . > > Signed-off-by: Christoph Hellwig > --- > fs/filesystems.c | 24 ++++++++++++++---------- > include/linux/fs.h | 2 +- > init/do_mounts.c | 20 +------------------- > 3 files changed, 16 insertions(+), 30 deletions(-) > > diff --git a/fs/filesystems.c b/fs/filesystems.c > index 90b8d879fbaf..7c136251607a 100644 > --- a/fs/filesystems.c > +++ b/fs/filesystems.c > @@ -209,21 +209,25 @@ SYSCALL_DEFINE3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2) > } > #endif > > -int __init get_filesystem_list(char *buf) > +void __init list_bdev_fs_names(char *buf, size_t size) > { > - int len = 0; > - struct file_system_type * tmp; > + struct file_system_type *p; > + size_t len; > > read_lock(&file_systems_lock); > - tmp = file_systems; > - while (tmp && len < PAGE_SIZE - 80) { > - len += sprintf(buf+len, "%s\t%s\n", > - (tmp->fs_flags & FS_REQUIRES_DEV) ? "" : "nodev", > - tmp->name); > - tmp = tmp->next; > + for (p = file_systems; p; p = p->next) { > + if (!(p->fs_flags & FS_REQUIRES_DEV)) > + continue; > + len = strlen(p->name) + 1; > + if (len > size) { > + pr_warn("%s: truncating file system list\n", __func__); > + break; > + } > + memcpy(buf, p->name, len); > + buf += len; > + size -= len; > } > read_unlock(&file_systems_lock); > - return len; > } I don't see the extra NUL terminator byte being added that's required by the loop in mount_block_root()?