From f2f632579f3b99154a8f42ef2d1b29c4b6abfe48 Mon Sep 17 00:00:00 2001 From: Greg Lehey Date: Mon, 2 Dec 2002 23:49:59 +0000 Subject: [PATCH] Relax partition overlap check to allow Vinum partitions to overlap other partitiosns. This is necessary when migrating conventional partitions to Vinum and was broken by recent more stringent overlap checks. This is arguably the wrong way to do it. A better method would be to have the loader understand a subset of Vinum partitioning and allow an install directly to Vinum, but until then, this is the best we have. Reviewed by: jhb Approved by: re (rwatson) --- sbin/bsdlabel/bsdlabel.c | 9 ++++++--- sbin/disklabel/disklabel.c | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sbin/bsdlabel/bsdlabel.c b/sbin/bsdlabel/bsdlabel.c index 6c16a47e6ae4..3d3139f925a8 100644 --- a/sbin/bsdlabel/bsdlabel.c +++ b/sbin/bsdlabel/bsdlabel.c @@ -1462,7 +1462,8 @@ checklabel(struct disklabel *lp) } else { /* allow them to be out of order for old-style tables */ if (pp->p_offset < current_offset && - seen_default_offset && i != RAW_PART) { + seen_default_offset && i != RAW_PART && + pp->p_fstype != FS_VINUM) { fprintf(stderr, "Offset %ld for partition %c overlaps previous partition which ends at %lu\n", (long)pp->p_offset,i+'a',current_offset); @@ -1537,9 +1538,11 @@ checklabel(struct disklabel *lp) /* check for overlaps */ /* this will check for all possible overlaps once and only once */ for (j = 0; j < i; j++) { - if (j != RAW_PART && i != RAW_PART && + pp2 = &lp->d_partitions[j]; + if (j != RAW_PART && i != RAW_PART && + pp->p_fstype != FS_VINUM && + pp2->p_fstype != FS_VINUM && part_set[i] && part_set[j]) { - pp2 = &lp->d_partitions[j]; if (pp2->p_offset < pp->p_offset + pp->p_size && (pp2->p_offset + pp2->p_size > pp->p_offset || pp2->p_offset >= pp->p_offset)) { diff --git a/sbin/disklabel/disklabel.c b/sbin/disklabel/disklabel.c index 6c16a47e6ae4..3d3139f925a8 100644 --- a/sbin/disklabel/disklabel.c +++ b/sbin/disklabel/disklabel.c @@ -1462,7 +1462,8 @@ checklabel(struct disklabel *lp) } else { /* allow them to be out of order for old-style tables */ if (pp->p_offset < current_offset && - seen_default_offset && i != RAW_PART) { + seen_default_offset && i != RAW_PART && + pp->p_fstype != FS_VINUM) { fprintf(stderr, "Offset %ld for partition %c overlaps previous partition which ends at %lu\n", (long)pp->p_offset,i+'a',current_offset); @@ -1537,9 +1538,11 @@ checklabel(struct disklabel *lp) /* check for overlaps */ /* this will check for all possible overlaps once and only once */ for (j = 0; j < i; j++) { - if (j != RAW_PART && i != RAW_PART && + pp2 = &lp->d_partitions[j]; + if (j != RAW_PART && i != RAW_PART && + pp->p_fstype != FS_VINUM && + pp2->p_fstype != FS_VINUM && part_set[i] && part_set[j]) { - pp2 = &lp->d_partitions[j]; if (pp2->p_offset < pp->p_offset + pp->p_size && (pp2->p_offset + pp2->p_size > pp->p_offset || pp2->p_offset >= pp->p_offset)) {