summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_diskmbr.c
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1998-07-20 13:39:45 +0000
committerbde <bde@FreeBSD.org>1998-07-20 13:39:45 +0000
commit79b1340c5bd1addb9d5b7a030c618f7c862d359b (patch)
tree12b8852a5f926f33ae246ba6825dbf9d4362b3c8 /sys/kern/subr_diskmbr.c
parentfc4d618c2d94df027354a981a312a2bca44c7131 (diff)
downloadFreeBSD-src-79b1340c5bd1addb9d5b7a030c618f7c862d359b.zip
FreeBSD-src-79b1340c5bd1addb9d5b7a030c618f7c862d359b.tar.gz
Moved allocation of the slices struct to the right place. Initialize
everything in it (the devsw pointers were not initialized early or at all for the !DEVFS case, but this was harmless on i386's).
Diffstat (limited to 'sys/kern/subr_diskmbr.c')
-rw-r--r--sys/kern/subr_diskmbr.c37
1 files changed, 9 insertions, 28 deletions
diff --git a/sys/kern/subr_diskmbr.c b/sys/kern/subr_diskmbr.c
index 6c788a6..943ef5a 100644
--- a/sys/kern/subr_diskmbr.c
+++ b/sys/kern/subr_diskmbr.c
@@ -35,10 +35,9 @@
*
* from: @(#)ufs_disksubr.c 7.16 (Berkeley) 5/4/91
* from: ufs_disksubr.c,v 1.8 1994/06/07 01:21:39 phk Exp $
- * $Id: diskslice_machdep.c,v 1.27 1997/12/02 21:06:20 phk Exp $
+ * $Id: diskslice_machdep.c,v 1.28 1998/07/11 07:45:35 bde Exp $
*/
-#include <stddef.h>
#include <sys/param.h>
#include <sys/buf.h>
#include <sys/conf.h>
@@ -174,21 +173,6 @@ dsinit(dname, dev, strat, lp, sspp)
struct diskslice *sp;
struct diskslices *ssp;
- /*
- * Allocate a dummy slices "struct" and initialize it to contain
- * only an empty compatibility slice (pointing to itself) and a
- * whole disk slice (covering the disk as described by the label).
- * If there is an error, then the dummy struct becomes final.
- */
- ssp = malloc(offsetof(struct diskslices, dss_slices)
- + BASE_SLICE * sizeof *sp, M_DEVBUF, M_WAITOK);
- *sspp = ssp;
- ssp->dss_first_bsd_slice = COMPATIBILITY_SLICE;
- ssp->dss_nslices = BASE_SLICE;
- sp = &ssp->dss_slices[0];
- bzero(sp, BASE_SLICE * sizeof *sp);
- sp[WHOLE_DISK_SLICE].ds_size = lp->d_secperunit;
-
mbr_offset = DOSBBSECTOR;
reread_mbr:
/* Read master boot record. */
@@ -315,21 +299,18 @@ reread_mbr:
}
/*
- * Free the dummy slices "struct" and allocate a real new one.
- * Initialize special slices as above.
+ * We are passed a pointer to a suitably initialized minimal
+ * slices "struct" with no dangling pointers in it. Replace it
+ * by a maximal one. This usually oversizes the "struct", but
+ * enlarging it while searching for logical drives would be
+ * inconvenient.
*/
- free(ssp, M_DEVBUF);
- ssp = malloc(offsetof(struct diskslices, dss_slices)
-#define MAX_SLICES_SUPPORTED MAX_SLICES /* was (BASE_SLICE + NDOSPART) */
- + MAX_SLICES_SUPPORTED * sizeof *sp, M_DEVBUF, M_WAITOK);
+ free(*sspp, M_DEVBUF);
+ ssp = dsmakeslicestruct(MAX_SLICES, lp);
*sspp = ssp;
- ssp->dss_first_bsd_slice = COMPATIBILITY_SLICE;
- sp = &ssp->dss_slices[0];
- bzero(sp, MAX_SLICES_SUPPORTED * sizeof *sp);
- sp[WHOLE_DISK_SLICE].ds_size = lp->d_secperunit;
/* Initialize normal slices. */
- sp += BASE_SLICE;
+ sp = &ssp->dss_slices[BASE_SLICE];
for (dospart = 0, dp = dp0; dospart < NDOSPART; dospart++, dp++, sp++) {
sp->ds_offset = mbr_offset + dp->dp_start;
sp->ds_size = dp->dp_size;
OpenPOWER on IntegriCloud