From patchwork Fri Apr 3 14:04:32 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 2095 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775225169; bh=acXa9AATyJ/haf4WTu1IvEateTAlHmle6/pfEfVQB0s=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=XrNG64VmGYEENhLYD97RPCOxhdWh1ETZiAuiL9Ojwf94fkOj9ctHf4j6IZTOSkw6b eLVYkppj9p0oPIzcabUgwv1F4PHDwDeuGl2XvNDFryftw+j+QwfpxO5dyC5XF+f2Ma vHjuboGxQRClDvUtTnTFt+tTDIHHeF8bhTCmd6goCn7jXVbC7OyqFioQSuAEO3rv4P xIIvTJPMQ+r4I6IGwdtZ4N74kJYWE/SYA9a5ShGQxeqmHsHa/PnYbb936b2wV/XNKR 0gA1pS+/w/ZGiD+d4wt3lF6f39bLKdGKLDgyxgjz8ZNOuuL+ZRV2FnKhMNsms8LkF5 jOIgO5lj7/1eA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id A6D2F6A35E for ; Fri, 3 Apr 2026 08:06:09 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id GCBmN_YJneka for ; Fri, 3 Apr 2026 08:06:09 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775225166; bh=acXa9AATyJ/haf4WTu1IvEateTAlHmle6/pfEfVQB0s=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=kxjRCmK6fyW+QDdAV3KjfvozBjF37LFFAd6GeQbK2QlaUDC4DLSoopDPXsRI7Ob4y UFgzc3m4Jbo53Nu7OUxxrSshD4yVMO0XU0l+i/LynvWlPgreLPJwss6WLpJB0Sjbt5 M5Nt9e5n37mLtDZ4M3PuhrISZx5YXhbF7OKuAnnEEYM2v8ieBo05pgieoOfvhF0Fxg qEa/E413ccpO9d4FOnbmBl18Ltf3FCuCyQJEDx4rfmDmc+AaXqxLSIZgBkebEtmPDB Ne71BoBADWpKyWuCkdDqjuKnVjjJhfqvQwJeJQ3LAS3o7FCWIgGUCTon/fIMzQzMjI FfMQgobV4QLLA== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 8B2E76A35C for ; Fri, 3 Apr 2026 08:06:06 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775225163; bh=tKnPiUjNCs7Pqnr6bM6hFneuBUuVf1EqFUS/S8FfieM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=r5Sxe7+iM8dTJN0b2JRATM4SfCEWN3WmnAF28DxcTCQQU0F8H14ImFJ8pjvWB7rie MGPfE/TrQu4z8y1SMPnXXUe9tPmgqAVLkNFhrROAsMY3JfyNhn2BUujel0TMZ2TcxX t6HVErzfYZ8lz0e/fNGOg65sdTZ0Qh6uozb7S/ewIg4bTOhfv89plkx3cB7bBNUi5B bVM4c0HcfLt02aMEjQzA5R8waBvBWCWJe6LL0m+UxYUsUFzjcNozlFTM+L7GHPgkuy H8CRylrUQgh51tf2zjgaoonqQK+19sjQJMCOm81NFCNbbDdoLH/1F+DHpxA1VN9DQ9 jlD98Wl1bXFCA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 4BBD46A34F; Fri, 3 Apr 2026 08:06:03 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id Jemaf5hLwpVz; Fri, 3 Apr 2026 08:06:03 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775225158; bh=Ru3RatScBtHsIthUWmJhxd4aRb4X9f0jMyx0u9QyVYI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JVacsj6varhUqWLS6n0VTmM5ZpAEZtXxZ2WHVFeXQdtN4uGN6R8ze/iiccLHjAJ+i KeV1Hii1hY0hnZxHcXJVwbaovnrjqHjFWsCD//KiuXdMF7xpg3ZG9r/+Y1Xx52avne ek9TVkFMff0rScy/DBFm76BWx+QJBWiwHOPDmdJljx61twaprBUyX/OSNnDM7Su7uH xpCV/fwsyHNK0PdvWONYoToGhxFt2Xev27MZ8wt3Yb8ytguTyzBL6iqCpPmMCeVVBt g6ekUx3QM6IQGgq8m8/UV8wfXjv5kWFnFQf+tBszeqoO9uLAzmM0Q5IfgsRtwunp75 63kf60RpMFFRg== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 778A26A347; Fri, 3 Apr 2026 08:05:58 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Fri, 3 Apr 2026 08:04:32 -0600 Message-ID: <20260403140523.1998228-11-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260403140523.1998228-1-sjg@u-boot.org> References: <20260403140523.1998228-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: 4WY6GOWOY6J7JVXX45BSGWHX7ASJBWMQ X-Message-ID-Hash: 4WY6GOWOY6J7JVXX45BSGWHX7ASJBWMQ X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Simon Glass X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 10/34] vfs: cmd: Add fs command with mount and umount subcommands List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Add a new 'fs' command for VFS operations: - fs mount [ ] - list or create mounts - fs umount - unmount a filesystem Signed-off-by: Simon Glass --- cmd/Kconfig | 8 +++++ cmd/Makefile | 1 + cmd/vfs.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ test/dm/fs.c | 27 +++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 cmd/vfs.c diff --git a/cmd/Kconfig b/cmd/Kconfig index 95ccb9fca1a..60ebb56de00 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -2987,6 +2987,14 @@ config CMD_FS_LEGACY include load, save, ls, size, mkdir, rm, ln, mv, fstype and fstypes. +config CMD_VFS + bool "fs - virtual filesystem commands" + depends on VFS + default y if SANDBOX + help + Provides the 'fs' command with mount, umount and ls subcommands + for the virtual filesystem layer. + config CMD_FS_UUID bool "fsuuid command" default y if SANDBOX diff --git a/cmd/Makefile b/cmd/Makefile index 4d1b3eab90c..412a3096d0e 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -94,6 +94,7 @@ obj-$(CONFIG_CMD_FPGA) += fpga.o obj-$(CONFIG_CMD_LUKS) += luks.o obj-$(CONFIG_CMD_FPGAD) += fpgad.o obj-$(CONFIG_CMD_FS_LEGACY) += fs_legacy.o +obj-$(CONFIG_CMD_VFS) += vfs.o obj-$(CONFIG_CMD_FUSE) += fuse.o obj-$(CONFIG_CMD_FWU_METADATA) += fwu_mdata.o obj-$(CONFIG_CMD_GETTIME) += gettime.o diff --git a/cmd/vfs.c b/cmd/vfs.c new file mode 100644 index 00000000000..23b8cabdcdb --- /dev/null +++ b/cmd/vfs.c @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * VFS commands - 'fs mount', 'fs umount' + * + * Provides a new 'fs' command with subcommands for the virtual filesystem + * layer, co-existing with the legacy filesystem commands in cmd/fs.c. + * + * Copyright 2026 Simon Glass + */ + +#include +#include +#include +#include +#include + +static int fs_mount_handler(int argc, char *const argv[]) +{ + struct udevice *vfs, *fsdev, *dir; + int ret; + + vfs = vfs_root(); + if (!vfs) + return -ENXIO; + + if (argc < 2) { + vfs_print_mounts(); + return 0; + } + + if (argc < 3) + return -EINVAL; + + ret = uclass_get_device_by_name(UCLASS_FS, argv[1], &fsdev); + if (ret) + return ret; + + ret = vfs_resolve(vfs, argv[2], &dir); + if (ret) + return ret; + + return vfs_mount(vfs, dir, fsdev); +} + +static int do_fs_mount(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + int ret; + + if (argc == 2) + return CMD_RET_USAGE; + + ret = fs_mount_handler(argc, argv); + if (ret) { + printf("fs mount failed: %dE\n", ret); + return CMD_RET_FAILURE; + } + + return CMD_RET_SUCCESS; +} + +static int fs_umount_handler(const char *path) +{ + struct udevice *vfs; + + vfs = vfs_root(); + if (!vfs) + return -ENXIO; + + return vfs_umount_path(vfs, path); +} + +static int do_fs_umount(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + int ret; + + if (argc < 2) + return CMD_RET_USAGE; + + ret = fs_umount_handler(argv[1]); + if (ret) { + printf("fs umount failed: %dE\n", ret); + return CMD_RET_FAILURE; + } + + return CMD_RET_SUCCESS; +} + +U_BOOT_LONGHELP(fs, + "mount [ ] - list or create mounts\n" + "fs umount - unmount a filesystem"); + +U_BOOT_CMD_WITH_SUBCMDS(fs, "Filesystem operations", fs_help_text, + U_BOOT_SUBCMD_MKENT(mount, 3, 1, do_fs_mount), + U_BOOT_SUBCMD_MKENT(umount, 2, 1, do_fs_umount)); diff --git a/test/dm/fs.c b/test/dm/fs.c index f31a11e90cb..f71ad361bcd 100644 --- a/test/dm/fs.c +++ b/test/dm/fs.c @@ -247,4 +247,31 @@ static int dm_test_vfs_mount(struct unit_test_state *uts) return 0; } DM_TEST(dm_test_vfs_mount, UTF_SCAN_FDT); + +/* Test the VFS layer using the 'fs' command */ +static int dm_test_vfs_cmd(struct unit_test_state *uts) +{ + ut_assertok(vfs_init()); + + /* Mount the sandbox FS at /host */ + ut_assertok(run_command("fs mount hostfs /host", 0)); + ut_assert_console_end(); + + /* Verify it appears in the mount list */ + ut_assertok(run_command("fs mount", 0)); + ut_assert_nextlinen("/host"); + ut_assert_console_end(); + + /* Unmount */ + ut_assertok(run_command("fs umount /host", 0)); + ut_assert_console_end(); + + /* Mount list should now be empty */ + ut_assertok(run_command("fs mount", 0)); + ut_assert_console_end(); + + return 0; +} +DM_TEST(dm_test_vfs_cmd, UTF_SCAN_FDT); + #endif