Module Name:    src
Committed By:   martin
Date:           Sat Jan 29 15:32:49 UTC 2022

Modified Files:
        src/usr.sbin/sysinst: defs.h gpt.c target.c util.c

Log Message:
Try to get rid of all wedges we created (after unmounting).


To generate a diff of this commit:
cvs rdiff -u -r1.76 -r1.77 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.26 -r1.27 src/usr.sbin/sysinst/gpt.c
cvs rdiff -u -r1.15 -r1.16 src/usr.sbin/sysinst/target.c
cvs rdiff -u -r1.63 -r1.64 src/usr.sbin/sysinst/util.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/sysinst/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.76 src/usr.sbin/sysinst/defs.h:1.77
--- src/usr.sbin/sysinst/defs.h:1.76	Sun Dec  5 02:52:17 2021
+++ src/usr.sbin/sysinst/defs.h	Sat Jan 29 15:32:49 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.76 2021/12/05 02:52:17 msaitoh Exp $	*/
+/*	$NetBSD: defs.h,v 1.77 2022/01/29 15:32:49 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -927,6 +927,7 @@ int	target_dir_exists_p(const char *);
 int	target_file_exists_p(const char *);
 int	target_symlink_exists_p(const char *);
 void	unwind_mounts(void);
+void	register_post_umount_delwedge(const char *disk, const char *wedge);
 int	target_mounted(void);
 void	umount_root(void);
 

Index: src/usr.sbin/sysinst/gpt.c
diff -u src/usr.sbin/sysinst/gpt.c:1.26 src/usr.sbin/sysinst/gpt.c:1.27
--- src/usr.sbin/sysinst/gpt.c:1.26	Sat Jul 17 19:27:22 2021
+++ src/usr.sbin/sysinst/gpt.c	Sat Jan 29 15:32:49 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: gpt.c,v 1.26 2021/07/17 19:27:22 martin Exp $	*/
+/*	$NetBSD: gpt.c,v 1.27 2022/01/29 15:32:49 martin Exp $	*/
 
 /*
  * Copyright 2018 The NetBSD Foundation, Inc.
@@ -1680,6 +1680,9 @@ gpt_free(struct disk_partitions *arg)
 
 	assert(parts != NULL);
 	for (p = parts->partitions; p != NULL; p = n) {
+		if (p->gp_flags & GPEF_WEDGE)
+			register_post_umount_delwedge(parts->dp.disk,
+			    p->gp_dev_name);
 		free(__UNCONST(p->last_mounted));
 		n = p->gp_next;
 		free(p);

Index: src/usr.sbin/sysinst/target.c
diff -u src/usr.sbin/sysinst/target.c:1.15 src/usr.sbin/sysinst/target.c:1.16
--- src/usr.sbin/sysinst/target.c:1.15	Sun Jan 31 22:45:47 2021
+++ src/usr.sbin/sysinst/target.c	Sat Jan 29 15:32:49 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: target.c,v 1.15 2021/01/31 22:45:47 rillig Exp $	*/
+/*	$NetBSD: target.c,v 1.16 2022/01/29 15:32:49 martin Exp $	*/
 
 /*
  * Copyright 1997 Jonathan Stone
@@ -71,7 +71,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: target.c,v 1.15 2021/01/31 22:45:47 rillig Exp $");
+__RCSID("$NetBSD: target.c,v 1.16 2022/01/29 15:32:49 martin Exp $");
 #endif
 
 /*
@@ -83,6 +83,7 @@ __RCSID("$NetBSD: target.c,v 1.15 2021/0
 
 #include <sys/param.h>			/* XXX vm_param.h always defines TRUE*/
 #include <sys/types.h>
+#include <sys/ioctl.h>
 #include <sys/sysctl.h>
 #include <sys/stat.h>			/* stat() */
 #include <sys/mount.h>			/* statfs() */
@@ -93,7 +94,7 @@ __RCSID("$NetBSD: target.c,v 1.15 2021/0
 #include <unistd.h>
 #include <curses.h>			/* defines TRUE, but checks  */
 #include <errno.h>
-
+#include <util.h>
 
 #include "defs.h"
 #include "md.h"
@@ -119,6 +120,13 @@ struct unwind_mount {
 	char um_mountpoint[4];		/* Allocated longer... */
 };
 
+/* Record a wedge for later deletion after all file systems have been unmounted */
+struct umount_delwedge {
+	struct umount_delwedge *next;
+	char disk[MAXPATHLEN], wedge[MAXPATHLEN];
+};
+struct umount_delwedge *post_umount_dwlist = NULL;
+
 /* Unwind-mount stack */
 struct unwind_mount *unwind_mountlist = NULL;
 
@@ -519,6 +527,35 @@ target_mount(const char *opts, const cha
 	return target_mount_do(opts, from, on);
 }
 
+static bool
+delete_wedge(const char *disk, const char *wedge)
+{
+	struct dkwedge_info dkw;
+	char diskpath[MAXPATHLEN];
+	int fd, error;
+
+	fd = opendisk(disk, O_RDWR, diskpath, sizeof(diskpath), 0);
+	if (fd < 0)
+		return false;
+	memset(&dkw, 0, sizeof(dkw));
+	strlcpy(dkw.dkw_devname, wedge, sizeof(dkw.dkw_devname));
+	error = ioctl(fd, DIOCDWEDGE, &dkw);
+	close(fd);
+	return error == 0;
+}
+
+void
+register_post_umount_delwedge(const char *disk, const char *wedge)
+{
+	struct umount_delwedge *dw;
+
+	dw = calloc(1, sizeof(*dw));
+	dw->next = post_umount_dwlist;
+	strlcpy(dw->disk, disk, sizeof(dw->disk));
+	strlcpy(dw->wedge, wedge, sizeof(dw->wedge));
+	post_umount_dwlist = dw;
+}
+
 /*
  * unwind the mount stack, unmounting mounted filesystems.
  * For now, ignore any errors in unmount.
@@ -529,6 +566,7 @@ void
 unwind_mounts(void)
 {
 	struct unwind_mount *m;
+	struct umount_delwedge *dw;
 	static volatile int unwind_in_progress = 0;
 
 	/* signal safety */
@@ -547,6 +585,11 @@ unwind_mounts(void)
 			target_prefix(), m->um_mountpoint);
 		free(m);
 	}
+	while ((dw = post_umount_dwlist) != NULL) {
+		post_umount_dwlist = dw->next;
+		delete_wedge(dw->disk, dw->wedge);
+		free(dw);
+	}
 	unwind_in_progress = 0;
 }
 

Index: src/usr.sbin/sysinst/util.c
diff -u src/usr.sbin/sysinst/util.c:1.63 src/usr.sbin/sysinst/util.c:1.64
--- src/usr.sbin/sysinst/util.c:1.63	Mon Jan  3 11:44:02 2022
+++ src/usr.sbin/sysinst/util.c	Sat Jan 29 15:32:49 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: util.c,v 1.63 2022/01/03 11:44:02 martin Exp $	*/
+/*	$NetBSD: util.c,v 1.64 2022/01/29 15:32:49 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -2541,9 +2541,9 @@ free_usage_set(struct partition_usage_se
 void
 free_install_desc(struct install_partition_desc *install)
 {
-#ifndef NO_CLONES
 	size_t i, j;
 
+#ifndef NO_CLONES
 	for (i = 0; i < install->num; i++) {
 		struct selected_partitions *src = install->infos[i].clone_src;
 		if (!(install->infos[i].flags & PUIFLG_CLONE_PARTS) ||
@@ -2555,6 +2555,22 @@ free_install_desc(struct install_partiti
 				install->infos[j].clone_src = NULL;
 	}
 #endif
+
+	for (i = 0; i < install->num; i++) {
+		struct disk_partitions * parts = install->infos[i].parts;
+
+		if (parts == NULL)
+			continue;
+
+		if (parts->pscheme->free)
+			parts->pscheme->free(parts);
+
+		/* NULL all other references to this parts */
+		for (j = i+1; j < install->num; j++)
+			if (install->infos[j].parts == parts)
+				install->infos[j].parts = NULL;
+	}
+
 	free(install->write_back);
 	free(install->infos);
 }

Reply via email to