Module Name:    src
Committed By:   martin
Date:           Fri Jan 10 10:47:35 UTC 2020

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

Log Message:
Move the LABELSECTOR check and make it FS type specific - some partition
types (FFS, RAID) are allowed to overlap with the LABELSECTOR.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/usr.sbin/sysinst/disklabel.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/disklabel.c
diff -u src/usr.sbin/sysinst/disklabel.c:1.28 src/usr.sbin/sysinst/disklabel.c:1.29
--- src/usr.sbin/sysinst/disklabel.c:1.28	Thu Jan  9 13:22:30 2020
+++ src/usr.sbin/sysinst/disklabel.c	Fri Jan 10 10:47:35 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: disklabel.c,v 1.28 2020/01/09 13:22:30 martin Exp $	*/
+/*	$NetBSD: disklabel.c,v 1.29 2020/01/10 10:47:35 martin Exp $	*/
 
 /*
  * Copyright 2018 The NetBSD Foundation, Inc.
@@ -797,8 +797,8 @@ disklabel_get_free_spaces_internal(const
 	size_t cnt = 0, i;
 	daddr_t s, e, from, size, end_of_disk;
 
-	if (start <= parts->dp.disk_start+LABELSECTOR)
-		start = parts->dp.disk_start+LABELSECTOR+1;
+	if (start < parts->dp.disk_start)
+		start = parts->dp.disk_start;
 	if (min_space_size < 1)
 		min_space_size = 1;
 	if (align > 1 && (start % align) != 0)
@@ -965,6 +965,24 @@ disklabel_get_part_device(const struct d
 	return false;
 }
 
+/*
+ * If the requested partition file system type internally skips
+ * the disk label sector, we can allow it to start at the beginning
+ * of the disk. In most cases though we have to move the partition
+ * to start past the label sector.
+ */
+static bool
+need_to_skip_past_label(const struct disk_part_info *info)
+{
+	switch (info->fs_type) {
+	case FS_BSDFFS:
+	case FS_RAID:
+		return false;
+	}
+
+	return true;
+}
+
 static part_id
 disklabel_add_partition(struct disk_partitions *arg,
     const struct disk_part_info *info, const char **err_msg)
@@ -982,6 +1000,14 @@ disklabel_add_partition(struct disk_part
 			*err_msg = msg_string(MSG_No_free_space);
 		return NO_PART;
 	}
+	if (space.start <= (parts->dp.disk_start + LABELSECTOR) &&
+	    need_to_skip_past_label(info)) {
+		daddr_t new_start = roundup(parts->dp.disk_start + LABELSECTOR,
+		    parts->ptn_alignment);
+		daddr_t off = new_start - space.start;
+		space.start += off;
+		space.size -= off;
+	}
 	if (data.size > space.size)
 		data.size = space.size;
 	daddr_t dend = data.start+data.size;

Reply via email to