diff options
author | bde <bde@FreeBSD.org> | 1994-12-16 16:14:39 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 1994-12-16 16:14:39 +0000 |
commit | aa0ce7be98b74b06455aa90bc534c3fcfadf068d (patch) | |
tree | 2289b80dcafaed77273570565dec4359ce5c7225 /sys/kern/subr_diskslice.c | |
parent | 9706c473f92b641bb55b27fa92a8abeb85615d4c (diff) | |
download | FreeBSD-src-aa0ce7be98b74b06455aa90bc534c3fcfadf068d.zip FreeBSD-src-aa0ce7be98b74b06455aa90bc534c3fcfadf068d.tar.gz |
Separate go-away code from dsinit() to produce dsgone().
Call correct_writedisklabel() instead of writedisklabel() (temporary
compatibility hack).
Remove kludge for allowing a label on slice 0.
Diffstat (limited to 'sys/kern/subr_diskslice.c')
-rw-r--r-- | sys/kern/subr_diskslice.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/sys/kern/subr_diskslice.c b/sys/kern/subr_diskslice.c index 8827716..9eccaf9 100644 --- a/sys/kern/subr_diskslice.c +++ b/sys/kern/subr_diskslice.c @@ -158,7 +158,7 @@ if (labelsect != 0) Debugger(""); bp->b_pblkno = blkno + sp->ds_offset; if (lp == NULL) - bp->b_cylinder = 0; /* XXX all 0 would be better */ + bp->b_cylinder = 0; /* XXX always 0 would be better */ else bp->b_cylinder = bp->b_pblkno / lp->d_secpercyl; return (1); @@ -190,6 +190,28 @@ dsclose(dev, mode, ssp) sp->ds_openmask = sp->ds_bopenmask | sp->ds_copenmask; } +void +dsgone(sspp) + struct diskslices **sspp; +{ + int slice; + struct diskslice *sp; + struct diskslices *ssp; + + for (slice = 0, ssp = *sspp; slice < ssp->dss_nslices; slice++) { + sp = &ssp->dss_slices[slice]; + if (sp->ds_bad != NULL) { + free(sp->ds_bad, M_DEVBUF); + sp->ds_bad = NULL; + } + if (sp->ds_label != NULL) { + free(sp->ds_label, M_DEVBUF); + sp->ds_label = NULL; + } + } + *sspp = NULL; +} + /* * For the "write" commands (DIOCSBAD, DIOCSDINFO and DIOCWDINFO), this * is subject to the same restriction as dsopen(). @@ -276,7 +298,7 @@ dsioctl(dev, cmd, data, flags, ssp, strat, setgeom) */ old_wlabel = sp->ds_wlabel; sp->ds_wlabel = TRUE; - error = writedisklabel(dev, strat, sp->ds_label); + error = correct_writedisklabel(dev, strat, sp->ds_label); sp->ds_wlabel = old_wlabel; return (error); @@ -328,19 +350,8 @@ dsopen(dname, dev, mode, sspp, lp, strat, setgeom) need_init = FALSE; break; } - if (need_init) - for (slice = 0, ssp = *sspp; slice < ssp->dss_nslices; - slice++) { - sp = &ssp->dss_slices[slice]; - if (sp->ds_bad != NULL) { - free(sp->ds_bad, M_DEVBUF); - sp->ds_bad = NULL; - } - if (sp->ds_label != NULL) { - free(sp->ds_label, M_DEVBUF); - sp->ds_label = NULL; - } - } + if (need_init) + dsgone(sspp); } if (need_init) { printf("dsinit\n"); @@ -361,7 +372,7 @@ dsopen(dname, dev, mode, sspp, lp, strat, setgeom) sp = &ssp->dss_slices[slice]; part = dkpart(dev); unit = dkunit(dev); - if (/* slice != WHOLE_DISK_SLICE && */ sp->ds_label == NULL) { + if (slice != WHOLE_DISK_SLICE && sp->ds_label == NULL) { struct disklabel *lp1; lp1 = malloc(sizeof *lp1, M_DEVBUF, M_WAITOK); |