diff options
| author | Bruce Evans <bde@FreeBSD.org> | 1998-07-20 13:39:45 +0000 |
|---|---|---|
| committer | Bruce Evans <bde@FreeBSD.org> | 1998-07-20 13:39:45 +0000 |
| commit | 92d1f65ed27dd05e7177c6e55671daa4499f19d6 (patch) | |
| tree | 1e976c8a43cf003a7cd583344cf39bdc5dae2bc3 /sys | |
| parent | 8a261b8f7f2acf183a13a65fcf4a34b07a3e0fad (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/i386/isa/diskslice_machdep.c | 37 | ||||
| -rw-r--r-- | sys/kern/subr_diskmbr.c | 37 | ||||
| -rw-r--r-- | sys/kern/subr_diskslice.c | 37 | ||||
| -rw-r--r-- | sys/sys/diskslice.h | 3 |
4 files changed, 56 insertions, 58 deletions
diff --git a/sys/i386/isa/diskslice_machdep.c b/sys/i386/isa/diskslice_machdep.c index 6c788a60eada..943ef5a27f2e 100644 --- a/sys/i386/isa/diskslice_machdep.c +++ b/sys/i386/isa/diskslice_machdep.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; diff --git a/sys/kern/subr_diskmbr.c b/sys/kern/subr_diskmbr.c index 6c788a60eada..943ef5a27f2e 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; diff --git a/sys/kern/subr_diskslice.c b/sys/kern/subr_diskslice.c index 4dc234350eaa..a0e09cf43706 100644 --- a/sys/kern/subr_diskslice.c +++ b/sys/kern/subr_diskslice.c @@ -43,11 +43,13 @@ * from: wd.c,v 1.55 1994/10/22 01:57:12 phk Exp $ * 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: subr_diskslice.c,v 1.48 1998/07/11 07:45:42 bde Exp $ + * $Id: subr_diskslice.c,v 1.49 1998/07/20 12:37:59 bde Exp $ */ #include "opt_devfs.h" +#include <stddef.h> + #include <sys/param.h> #include <sys/buf.h> #include <sys/conf.h> @@ -556,6 +558,32 @@ dsisopen(ssp) return (0); } +/* + * Allocate a slices "struct" and initialize it to contain only an empty + * compatibility slice (pointing to itself), a whole disk slice (covering + * the disk as described by the label), and (nslices - BASE_SLICES) empty + * slices beginning at BASE_SLICE. + */ +struct diskslices * +dsmakeslicestruct(nslices, lp) + int nslices; + struct disklabel *lp; +{ + struct diskslice *sp; + struct diskslices *ssp; + + ssp = malloc(offsetof(struct diskslices, dss_slices) + + nslices * sizeof *sp, M_DEVBUF, M_WAITOK); + ssp->dss_bdevsw = NULL; + ssp->dss_cdevsw = NULL; + ssp->dss_first_bsd_slice = COMPATIBILITY_SLICE; + ssp->dss_nslices = nslices; + sp = &ssp->dss_slices[0]; + bzero(sp, nslices * sizeof *sp); + sp[WHOLE_DISK_SLICE].ds_size = lp->d_secperunit; + return (ssp); +} + char * dsname(dname, unit, slice, part, partname) char *dname; @@ -623,6 +651,13 @@ dsopen(dname, dev, mode, sspp, lp, strat, setgeom, bdevsw, cdevsw) if (ssp != NULL && need_init) dsgone(sspp); if (need_init) { + /* + * Allocate a minimal slices "struct". This will become + * the final slices "struct" if we don't want real slices + * or if we can't find any real slices. + */ + *sspp = dsmakeslicestruct(BASE_SLICE, lp); + TRACE(("dsinit\n")); error = dsinit(dname, dev, strat, lp, sspp); if (error != 0) { diff --git a/sys/sys/diskslice.h b/sys/sys/diskslice.h index a7cac6cbb182..31b1219df1ea 100644 --- a/sys/sys/diskslice.h +++ b/sys/sys/diskslice.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: diskslice.h,v 1.22 1998/06/06 02:32:51 bde Exp $ + * $Id: diskslice.h,v 1.23 1998/07/04 22:30:26 julian Exp $ */ #ifndef _SYS_DISKSLICE_H_ @@ -96,6 +96,7 @@ int dsioctl __P((char *dname, dev_t dev, int cmd, caddr_t data, int flags, struct diskslices **sspp, void (*strat)(struct buf *bp), ds_setgeom_t *setgeom)); int dsisopen __P((struct diskslices *ssp)); +struct diskslices *dsmakeslicestruct __P((int nslices, struct disklabel *lp)); char *dsname __P((char *dname, int unit, int slice, int part, char *partname)); int dsopen __P((char *dname, dev_t dev, int mode, struct diskslices **sspp, |
