Module Name:    src
Committed By:   martin
Date:           Tue Oct 13 10:43:23 UTC 2020

Modified Files:
        src/usr.sbin/sysinst: bsddisklabel.c

Log Message:
Before forcing MBR partitions into our disklabel, make sure they are not
there yet - could happen in various paths when reusing existing partitions
(or parts of that) - previously we would blindly duplicate identical
partitions.


To generate a diff of this commit:
cvs rdiff -u -r1.53 -r1.54 src/usr.sbin/sysinst/bsddisklabel.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/bsddisklabel.c
diff -u src/usr.sbin/sysinst/bsddisklabel.c:1.53 src/usr.sbin/sysinst/bsddisklabel.c:1.54
--- src/usr.sbin/sysinst/bsddisklabel.c:1.53	Mon Oct 12 16:27:23 2020
+++ src/usr.sbin/sysinst/bsddisklabel.c	Tue Oct 13 10:43:23 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: bsddisklabel.c,v 1.53 2020/10/12 16:27:23 martin Exp $	*/
+/*	$NetBSD: bsddisklabel.c,v 1.54 2020/10/13 10:43:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -1615,26 +1615,44 @@ apply_settings_to_partitions(struct disk
 		    (PUIFLG_ADD_INNER|PUIFLG_IS_OUTER))
 			continue;
 
-		infos[i].start = want->cur_start;
-		infos[i].size = want->size;
-		infos[i].nat_type = wanted->parts->pscheme->get_fs_part_type(
-		    want->type, want->fs_type, want->fs_version);
-		infos[i].last_mounted = want->mount;
-		infos[i].fs_type = want->fs_type;
-		infos[i].fs_sub_type = want->fs_version;
-
-		if (wanted->parts->pscheme->add_outer_partition
-		    != NULL)
-			new_part_id = wanted->parts->pscheme->
-			    add_outer_partition(
-			    wanted->parts, &infos[i], NULL);
-		else
-			new_part_id = wanted->parts->pscheme->
-			    add_partition(
-			    wanted->parts, &infos[i], NULL);
+		new_part_id = NO_PART;
+		for (part_id j = 0; new_part_id == NO_PART &&
+		    j < wanted->parts->num_part; j++) {
+			struct disk_part_info test;
+
+			if (!wanted->parts->pscheme->get_part_info(
+			    wanted->parts, j, &test))
+				continue;
+			if (test.start == want->cur_start &&
+			    test.size == want->size)
+				new_part_id = j;
+		}
+
+		if (new_part_id == NO_PART) {
+			infos[i].start = want->cur_start;
+			infos[i].size = want->size;
+			infos[i].nat_type = wanted->parts->pscheme->
+			    get_fs_part_type(want->type, want->fs_type,
+			    want->fs_version);
+			infos[i].last_mounted = want->mount;
+			infos[i].fs_type = want->fs_type;
+			infos[i].fs_sub_type = want->fs_version;
+			infos[i].fs_opt1 = want->fs_opt1;
+			infos[i].fs_opt2 = want->fs_opt2;
+
+			if (wanted->parts->pscheme->add_outer_partition
+			    != NULL)
+				new_part_id = wanted->parts->pscheme->
+				    add_outer_partition(
+				    wanted->parts, &infos[i], NULL);
+			else
+				new_part_id = wanted->parts->pscheme->
+				    add_partition(
+				    wanted->parts, &infos[i], NULL);
 		
-		if (new_part_id == NO_PART)
-			continue;	/* failed to add, skip */
+			if (new_part_id == NO_PART)
+				continue;	/* failed to add, skip */
+		}
 
 		wanted->parts->pscheme->get_part_info(
 		    wanted->parts, new_part_id, &infos[i]);

Reply via email to