From nobody Tue Jan 21 14:08:56 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4YcpwT1FJnz5l8Jx; Tue, 21 Jan 2025 14:08:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4YcpwT0TdRz41P7; Tue, 21 Jan 2025 14:08:57 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737468537; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=SbV9kctG/guJPvh4gsi8bgxI+CqTCH47RPyMUTwJ88I=; b=Vdd6xPNptKVJUzMvWFYrPbcrnKVZb8+F7ZH5M9Z0wP3NWU3U5/66gfhGOQuGzScFYIgVwJ sMOTK99FfqwSKroEJr5LntGd2v4ZWnUW2JW70pC+aHSvFCIS59orrHM0rWP2EzvW4OtX7t MqIQ94OeqQEaHCO42veZB/jvrJc3nT7gd/0S/4EOH3TwhapZhD2ScXL9KByKY2hnK/oPyM AJVJO933ig20fG3IAC7hj5UDB5+xYn6/SKHA+wg/DVfdGj/i5XyQdPAomdMNCJZW0GC5Kf mr0WZjr2kb9bQnKXuhRViG38Av6y4a3d3mbsvUFYLrCGm77MpGjh7ydvyANepA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737468537; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=SbV9kctG/guJPvh4gsi8bgxI+CqTCH47RPyMUTwJ88I=; b=T/d6jAnbvz1aik6WSpUZontgQqAFyK6gjjGXGBmGD7duiM3zbkeu7sECpwYZ6seinNLHFy JaRQpU2Hd46g9mfAL7Oc9hil1zNJSnAiyi+TlnE36LZrA2odyhnS2ss/eGg4HpP9W3Zlda oquBYru7riNqNGuS7w5ZGIVl6aIXWZy4fSC+YwwJG8wBoh5s6cf0xzwEC5WZLNs0gIZz6t 6L4O/D1Jp1pBuChUisqNAu8RE8wCM7/uTLLeUWmK2iW1wLYT3EMqwDenPkvN8LiBD77oOp Qr5a7RvS4bY2eCGkTQuFnklhN7v5O3N8+Cmvil9VRwMXKDhCqEKQFvseLB3o3Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1737468537; a=rsa-sha256; cv=none; b=Ey0QtX/79bw+Mc9NzR8mPyqD1KZFDXkgyYslZQ9ieYnD7R8hMaQX5fwIrLP/jLH0RQpXZ3 vWYBiXpxpPbihEHPpKsw3jkTwpCUemGF5Q3DCciMZ6ZrumDJbbb2dodqbaw6a4LvhBplhT 2T5QH1gCYmrBKA8/8ntXqziebg/10zoCmaO6E9w6Ea/0xRyAjaNxLXxtMt+T9LRYuPO6JN HhFmPXyj9YS+ov/vz+Vk26SLy7OQ69CnUKWzYHZuIgw+OI87vH/BlohcVW87EbHGjhS4y7 6w2wXHeHyTuCaiKycnNhiRDcO8A18TGNgL5N0KK2RmvAvFMGOPcv1wC74Fry+Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4YcpwS6rhdz18kV; Tue, 21 Jan 2025 14:08:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 50LE8uj3049066; Tue, 21 Jan 2025 14:08:56 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50LE8uSw049063; Tue, 21 Jan 2025 14:08:56 GMT (envelope-from git) Date: Tue, 21 Jan 2025 14:08:56 GMT Message-Id: <202501211408.50LE8uSw049063@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: 0ec93987e530 - stable/14 - makefs: Handle special file types when creating a zpool List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 0ec93987e5302495f9512f8534a2375d7da4ee2a Auto-Submitted: auto-generated The branch stable/14 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=0ec93987e5302495f9512f8534a2375d7da4ee2a commit 0ec93987e5302495f9512f8534a2375d7da4ee2a Author: Mark Johnston AuthorDate: 2025-01-07 14:31:02 +0000 Commit: Mark Johnston CommitDate: 2025-01-21 14:08:40 +0000 makefs: Handle special file types when creating a zpool Previously, anything other than a regular file, directory or symlink would cause makefs to exit with an assertion failure. Make it a bit more resilient to user error: print a warning and skip the file. Add a regression test wherein we create an image from a devfs mount. PR: 283583 MFC after: 2 weeks (cherry picked from commit ce878284318e71217d8d8f43f7d590b6c338d3aa) --- usr.sbin/makefs/tests/makefs_zfs_tests.sh | 22 +++++++++++++++++ usr.sbin/makefs/zfs/fs.c | 39 +++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/usr.sbin/makefs/tests/makefs_zfs_tests.sh b/usr.sbin/makefs/tests/makefs_zfs_tests.sh index aeda889d9a5c..3d5819439a73 100644 --- a/usr.sbin/makefs/tests/makefs_zfs_tests.sh +++ b/usr.sbin/makefs/tests/makefs_zfs_tests.sh @@ -148,6 +148,27 @@ dataset_removal_cleanup() common_cleanup } +# +# Make sure that we can handle some special file types. Anything other than +# regular files, symlinks and directories are ignored. +# +atf_test_case devfs cleanup +devfs_body() +{ + atf_check mkdir dev + atf_check mount -t devfs none ./dev + + atf_check -e match:"skipping unhandled" $MAKEFS -s 1g -o rootpath=/ \ + -o poolname=$ZFS_POOL_NAME $TEST_IMAGE ./dev + + import_image +} +devfs_cleanup() +{ + common_cleanup + umount -f ./dev +} + # # Make sure that we can create and remove an empty directory. # @@ -842,6 +863,7 @@ atf_init_test_cases() atf_add_test_case autoexpand atf_add_test_case basic atf_add_test_case dataset_removal + atf_add_test_case devfs atf_add_test_case empty_dir atf_add_test_case empty_fs atf_add_test_case file_extend diff --git a/usr.sbin/makefs/zfs/fs.c b/usr.sbin/makefs/zfs/fs.c index 9413241da0c7..073dce3ce697 100644 --- a/usr.sbin/makefs/zfs/fs.c +++ b/usr.sbin/makefs/zfs/fs.c @@ -177,6 +177,13 @@ fsnode_isroot(const fsnode *cur) return (strcmp(cur->name, ".") == 0); } +static bool +fsnode_valid(const fsnode *cur) +{ + return (cur->type == S_IFREG || cur->type == S_IFDIR || + cur->type == S_IFLNK); +} + /* * Visit each node in a directory hierarchy, in pre-order depth-first order. */ @@ -186,9 +193,11 @@ fsnode_foreach(fsnode *root, int (*cb)(fsnode *, void *), void *arg) assert(root->type == S_IFDIR); for (fsnode *cur = root; cur != NULL; cur = cur->next) { - assert(cur->type == S_IFREG || cur->type == S_IFDIR || - cur->type == S_IFLNK); - + if (!fsnode_valid(cur)) { + warnx("skipping unhandled %s %s/%s", + inode_type(cur->type), cur->path, cur->name); + continue; + } if (cb(cur, arg) == 0) continue; if (cur->type == S_IFDIR && cur->child != NULL) @@ -381,9 +390,15 @@ fs_populate_sattrs(struct fs_populate_arg *arg, const fsnode *cur, */ for (fsnode *c = fsnode_isroot(cur) ? cur->next : cur->child; c != NULL; c = c->next) { - if (c->type == S_IFDIR) + switch (c->type) { + case S_IFDIR: links++; - objsize++; + /* FALLTHROUGH */ + case S_IFREG: + case S_IFLNK: + objsize++; + break; + } } /* The root directory is its own parent. */ @@ -652,6 +667,16 @@ fs_populate_symlink(fsnode *cur, struct fs_populate_arg *arg) fs_populate_sattrs(arg, cur, dnode); } +static fsnode * +fsnode_next(fsnode *cur) +{ + for (cur = cur->next; cur != NULL; cur = cur->next) { + if (fsnode_valid(cur)) + return (cur); + } + return (NULL); +} + static int fs_foreach_populate(fsnode *cur, void *_arg) { @@ -678,7 +703,7 @@ fs_foreach_populate(fsnode *cur, void *_arg) ret = (cur->inode->flags & FI_ROOT) != 0 ? 0 : 1; - if (cur->next == NULL && + if (fsnode_next(cur) == NULL && (cur->child == NULL || (cur->inode->flags & FI_ROOT) != 0)) { /* * We reached a terminal node in a subtree. Walk back up and @@ -694,7 +719,7 @@ fs_foreach_populate(fsnode *cur, void *_arg) eclose(dir->dirfd); free(dir); cur = cur->parent; - } while (cur != NULL && cur->next == NULL && + } while (cur != NULL && fsnode_next(cur) == NULL && (cur->inode->flags & FI_ROOT) == 0); }