Thread (21 messages) 21 messages, 5 authors, 2021-07-13

Re: [Virtio-fs] [PATCH 3/2] fs: simplify get_filesystem_list / get_all_fs_names

From: Stefan Hajnoczi <stefanha@redhat.com>
Date: 2021-06-22 08:36:48
Also in: lkml

On Tue, Jun 22, 2021 at 10:12:17AM +0200, Christoph Hellwig wrote:
quoted hunk ↗ jump to hunk
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 [off-list ref].

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 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()?

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help