summaryrefslogtreecommitdiffstats
path: root/sys/pc98
diff options
context:
space:
mode:
authornyan <nyan@FreeBSD.org>2001-06-03 04:44:26 +0000
committernyan <nyan@FreeBSD.org>2001-06-03 04:44:26 +0000
commit4a336ef7291b1a8d8caf57c1169b21615ed48078 (patch)
treeea47cda96e1e74f3aed318b1f0ac9ecdc1015e0a /sys/pc98
parentf9486ac10accfedf221b4514a3e8b2514b87fe93 (diff)
downloadFreeBSD-src-4a336ef7291b1a8d8caf57c1169b21615ed48078.zip
FreeBSD-src-4a336ef7291b1a8d8caf57c1169b21615ed48078.tar.gz
Merged from sys/kern/subr_diskmbr.c revision 1.45.
Diffstat (limited to 'sys/pc98')
-rw-r--r--sys/pc98/pc98/diskslice_machdep.c96
1 files changed, 63 insertions, 33 deletions
diff --git a/sys/pc98/pc98/diskslice_machdep.c b/sys/pc98/pc98/diskslice_machdep.c
index 3236637..948f146 100644
--- a/sys/pc98/pc98/diskslice_machdep.c
+++ b/sys/pc98/pc98/diskslice_machdep.c
@@ -82,6 +82,9 @@ static void mbr_extended __P((dev_t dev, struct disklabel *lp,
int nsectors, int ntracks, u_long mbr_offset,
int level));
#endif
+static int mbr_setslice __P((char *sname, struct disklabel *lp,
+ struct diskslice *sp, struct dos_partition *dp,
+ u_long br_offset));
#ifdef PC98
#define DPBLKNO(cyl,hd,sect) ((cyl)*(lp->d_secpercyl))
@@ -224,10 +227,6 @@ dsinit(dev, lp, sspp)
char *sname;
struct diskslice *sp;
struct diskslices *ssp;
-#ifdef PC98
- u_long pc98_start;
- u_long pc98_size;
-#endif
mbr_offset = DOSBBSECTOR;
#ifdef PC98
@@ -458,23 +457,9 @@ reread_mbr:
/* Initialize normal slices. */
sp = &ssp->dss_slices[BASE_SLICE];
for (dospart = 0, dp = dp0; dospart < NDOSPART; dospart++, dp++, sp++) {
-#ifdef PC98
- pc98_start = DPBLKNO(dp->dp_scyl,dp->dp_shd,dp->dp_ssect);
- pc98_size = dp->dp_ecyl ? DPBLKNO(dp->dp_ecyl+1,dp->dp_ehd,dp->dp_esect) - pc98_start : 0;
- sp->ds_offset = pc98_start;
- sp->ds_size = pc98_size;
- sp->ds_type = dp->dp_mid;
- sp->ds_subtype = dp->dp_sid;
- strncpy(sp->ds_name, dp->dp_name, sizeof(sp->ds_name));
-#else
- sp->ds_offset = mbr_offset + dp->dp_start;
- sp->ds_size = dp->dp_size;
- sp->ds_type = dp->dp_typ;
-#endif
-#if 0
- lp->d_subtype |= (lp->d_subtype & 3) | dospart
- | DSTYPE_INDOSPART;
-#endif
+ sname = dsname(dev, dkunit(dev), BASE_SLICE + dospart,
+ RAW_PART, partname);
+ (void)mbr_setslice(sname, lp, sp, dp, mbr_offset);
}
ssp->dss_nslices = BASE_SLICE + NDOSPART;
@@ -484,8 +469,8 @@ reread_mbr:
for (dospart = 0; dospart < NDOSPART; dospart++, sp++)
if (sp->ds_type == DOSPTYP_EXTENDED ||
sp->ds_type == DOSPTYP_EXTENDEDX)
- mbr_extended(bp->b_dev, lp, ssp,
- sp->ds_offset, sp->ds_size, sp->ds_offset,
+ mbr_extended(bp->b_dev, lp, ssp,
+ sp->ds_offset, sp->ds_size, sp->ds_offset,
max_nsectors, max_ntracks, mbr_offset, 1);
/*
@@ -545,9 +530,9 @@ mbr_extended(dev, lp, ssp, ext_offset, ext_size, base_ext_offset, nsectors,
bp->b_blkno = ext_offset;
bp->b_bcount = lp->d_secsize;
bp->b_iocmd = BIO_READ;
- BUF_STRATEGY(bp, 1);
+ DEV_STRATEGY(bp, 1);
if (bufwait(bp) != 0) {
- diskerr(bp, "reading extended partition table: error",
+ diskerr(&bp->b_io, "reading extended partition table: error",
0, (struct disklabel *)NULL);
printf("\n");
goto done;
@@ -598,14 +583,8 @@ mbr_extended(dev, lp, ssp, ext_offset, ext_size, base_ext_offset, nsectors,
continue;
}
sp = &ssp->dss_slices[slice];
- sp->ds_offset = ext_offset + dp->dp_start;
- sp->ds_size = dp->dp_size;
- sp->ds_type = dp->dp_typ;
-#ifdef PC98_ATCOMPAT
- /* Fake FreeBSD(98). */
- if (sp->ds_type == DOSPTYP_386BSD)
- sp->ds_type = 0x94;
-#endif
+ if (mbr_setslice(sname, lp, sp, dp, ext_offset) != 0)
+ continue;
slice++;
}
}
@@ -624,6 +603,57 @@ done:
}
#endif
+static int
+mbr_setslice(sname, lp, sp, dp, br_offset)
+ char *sname;
+ struct disklabel *lp;
+ struct diskslice *sp;
+ struct dos_partition *dp;
+ u_long br_offset;
+{
+ u_long offset;
+ u_long size;
+
+#ifdef PC98
+ offset = DPBLKNO(dp->dp_scyl, dp->dp_shd, dp->dp_ssect);
+ size = dp->dp_ecyl ?
+ DPBLKNO(dp->dp_ecyl + 1, dp->dp_ehd, dp->dp_esect) - offset : 0;
+#else
+ offset = br_offset + dp->dp_start;
+ if (offset > lp->d_secperunit || offset < br_offset) {
+ printf(
+ "%s: slice starts beyond end of the disk: rejecting it\n",
+ sname);
+ return (1);
+ }
+ size = lp->d_secperunit - offset;
+ if (size >= dp->dp_size)
+ size = dp->dp_size;
+ else
+ printf(
+"%s: slice extends beyond end of disk: truncating from %lu to %lu sectors\n",
+ sname, (u_long)dp->dp_size, size);
+#endif
+ sp->ds_offset = offset;
+ sp->ds_size = size;
+#ifdef PC98
+ sp->ds_type = dp->dp_mid;
+ sp->ds_subtype = dp->dp_sid;
+ strncpy(sp->ds_name, dp->dp_name, sizeof(sp->ds_name));
+#else
+ sp->ds_type = dp->dp_typ;
+#ifdef PC98_ATCOMPAT
+ /* Fake FreeBSD(98). */
+ if (sp->ds_type == DOSPTYP_386BSD)
+ sp->ds_type = 0x94;
+#endif
+#endif /* PC98 */
+#if 0
+ lp->d_subtype |= (lp->d_subtype & 3) | dospart | DSTYPE_INDOSPART;
+#endif
+ return (0);
+}
+
#ifdef __alpha__
void
alpha_fix_srm_checksum(bp)
OpenPOWER on IntegriCloud