git: ef184e989b54 - main - tarfs: Fix backtracking during node creation.

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Thu, 16 Mar 2023 12:20:01 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=ef184e989b548da3a0cb703f58db00921ad612c4

commit ef184e989b548da3a0cb703f58db00921ad612c4
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2023-03-16 11:31:14 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2023-03-16 11:31:22 +0000

    tarfs: Fix backtracking during node creation.
    
    Sponsored by:   Juniper Networks, Inc.
    Sponsored by:   Klara, Inc.
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D39082
---
 sys/fs/tarfs/tarfs_vfsops.c      |  5 +++++
 tests/sys/fs/tarfs/mktar.c       | 10 +---------
 tests/sys/fs/tarfs/tarfs_test.sh | 12 ++++++++----
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/sys/fs/tarfs/tarfs_vfsops.c b/sys/fs/tarfs/tarfs_vfsops.c
index 837fc7644ac1..17d6814ba973 100644
--- a/sys/fs/tarfs/tarfs_vfsops.c
+++ b/sys/fs/tarfs/tarfs_vfsops.c
@@ -347,6 +347,11 @@ tarfs_lookup_path(struct tarfs_mount *tmp, char *name, size_t namelen,
 			}
 			tnp = parent;
 			parent = tnp->parent;
+			cn.cn_nameptr = tnp->name;
+			cn.cn_namelen = tnp->namelen;
+			do_lookup = true;
+			TARFS_DPF(LOOKUP, "%s: back to %.*s/\n", __func__,
+			    (int)tnp->namelen, tnp->name);
 			name += len;
 			namelen -= len;
 			continue;
diff --git a/tests/sys/fs/tarfs/mktar.c b/tests/sys/fs/tarfs/mktar.c
index 4e7d1acc1c82..391ac9170171 100644
--- a/tests/sys/fs/tarfs/mktar.c
+++ b/tests/sys/fs/tarfs/mktar.c
@@ -41,7 +41,6 @@
 #define PROGNAME	"mktar"
 
 #define SUBDIRNAME	"directory"
-#define EMPTYDIRNAME	"empty"
 #define NORMALFILENAME	"file"
 #define SPARSEFILENAME	"sparse_file"
 #define HARDLINKNAME	"hard_link"
@@ -128,11 +127,6 @@ mktar(void)
 	if (mkdir(SUBDIRNAME, 0755) != 0)
 		err(1, "%s", SUBDIRNAME);
 
-	/* create a second subdirectory which will remain empty */
-	verbose("mkdir %s", EMPTYDIRNAME);
-	if (mkdir(EMPTYDIRNAME, 0755) != 0)
-		err(1, "%s", EMPTYDIRNAME);
-
 	/* create a normal file */
 	verbose("creating %s", NORMALFILENAME);
 	mknormalfile(NORMALFILENAME, 0644);
@@ -233,7 +227,7 @@ main(int argc, char *argv[])
 #if 0
 		    "--options", "zstd:frame-per-file",
 #endif
-		    "./" EMPTYDIRNAME "/../" NORMALFILENAME,
+		    "./" SUBDIRNAME "/../" NORMALFILENAME,
 		    "./" SPARSEFILENAME,
 		    "./" HARDLINKNAME,
 		    "./" SHORTLINKNAME,
@@ -262,8 +256,6 @@ main(int argc, char *argv[])
 		(void)unlink(HARDLINKNAME);
 		verbose("rm %s", SPARSEFILENAME);
 		(void)unlink(SPARSEFILENAME);
-		verbose("rmdir %s", EMPTYDIRNAME);
-		(void)rmdir(EMPTYDIRNAME);
 		verbose("rmdir %s", SUBDIRNAME);
 		(void)rmdir(SUBDIRNAME);
 		verbose("cd -");
diff --git a/tests/sys/fs/tarfs/tarfs_test.sh b/tests/sys/fs/tarfs/tarfs_test.sh
index d0624b79eb2d..15354aac501a 100644
--- a/tests/sys/fs/tarfs/tarfs_test.sh
+++ b/tests/sys/fs/tarfs/tarfs_test.sh
@@ -58,10 +58,14 @@ tarfs_basic_body() {
 	atf_check_equal "$(stat -f%d,%i "${mnt}"/sparse_file)" "$(stat -f%d,%i "${mnt}"/hard_link)"
 	atf_check_equal "$(stat -f%d,%i "${mnt}"/sparse_file)" "$(stat -L -f%d,%i "${mnt}"/short_link)"
 	atf_check_equal "$(stat -f%d,%i "${mnt}"/sparse_file)" "$(stat -L -f%d,%i "${mnt}"/long_link)"
-	atf_check_equal "$(sha256 -q "${mnt}"/sparse_file)" ${sum}
-	atf_check_equal "$(stat -f%p "${mnt}"/sparse_file)" 100644
-	atf_check_equal "$(stat -f%l "${mnt}"/sparse_file)" 2
-	atf_check_equal "$(stat -f%l "${mnt}"/hard_link)" 2
+	atf_check -o inline:"${sum}\n" sha256 -q "${mnt}"/sparse_file
+	atf_check -o inline:"2,40755\n" stat -f%l,%p "${mnt}"/directory
+	atf_check -o inline:"1,100644\n" stat -f%l,%p "${mnt}"/file
+	atf_check -o inline:"2,100644\n" stat -f%l,%p "${mnt}"/hard_link
+	atf_check -o inline:"1,120755\n" stat -f%l,%p "${mnt}"/long_link
+	atf_check -o inline:"1,120755\n" stat -f%l,%p "${mnt}"/short_link
+	atf_check -o inline:"2,100644\n" stat -f%l,%p "${mnt}"/sparse_file
+	atf_check -o inline:"3,40755\n" stat -f%l,%p "${mnt}"
 }
 tarfs_basic_cleanup() {
 	umount "${mnt}" || true