Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 2 Mar 2023 18:18:33 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 7b4299eb4e7c - main - kboot: Fix hostdisk_override
Message-ID:  <202303021818.322IIXv4035429@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by imp:

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

commit 7b4299eb4e7ccf3f2a9ecf7b3fadaa8e5aa78dc3
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2023-03-02 17:57:43 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2023-03-02 18:12:10 +0000

    kboot: Fix hostdisk_override
    
    We were assuming that hostdisk_override was both a directory and a
    file, which is not going to work very well. It's supposed to be a
    single file, so recode it as such. Simplify erorr handling a little as
    well and fix a return type-mismatch that doesn't matter for the
    generated code (return NULL is the same as return false in this
    context)
    
    Sponsored by: Netflix
---
 stand/kboot/hostdisk.c | 35 ++++++++++++-----------------------
 1 file changed, 12 insertions(+), 23 deletions(-)

diff --git a/stand/kboot/hostdisk.c b/stand/kboot/hostdisk.c
index b71ae256b0f6..5cc7825034dd 100644
--- a/stand/kboot/hostdisk.c
+++ b/stand/kboot/hostdisk.c
@@ -249,31 +249,22 @@ hostdisk_one_disk(struct host_dirent64 *dent, void *argp __unused)
 	return (true);
 }
 
-static bool
-hostdisk_fake_one_disk(struct host_dirent64 *dent, void *argp)
+static void
+hostdisk_fake_one_disk(char *override)
 {
-	char *override_dir = argp;
-	char *fn = NULL;
 	hdinfo_t *hd = NULL;
 	struct host_kstat sb;
 
-	/*
-	 * We only do regular files. Each one is treated as a disk image
-	 * accessible via /dev/${dent->d_name}.
-	 */
-	if (dent->d_type != HOST_DT_REG && dent->d_type != HOST_DT_LNK)
-		return (true);
-	if (asprintf(&fn, "%s/%s", override_dir, dent->d_name) == -1)
-		return (true);
-	if (host_stat(fn, &sb) != 0)
-		goto err;
+	if (host_stat(override, &sb) != 0)
+		return;
 	if (!HOST_S_ISREG(sb.st_mode))
-		return (true);
+		return;
 	if (sb.st_size == 0)
-		goto err;
+		return;
 	if ((hd = calloc(1, sizeof(*hd))) == NULL)
+		return;
+	if ((hd->hd_dev = strdup(override)) == NULL)
 		goto err;
-	hd->hd_dev = fn;
 	hd->hd_size = sb.st_size;
 	hd->hd_sectorsize = 512;	/* XXX configurable? */
 	hd->hd_sectors = hd->hd_size / hd->hd_sectorsize;
@@ -284,12 +275,10 @@ hostdisk_fake_one_disk(struct host_dirent64 *dent, void *argp)
 	printf("%s: %ju %ju %ju\n",
 	    hd->hd_dev, hd->hd_size, hd->hd_sectors, hd->hd_sectorsize);
 	STAILQ_INSERT_TAIL(&hdinfo, hd, hd_link);
-	/* XXX no partiions? -- is that OK? */
-	return (true);
+	return;
 err:
+	free(__DECONST(void *, hd->hd_dev));
 	free(hd);
-	free(fn);
-	return (true);
 }
 
 static void
@@ -299,7 +288,7 @@ hostdisk_find_block_devices(void)
 
 	override=getenv("hostdisk_override");
 	if (override != NULL)
-		foreach_file(override, hostdisk_fake_one_disk, override, 0);
+		hostdisk_fake_one_disk(override);
 	else
 		foreach_file(SYSBLK, hostdisk_one_disk, NULL, 0);
 }
@@ -540,7 +529,7 @@ hostdisk_gen_probe(void)
 				return (rv);
 		}
 	}
-	return (false);
+	return (NULL);
 }
 
 #ifdef LOADER_ZFS_SUPPORT



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202303021818.322IIXv4035429>