summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/hppa/hppa/disksubr.c25
-rw-r--r--sys/arch/hppa/include/disklabel.h4
-rw-r--r--sys/arch/hppa64/hppa64/disksubr.c25
-rw-r--r--sys/arch/hppa64/include/disklabel.h4
-rw-r--r--sys/arch/macppc/macppc/disksubr.c10
-rw-r--r--sys/arch/sgi/sgi/disksubr.c19
-rw-r--r--sys/arch/socppc/socppc/disksubr.c11
-rw-r--r--sys/kern/subr_disk.c12
8 files changed, 66 insertions, 44 deletions
diff --git a/sys/arch/hppa/hppa/disksubr.c b/sys/arch/hppa/hppa/disksubr.c
index df0df856259..962dc450a6a 100644
--- a/sys/arch/hppa/hppa/disksubr.c
+++ b/sys/arch/hppa/hppa/disksubr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: disksubr.c,v 1.73 2009/06/04 21:13:01 deraadt Exp $ */
+/* $OpenBSD: disksubr.c,v 1.74 2009/06/14 00:09:37 deraadt Exp $ */
/*
* Copyright (c) 1999 Michael Shalayeff
@@ -102,7 +102,7 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
struct lifdir *p;
struct lifvol *lvp;
char *msg = NULL;
- int fsoff = 0, i;
+ int fsoff = 0, openbsdstart = MAXLIFSPACE, i;
/* read LIF volume header */
bp->b_blkno = btodb(LIF_VOLSTART);
@@ -113,8 +113,10 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
return "LIF volume header I/O error";
lvp = (struct lifvol *)bp->b_data;
- if (lvp->vol_id != LIF_VOL_ID)
+ if (lvp->vol_id != LIF_VOL_ID) {
+ openbsdstart = 0;
goto finished;
+ }
dbp = geteblk(LIF_DIRSIZE);
dbp->b_dev = bp->b_dev;
@@ -127,6 +129,7 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
if (biowait(dbp)) {
msg = "LIF directory I/O error";
+ openbsdstart = 0;
goto done;
}
@@ -138,11 +141,12 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
if (p->dir_type == LIF_DIR_FS) {
fsoff = lifstodb(p->dir_addr);
+ openbsdstart = 0;
goto finished;
}
/* Only came here to find the offset... */
- if (partoffp && spoofonly)
+ if (partoffp)
goto finished;
if (p->dir_type == LIF_DIR_HPLBL) {
@@ -210,12 +214,15 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
}
finished:
+ /* record the OpenBSD partition's placement for the caller */
if (partoffp)
*partoffp = fsoff;
+ else {
+ DL_SETBSTART(lp, openbsdstart);
+ DL_SETBEND(lp, DL_GETDSIZE(lp)); /* XXX */
+ }
- DL_SETBSTART(lp, fsoff);
- DL_SETBEND(lp, DL_GETDSIZE(lp)); /* XXX */
-
+ /* don't read the on-disk label if we are in spoofed-only mode */
if (spoofonly)
goto done;
@@ -223,14 +230,12 @@ finished:
bp->b_bcount = lp->d_secsize;
bp->b_flags = B_BUSY | B_READ | B_RAW;
(*strat)(bp);
-
- /* if successful, locate disk label within block and validate */
if (biowait(bp)) {
msg = "disk label I/O error";
goto done;
}
- return checkdisklabel(bp->b_data + LABELOFFSET, lp, fsoff,
+ return checkdisklabel(bp->b_data + LABELOFFSET, lp, openbsdstart,
DL_GETDSIZE(lp)); /* XXX */
done:
diff --git a/sys/arch/hppa/include/disklabel.h b/sys/arch/hppa/include/disklabel.h
index 701535bf4c2..6f1b84abbe6 100644
--- a/sys/arch/hppa/include/disklabel.h
+++ b/sys/arch/hppa/include/disklabel.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: disklabel.h,v 1.21 2007/06/20 18:15:45 deraadt Exp $ */
+/* $OpenBSD: disklabel.h,v 1.22 2009/06/14 00:09:39 deraadt Exp $ */
/*
* Copyright (c) 1994 Christopher G. Demetriou
@@ -126,4 +126,6 @@ struct hpux_label {
#define lifstob(s) ((s) * LIF_SECTSIZE)
#define lifstodb(s) ((s) * LIF_SECTSIZE / DEV_BSIZE)
+#define MAXLIFSPACE 256 /* 512 byte blocks */
+
#endif /* _MACHINE_DISKLABEL_H_ */
diff --git a/sys/arch/hppa64/hppa64/disksubr.c b/sys/arch/hppa64/hppa64/disksubr.c
index 0b94e410e86..65df5fbe288 100644
--- a/sys/arch/hppa64/hppa64/disksubr.c
+++ b/sys/arch/hppa64/hppa64/disksubr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: disksubr.c,v 1.57 2009/06/11 18:54:13 deraadt Exp $ */
+/* $OpenBSD: disksubr.c,v 1.58 2009/06/14 00:09:38 deraadt Exp $ */
/*
* Copyright (c) 1999 Michael Shalayeff
@@ -102,7 +102,7 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
struct lifdir *p;
struct lifvol *lvp;
char *msg = NULL;
- int fsoff = 0, i;
+ int fsoff = 0, openbsdstart = MAXLIFSPACE, i;
/* read LIF volume header */
bp->b_blkno = btodb(LIF_VOLSTART);
@@ -113,8 +113,10 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
return "LIF volume header I/O error";
lvp = (struct lifvol *)bp->b_data;
- if (lvp->vol_id != LIF_VOL_ID)
+ if (lvp->vol_id != LIF_VOL_ID) {
+ openbsdstart = 0;
goto finished;
+ }
dbp = geteblk(LIF_DIRSIZE);
dbp->b_dev = bp->b_dev;
@@ -127,6 +129,7 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
if (biowait(dbp)) {
msg = "LIF directory I/O error";
+ openbsdstart = 0;
goto done;
}
@@ -138,11 +141,12 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
if (p->dir_type == LIF_DIR_FS) {
fsoff = lifstodb(p->dir_addr);
+ openbsdstart = 0;
goto finished;
}
/* Only came here to find the offset... */
- if (partoffp && spoofonly)
+ if (partoffp)
goto finished;
if (p->dir_type == LIF_DIR_HPLBL) {
@@ -210,12 +214,15 @@ readliflabel(struct buf *bp, void (*strat)(struct buf *),
}
finished:
+ /* record the OpenBSD partition's placement for the caller */
if (partoffp)
*partoffp = fsoff;
+ else {
+ DL_SETBSTART(lp, openbsdstart);
+ DL_SETBEND(lp, DL_GETDSIZE(lp)); /* XXX */
+ }
- DL_SETBSTART(lp, fsoff);
- DL_SETBEND(lp, DL_GETDSIZE(lp)); /* XXX */
-
+ /* don't read the on-disk label if we are in spoofed-only mode */
if (spoofonly)
goto done;
@@ -223,14 +230,12 @@ finished:
bp->b_bcount = lp->d_secsize;
bp->b_flags = B_BUSY | B_READ | B_RAW;
(*strat)(bp);
-
- /* if successful, locate disk label within block and validate */
if (biowait(bp)) {
msg = "disk label I/O error";
goto done;
}
- return checkdisklabel(bp->b_data + LABELOFFSET, lp, fsoff,
+ return checkdisklabel(bp->b_data + LABELOFFSET, lp, openbsdstart,
DL_GETDSIZE(lp)); /* XXX */
done:
diff --git a/sys/arch/hppa64/include/disklabel.h b/sys/arch/hppa64/include/disklabel.h
index bad291819a3..df4a61d87e9 100644
--- a/sys/arch/hppa64/include/disklabel.h
+++ b/sys/arch/hppa64/include/disklabel.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: disklabel.h,v 1.15 2007/06/20 18:15:45 deraadt Exp $ */
+/* $OpenBSD: disklabel.h,v 1.16 2009/06/14 00:09:39 deraadt Exp $ */
/*
* Copyright (c) 1994 Christopher G. Demetriou
@@ -126,4 +126,6 @@ struct hpux_label {
#define lifstob(s) ((s) * LIF_SECTSIZE)
#define lifstodb(s) ((s) * LIF_SECTSIZE / DEV_BSIZE)
+#define MAXLIFSPACE 256 /* 512 byte blocks */
+
#endif /* _MACHINE_DISKLABEL_H_ */
diff --git a/sys/arch/macppc/macppc/disksubr.c b/sys/arch/macppc/macppc/disksubr.c
index 8e938218694..f9a51272109 100644
--- a/sys/arch/macppc/macppc/disksubr.c
+++ b/sys/arch/macppc/macppc/disksubr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: disksubr.c,v 1.64 2009/06/13 16:28:23 deraadt Exp $ */
+/* $OpenBSD: disksubr.c,v 1.65 2009/06/14 00:09:38 deraadt Exp $ */
/* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */
/*
@@ -144,12 +144,14 @@ readdpmelabel(struct buf *bp, void (*strat)(struct buf *),
if (strcmp(part->pmPartType, PART_TYPE_OPENBSD) == 0) {
hfspartoff = part->pmPyPartStart - LABELSECTOR;
hfspartend = hfspartoff + part->pmPartBlkCnt;
- DL_SETBSTART(lp, hfspartoff);
- DL_SETBEND(lp, hfspartend < DL_GETDSIZE(lp) ? hfspartend :
- DL_GETDSIZE(lp));
if (partoffp) {
*partoffp = hfspartoff;
return (NULL);
+ } else {
+ DL_SETBSTART(lp, hfspartoff);
+ DL_SETBEND(lp,
+ hfspartend < DL_GETDSIZE(lp) ? hfspartend :
+ DL_GETDSIZE(lp));
}
continue;
}
diff --git a/sys/arch/sgi/sgi/disksubr.c b/sys/arch/sgi/sgi/disksubr.c
index 481fa2df5fc..534a579fced 100644
--- a/sys/arch/sgi/sgi/disksubr.c
+++ b/sys/arch/sgi/sgi/disksubr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: disksubr.c,v 1.15 2009/06/05 09:12:25 deraadt Exp $ */
+/* $OpenBSD: disksubr.c,v 1.16 2009/06/14 00:09:39 deraadt Exp $ */
/*
* Copyright (c) 1999 Michael Shalayeff
@@ -120,9 +120,6 @@ readsgilabel(struct buf *bp, void (*strat)(struct buf *),
u_int fsend;
int offset;
- if (partoffp)
- *partoffp = fsoffs;
-
bp->b_blkno = 0;
bp->b_bcount = lp->d_secsize;
bp->b_flags = B_BUSY | B_READ | B_RAW;
@@ -145,10 +142,7 @@ readsgilabel(struct buf *bp, void (*strat)(struct buf *),
fsoffs = dlp->partitions[0].first * (dlp->dp.dp_secbytes / DEV_BSIZE);
fsend = fsoffs + dlp->partitions[0].blocks * (dlp->dp.dp_secbytes / DEV_BSIZE);
- /*
- * If the disklabel is about to be written to disk, don't modify it!
- * just bail out.
- */
+ /* Only came here to find the offset... */
if (partoffp) {
*partoffp = fsoffs;
goto finished;
@@ -199,6 +193,15 @@ readsgilabel(struct buf *bp, void (*strat)(struct buf *),
lp->d_checksum = dkcksum(lp);
finished:
+ /* record the OpenBSD partition's placement for the caller */
+ if (partoffp)
+ *partoffp = fsoffs;
+ else {
+ DL_SETBSTART(lp, fsoffs);
+ DL_SETBEND(lp, fsend);
+ }
+
+ /* don't read the on-disk label if we are in spoofed-only mode */
if (spoofonly)
goto done;
diff --git a/sys/arch/socppc/socppc/disksubr.c b/sys/arch/socppc/socppc/disksubr.c
index c7c459d0a64..380732c4cb8 100644
--- a/sys/arch/socppc/socppc/disksubr.c
+++ b/sys/arch/socppc/socppc/disksubr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: disksubr.c,v 1.7 2009/06/05 00:41:13 deraadt Exp $ */
+/* $OpenBSD: disksubr.c,v 1.8 2009/06/14 00:09:39 deraadt Exp $ */
/* $NetBSD: disksubr.c,v 1.21 1996/05/03 19:42:03 christos Exp $ */
/*
@@ -147,6 +147,11 @@ readdpmelabel(struct buf *bp, void (*strat)(struct buf *),
if (partoffp) {
*partoffp = hfspartoff;
return (NULL);
+ } else {
+ DL_SETBSTART(lp, hfspartoff);
+ DL_SETBEND(lp,
+ hfspartend < DL_GETDSIZE(lp) ? hfspartend :
+ DL_GETDSIZE(lp));
}
continue;
}
@@ -162,10 +167,6 @@ readdpmelabel(struct buf *bp, void (*strat)(struct buf *),
pp->p_fstype = FS_HFS;
n++;
}
-
- DL_SETBSTART(lp, hfspartoff);
- DL_SETBEND(lp, hfspartend < DL_GETDSIZE(lp) ? hfspartend :
- DL_GETDSIZE(lp));
}
if (hfspartoff == -1)
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c
index 2508c186ce1..d33a152d299 100644
--- a/sys/kern/subr_disk.c
+++ b/sys/kern/subr_disk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_disk.c,v 1.93 2009/06/05 00:41:13 deraadt Exp $ */
+/* $OpenBSD: subr_disk.c,v 1.94 2009/06/14 00:09:40 deraadt Exp $ */
/* $NetBSD: subr_disk.c,v 1.17 1996/03/16 23:17:08 christos Exp $ */
/*
@@ -575,16 +575,18 @@ donot:
lp->d_partitions['i' - 'a'].p_fstype = FS_MSDOS;
}
notfat:
- DL_SETBSTART(lp, dospartoff);
- DL_SETBEND(lp, dospartend < DL_GETDSIZE(lp) ? dospartend : DL_GETDSIZE(lp));
-
/* record the OpenBSD partition's placement for the caller */
if (partoffp)
*partoffp = dospartoff;
+ else {
+ DL_SETBSTART(lp, dospartoff);
+ DL_SETBEND(lp,
+ dospartend < DL_GETDSIZE(lp) ? dospartend : DL_GETDSIZE(lp));
+ }
/* don't read the on-disk label if we are in spoofed-only mode */
if (spoofonly)
- return (NULL);
+ return (NULL); /* jump to the checkdisklabel below?? */
bp->b_blkno = DL_BLKTOSEC(lp, dospartoff + DOS_LABELSECTOR) *
DL_BLKSPERSEC(lp);